From 37b2ad396fb472dbacbc0d928595f4d64f0c2395 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Wed, 20 Aug 2025 22:22:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 9 + package-lock.json | 181 ++++++++++++++ package.json | 1 + src/api/dbm.ts | 96 +++++++ src/components/menu.ts | 6 + src/router/index.ts | 10 + src/store/permiss.ts | 1 + src/types/dbm.ts | 17 ++ src/utils/requst_tx_vp.ts | 93 +++++++ src/views/system/db-manage.vue | 440 +++++++++++++++++++++++++++++++++ yarn.lock | 148 ++++++++++- 11 files changed, 998 insertions(+), 4 deletions(-) create mode 100644 src/api/dbm.ts create mode 100644 src/types/dbm.ts create mode 100644 src/utils/requst_tx_vp.ts create mode 100644 src/views/system/db-manage.vue diff --git a/components.d.ts b/components.d.ts index 19dd236..88e77ff 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,11 +8,13 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { Countup: typeof import('./src/components/countup.vue')['default'] + ElAside: typeof import('element-plus/es')['ElAside'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElButton: typeof import('element-plus/es')['ElButton'] ElCard: typeof import('element-plus/es')['ElCard'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCol: typeof import('element-plus/es')['ElCol'] + ElContainer: typeof import('element-plus/es')['ElContainer'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] @@ -26,12 +28,15 @@ declare module '@vue/runtime-core' { ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] + ElLink: typeof import('element-plus/es')['ElLink'] + ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] ElProgress: typeof import('element-plus/es')['ElProgress'] ElRow: typeof import('element-plus/es')['ElRow'] + ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] @@ -42,6 +47,7 @@ declare module '@vue/runtime-core' { ElTimeline: typeof import('element-plus/es')['ElTimeline'] ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] + ElTree: typeof import('element-plus/es')['ElTree'] ElUpload: typeof import('element-plus/es')['ElUpload'] Header: typeof import('./src/components/header.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] @@ -55,4 +61,7 @@ declare module '@vue/runtime-core' { Upload_file2: typeof import('./src/components/upload_file2.vue')['default'] UploadFile: typeof import('./src/components/upload-file.vue')['default'] } + export interface ComponentCustomProperties { + vLoading: typeof import('element-plus/es')['ElLoadingDirective'] + } } diff --git a/package-lock.json b/package-lock.json index 522e9e1..04328ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "dompurify": "^3.2.4", "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", + "el-table-horizontal-scroll": "^1.2.5", "element-plus": "^2.6.3", "highlight.js": "^11.11.1", "js-md5": "^0.8.3", @@ -1578,6 +1579,32 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1775,6 +1802,16 @@ "proto-list": "~1.2.1" } }, + "node_modules/core-js": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", + "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cose-base": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", @@ -2371,6 +2408,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", @@ -2490,6 +2535,80 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/el-table-horizontal-scroll": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/el-table-horizontal-scroll/-/el-table-horizontal-scroll-1.2.5.tgz", + "integrity": "sha512-2Ays+8skp64Yl5YE2Kpa/9lJ720jPn1ooNSc2LKiF0ECiXPEoBZ5hhd144Inp1JATs5of4YzNwNd9L/Xy397GQ==", + "dependencies": { + "core-js": "^3.6.5", + "element-ui": "^2.15.6", + "lodash": "^4.17.21", + "throttle-debounce": "^5.0.0", + "vue": "^2.6.11", + "vue-route": "^1.5.1", + "vue-router": "^3.5.3" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", + "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", + "dependencies": { + "babel-runtime": "6.x" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/element-ui": { + "version": "2.15.14", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz", + "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==", + "dependencies": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + }, + "peerDependencies": { + "vue": "^2.5.17" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/element-ui/node_modules/throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", + "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/vue": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "dependencies": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + }, + "node_modules/el-table-horizontal-scroll/node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" + }, "node_modules/element-plus": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.0.tgz", @@ -3346,6 +3465,11 @@ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4445,6 +4569,11 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + }, "node_modules/normalize-wheel-es": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", @@ -4468,6 +4597,14 @@ "quansync": "^0.2.7" } }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, "node_modules/path-data-parser": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", @@ -4502,6 +4639,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg==", + "dependencies": { + "isarray": "0.0.1" + } + }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -4636,6 +4781,21 @@ "url": "https://opencollective.com/preact" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -4719,6 +4879,11 @@ "resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz", "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5107,6 +5272,14 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", @@ -5583,6 +5756,14 @@ } } }, + "node_modules/vue-route": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/vue-route/-/vue-route-1.5.1.tgz", + "integrity": "sha512-RoeEWvSTk/Zasjx11En4XPyE1jXwuFQ4Itr4fzh1TOSMYefUddhhlHXmAGFFPn37J1YrEymm6sU/3IRTyu23Aw==", + "dependencies": { + "page": "^1.5.0" + } + }, "node_modules/vue-router": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz", diff --git a/package.json b/package.json index 2b24d4f..5cf6d93 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dompurify": "^3.2.4", "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", + "el-table-horizontal-scroll": "^1.2.5", "element-plus": "^2.6.3", "highlight.js": "^11.11.1", "js-md5": "^0.8.3", diff --git a/src/api/dbm.ts b/src/api/dbm.ts new file mode 100644 index 0000000..2dd60dc --- /dev/null +++ b/src/api/dbm.ts @@ -0,0 +1,96 @@ +import request from '@/utils/requst_tx_vp'; + + // dbm := router.Group("/dbm") + + // dbm.POST("/run_sql", RunSQLHandler) // 运行SQL语句 + // dbm.POST("/create_db_manage", CreateDBManageHandler) // 创建数据库管理 + // dbm.POST("/get_db_manage", GetDBManageHandler) // 获取数据库管理信息 + // dbm.POST("/get_sql_history", GetSQLRunHistoryHandler) // 获取SQL运行历史 + // dbm.POST("/update_db_manage", UpdateDBManageHandler) // 更新数据库管理信息 + +export const FindDBManageListService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + if(key == "token"){ + continue; + } + params.append(key, Data[key]) + + } + return request.post('/dbm/get_db_manage', params,{ + + headers: { + + 'token': Data.token, //token + + } + + }) +} + +export const AddDBManageService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + if(key == "token"){ + continue; + } + params.append(key, Data[key]) + + } + return request.post('/dbm/create_db_manage', params,{ + headers: { + 'token': Data.token, //token + + } + }) +} + +export const UpdateDBManageService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + if(key == "token"){ + continue; + } + params.append(key, Data[key]) + + } + return request.post('/dbm/update_db_manage', params,{ + headers: { + 'token': Data.token, //token + + } + }) +} + +export const RunSQLService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + if(key == "token"){ + continue; + } + params.append(key, Data[key]) + } + return request.post('/dbm/run_sql', params,{ + headers: { + 'token': Data.token, //token + + } + }) +} + +export const GetSQLRunHistoryService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + if(key == "token"){ + continue; + } + params.append(key, Data[key]) + + } + return request.post('/dbm/get_sql_history', params,{ + headers: { + 'token': Data.token, //token + + } + }) +} \ No newline at end of file diff --git a/src/components/menu.ts b/src/components/menu.ts index 0482598..86ca8c8 100644 --- a/src/components/menu.ts +++ b/src/components/menu.ts @@ -238,6 +238,12 @@ export const menuData: Menus[] = [ index: '/project-select', title: '项目选择', }, + { + id: '72', + icon: 'ChatDotSquare', + index: '/db-manage', + title: '数据库管理工具', + }, { id: '6', icon: 'DocumentAdd', diff --git a/src/router/index.ts b/src/router/index.ts index 31eea60..f86df9c 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -96,6 +96,16 @@ const routes: RouteRecordRaw[] = [ }, component: () => import(/* webpackChunkName: "project-select" */ '../views/system/project-select.vue'), + }, + { + path: '/db-manage', + name: 'db-manage', + meta: { + title: '数据库管理工具', + permiss: '72', + }, + component: () => import(/* webpackChunkName: "project-select" */ '../views/system/db-manage.vue'), + }, { path: '/callback', diff --git a/src/store/permiss.ts b/src/store/permiss.ts index 46574a0..dfa6465 100644 --- a/src/store/permiss.ts +++ b/src/store/permiss.ts @@ -57,6 +57,7 @@ export const usePermissStore = defineStore("permiss", { "58", //知识库管理 "59", //项目选择 "71", //用户功能管理 + "72" //数据库管理工具 ], user: ["0", "8", "7", "9", "51" ,"53","55" ,"56", "57", "58", "59", "61", "71"], }, diff --git a/src/types/dbm.ts b/src/types/dbm.ts new file mode 100644 index 0000000..01c03a6 --- /dev/null +++ b/src/types/dbm.ts @@ -0,0 +1,17 @@ + +export interface DatabaseConfig { + ID: number; + CreatedAt: string; + UpdatedAt: string; + DeletedAt: null; + UserID: number; + DB_IP: string; + DB_Port: number; + DB_NAME: string; + DB_User: string; + DB_Password: string; + DB_Type: number; + DB_Desc: string; + DB_STATUS: number; + Name: string; +} \ No newline at end of file diff --git a/src/utils/requst_tx_vp.ts b/src/utils/requst_tx_vp.ts new file mode 100644 index 0000000..02eaa5d --- /dev/null +++ b/src/utils/requst_tx_vp.ts @@ -0,0 +1,93 @@ +import axios from "axios"; +import router from "@/router/index.js"; +import { ElMessage } from 'element-plus'; +//const baseURL = "https://gep.ljsea.top/"; +const baseURL = "https://tx.ljsea.top/"; +//const baseURL= "http://localhost:8084"; +//const baseURL="https://pm.ljsea.top"; +//const baseURL = "https://gep.ljsea.xyz/"; + +let isRefreshing = false; +let requests = []; + +const request = axios.create({ + baseURL: baseURL, +}); + +// 请求拦截器 - 添加token +request.interceptors.request.use( + config => { + const token = localStorage.getItem("token"); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + config.headers.token = token; + } + return config; + } +); + +// 响应拦截器 +request.interceptors.response.use( + result => { + if(result.status !== 200) { + router.push("/login"); + } + + if(result.data.message === "NOT_LOGIN" || [2, 3, 4].includes(result.data.code)) { + // 检测到token过期 + if (isRefreshing == false) { + isRefreshing = true; + // 这里需要替换为实际的refresh token请求 + return axios.post('https://uc.ljsea.top/user/refresh_token', { + refresh_token: localStorage.getItem("refresh_token") + },{ + headers: { + 'Authorization': `Bearer ${localStorage.getItem("refresh_token")}` + } + }).then(res => { + const token = res.data["data"]["access_token"]; + localStorage.setItem("token", token); + //alert("token: " + token); + + // 重试所有挂起的请求 + requests.forEach(cb => cb(token)); + requests = []; + isRefreshing = false; + + // 重试当前请求 + const config = result.config; + config.headers.Authorization = `Bearer ${token}`; + return request(config); + }).catch(err => { + // 刷新token失败,跳转登录 + ElMessage.error('登录已过期,请重新登录!'); + router.push("/login"); + return Promise.reject(err); + }); + } else if (isRefreshing) { + // 正在刷新token,将请求放入队列 + return new Promise(resolve => { + requests.push(token => { + //alert("new token: " + token); + result.config.headers.Authorization = `Bearer ${token}`; + result.config.headers.token = token; + resolve(request(result.config)); + }); + }); + } + } + + if(result.data.code == 7) { + ElMessage.error('该用户已存在,请重新输入!'); + return null; + } + + if(result.data.code == 1) { + ElMessage.error('请求失败,请稍后重试!'); + } else { + return result.data; + } + } +); + +export default request; \ No newline at end of file diff --git a/src/views/system/db-manage.vue b/src/views/system/db-manage.vue new file mode 100644 index 0000000..df36cfd --- /dev/null +++ b/src/views/system/db-manage.vue @@ -0,0 +1,440 @@ + + + + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 5a1b7f3..aa04fce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,7 +28,7 @@ resolved "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz" integrity sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ== -"@babel/parser@^7.15.8", "@babel/parser@^7.23.9": +"@babel/parser@^7.15.8", "@babel/parser@^7.23.5", "@babel/parser@^7.23.9": version "7.24.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz" integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== @@ -835,6 +835,17 @@ postcss "^8.4.35" source-map-js "^1.0.2" +"@vue/compiler-sfc@2.7.16": + version "2.7.16" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz" + integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== + dependencies: + "@babel/parser" "^7.23.5" + postcss "^8.4.14" + source-map "^0.6.1" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + "@vue/compiler-ssr@3.4.21": version "3.4.21" resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz" @@ -1040,6 +1051,13 @@ async-validator@^4.2.5: resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== +async-validator@~1.8.1: + version "1.8.5" + resolved "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz" + integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA== + dependencies: + babel-runtime "6.x" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -1054,6 +1072,19 @@ axios@^1.6.3: form-data "^4.0.0" proxy-from-env "^1.1.0" +babel-helper-vue-jsx-merge-props@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz" + integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== + +babel-runtime@6.x: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -1224,6 +1255,16 @@ config-chain@^1.1.13: ini "^1.3.4" proto-list "~1.2.1" +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.6.5: + version "3.45.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz" + integrity sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA== + cose-base@^1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz" @@ -1280,7 +1321,7 @@ cssfilter@0.0.10: resolved "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz" integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== -csstype@^3.1.3: +csstype@^3.1.0, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1649,6 +1690,11 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" +deepmerge@^1.2.0: + version "1.5.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + delaunator@5: version "5.0.1" resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" @@ -1733,6 +1779,19 @@ editorconfig@^1.0.4: minimatch "9.0.1" semver "^7.5.3" +el-table-horizontal-scroll@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/el-table-horizontal-scroll/-/el-table-horizontal-scroll-1.2.5.tgz" + integrity sha512-2Ays+8skp64Yl5YE2Kpa/9lJ720jPn1ooNSc2LKiF0ECiXPEoBZ5hhd144Inp1JATs5of4YzNwNd9L/Xy397GQ== + dependencies: + core-js "^3.6.5" + element-ui "^2.15.6" + lodash "^4.17.21" + throttle-debounce "^5.0.0" + vue "^2.6.11" + vue-route "^1.5.1" + vue-router "^3.5.3" + element-plus@^2.6.3: version "2.7.0" resolved "https://registry.npmjs.org/element-plus/-/element-plus-2.7.0.tgz" @@ -1754,6 +1813,18 @@ element-plus@^2.6.3: memoize-one "^6.0.0" normalize-wheel-es "^1.2.0" +element-ui@^2.15.6: + version "2.15.14" + resolved "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz" + integrity sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA== + dependencies: + async-validator "~1.8.1" + babel-helper-vue-jsx-merge-props "^2.0.0" + deepmerge "^1.2.0" + normalize-wheel "^1.0.1" + resize-observer-polyfill "^1.5.0" + throttle-debounce "^1.0.1" + elkjs@^0.8.2: version "0.8.2" resolved "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz" @@ -2103,6 +2174,11 @@ is-url@^1.2.4: resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -2841,6 +2917,11 @@ normalize-wheel-es@^1.2.0: resolved "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz" integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz" + integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA== + nprogress@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" @@ -2858,6 +2939,13 @@ package-manager-detector@^0.2.8: dependencies: quansync "^0.2.7" +page@^1.5.0: + version "1.11.6" + resolved "https://registry.npmjs.org/page/-/page-1.11.6.tgz" + integrity sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g== + dependencies: + path-to-regexp "~1.2.1" + path-data-parser@^0.1.0, path-data-parser@0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz" @@ -2881,6 +2969,13 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz" + integrity sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg== + dependencies: + isarray "0.0.1" + pathe@^1.0.0, pathe@^1.1.0: version "1.1.2" resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" @@ -2954,7 +3049,7 @@ points-on-path@^0.2.1: path-data-parser "0.1.0" points-on-curve "0.2.0" -postcss@^8.4.18, postcss@^8.4.35: +postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.35: version "8.4.38" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -2968,6 +3063,11 @@ preact@^10.5.13: resolved "https://registry.npmjs.org/preact/-/preact-10.20.2.tgz" integrity sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg== +"prettier@^1.18.2 || ^2.0.0": + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + prismjs@^1.23.0: version "1.29.0" resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" @@ -3005,6 +3105,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" @@ -3015,6 +3120,11 @@ resize-detector@^0.3.0: resolved "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz" integrity sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ== +resize-observer-polyfill@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve@^1.22.1: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" @@ -3153,7 +3263,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -3255,6 +3365,16 @@ terser@^5.22.0, terser@^5.4.0: commander "^2.20.0" source-map-support "~0.5.20" +throttle-debounce@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz" + integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg== + +throttle-debounce@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz" + integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== + tiny-emitter@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" @@ -3506,6 +3626,18 @@ vue-echarts@^6.6.9: resize-detector "^0.3.0" vue-demi "^0.13.11" +vue-route@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/vue-route/-/vue-route-1.5.1.tgz" + integrity sha512-RoeEWvSTk/Zasjx11En4XPyE1jXwuFQ4Itr4fzh1TOSMYefUddhhlHXmAGFFPn37J1YrEymm6sU/3IRTyu23Aw== + dependencies: + page "^1.5.0" + +vue-router@^3.5.3: + version "3.6.5" + resolved "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz" + integrity sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ== + vue-router@^4.2.5: version "4.3.0" resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz" @@ -3538,6 +3670,14 @@ vue@*, "vue@^2.6.12 || ^3.1.1", "vue@^2.6.14 || ^3.3.0", "vue@^3.0.0-0 || ^2.6.0 "@vue/server-renderer" "3.4.21" "@vue/shared" "3.4.21" +vue@^2.5.17, vue@^2.6.11: + version "2.7.16" + resolved "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz" + integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== + dependencies: + "@vue/compiler-sfc" "2.7.16" + csstype "^3.1.0" + w3c-keyname@^2.2.4: version "2.2.8" resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz"