logManagement.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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. <i class="el-icon-tickets"></i>数据列表</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 date = new Date();
  137. let date1 = new Date().setTime(date.getTime() - 24 * 60 * 60 * 1000); //一天前的时间蹉
  138. date1 = new Date(parseInt(date1))
  139. .toLocaleString()
  140. .split(" ")[0]
  141. .replaceAll("/", "-");
  142. console.log(date1);
  143. this.startDate =
  144. date1.split("-")[0] +
  145. "-" +
  146. (date1.split("-")[1] < 10 ?
  147. "0" + date1.split("-")[1] :
  148. date1.split("-")[1]) +
  149. "-" +
  150. (date1.split("-")[2] < 10 ?
  151. "0" + date1.split("-")[2] :
  152. date1.split("-")[2]);
  153. this.endDate =
  154. date.getFullYear() +
  155. "-" +
  156. (date.getMonth() + 1 < 10 ?
  157. "0" + (date.getMonth() + 1) :
  158. date.getMonth()) +
  159. "-" +
  160. (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()); //當前時間
  161. this.value1 = [this.startDate, this.endDate];
  162. this.getList();
  163. },
  164. methods: {
  165. look(val) { //详情
  166. this.detailsInfo = val
  167. this.detailsVisible = true
  168. },
  169. handleClose() {
  170. this.logVisible = false;
  171. },
  172. detailsClose() {
  173. this.detailsVisible = false
  174. },
  175. async exportSubmit() {
  176. exportInfo({
  177. startDate: this.formInfo.startDate,
  178. endDate: this.formInfo.endDate,
  179. }).then((response) => {
  180. let blob = response.data;
  181. let a = document.createElement("a");
  182. //由于后台返回文件名称是通过response返回的
  183. //因此需要从response headers中content-disposition响应头中获取文件名称fileName,如上图所示
  184. // let headers = response.headers;
  185. // let fileName = headers["content-disposition"];
  186. // fileName = fileName.split('=')[1]
  187. //download是a标签的一个属性,可以自定义文件名称
  188. a.download = "日志记录.xlsx";
  189. let binaryData = [];
  190. binaryData.push(blob);
  191. // a.href = URL.createObjectURL(blob);
  192. a.href = window.URL.createObjectURL(new Blob(binaryData));
  193. document.body.appendChild(a);
  194. a.click();
  195. document.body.removeChild(a);
  196. });
  197. // const {
  198. // data
  199. // } = await exportInfo({
  200. // startDate: this.formInfo.startDate,
  201. // endDate: this.formInfo.endDate,
  202. // }, {}, {
  203. // responseType: "blob",
  204. // }).toPromise();
  205. // debugger
  206. // console.log(data)
  207. // downloadFile({
  208. // res: data,
  209. // fileName: `导出日志记录`,
  210. // type: "xls",
  211. // });
  212. },
  213. delBtn() {
  214. if (this.musterList.length == 0) {
  215. this.$message.error("请勾选操作的条目!");
  216. return;
  217. }
  218. this.$confirm("确定删除信息?", "提示", {
  219. confirmButtonText: "确定",
  220. cancelButtonText: "取消",
  221. type: "warning",
  222. }).then(() => {
  223. delInfo({
  224. hyOperLogList: this.musterList
  225. }).then((response) => {
  226. if (response.code == 200) {
  227. this.$notify({
  228. title: "成功",
  229. message: "删除成功!",
  230. type: "success",
  231. });
  232. this.getList();
  233. }
  234. });
  235. });
  236. },
  237. exportBtn() {
  238. this.logVisible = true;
  239. },
  240. dateChange(e) {
  241. this.startDate = e[0];
  242. this.endDate = e[1];
  243. this.getList();
  244. },
  245. closeImgViewer() {
  246. this.srcList = [];
  247. this.imgsVisible = false;
  248. },
  249. enlarge(url) {
  250. this.imgsVisible = true;
  251. this.srcList.push(url);
  252. },
  253. getList() {
  254. this.listLoading = true;
  255. let _obj = {};
  256. _obj.currentPage = this.currentPage;
  257. _obj.pageSize = this.pageSize;
  258. _obj.searchKeyWord = this.searchkeyWord;
  259. _obj.startDate = this.startDate;
  260. _obj.endDate = this.endDate;
  261. logList(_obj)
  262. .then((response) => {
  263. this.tableData = response.data.records;
  264. for (let i = 0; i < this.tableData.length; i++) {
  265. this.tableData[i].iconShow = true;
  266. }
  267. this.deptBudgetTotal = response.data.total;
  268. this.listLoading = false;
  269. })
  270. .catch(() => {
  271. this.listLoading = false;
  272. });
  273. },
  274. searchBtn(num) {
  275. this.search = num;
  276. this.getList();
  277. },
  278. find() {
  279. this.getList();
  280. },
  281. selectInit() {
  282. return true;
  283. },
  284. handleRowClick(row) {
  285. return true;
  286. },
  287. handleSelectionChange(val) {
  288. this.musterList = val;
  289. console.log(this.musterList);
  290. },
  291. handleSizeChange(val) {
  292. console.log(`每页 ${val} 条`);
  293. this.pageSize = val;
  294. this.getList();
  295. },
  296. handleCurrentChange(val) {
  297. this.currentPage = val;
  298. console.log(`当前页: ${val}`);
  299. this.getList();
  300. },
  301. },
  302. };
  303. </script>
  304. <style lang="scss" scoped>
  305. .center {
  306. padding: 10px 20px;
  307. background: #f5f6f7;
  308. height: calc(100vh - 5vh);
  309. .top_css {
  310. min-width: 1020px;
  311. padding: 10px;
  312. .batch_text {
  313. font-size: 22px;
  314. margin-right: 10px;
  315. }
  316. .top_btn {
  317. margin-right: 10px;
  318. }
  319. }
  320. .ask_css {
  321. position: absolute;
  322. margin: 3px 0 0 10px;
  323. }
  324. .center_css {
  325. background: #ffffff;
  326. border-radius: 1px;
  327. margin-top: 10px;
  328. padding-bottom: 10px;
  329. }
  330. .screen {
  331. // float: right;
  332. display: flex;
  333. .search {
  334. width: 40px;
  335. height: 40px;
  336. background: #2f53eb;
  337. border-radius: 0px 2px 2px 0px;
  338. border: 1px solid #dcdfe6;
  339. margin-left: -1px;
  340. }
  341. .count_css {
  342. width: 80px;
  343. text-align: center;
  344. line-height: 40px;
  345. color: #666666;
  346. min-width: 80px;
  347. }
  348. }
  349. .el-button {
  350. padding: 10px 20px !important;
  351. }
  352. .center_css {
  353. ::v-deep .el-table th,
  354. ::v-deep .el-table td {
  355. text-align: center;
  356. }
  357. .fujian {
  358. font-size: 24px;
  359. color: #409eff;
  360. }
  361. .warning {
  362. font-size: 14px;
  363. color: #ed1d1d;
  364. }
  365. }
  366. }
  367. ::v-deep .el-table--border .el-table__header th {
  368. background: #f7f8f9;
  369. }
  370. .btn_css {
  371. color: #409eff;
  372. cursor: pointer;
  373. }
  374. .btn_css1 {
  375. margin-left: -20px;
  376. }
  377. </style>