9f4fba2ef1a4ee802f79206491748de4.json 18 KB

1
  1. {"remainingRequest":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\system\\maintain\\systemDatabackup\\index.vue?vue&type=style&index=0&id=516cf2e6&lang=scss&scoped=true","dependencies":[{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\system\\maintain\\systemDatabackup\\index.vue","mtime":1761185180218},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\css-loader\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\postcss-loader\\src\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\sass-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQo6OnYtZGVlcCAuZWwtdGFic19faXRlbSB7DQogIGhlaWdodDogNTRweCAhaW1wb3J0YW50Ow0KICBsaW5lLWhlaWdodDogNTRweCAhaW1wb3J0YW50Ow0KfQ0KLnRhYmxlQm94IDo6di1kZWVwIC5pdnUtdGFibGUtaGVhZGVyIHRhYmxlIHsNCiAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7DQp9DQoudGFibGUtbWFyayB7DQogIGN1cnNvcjogdGV4dDsNCn0NCi50YWJsZS1tYXJrOmhvdmVyIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2MyYzJjMjsNCiAgcGFkZGluZzogM3B4IDVweDsNCn0NCi5tYXJrIDo6di1kZWVwIC5pdnUtaW5wdXQgew0KICBiYWNrZ3JvdW5kOiAjZmZmOw0KICBib3JkZXItcmFkaXVzOiAwLjM5cmVtOw0KfQ0KLm1hcmsgOjp2LWRlZXAgLml2dS1pbnB1dCwNCi5pdnUtaW5wdXQ6aG92ZXIsDQouaXZ1LWlucHV0OmZvY3VzIHsNCiAgYm9yZGVyOiB0cmFuc3BhcmVudDsNCiAgYm94LXNoYWRvdzogbm9uZTsNCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AA2bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/pages/system/maintain/systemDatabackup","sourcesContent":["<template>\r\n <div>\r\n <el-card :bordered=\"false\" :body-style=\"{ padding: '0 20px 20px' }\">\r\n <el-tabs>\r\n <el-tab-pane label=\"数据库列表\">\r\n <!-- <el-card :bordered=\"false\" shadow=\"never\" class=\"tableBox\">-->\r\n <div class=\"mb10\">\r\n <!-- <span class=\"ivu-pl-8 mr10\">数据库表列表</span>-->\r\n <el-button v-db-click @click=\"getBackup\">备份</el-button>\r\n <el-button v-db-click @click=\"getOptimize\">优化表</el-button>\r\n <el-button v-db-click @click=\"getRepair\">修复表</el-button>\r\n <el-button v-db-click @click=\"exportData(1)\">导出文件</el-button>\r\n </div>\r\n <el-table\r\n ref=\"selection\"\r\n :data=\"tabList2\"\r\n v-loading=\"loading\"\r\n empty-text=\"暂无数据\"\r\n @select=\"onSelectTab\"\r\n @select-all=\"onSelectTab\"\r\n class=\"mt14\"\r\n >\r\n <el-table-column type=\"selection\" width=\"55\"> </el-table-column>\r\n <el-table-column label=\"表名称\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.name }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"备注\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <div class=\"mark\">\r\n <div v-if=\"scope.row.is_edit\" class=\"table-mark\" v-db-click @click=\"isEditMark(scope.row)\">\r\n {{ scope.row.comment }}\r\n </div>\r\n <el-input ref=\"mark\" v-else v-model=\"scope.row.comment\" @blur=\"isEditBlur(scope.row, 0)\"></el-input>\r\n </div>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"类型\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.engine }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"大小\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.data_length }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"更新时间\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.update_time }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"行数\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.rows }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" fixed=\"right\" width=\"70\">\r\n <template slot-scope=\"scope\">\r\n <a v-db-click @click=\"Info(scope.row)\">详情</a>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <!-- </el-card>-->\r\n <!-- 详情模态框-->\r\n <el-drawer\r\n :visible.sync=\"modals\"\r\n :wrapperClosable=\"false\"\r\n :size=\"740\"\r\n :title=\"'[ ' + rows.name + ' ]' + rows.comment\"\r\n >\r\n <el-table\r\n ref=\"selection\"\r\n :data=\"tabList3\"\r\n v-loading=\"loading2\"\r\n empty-text=\"暂无数据\"\r\n max-height=\"600\"\r\n size=\"small\"\r\n >\r\n <el-table-column label=\"字段名\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.COLUMN_NAME }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"数据类型\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.COLUMN_TYPE }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"默认值\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.COLUMN_DEFAULT }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"允许非空\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.IS_NULLABLE }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"自动递增\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.EXTRA }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"备注\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <div class=\"mark\">\r\n <div v-if=\"scope.row.is_edit\" class=\"table-mark\" v-db-click @click=\"isEditMark(scope.row)\">\r\n {{ scope.row.COLUMN_COMMENT }}\r\n </div>\r\n <el-input\r\n ref=\"mark\"\r\n v-else\r\n v-model=\"scope.row.COLUMN_COMMENT\"\r\n @blur=\"isEditBlur(scope.row, 1)\"\r\n ></el-input>\r\n </div>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-drawer>\r\n </el-tab-pane>\r\n <el-tab-pane label=\"备份列表\">\r\n <el-table\r\n ref=\"selection\"\r\n :data=\"tabList\"\r\n v-loading=\"loading3\"\r\n empty-text=\"暂无数据\"\r\n highlight-current-row\r\n size=\"small\"\r\n >\r\n <el-table-column label=\"备份名称\" min-width=\"200\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.filename }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"part\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.part }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"大小\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.size }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"compress\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.compress }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"时间\" min-width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.backtime }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" fixed=\"right\" width=\"140\">\r\n <template slot-scope=\"scope\">\r\n <a v-db-click @click=\"ImportFile(scope.row)\">导入</a>\r\n <el-divider direction=\"vertical\"></el-divider>\r\n <a v-db-click @click=\"del(scope.row, '删除该备份', scope.$index)\">删除</a>\r\n <el-divider direction=\"vertical\"></el-divider>\r\n <a v-db-click @click=\"download(scope.row)\">下载</a>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-tab-pane>\r\n </el-tabs>\r\n </el-card>\r\n <el-dialog :visible.sync=\"markModal\" width=\"470px\" title=\"修改备注\" @closed=\"cancel\">\r\n <el-input v-model=\"mark\"></el-input>\r\n <span slot=\"footer\" class=\"dialog-footer\">\r\n <el-button v-db-click @click=\"cancel\">取 消</el-button>\r\n <el-button type=\"primary\" v-db-click @click=\"ok\">确 定</el-button>\r\n </span>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n backupListApi,\r\n backupReadListApi,\r\n backupBackupApi,\r\n backupOptimizeApi,\r\n backupRepairApi,\r\n filesListApi,\r\n filesDownloadApi,\r\n filesImportApi,\r\n updateMark,\r\n} from '@/api/system';\r\nimport Setting from '@/setting';\r\nimport { getCookies } from '@/libs/util';\r\n\r\nexport default {\r\n name: 'systemDatabackup',\r\n data() {\r\n return {\r\n modals: false,\r\n loading: false,\r\n tabList: [],\r\n tabList2: [],\r\n selectionList: [],\r\n tabList3: [],\r\n rows: {},\r\n dataList: {},\r\n loading2: false,\r\n loading3: false,\r\n markModal: false,\r\n mark: '',\r\n header: {},\r\n Token: '',\r\n changeMarkData: {\r\n table: '',\r\n mark: '',\r\n type: '',\r\n field: '',\r\n },\r\n };\r\n },\r\n computed: {\r\n fileUrl() {\r\n const search = '/adminapi/';\r\n const start = Setting.apiBaseURL.indexOf(search);\r\n return Setting.apiBaseURL.substring(0, start); // 截取字符串\r\n },\r\n },\r\n created() {\r\n this.getToken();\r\n this.getList();\r\n this.getfileList();\r\n },\r\n methods: {\r\n editMark(row, type) {\r\n this.changeMarkData.table = row.name || row.TABLE_NAME;\r\n this.changeMarkData.field = row.COLUMN_NAME || '';\r\n this.changeMarkData.type = row.COLUMN_TYPE || '';\r\n this.changeMarkData.is_field = type;\r\n this.markModal = true;\r\n },\r\n ok() {\r\n this.changeMarkData.mark = this.mark;\r\n updateMark(this.changeMarkData).then((res) => {\r\n this.$message.success(res.msg);\r\n if (this.changeMarkData.is_field) {\r\n this.Info({ name: this.changeMarkData.table, comment: this.rows.comment });\r\n } else {\r\n this.getList();\r\n }\r\n });\r\n },\r\n cancel() {\r\n this.mark = '';\r\n },\r\n // 导入\r\n ImportFile(row) {\r\n filesImportApi({\r\n part: row.part,\r\n time: row.time,\r\n })\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n this.getfileList();\r\n })\r\n .catch((res) => {\r\n this.loading = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 删除备份记录表\r\n del(row, tit, num) {\r\n let delfromData = {\r\n title: tit,\r\n num: num,\r\n url: `system/backup/del_file`,\r\n method: 'DELETE',\r\n ids: {\r\n filename: row.time,\r\n },\r\n };\r\n this.$modalSure(delfromData)\r\n .then((res) => {\r\n this.$message.success(res.msg);\r\n this.tabList.splice(num, 1);\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 上传头部token\r\n getToken() {\r\n this.Token = getCookies('token');\r\n },\r\n download(row) {\r\n let data = {\r\n time: row.time,\r\n };\r\n filesDownloadApi(data)\r\n .then((res) => {\r\n if (res.data.key) {\r\n window.open(Setting.apiBaseURL + '/download?key=' + res.data.key);\r\n }\r\n })\r\n .catch((res) => {\r\n this.$message.error(res);\r\n });\r\n },\r\n // 导出备份记录表\r\n exportData() {\r\n const columns = this.columns.slice(1, 7);\r\n this.$refs.selection.exportCsv({\r\n filename: '导出',\r\n columns: columns,\r\n data: this.tabList2,\r\n });\r\n },\r\n // 全选\r\n onSelectTab(selection) {\r\n this.selectionList = selection;\r\n let tables = [];\r\n this.selectionList.map((item) => {\r\n tables.push(item.name);\r\n });\r\n this.dataList = {\r\n tables: tables.join(','),\r\n };\r\n },\r\n // 备份表\r\n getBackup() {\r\n if (this.selectionList.length === 0) {\r\n return this.$message.warning('请选择表');\r\n }\r\n backupBackupApi(this.dataList)\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n this.getfileList();\r\n })\r\n .catch((res) => {\r\n this.loading = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 备份记录表列表\r\n getfileList() {\r\n this.loading3 = true;\r\n filesListApi()\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tabList = data.list;\r\n this.loading3 = false;\r\n })\r\n .catch((res) => {\r\n this.loading3 = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 优化表\r\n getOptimize() {\r\n if (this.selectionList.length === 0) {\r\n return this.$message.warning('请选择表');\r\n }\r\n backupOptimizeApi(this.dataList)\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 修复表\r\n getRepair() {\r\n if (this.selectionList.length === 0) {\r\n return this.$message.warning('请选择表');\r\n }\r\n backupRepairApi(this.dataList)\r\n .then(async (res) => {\r\n this.$message.success(res.msg);\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 数据库列表\r\n getList() {\r\n this.loading = true;\r\n backupListApi()\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tabList2 = data.list;\r\n this.loading = false;\r\n })\r\n .catch((res) => {\r\n this.loading = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 详情\r\n Info(row) {\r\n this.rows = row;\r\n this.modals = true;\r\n this.loading2 = true;\r\n let data = {\r\n tablename: row.name,\r\n };\r\n backupReadListApi(data)\r\n .then(async (res) => {\r\n let data = res.data;\r\n this.tabList3 = data.list;\r\n this.loading2 = false;\r\n })\r\n .catch((res) => {\r\n this.loading2 = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n isEditMark(row) {\r\n row.is_edit = true;\r\n this.$nextTick((e) => {\r\n this.$refs.mark.focus();\r\n });\r\n },\r\n isEditBlur(row, type) {\r\n row.is_edit = false;\r\n this.changeMarkData.table = row.name || row.TABLE_NAME;\r\n this.changeMarkData.field = row.COLUMN_NAME || '';\r\n this.changeMarkData.type = row.COLUMN_TYPE || '';\r\n this.changeMarkData.is_field = type;\r\n this.changeMarkData.mark = type ? row.COLUMN_COMMENT : row.comment;\r\n\r\n updateMark(this.changeMarkData)\r\n .then((res) => {\r\n // this.$message.success(res.msg);\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n },\r\n },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n::v-deep .el-tabs__item {\r\n height: 54px !important;\r\n line-height: 54px !important;\r\n}\r\n.tableBox ::v-deep .ivu-table-header table {\r\n border: none !important;\r\n}\r\n.table-mark {\r\n cursor: text;\r\n}\r\n.table-mark:hover {\r\n border: 1px solid #c2c2c2;\r\n padding: 3px 5px;\r\n}\r\n.mark ::v-deep .ivu-input {\r\n background: #fff;\r\n border-radius: 0.39rem;\r\n}\r\n.mark ::v-deep .ivu-input,\r\n.ivu-input:hover,\r\n.ivu-input:focus {\r\n border: transparent;\r\n box-shadow: none;\r\n}\r\n</style>\r\n"]}]}