logManagement.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. // 操作日志
  2. <template>
  3. <div class="center">
  4. <div class="center_css">
  5. <div class="top_css">
  6. <el-row>
  7. <el-col :span="14" style="height: 45px">
  8. <span type="primary" class="batch_text">
  9. </span>
  10. <el-button type="danger" plain icon="el-icon-delete" size="small" @click="delBtn()">删除</el-button>
  11. <el-button type="warning" plain icon="el-icon-download" size="small" class="top_btn" @click="exportBtn()">导出
  12. </el-button>
  13. <el-date-picker v-model="value1" value-format="yyyy-MM-dd" @change="dateChange" type="daterange"
  14. range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
  15. </el-date-picker>
  16. </el-col>
  17. <el-col :span="10" style="height: 45px">
  18. <div class="screen">
  19. <el-input class="find" placeholder="可按系统模块,操作人员进行筛选" @keyup.enter.native="find" v-model="searchkeyWord"
  20. clearable @change="find"></el-input>
  21. <el-button class="search" @click="find"><img width="16" height="16" style="margin-left: -8px"
  22. src="../../../public/img/sousuo.png" /></el-button><span
  23. class="count_css">共{{ deptBudgetTotal }}条</span>
  24. </div>
  25. </el-col>
  26. </el-row>
  27. </div>
  28. <el-table :data="tableData" style="width: 98%; margin: 0 auto; border-radius: 10px" height="55.8vh" border
  29. highlight-current-row @row-click="handleRowClick" @selection-change="handleSelectionChange"
  30. :default-sort="{ prop: 'date', order: 'descending' }">
  31. <el-table-column type="selection" width="55" :selectable="selectInit">
  32. </el-table-column>
  33. <el-table-column type="index" label="序号" width="50">
  34. <template scope="scope">
  35. <span v-if="scope.$index < 9">0{{ scope.$index + 1 }}</span>
  36. <span v-else>{{ scope.$index + 1 }}</span>
  37. </template>
  38. </el-table-column>
  39. <el-table-column prop="title" label="系统模块"></el-table-column>
  40. <el-table-column prop="requestMethod" label="请求方式"></el-table-column>
  41. <el-table-column prop="operator" label="操作人员" sortable></el-table-column>
  42. <el-table-column prop="ip" label="操作地址"></el-table-column>
  43. <el-table-column prop="status" label="操作状态"></el-table-column>
  44. <el-table-column prop="updateDate" label="操作日期" sortable></el-table-column>
  45. <el-table-column label="操作" min-width="200">
  46. <template slot-scope="scope">
  47. <span @click="look(scope.row)" style="color: #40b6ff;cursor:pointer"><i class="el-icon-view"
  48. style="margin: 0 6px"></i>详情</span>
  49. </template>
  50. </el-table-column>
  51. </el-table>
  52. </div>
  53. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
  54. style="text-align: center; margin-top: 10px" :page-size="deptCircularPage.pageSize"
  55. layout="total, sizes, prev, pager, next, jumper" :total="deptBudgetTotal">
  56. </el-pagination>
  57. <el-dialog title="导出日志" :visible.sync="logVisible" width="400px" :before-close="handleClose">
  58. <el-form ref="form" label-width="100px">
  59. <el-form-item label="起始日期">
  60. <el-date-picker value-format="yyyy-MM-dd" type="date" placeholder="请选择起始日期" v-model="formInfo.startDate">
  61. </el-date-picker>
  62. </el-form-item>
  63. <el-form-item label="截止日期">
  64. <el-date-picker value-format="yyyy-MM-dd" type="date" placeholder="请选择截止日期" v-model="formInfo.endDate">
  65. </el-date-picker>
  66. </el-form-item>
  67. </el-form>
  68. <span slot="footer" class="dialog-footer">
  69. <el-button @click="logVisible = false">取 消</el-button>
  70. <el-button type="primary" @click="exportSubmit">确 定</el-button>
  71. </span>
  72. </el-dialog>
  73. <el-dialog title="日志详情" :visible.sync="detailsVisible" width="40%" :before-close="detailsClose">
  74. <el-form ref="form" label-width="100px">
  75. <el-form-item label="日志类型">
  76. <span>{{detailsInfo.title}}</span>
  77. </el-form-item>
  78. <el-form-item label="请求方式">
  79. <span>{{detailsInfo.requestMethod}}</span>
  80. </el-form-item>
  81. <el-form-item label="后台地址">
  82. {{detailsInfo.url}}
  83. </el-form-item>
  84. <el-form-item label="请求地址">
  85. <span>{{detailsInfo.ip}}</span>
  86. </el-form-item>
  87. </el-form>
  88. <span slot="footer" class="dialog-footer">
  89. <el-button @click="detailsVisible = false">取 消</el-button>
  90. <el-button type="primary" @click="detailsVisible = false">确 定</el-button>
  91. </span>
  92. </el-dialog>
  93. <el-image-viewer v-if="imgsVisible" :on-close="closeImgViewer" :url-list="srcList" style="z-index: 9999" />
  94. </div>
  95. </template>
  96. <script>
  97. import {
  98. logList,
  99. delInfo,
  100. exportInfo
  101. } from '@/api/operationLog';
  102. export default {
  103. components: {
  104. 'el-image-viewer': () =>
  105. import('element-ui/packages/image/src/image-viewer'),
  106. },
  107. data() {
  108. return {
  109. tableData: [],
  110. //筛选
  111. searchkeyWord: '',
  112. //分页
  113. currentPage: 1,
  114. pageSize: 10,
  115. deptBudgetTotal: 0,
  116. deptCircularPage: {},
  117. search: '',
  118. //图片预览
  119. srcList: [],
  120. imgsVisible: false,
  121. //筛选时间
  122. startDate: '',
  123. endDate: '',
  124. value1: [],
  125. //批量
  126. musterList: [],
  127. //导出
  128. logVisible: false,
  129. formInfo: {},
  130. //详情
  131. detailsVisible: false,
  132. detailsInfo: {}
  133. };
  134. },
  135. mounted() {
  136. let now = new Date();
  137. let date1 = new Date().setTime(now.getTime() - 24 * 60 * 60 * 1000); //一天前的时间蹉
  138. let date = new Date().setTime(now.getTime());
  139. date1 = new Date(parseInt(date1))
  140. .toLocaleString()
  141. .split(' ')[0]
  142. .replaceAll('/', '-');
  143. console.log(date1);
  144. date = new Date(parseInt(date))
  145. .toLocaleString()
  146. .split(' ')[0]
  147. .replaceAll('/', '-');
  148. this.startDate =
  149. date1.split('-')[0] +
  150. '-' +
  151. (date1.split('-')[1] < 10 ?
  152. '0' + date1.split('-')[1] :
  153. date1.split('-')[1]) +
  154. '-' +
  155. (date1.split('-')[2] < 10 ?
  156. '0' + date1.split('-')[2] :
  157. date1.split('-')[2]);
  158. this.endDate =
  159. date.split('-')[0] +
  160. '-' +
  161. (date.split('-')[1] < 10 ?
  162. '0' + date.split('-')[1] :
  163. date.split('-')[1]) +
  164. '-' +
  165. (date.split('-')[2] < 10 ?
  166. '0' + date.split('-')[2] :
  167. date.split('-')[2]);
  168. this.value1 = [this.startDate, this.endDate];
  169. this.getList();
  170. },
  171. methods: {
  172. look(val) { //详情
  173. this.detailsInfo = val
  174. this.detailsVisible = true
  175. },
  176. handleClose() {
  177. this.logVisible = false;
  178. },
  179. detailsClose() {
  180. this.detailsVisible = false
  181. },
  182. async exportSubmit() {
  183. exportInfo({
  184. startDate: this.formInfo.startDate,
  185. endDate: this.formInfo.endDate,
  186. }).then((response) => {
  187. let blob = response.data;
  188. let a = document.createElement('a');
  189. //由于后台返回文件名称是通过response返回的
  190. //因此需要从response headers中content-disposition响应头中获取文件名称fileName,如上图所示
  191. // let headers = response.headers;
  192. // let fileName = headers["content-disposition"];
  193. // fileName = fileName.split('=')[1]
  194. //download是a标签的一个属性,可以自定义文件名称
  195. a.download = '日志记录.xlsx';
  196. let binaryData = [];
  197. binaryData.push(blob);
  198. // a.href = URL.createObjectURL(blob);
  199. a.href = window.URL.createObjectURL(new Blob(binaryData));
  200. document.body.appendChild(a);
  201. a.click();
  202. document.body.removeChild(a);
  203. });
  204. // const {
  205. // data
  206. // } = await exportInfo({
  207. // startDate: this.formInfo.startDate,
  208. // endDate: this.formInfo.endDate,
  209. // }, {}, {
  210. // responseType: "blob",
  211. // }).toPromise();
  212. // console.log(data)
  213. // downloadFile({
  214. // res: data,
  215. // fileName: `导出日志记录`,
  216. // type: "xls",
  217. // });
  218. },
  219. delBtn() {
  220. if (this.musterList.length == 0) {
  221. this.$message.error('请勾选操作的条目!');
  222. return;
  223. }
  224. this.$confirm('确定删除信息?', '提示', {
  225. confirmButtonText: '确定',
  226. cancelButtonText: '取消',
  227. type: 'warning',
  228. }).then(() => {
  229. delInfo({
  230. hyOperLogList: this.musterList
  231. }).then((response) => {
  232. if (response.code == 200) {
  233. this.$notify({
  234. title: '成功',
  235. message: '删除成功!',
  236. type: 'success',
  237. });
  238. this.getList();
  239. }
  240. });
  241. });
  242. },
  243. exportBtn() {
  244. this.logVisible = true;
  245. },
  246. dateChange(e) {
  247. this.startDate = e[0];
  248. this.endDate = e[1];
  249. this.getList();
  250. },
  251. closeImgViewer() {
  252. this.srcList = [];
  253. this.imgsVisible = false;
  254. },
  255. enlarge(url) {
  256. this.imgsVisible = true;
  257. this.srcList.push(url);
  258. },
  259. getList() {
  260. this.listLoading = true;
  261. let _obj = {};
  262. _obj.currentPage = this.currentPage;
  263. _obj.pageSize = this.pageSize;
  264. _obj.searchKeyWord = this.searchkeyWord;
  265. _obj.startDate = this.startDate;
  266. _obj.endDate = this.endDate;
  267. logList(_obj)
  268. .then((response) => {
  269. this.tableData = response.data.records;
  270. for (let i = 0; i < this.tableData.length; i++) {
  271. this.tableData[i].iconShow = true;
  272. }
  273. this.deptBudgetTotal = response.data.total;
  274. this.listLoading = false;
  275. })
  276. .catch(() => {
  277. this.listLoading = false;
  278. });
  279. },
  280. searchBtn(num) {
  281. this.search = num;
  282. this.getList();
  283. },
  284. find() {
  285. this.currentPage = 1
  286. this.getList();
  287. },
  288. selectInit() {
  289. return true;
  290. },
  291. handleRowClick(row) {
  292. return true;
  293. },
  294. handleSelectionChange(val) {
  295. this.musterList = val;
  296. console.log(this.musterList);
  297. },
  298. handleSizeChange(val) {
  299. console.log(`每页 ${val} 条`);
  300. this.pageSize = val;
  301. this.getList();
  302. },
  303. handleCurrentChange(val) {
  304. this.currentPage = val;
  305. console.log(`当前页: ${val}`);
  306. this.getList();
  307. },
  308. },
  309. };
  310. </script>
  311. <style lang="scss" scoped>
  312. .center {
  313. padding: 10px 20px;
  314. background: #f5f6f7;
  315. min-height: calc(100vh - 50px);
  316. .top_css {
  317. min-width: 1020px;
  318. padding: 10px;
  319. .batch_text {
  320. font-size: 22px;
  321. margin-right: 10px;
  322. }
  323. .top_btn {
  324. margin-right: 10px;
  325. }
  326. }
  327. .ask_css {
  328. position: absolute;
  329. margin: 3px 0 0 10px;
  330. }
  331. .center_css {
  332. background: #ffffff;
  333. border-radius: 1px;
  334. margin-top: 10px;
  335. padding-bottom: 10px;
  336. }
  337. .screen {
  338. // float: right;
  339. display: flex;
  340. .search {
  341. width: 40px;
  342. height: 40px;
  343. background: #2f53eb;
  344. border-radius: 0px 2px 2px 0px;
  345. border: 1px solid #dcdfe6;
  346. margin-left: -1px;
  347. }
  348. .count_css {
  349. width: 80px;
  350. text-align: center;
  351. line-height: 40px;
  352. color: #666666;
  353. min-width: 80px;
  354. }
  355. }
  356. .el-button {
  357. padding: 10px 20px !important;
  358. }
  359. .center_css {
  360. ::v-deep .el-table th,
  361. ::v-deep .el-table td {
  362. text-align: center;
  363. }
  364. .fujian {
  365. font-size: 24px;
  366. color: #409eff;
  367. }
  368. .warning {
  369. font-size: 14px;
  370. color: #ed1d1d;
  371. }
  372. }
  373. }
  374. ::v-deep .el-table--border .el-table__header th {
  375. background: #f7f8f9;
  376. }
  377. .btn_css {
  378. color: #409eff;
  379. cursor: pointer;
  380. }
  381. .btn_css1 {
  382. margin-left: -20px;
  383. }
  384. </style>