index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="系统模块" prop="title">
  5. <el-input
  6. maxlength="50"
  7. v-model="queryParams.title"
  8. placeholder="请输入系统模块"
  9. clearable
  10. style="width: 240px;"
  11. />
  12. </el-form-item>
  13. <el-form-item label="操作人员" prop="operName">
  14. <el-input
  15. maxlength="50"
  16. v-model="queryParams.operName"
  17. placeholder="请输入操作人员"
  18. clearable
  19. style="width: 240px;"
  20. />
  21. </el-form-item>
  22. <el-form-item label="审计类型" prop="auditType">
  23. <el-select
  24. v-model="queryParams.auditType"
  25. placeholder="请选择审计类型"
  26. clearable
  27. style="width: 240px"
  28. >
  29. <el-option
  30. v-for="dict in auditTypeOptions"
  31. :key="dict.value"
  32. :label="dict.label"
  33. :value="dict.value"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="操作类型" prop="businessType">
  38. <el-select
  39. v-model="queryParams.businessType"
  40. placeholder="请选择操作类型"
  41. clearable
  42. style="width: 240px"
  43. >
  44. <el-option
  45. v-for="dict in operTypeOptions"
  46. :key="dict.value"
  47. :label="dict.label"
  48. :value="dict.value"
  49. />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="操作状态" prop="status">
  53. <el-select
  54. v-model="queryParams.status"
  55. placeholder="请选择操作状态"
  56. clearable
  57. style="width: 240px"
  58. >
  59. <el-option
  60. v-for="dict in statusOptions"
  61. :key="dict.value"
  62. :label="dict.label"
  63. :value="dict.value"
  64. />
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item label="操作时间">
  68. <el-date-picker
  69. v-model="dateRange"
  70. style="width: 240px"
  71. value-format="yyyy-MM-dd"
  72. type="daterange"
  73. range-separator="-"
  74. start-placeholder="开始日期"
  75. end-placeholder="结束日期"
  76. ></el-date-picker>
  77. </el-form-item>
  78. <el-form-item>
  79. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  80. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  81. </el-form-item>
  82. </el-form>
  83. <el-row :gutter="10" class="mb8">
  84. <el-col :span="1.5">
  85. <el-button
  86. style="display:none"
  87. type="danger"
  88. plain
  89. icon="el-icon-delete"
  90. size="mini"
  91. @click="handleDelete"
  92. v-hasPermi="['auditManager:operlog:remove']"
  93. >删除
  94. </el-button>
  95. </el-col>
  96. <el-col :span="1.5">
  97. <el-button
  98. style="display:none"
  99. type="danger"
  100. plain
  101. icon="el-icon-delete"
  102. size="mini"
  103. @click="handleClean"
  104. v-hasPermi="['auditManager:operlog:remove']"
  105. >清空
  106. </el-button>
  107. </el-col>
  108. </el-row>
  109. <div style="padding-top: 10px">
  110. <vxe-table
  111. ref="tables"
  112. align="center"
  113. :loading="loading"
  114. class="mytable-style"
  115. auto-resize
  116. border
  117. resizable
  118. export-config
  119. highlight-current-row
  120. show-overflow
  121. max-height="700"
  122. :data="list"
  123. :radio-config="{trigger: 'row'}"
  124. @sort-change="sortChangeEvent"
  125. :sort-config="{remote:'true'}"
  126. >
  127. <!-- <vxe-column type="radio" width="60"/>-->
  128. <vxe-table-column field="operId" title="日志编号"/>
  129. <vxe-table-column field="title" title="系统模块" :sortable="true"/>
  130. <vxe-table-column field="auditType" title="审计类型" :formatter="auditTypeFormat"/>
  131. <vxe-table-column field="businessType" title="操作类型" :formatter="operTypeFormat"/>
  132. <vxe-table-column field="operName" title="操作人员" :sortable="true"/>
  133. <vxe-table-column field="operIp" title="操作地址"/>
  134. <vxe-table-column field="operLocation" title="操作地点"/>
  135. <vxe-table-column field="status" title="操作状态" :formatter="statusFormat"/>
  136. <vxe-table-column field="operTime" title="操作日期" :sortable="true"/>
  137. <vxe-table-column field="costTime" title="消耗时间(毫秒)"/>
  138. <vxe-table-column title="操作">
  139. <template slot-scope="scope">
  140. <el-button
  141. size="mini"
  142. type="text"
  143. icon="el-icon-view"
  144. @click="handleView(scope.row,scope.index)"
  145. >详细
  146. </el-button>
  147. </template>
  148. </vxe-table-column>
  149. </vxe-table>
  150. <vxe-pager
  151. perfect
  152. :current-page.sync="currentPage"
  153. :page-size.sync="pageSize"
  154. :total="total"
  155. :page-sizes="[10,50,100]"
  156. :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
  157. @page-change="handlePageChange"
  158. >
  159. </vxe-pager>
  160. </div>
  161. <!-- 操作日志详细 -->
  162. <el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body>
  163. <el-form ref="form" :model="form" label-width="100px" size="mini">
  164. <el-row>
  165. <el-col :span="12">
  166. <el-form-item label="操作模块:">{{ form.title }}</el-form-item>
  167. <el-form-item
  168. label="登录信息:"
  169. >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}
  170. </el-form-item>
  171. </el-col>
  172. <el-col :span="12">
  173. <el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
  174. <el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
  175. </el-col>
  176. <el-col :span="24">
  177. <el-form-item label="操作方法:">{{ form.method }}</el-form-item>
  178. </el-col>
  179. <el-col :span="24">
  180. <el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
  181. </el-col>
  182. <el-col :span="24">
  183. <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
  184. </el-col>
  185. <el-col :span="6">
  186. <el-form-item label="操作状态:">
  187. <div v-if="form.status === 0">正常</div>
  188. <div v-else-if="form.status === 1">失败</div>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="8">
  192. <el-form-item label="消耗时间:">{{ form.costTime }}毫秒</el-form-item>
  193. </el-col>
  194. <el-col :span="10">
  195. <el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
  196. </el-col>
  197. <el-col :span="24">
  198. <el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
  199. </el-col>
  200. </el-row>
  201. </el-form>
  202. <div slot="footer" class="dialog-footer">
  203. <el-button @click="open = false">关 闭</el-button>
  204. </div>
  205. </el-dialog>
  206. </div>
  207. </template>
  208. <script>
  209. import {debounce} from "lodash";
  210. export default {
  211. name: "Operlog",
  212. dicts: ['sys_oper_type', 'sys_common_status'],
  213. data() {
  214. return {
  215. showTable: true,
  216. currentPage: 1,
  217. pageSize: 10,
  218. ///** 操作类型(0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据) */
  219. operTypeOptions: [
  220. {value: '1', label: '新增'},
  221. {value: '2', label: '修改'},
  222. {value: '3', label: '删除'},
  223. {value: '4', label: '授权'},
  224. {value: '9', label: '清空数据'},
  225. {value: '0', label: '其他'}
  226. ],
  227. ///** 审计类型(0=系统,1=业务) */
  228. auditTypeOptions: [
  229. // {value: '0', label: '系统'},
  230. // {value: '1', label: '业务'}
  231. ],
  232. statusOptions: [
  233. {value: '0', label: '成功'},
  234. {value: '1', label: '失败'}
  235. ],
  236. // 遮罩层
  237. loading: true,
  238. // 选中数组
  239. ids: [],
  240. // 非多个禁用
  241. multiple: true,
  242. // 显示搜索条件
  243. showSearch: true,
  244. // 总条数
  245. total: 0,
  246. // 表格数据
  247. list: [],
  248. // 是否显示弹出层
  249. open: false,
  250. sortOrder: 'operTime&asc',
  251. // 日期范围
  252. dateRange: [],
  253. // 默认排序
  254. defaultSort: {prop: 'operTime', order: 'descending'},
  255. // 表单参数
  256. form: {},
  257. // 查询参数
  258. queryParams: {
  259. title: undefined,
  260. operName: undefined,
  261. businessType: undefined,
  262. auditType: undefined,
  263. status: undefined
  264. }
  265. };
  266. },
  267. async created() {
  268. let sysTime
  269. let lk
  270. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  271. sysTime = res.data.sysTime
  272. lk = res.data.lk
  273. }).catch((error) => {
  274. })
  275. var searchParams = {
  276. sysTime: sysTime,
  277. lk: lk
  278. }
  279. // 获取审计类型
  280. await this.$axios.get('/sysOperlogController/getAuditType',{params: searchParams}).then((res) => {
  281. this.auditTypeOptions = res.data
  282. }).catch((error) => {
  283. })
  284. await this.getList();
  285. },
  286. methods: {
  287. sortChangeEvent({column, property, order}) {
  288. if (order == null) {
  289. order = 'asc'
  290. }
  291. this.currentPage = 1
  292. this.sortOrder = property+'&'+order
  293. this.getList()
  294. },
  295. handlePageChange({currentPage, pageSize}) {
  296. this.currentPage = currentPage
  297. this.pageSize = pageSize
  298. this.getList()
  299. },
  300. // 列表状态格式化
  301. statusFormat({cellValue}) {
  302. let belongTo = '未知的类型'
  303. for (let i = 0; i < this.statusOptions.length; i++) {
  304. if (cellValue == "0") {
  305. belongTo = "成功"
  306. } else if (cellValue == "1") {
  307. belongTo = "失败"
  308. }
  309. }
  310. return belongTo
  311. },
  312. // 列表状态格式化
  313. operTypeFormat({cellValue}) {
  314. let belongTo = '未知的类型'
  315. for (let i = 0; i < this.operTypeOptions.length; i++) {
  316. if (cellValue == "1") {
  317. belongTo = "新增"
  318. } else if (cellValue == "2") {
  319. belongTo = "修改"
  320. } else if (cellValue == "3") {
  321. belongTo = "删除"
  322. } else if (cellValue == "4") {
  323. belongTo = "授权"
  324. } else if (cellValue == "9") {
  325. belongTo = "清空数据"
  326. } else if (cellValue == "0") {
  327. belongTo = "其他"
  328. }
  329. }
  330. return belongTo
  331. },
  332. // 列表状态格式化
  333. auditTypeFormat({cellValue}) {
  334. let belongTo = '未知的类型'
  335. for (let i = 0; i < this.auditTypeOptions.length; i++) {
  336. if (cellValue == "0") {
  337. belongTo = "系统"
  338. } else if (cellValue == "1") {
  339. belongTo = "业务"
  340. }
  341. }
  342. return belongTo
  343. },
  344. /** 查询操作日志列表 */
  345. getList: debounce(async function () {
  346. let sysTime
  347. let lk
  348. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  349. sysTime = res.data.sysTime
  350. lk = res.data.lk
  351. }).catch((error) => {
  352. })
  353. this.loading = true;
  354. let _startOperTime;
  355. let _endOperTime;
  356. if (this.dateRange == null) {
  357. _startOperTime = ''
  358. _endOperTime = ''
  359. } else {
  360. _startOperTime = this.dateRange[0]
  361. _endOperTime = this.dateRange[1]
  362. }
  363. var searchParams = {
  364. currentPage: this.currentPage,
  365. pageSize: this.pageSize,
  366. title: this.queryParams.title,
  367. operName: this.queryParams.operName,
  368. businessType: this.queryParams.businessType,
  369. auditType: this.queryParams.auditType,
  370. status: this.queryParams.status,
  371. startOperTime: _startOperTime,
  372. endOperTime: _endOperTime,
  373. sortOrder: this.sortOrder,
  374. sysTime: sysTime,
  375. lk: lk
  376. }
  377. await this.$axios.get('/sysOperlogController/getAll',
  378. {params: searchParams}).then((res) => {
  379. this.list = res.data.records
  380. this.total = res.data.total
  381. if (res.data.records == '') {
  382. this.showTable = false
  383. } else {
  384. this.showTable = true
  385. }
  386. this.loading = false
  387. }).catch((error) => {
  388. this.loading = false;
  389. // this.$message.error(error)
  390. })
  391. }, 1000),
  392. // 操作日志类型字典翻译
  393. typeFormat(row, column) {
  394. // return this.selectDictLabel(this.dict.type.sys_oper_type, row.businessType);
  395. return ''
  396. },
  397. /** 搜索按钮操作 */
  398. handleQuery() {
  399. this.getList();
  400. },
  401. /** 重置按钮操作 */
  402. resetQuery() {
  403. this.dateRange = [];
  404. this.resetForm("queryForm");
  405. },
  406. /** 多选框选中数据 */
  407. handleSelectionChange(selection) {
  408. this.ids = selection.map(item => item.operId)
  409. this.multiple = !selection.length
  410. },
  411. /** 排序触发事件 */
  412. handleSortChange(column, prop, order) {
  413. this.queryParams.orderByColumn = column.prop;
  414. this.queryParams.isAsc = column.order;
  415. this.getList();
  416. },
  417. /** 详细按钮操作 */
  418. handleView(row) {
  419. this.open = true;
  420. this.form = row;
  421. },
  422. /** 删除按钮操作 */
  423. handleDelete() {
  424. const _selectData = this.$refs.tables.getRadioRecord(true)
  425. if (_selectData == null) {
  426. this.$message({
  427. type: 'warning',
  428. message: '请选择记录!'
  429. });
  430. return
  431. }
  432. this.$confirm('是否确认删除操作日志?', '提示', {
  433. confirmButtonText: '确定',
  434. cancelButtonText: '取消',
  435. type: 'warning'
  436. }).then(() => {
  437. this.doDelete(_selectData)
  438. }).catch(() => {
  439. });
  440. },
  441. /**
  442. * 删除提交
  443. */
  444. doDelete: debounce(function (_selectData) {
  445. const param = {
  446. operId: _selectData.operId
  447. }
  448. this.$axios.post('/sysOperlogController/delOperlog', param).then((res) => {
  449. if (res.code == 0) {
  450. this.$message({
  451. type: 'success',
  452. message: '删除成功!'
  453. });
  454. this.getList();
  455. } else {
  456. this.$message({
  457. type: 'error',
  458. message: res.data
  459. });
  460. }
  461. }).catch((error) => {
  462. this.$message({
  463. type: 'error',
  464. message: '删除失败!'
  465. });
  466. this.loading = false
  467. })
  468. }, 1000),
  469. /** 清空按钮操作 */
  470. handleClean() {
  471. if (this.list == '') {
  472. this.$message({
  473. type: 'warning',
  474. message: '没有记录不能清空!'
  475. });
  476. return
  477. }
  478. this.$confirm('是否确认清空所有操作日志数据项?', '提示', {
  479. confirmButtonText: '确定',
  480. cancelButtonText: '取消',
  481. type: 'warning'
  482. }).then(() => {
  483. this.cleanOperLog();
  484. }).catch(() => {
  485. })
  486. },
  487. /**
  488. * 清空提交
  489. */
  490. cleanOperLog: debounce(function () {
  491. this.$axios.post('/sysOperlogController/cleanOperLog', {}).then((res) => {
  492. if (res.code == 0) {
  493. this.$message({
  494. type: 'success',
  495. message: '清空成功!'
  496. });
  497. this.getList();
  498. } else {
  499. this.$message({
  500. type: 'error',
  501. message: res.data
  502. });
  503. }
  504. }).catch((error) => {
  505. this.$message({
  506. type: 'error',
  507. message: '清空失败!'
  508. });
  509. this.loading = false
  510. })
  511. }, 1000)
  512. }
  513. };
  514. </script>