diff --git a/dbm-ui/frontend/.eslintignore b/dbm-ui/frontend/.eslintignore deleted file mode 100644 index 73a6a568ff..0000000000 --- a/dbm-ui/frontend/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules/ -dist/ -public/ -src/types/auto-imports.d.ts -patch/ -lib/ diff --git a/dbm-ui/frontend/.eslintrc.js b/dbm-ui/frontend/.eslintrc.js deleted file mode 100644 index 8bc63d4ff6..0000000000 --- a/dbm-ui/frontend/.eslintrc.js +++ /dev/null @@ -1,146 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for - * the specific language governing permissions and limitations under the License. - */ - -module.exports = { - root: true, - extends: [ - 'eslint-config-tencent', - 'plugin:vue/vue3-recommended', - 'eslint:recommended', - '@vue/eslint-config-typescript/recommended', - './.eslintrc-auto-import.json', - 'prettier', - ], - plugins: ['simple-import-sort'], - env: { - es6: true, - node: true, - jest: true, - browser: true, - 'vue/setup-compiler-macros': true, - }, - globals: { - defineModel: 'readonly', - // value 为 true 允许被重写,为 false 不允许被重写 - __RESOURCE_UNIQUE_KEY__: false, - ValueOf: false, - ServiceReturnType: false, - ServiceParameters: false, - SelectItem: false, - KeyExpand: false, - }, - rules: { - '@typescript-eslint/no-explicit-any': 'off', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': [ - 'error', - { - groups: [ - ['^[a-zA-Z]'], - ['^@services'], - ['^@hooks'], - ['^@router'], - ['^@stores'], - ['^@common'], - ['^@components'], - ['^@views'], - ['^@utils'], - ['^@helper'], - ['^@types'], - ['^@locales'], - ['^@styles'], - ['^@locales'], - ['^@images'], - ['^@\\w'], - ['^\\.\\.'], - ['^\\.'], - ], - }, - ], - 'import/newline-after-import': 'error', - 'vue/multi-word-component-names': 'off', - }, - overrides: [ - { - files: ['*.vue'], - rules: { - indent: 'off', - 'import/first': 'off', - 'vue/html-closing-bracket-newline': [ - 'error', - { - singleline: 'never', - multiline: 'never', - }, - ], - 'vue/component-tags-order': ['warn', { order: ['template', 'script', 'style'] }], - 'vue/attributes-order': [ - 'error', - { - order: [ - 'DEFINITION', - 'LIST_RENDERING', - 'CONDITIONALS', - 'RENDER_MODIFIERS', - 'GLOBAL', - ['UNIQUE', 'SLOT'], - 'TWO_WAY_BINDING', - 'OTHER_DIRECTIVES', - 'OTHER_ATTR', - 'EVENTS', - 'CONTENT', - ], - alphabetical: true, - }, - ], - 'vue/define-macros-order': ['error', { order: ['defineProps', 'defineEmits'] }], - 'vue/no-undef-properties': ['error', { ignores: ['/^\\$/'] }], - 'vue/no-unused-properties': [ - 'error', - { - groups: ['props'], - deepData: false, - ignorePublicMembers: false, - }, - ], - 'vue/no-useless-mustaches': [ - 'error', - { - ignoreIncludesComment: false, - ignoreStringEscape: false, - }, - ], - 'vue/no-useless-v-bind': [ - 'error', - { - ignoreIncludesComment: false, - ignoreStringEscape: false, - }, - ], - 'vue/prefer-separate-static-class': 'error', - 'vue/prefer-true-attribute-shorthand': 'error', - 'vue/script-indent': ['off', 2, { baseIndent: 1 }], - 'vue/component-name-in-template-casing': [ - 'error', - 'PascalCase', - { - registeredComponentsOnly: false, - ignores: [], - }, - ], - 'vue/no-setup-props-reactivity-loss': 'off', - 'vue/no-setup-props-destructure': 'off', - }, - }, - ], -}; diff --git a/dbm-ui/frontend/.nvmrc b/dbm-ui/frontend/.nvmrc index df9385826f..4377937757 100644 --- a/dbm-ui/frontend/.nvmrc +++ b/dbm-ui/frontend/.nvmrc @@ -1 +1 @@ -v20.11.0 \ No newline at end of file +v22.13.1 \ No newline at end of file diff --git a/dbm-ui/frontend/.prettierrc b/dbm-ui/frontend/.prettierrc index b544d20e72..a5024e089f 100644 --- a/dbm-ui/frontend/.prettierrc +++ b/dbm-ui/frontend/.prettierrc @@ -1,7 +1,5 @@ { - "plugins": [ - "prettier-plugin-curly" - ], + "plugins": ["prettier-plugin-curly"], "$schema": "https://json.schemastore.org/prettierrc", "semi": true, "quoteProps": "as-needed", @@ -15,14 +13,5 @@ "arrowParens": "always", "vueIndentScriptAndStyle": true, "singleAttributePerLine": true, - "proseWrap": "always", - "parser": "typescript", - "overrides": [ - { - "files": "*.vue", - "options": { - "parser": "vue" - } - } - ] + "proseWrap": "always" } diff --git a/dbm-ui/frontend/.vscode/settings.json b/dbm-ui/frontend/.vscode/settings.json index 1e37538ab6..7da042cb78 100644 --- a/dbm-ui/frontend/.vscode/settings.json +++ b/dbm-ui/frontend/.vscode/settings.json @@ -38,6 +38,12 @@ "peacock.remoteColor": "#45e35f", "bk-code-ai.enable": false, "typescript.tsdk": "node_modules/typescript/lib", + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "tsconfig.json": "tsconfig.*.json, env.d.ts", + "vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*", + "package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig, .stylelint*, .browserslistrc, commit*" + }, "workbench.colorCustomizations": { "activityBar.activeBackground": "#65c89b", "activityBar.background": "#65c89b", @@ -58,4 +64,4 @@ "titleBar.inactiveForeground": "#15202b99" }, "peacock.color": "#42b883" -} \ No newline at end of file +} diff --git a/dbm-ui/frontend/env.d.ts b/dbm-ui/frontend/env.d.ts index 1abc28a478..29713d6ce8 100644 --- a/dbm-ui/frontend/env.d.ts +++ b/dbm-ui/frontend/env.d.ts @@ -11,7 +11,7 @@ * the specific language governing permissions and limitations under the License. */ -// eslint-disable-next-line spaced-comment + /// interface ImportMetaEnv { readonly MODE: string; diff --git a/dbm-ui/frontend/eslint.config.mjs b/dbm-ui/frontend/eslint.config.mjs new file mode 100644 index 0000000000..76326262ad --- /dev/null +++ b/dbm-ui/frontend/eslint.config.mjs @@ -0,0 +1,297 @@ +import tencentConfig from 'eslint-config-tencent/ts'; +import importPlugin from 'eslint-plugin-import'; +import oxlint from 'eslint-plugin-oxlint'; +// import perfectionist from 'eslint-plugin-perfectionist'; +import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort'; +import pluginVue from 'eslint-plugin-vue'; +import globals from 'globals'; + +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; +import { configureVueProject, defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'; + +const tencentRule = tencentConfig.rules; + +// eslint-config-tencent/ts 依赖的 @typescript-eslint 版本过低,部分规则配置已经废弃需要删除 +delete tencentRule['@typescript-eslint/quotes']; +delete tencentRule['@typescript-eslint/brace-style']; +delete tencentRule['@typescript-eslint/comma-spacing']; +delete tencentRule['@typescript-eslint/func-call-spacing']; +delete tencentRule['@typescript-eslint/indent']; +delete tencentRule['@typescript-eslint/keyword-spacing']; +delete tencentRule['@typescript-eslint/semi']; +delete tencentRule['@typescript-eslint/type-annotation-spacing']; +delete tencentRule['@typescript-eslint/space-before-function-paren']; + +configureVueProject({ + scriptLangs: ['ts', 'tsx'], +}); + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue}'], + }, + + { + name: 'app/files-to-ignore', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], + }, + pluginVue.configs['flat/recommended'], + vueTsConfigs.recommended, + oxlint.configs['flat/recommended'], + skipFormatting, + { + languageOptions: { + ecmaVersion: 5, + sourceType: 'script', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + globals: { + ...globals.browser, + defineModel: 'readonly', + ValueOf: 'readonly', + ServiceReturnType: 'readonly', + ServiceParameters: 'readonly', + SelectItem: 'readonly', + KeyExpand: 'readonly', + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.vue'], + rules: { + ...tencentRule, + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'variable', + format: ['camelCase', 'UPPER_CASE'], + }, + ], + 'no-underscore-dangle': ['error', { enforceInMethodNames: false }], + 'no-param-reassign': ['error', { props: true }], + }, + }, + // { + // files: ['**/*.ts', '**/*.tsx', '**/*.vue'], + // plugins: { + // perfectionist, + // }, + // rules: { + // 'perfectionist/sort-jsx-props': [ + // 'error', + // { + // type: 'alphabetical', + // order: 'asc', + // ignoreCase: true, + // specialCharacters: 'keep', + // ignorePattern: [], + // partitionByNewLine: false, + // newlinesBetween: 'ignore', + // groups: [ + // 'DEFINITION', + // 'LIST_RENDERING', + // 'CONDITIONALS', + // 'RENDER_MODIFIERS', + // 'GLOBAL', + // 'UNIQUE', + // 'SLOT', + // 'TWO_WAY_BINDING', + // 'OTHER_DIRECTIVES', + // 'multiline', + // 'unknown', + // 'shorthand', + // 'callback', + // ], + // customGroups: { + // DEFINITION: '^v-is', + // LIST_RENDERING: '^v-for', + // CONDITIONALS: '^(v-if|v-else-if|v-else|v-show|v-cloak)', + // RENDER_MODIFIERS: '^(v-once|v-pre)', + // GLOBAL: '^id', + // UNIQUE: '^(ref|key)', + // SLOT: '^v-slot', + // TWO_WAY_BINDING: '^v-model', + // OTHER_DIRECTIVES: '^v-.+', + // callback: '^on.+', + // }, + // }, + // ], + // 'perfectionist/sort-array-includes': 'error', + // 'perfectionist/sort-classes': [ + // 'error', + // { + // type: 'alphabetical', + // order: 'asc', + // ignoreCase: true, + // specialCharacters: 'keep', + // partitionByComment: false, + // partitionByNewLine: false, + // newlinesBetween: 'ignore', + // ignoreCallbackDependenciesPatterns: [], + // groups: [ + // 'index-signature', + // ['static-property', 'static-accessor-property'], + // ['static-get-method', 'static-set-method'], + // ['protected-static-property', 'protected-static-accessor-property'], + // ['protected-static-get-method', 'protected-static-set-method'], + // ['private-static-property', 'private-static-accessor-property'], + // ['private-static-get-method', 'private-static-set-method'], + // 'static-block', + // ['static-method', 'static-function-property'], + // ['protected-static-method', 'protected-static-function-property'], + // ['private-static-method', 'private-static-function-property'], + // ['property', 'accessor-property'], + // ['protected-property', 'protected-accessor-property'], + // ['protected-get-method', 'protected-set-method'], + // ['private-property', 'private-accessor-property'], + // ['private-get-method', 'private-set-method'], + // 'constructor', + // ['get-method', 'set-method'], + // ['method', 'function-property'], + // ['protected-method', 'protected-function-property'], + // ['private-method', 'private-function-property'], + // 'unknown', + // ], + // customGroups: [], + // }, + // ], + // 'perfectionist/sort-enums': 'error', + // 'perfectionist/sort-intersection-types': 'error', + // 'perfectionist/sort-interfaces': 'error', + // 'perfectionist/sort-named-imports': 'error', + // 'perfectionist/sort-object-types': 'error', + // 'perfectionist/sort-objects': 'error', + // }, + // }, + { + plugins: { + import: importPlugin, + }, + rules: { + 'import/first': 'off', + 'import/newline-after-import': 'error', + 'import/no-duplicates': 'error', + }, + }, + { + plugins: { + 'simple-import-sort': simpleImportSortPlugin, + }, + rules: { + 'simple-import-sort/exports': 'error', + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + ['^[a-zA-Z]'], // 普通 npm 包 + ['^@blueking'], + ['^@services'], + ['^@hooks'], + ['^@router'], + ['^@stores'], + ['^@common'], + ['^@components'], + ['^@views'], + ['^@utils'], + ['^@helper'], + ['^@types'], + ['^@locales'], + ['^@styles'], + ['^@images'], + ['^[^.]'], + ['^\\.\\.'], // 父目录相对路径 + ['^\\.'], // 当前目录相对路径 + ], + }, + ], + }, + }, + { + files: ['**/*.vue'], + rules: { + indent: 'off', + 'vue/multi-word-component-names': 'off', + 'vue/html-closing-bracket-newline': [ + 'error', + { + singleline: 'never', + multiline: 'never', + }, + ], + 'vue/component-tags-order': ['warn', { order: ['template', 'script', 'style'] }], + 'vue/attributes-order': [ + 'error', + { + order: [ + 'DEFINITION', + 'LIST_RENDERING', + 'CONDITIONALS', + 'RENDER_MODIFIERS', + 'GLOBAL', + ['UNIQUE', 'SLOT'], + 'TWO_WAY_BINDING', + 'OTHER_DIRECTIVES', + 'OTHER_ATTR', + 'EVENTS', + 'CONTENT', + ], + alphabetical: true, + }, + ], + 'vue/define-macros-order': ['error', { order: ['defineProps', 'defineEmits'] }], + 'vue/no-undef-properties': ['error', { ignores: ['/^\\$/'] }], + 'vue/no-unused-properties': [ + 'error', + { + groups: ['props'], + deepData: false, + ignorePublicMembers: false, + }, + ], + 'vue/no-useless-mustaches': [ + 'error', + { + ignoreIncludesComment: false, + ignoreStringEscape: false, + }, + ], + 'vue/no-useless-v-bind': [ + 'error', + { + ignoreIncludesComment: false, + ignoreStringEscape: false, + }, + ], + 'vue/prefer-separate-static-class': 'error', + 'vue/prefer-true-attribute-shorthand': 'error', + 'vue/script-indent': ['off', 2, { baseIndent: 1 }], + 'vue/component-name-in-template-casing': [ + 'error', + 'PascalCase', + { + registeredComponentsOnly: false, + ignores: [], + }, + ], + 'vue/no-setup-props-reactivity-loss': 'off', + 'vue/no-setup-props-destructure': 'off', + }, + }, + { + ignores: [ + 'node_modules/*', + 'dist/*', + 'public/*', + 'src/types/auto-imports.d.ts', + 'patch/*', + 'lib/*', + 'auto-copyright.js', + ], + }, +); diff --git a/dbm-ui/frontend/package.json b/dbm-ui/frontend/package.json index 051f500364..d7c15d8830 100644 --- a/dbm-ui/frontend/package.json +++ b/dbm-ui/frontend/package.json @@ -3,16 +3,18 @@ "private": true, "version": "0.0.0", "scripts": { - "dev": "vite --mode test", + "dev": "vite", "dev-https": "vite --mode https", "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 run-p build-only", "preview": "vite preview", "prepare": "npx simple-git-hooks", - "build-only": "vite build --mode production", - "type-check": "vue-tsc --noEmit", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore", "lint:lint-staged": "lint-staged", - "lint:script": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx --fix", + "lint:script": "eslint . --fix", "lint:style": "stylelint --fix ./src/**/*.{vue,css,less} --custom-syntax", + "lint": "run-s lint:*", "prettier": "prettier --write ./src" }, "dependencies": { @@ -26,27 +28,27 @@ "@blueking/sub-saas": "0.0.0-beta.6", "@blueking/table": "^0.0.1-beta.35", "@icon-cool/bk-icon-bk-biz-components": "^0.0.4", - "@vueuse/core": "^12.0.0", + "@vueuse/core": "^12.5.0", "axios": "^1.7.9", "bkui-vue": "2.0.1-beta.100", "date-fns": "^4.1.0", "dayjs": "^1.11.13", - "echarts": "^5.5.1", + "echarts": "^5.6.0", "html-to-image": "1.11.11", "js-cookie": "3.0.5", "jsencrypt": "3.3.2", "lodash": "4.17.21", "mitt": "3.0.1", "monaco-editor": "^0.52.0", - "pinia": "^2.3.0", - "qs": "^6.13.1", + "pinia": "^2.3.1", + "qs": "^6.14.0", "screenfull": "6.0.2", "tiny-pinyin": "1.3.2", "tippy.js": "6.3.7", "url-join": "5.0.0", "vue": "^3.5.13", "vue-content-loader": "2.0.1", - "vue-i18n": "^10.0.5", + "vue-i18n": "^11.1.0", "vue-request": "2.0.4", "vue-router": "^4.5.0", "vue-types": "^5.1.3", @@ -54,48 +56,54 @@ "xlsx": "^0.18.5" }, "devDependencies": { - "@commitlint/config-conventional": "^19.6.0", - "@trivago/prettier-plugin-sort-imports": "^5.1.0", - "@tsconfig/node20": "20.1.4", - "@types/lodash": "^4.17.13", - "@types/node": "^22.10.1", - "@types/qs": "^6.9.17", + "@commitlint/config-conventional": "^19.7.1", + "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@tsconfig/node22": "^22.0.0", + "@types/lodash": "^4.17.15", + "@types/node": "^22.13.1", + "@types/qs": "^6.9.18", "@vitejs/plugin-basic-ssl": "^1.2.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", - "@vue/eslint-config-typescript": "13.0.0", + "@vue/eslint-config-prettier": "^10.1.0", + "@vue/eslint-config-typescript": "^14.3.0", "@vue/tsconfig": "^0.7.0", - "commitlint": "^19.6.0", + "commitlint": "^19.7.1", "cross-env": "7.0.3", - "eslint": "8.57.0", - "eslint-config-prettier": "9.1.0", - "eslint-config-tencent": "^1.1.1", + "eslint": "^9.19.0", + "eslint-config-prettier": "^10.0.1", + "eslint-config-tencent": "^1.1.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.6", + "eslint-plugin-perfectionist": "^4.8.0", "eslint-plugin-simple-import-sort": "12.1.1", "eslint-plugin-vue": "^9.32.0", - "less": "^4.2.1", - "lint-staged": "^15.2.10", - "npm-run-all2": "^7.0.1", - "postcss-html": "1.7.0", + "globals": "^15.14.0", + "less": "^4.2.2", + "lint-staged": "^15.4.3", + "npm-run-all2": "^7.0.2", + "oxlint": "^0.15.6", + "postcss-html": "^1.8.0", "postcss-less": "6.0.0", "prettier": "^3.4.2", "prettier-plugin-curly": "^0.3.1", "simple-git-hooks": "2.11.1", - "stylelint": "^16.11.0", - "stylelint-config-standard": "36.0.1", + "stylelint": "^16.14.1", + "stylelint-config-standard": "^37.0.0", "stylelint-less": "3.0.1", "stylelint-order": "6.0.4", - "typescript": "^5.7.2", - "unplugin-auto-import": "^0.18.6", - "unplugin-vue-components": "^0.27.5", - "vite": "^6.0.3", + "typescript": "^5.7.3", + "unplugin-auto-import": "^19.0.0", + "unplugin-vue-components": "^28.0.0", + "vite": "^6.1.0", "vite-plugin-babel": "^1.3.0", "vite-plugin-html-env": "1.2.8", "vite-plugin-imp": "2.4.0", "vite-plugin-monaco-editor": "1.1.0", "vite-plugin-static-copy": "^2.2.0", "vite-plugin-style-import": "2.0.0", - "vue-component-type-helpers": "^2.1.10", - "vue-tsc": "^2.1.10" + "vue-component-type-helpers": "^2.2.0", + "vue-tsc": "^2.2.0" }, "simple-git-hooks": { "pre-commit": "cd dbm-ui/frontend && npx lint-staged", diff --git a/dbm-ui/frontend/src/App.vue b/dbm-ui/frontend/src/App.vue index d7255c971d..d284634d81 100644 --- a/dbm-ui/frontend/src/App.vue +++ b/dbm-ui/frontend/src/App.vue @@ -65,6 +65,8 @@ import { onMounted, watch } from 'vue'; import { useI18n } from 'vue-i18n'; + import NoticeComponent from '@blueking/notice-component'; + import { getLogout } from '@services/source/logout'; import { useSQLTaskNotify } from '@hooks'; @@ -79,11 +81,9 @@ import { checkDbConsole } from '@utils'; - import NoticeComponent from '@blueking/notice-component'; - import Layout from './layout/Index.vue'; - import '@blueking/notice-component/dist/style.css'; + import('@blueking/notice-component/dist/style.css'); const userProfileStore = useUserProfile(); const { t, locale } = useI18n(); diff --git a/dbm-ui/frontend/src/common/const/accountTypes.ts b/dbm-ui/frontend/src/common/const/accountTypes.ts index 0e4bcebbc3..3fa0238eca 100644 --- a/dbm-ui/frontend/src/common/const/accountTypes.ts +++ b/dbm-ui/frontend/src/common/const/accountTypes.ts @@ -2,9 +2,9 @@ * 账号类型 */ export enum AccountTypes { - MYSQL = 'mysql', - TENDBCLUSTER = 'tendbcluster', MONGODB = 'mongodb', + MYSQL = 'mysql', SQLSERVER = 'sqlserver', + TENDBCLUSTER = 'tendbcluster', } export type AccountTypesValues = `${AccountTypes}`; diff --git a/dbm-ui/frontend/src/common/const/ticketTypes.ts b/dbm-ui/frontend/src/common/const/ticketTypes.ts index ab1303fc95..3a057a0194 100644 --- a/dbm-ui/frontend/src/common/const/ticketTypes.ts +++ b/dbm-ui/frontend/src/common/const/ticketTypes.ts @@ -2,47 +2,47 @@ * 服务单据类型(与后端字段对应) */ export enum TicketTypes { - MYSQL_SINGLE_APPLY = 'MYSQL_SINGLE_APPLY', - MYSQL_HA_APPLY = 'MYSQL_HA_APPLY', - MYSQL_EXCEL_AUTHORIZE_RULES = 'MYSQL_EXCEL_AUTHORIZE_RULES', + MYSQL_ACCOUNT_RULE_CHANGE = 'MYSQL_ACCOUNT_RULE_CHANGE', // MySQL 权限变更 + MYSQL_ADD_SLAVE = 'MYSQL_ADD_SLAVE', MYSQL_AUTHORIZE_RULES = 'MYSQL_AUTHORIZE_RULES', + MYSQL_CHECKSUM = 'MYSQL_CHECKSUM', + MYSQL_CLIENT_CLONE_RULES = 'MYSQL_CLIENT_CLONE_RULES', + MYSQL_DATA_MIGRATE = 'MYSQL_DATA_MIGRATE', + MYSQL_DATA_REPAIR = 'MYSQL_DATA_REPAIR', // mysql 数据修复 + MYSQL_DUMP_DATA = 'MYSQL_DUMP_DATA', // mysql 数据导出 + MYSQL_EXCEL_AUTHORIZE_RULES = 'MYSQL_EXCEL_AUTHORIZE_RULES', + MYSQL_FLASHBACK = 'MYSQL_FLASHBACK', + MYSQL_FORCE_IMPORT_SQLFILE = 'MYSQL_FORCE_IMPORT_SQLFILE', + MYSQL_HA_APPLY = 'MYSQL_HA_APPLY', + MYSQL_HA_DB_TABLE_BACKUP = 'MYSQL_HA_DB_TABLE_BACKUP', + MYSQL_HA_DESTROY = 'MYSQL_HA_DESTROY', MYSQL_HA_DISABLE = 'MYSQL_HA_DISABLE', MYSQL_HA_ENABLE = 'MYSQL_HA_ENABLE', - MYSQL_HA_DESTROY = 'MYSQL_HA_DESTROY', - MYSQL_SINGLE_DISABLE = 'MYSQL_SINGLE_DISABLE', - MYSQL_SINGLE_ENABLE = 'MYSQL_SINGLE_ENABLE', - MYSQL_SINGLE_DESTROY = 'MYSQL_SINGLE_DESTROY', - MYSQL_INSTANCE_CLONE_RULES = 'MYSQL_INSTANCE_CLONE_RULES', - MYSQL_CLIENT_CLONE_RULES = 'MYSQL_CLIENT_CLONE_RULES', - MYSQL_RESTORE_LOCAL_SLAVE = 'MYSQL_RESTORE_LOCAL_SLAVE', + MYSQL_HA_FULL_BACKUP = 'MYSQL_HA_FULL_BACKUP', MYSQL_HA_RENAME_DATABASE = 'MYSQL_HA_RENAME_DATABASE', - MYSQL_SINGLE_RENAME_DATABASE = 'MYSQL_SINGLE_RENAME_DATABASE', - MYSQL_ADD_SLAVE = 'MYSQL_ADD_SLAVE', MYSQL_HA_TRUNCATE_DATA = 'MYSQL_HA_TRUNCATE_DATA', - MYSQL_SINGLE_TRUNCATE_DATA = 'MYSQL_SINGLE_TRUNCATE_DATA', - MYSQL_CHECKSUM = 'MYSQL_CHECKSUM', - MYSQL_DATA_MIGRATE = 'MYSQL_DATA_MIGRATE', - MYSQL_PROXY_SWITCH = 'MYSQL_PROXY_SWITCH', - MYSQL_HA_DB_TABLE_BACKUP = 'MYSQL_HA_DB_TABLE_BACKUP', - MYSQL_MIGRATE_CLUSTER = 'MYSQL_MIGRATE_CLUSTER', - MYSQL_MASTER_SLAVE_SWITCH = 'MYSQL_MASTER_SLAVE_SWITCH', - MYSQL_PROXY_ADD = 'MYSQL_PROXY_ADD', - MYSQL_MASTER_FAIL_OVER = 'MYSQL_MASTER_FAIL_OVER', MYSQL_IMPORT_SQLFILE = 'MYSQL_IMPORT_SQLFILE', - MYSQL_FORCE_IMPORT_SQLFILE = 'MYSQL_FORCE_IMPORT_SQLFILE', - MYSQL_FLASHBACK = 'MYSQL_FLASHBACK', - MYSQL_ROLLBACK_CLUSTER = 'MYSQL_ROLLBACK_CLUSTER', - MYSQL_RESTORE_SLAVE = 'MYSQL_RESTORE_SLAVE', - MYSQL_HA_FULL_BACKUP = 'MYSQL_HA_FULL_BACKUP', + MYSQL_INSTANCE_CLONE_RULES = 'MYSQL_INSTANCE_CLONE_RULES', + MYSQL_LOCAL_UPGRADE = 'MYSQL_LOCAL_UPGRADE', // MySQL 原地升级 + MYSQL_MASTER_FAIL_OVER = 'MYSQL_MASTER_FAIL_OVER', + MYSQL_MASTER_SLAVE_SWITCH = 'MYSQL_MASTER_SLAVE_SWITCH', + MYSQL_MIGRATE_CLUSTER = 'MYSQL_MIGRATE_CLUSTER', + MYSQL_MIGRATE_UPGRADE = 'MYSQL_MIGRATE_UPGRADE', // MySQL 迁移升级 MYSQL_OPEN_AREA = 'MYSQL_OPEN_AREA', // 开区 MYSQL_PARTITION = 'MYSQL_PARTITION', - MYSQL_DUMP_DATA = 'MYSQL_DUMP_DATA', // mysql 数据导出 - MYSQL_DATA_REPAIR = 'MYSQL_DATA_REPAIR', // mysql 数据修复 + MYSQL_PROXY_ADD = 'MYSQL_PROXY_ADD', + MYSQL_PROXY_SWITCH = 'MYSQL_PROXY_SWITCH', MYSQL_PROXY_UPGRADE = 'MYSQL_PROXY_UPGRADE', // MySQL Proxy 升级 - MYSQL_LOCAL_UPGRADE = 'MYSQL_LOCAL_UPGRADE', // MySQL 原地升级 - MYSQL_MIGRATE_UPGRADE = 'MYSQL_MIGRATE_UPGRADE', // MySQL 迁移升级 + MYSQL_RESTORE_LOCAL_SLAVE = 'MYSQL_RESTORE_LOCAL_SLAVE', + MYSQL_RESTORE_SLAVE = 'MYSQL_RESTORE_SLAVE', + MYSQL_ROLLBACK_CLUSTER = 'MYSQL_ROLLBACK_CLUSTER', + MYSQL_SINGLE_APPLY = 'MYSQL_SINGLE_APPLY', + MYSQL_SINGLE_DESTROY = 'MYSQL_SINGLE_DESTROY', + MYSQL_SINGLE_DISABLE = 'MYSQL_SINGLE_DISABLE', + MYSQL_SINGLE_ENABLE = 'MYSQL_SINGLE_ENABLE', + MYSQL_SINGLE_RENAME_DATABASE = 'MYSQL_SINGLE_RENAME_DATABASE', + MYSQL_SINGLE_TRUNCATE_DATA = 'MYSQL_SINGLE_TRUNCATE_DATA', MYSQL_SLAVE_MIGRATE_UPGRADE = 'MYSQL_SLAVE_MIGRATE_UPGRADE', // MySQL 从库迁移升级 - MYSQL_ACCOUNT_RULE_CHANGE = 'MYSQL_ACCOUNT_RULE_CHANGE', // MySQL 权限变更 } export enum TicketTypes { REDIS_BACKUP = 'REDIS_BACKUP', @@ -50,15 +50,21 @@ export enum TicketTypes { REDIS_CLUSTER_APPLY = 'REDIS_CLUSTER_APPLY', REDIS_CLUSTER_CUTOFF = 'REDIS_CLUSTER_CUTOFF', REDIS_CLUSTER_DATA_COPY = 'REDIS_CLUSTER_DATA_COPY', + REDIS_CLUSTER_INS_MIGRATE = 'REDIS_CLUSTER_INS_MIGRATE', + REDIS_CLUSTER_LOAD_MODULES = 'REDIS_CLUSTER_LOAD_MODULES', // redis 安装Module REDIS_CLUSTER_ROLLBACK_DATA_COPY = 'REDIS_CLUSTER_ROLLBACK_DATA_COPY', REDIS_CLUSTER_SHARD_NUM_UPDATE = 'REDIS_CLUSTER_SHARD_NUM_UPDATE', REDIS_CLUSTER_TYPE_UPDATE = 'REDIS_CLUSTER_TYPE_UPDATE', + REDIS_DATA_STRUCTURE = 'REDIS_DATA_STRUCTURE', // redis 定点构造 + REDIS_DATA_STRUCTURE_TASK_DELETE = 'REDIS_DATA_STRUCTURE_TASK_DELETE', // redis 构造销毁 REDIS_DATACOPY_CHECK_REPAIR = 'REDIS_DATACOPY_CHECK_REPAIR', REDIS_DESTROY = 'REDIS_DESTROY', REDIS_INS_APPLY = 'REDIS_INS_APPLY', + REDIS_INSTANCE_CLOSE = 'REDIS_INSTANCE_CLOSE', // redis 主从集群禁用 + REDIS_INSTANCE_DESTROY = 'REDIS_INSTANCE_DESTROY', // redis 主从集群删除 + REDIS_INSTANCE_OPEN = 'REDIS_INSTANCE_OPEN', // redis 主从集群启用 REDIS_INSTANCE_PROXY_CLOSE = 'REDIS_INSTANCE_PROXY_CLOSE', REDIS_INSTANCE_PROXY_OPEN = 'REDIS_INSTANCE_PROXY_OPEN', - REDIS_INSTANCE_DESTROY = 'REDIS_INSTANCE_DESTROY', // redis 主从集群删除 REDIS_KEYS_DELETE = 'REDIS_KEYS_DELETE', REDIS_KEYS_EXTRACT = 'REDIS_KEYS_EXTRACT', REDIS_MASTER_SLAVE_SWITCH = 'REDIS_MASTER_SLAVE_SWITCH', @@ -68,61 +74,55 @@ export enum TicketTypes { REDIS_PLUGIN_DELETE_POLARIS = 'REDIS_PLUGIN_DELETE_POLARIS', REDIS_PLUGIN_DNS_BIND_CLB = 'REDIS_PLUGIN_DNS_BIND_CLB', REDIS_PLUGIN_DNS_UNBIND_CLB = 'REDIS_PLUGIN_DNS_UNBIND_CLB', - REDIS_DATA_STRUCTURE = 'REDIS_DATA_STRUCTURE', // redis 定点构造 - REDIS_DATA_STRUCTURE_TASK_DELETE = 'REDIS_DATA_STRUCTURE_TASK_DELETE', // redis 构造销毁 - REDIS_INSTANCE_OPEN = 'REDIS_INSTANCE_OPEN', // redis 主从集群启用 - REDIS_INSTANCE_CLOSE = 'REDIS_INSTANCE_CLOSE', // redis 主从集群禁用 - REDIS_CLUSTER_LOAD_MODULES = 'REDIS_CLUSTER_LOAD_MODULES', // redis 安装Module - REDIS_PURGE = 'REDIS_PURGE', REDIS_PROXY_CLOSE = 'REDIS_PROXY_CLOSE', REDIS_PROXY_OPEN = 'REDIS_PROXY_OPEN', REDIS_PROXY_SCALE_DOWN = 'REDIS_PROXY_SCALE_DOWN', REDIS_PROXY_SCALE_UP = 'REDIS_PROXY_SCALE_UP', + REDIS_PURGE = 'REDIS_PURGE', REDIS_SCALE_DOWN = 'REDIS_SCALE_DOWN', REDIS_SCALE_UP = 'REDIS_SCALE_UP', REDIS_SCALE_UPDOWN = 'REDIS_SCALE_UPDOWN', - REDIS_VERSION_UPDATE_ONLINE = 'REDIS_VERSION_UPDATE_ONLINE', - REDIS_CLUSTER_INS_MIGRATE = 'REDIS_CLUSTER_INS_MIGRATE', REDIS_SINGLE_INS_MIGRATE = 'REDIS_SINGLE_INS_MIGRATE', + REDIS_VERSION_UPDATE_ONLINE = 'REDIS_VERSION_UPDATE_ONLINE', } export enum TicketTypes { + TENDBCLUSTER_ACCOUNT_RULE_CHANGE = 'TENDBCLUSTER_ACCOUNT_RULE_CHANGE', // spider 权限变更 TENDBCLUSTER_APPLY = 'TENDBCLUSTER_APPLY', - TENDBCLUSTER_DISABLE = 'TENDBCLUSTER_DISABLE', // spider 集群禁用 - TENDBCLUSTER_ENABLE = 'TENDBCLUSTER_ENABLE', // spider 集群启用 - TENDBCLUSTER_DESTROY = 'TENDBCLUSTER_DESTROY', // spider 集群下架 - TENDBCLUSTER_SPIDER_SLAVE_DESTROY = 'TENDBCLUSTER_SPIDER_SLAVE_DESTROY', // spider 只读集群下架 - TENDBCLUSTER_SPIDER_REDUCE_MNT = 'TENDBCLUSTER_SPIDER_REDUCE_MNT', // spider 运维节点下架 - TENDBCLUSTER_SPIDER_ADD_NODES = 'TENDBCLUSTER_SPIDER_ADD_NODES', // Spider扩容接入层 - TENDBCLUSTER_SPIDER_REDUCE_NODES = 'TENDBCLUSTER_SPIDER_REDUCE_NODES', // Spider缩容接入层 - TENDBCLUSTER_SPIDER_SLAVE_APPLY = 'TENDBCLUSTER_SPIDER_SLAVE_APPLY', // Spider 部署只读接入层 - TENDBCLUSTER_SPIDER_MNT_APPLY = 'TENDBCLUSTER_SPIDER_MNT_APPLY', // Spider 添加运维节点 - TENDBCLUSTER_MASTER_SLAVE_SWITCH = 'TENDBCLUSTER_MASTER_SLAVE_SWITCH', // Spider remote 主从切换 - TENDBCLUSTER_RENAME_DATABASE = 'TENDBCLUSTER_RENAME_DATABASE', // Spider Tendbcluster 重命名 - TENDBCLUSTER_MASTER_FAIL_OVER = 'TENDBCLUSTER_MASTER_FAIL_OVER', // Spider remote主故障切换 - TENDBCLUSTER_DB_TABLE_BACKUP = 'TENDBCLUSTER_DB_TABLE_BACKUP', // Spider TenDBCluster 库表备份 - TENDBCLUSTER_FULL_BACKUP = 'TENDBCLUSTER_FULL_BACKUP', // Spider TenDBCluster 全备单据 - TENDBCLUSTER_NODE_REBALANCE = 'TENDBCLUSTER_NODE_REBALANCE', // Spider 集群remote节点扩缩容 - TENDBCLUSTER_ROLLBACK_CLUSTER = 'TENDBCLUSTER_ROLLBACK_CLUSTER', // Spider 定点回档 - TENDBCLUSTER_FLASHBACK = 'TENDBCLUSTER_FLASHBACK', // Spider 闪回 - TENDBCLUSTER_TRUNCATE_DATABASE = 'TENDBCLUSTER_TRUNCATE_DATABASE', // Spider tendbcluster 清档 - TENDBCLUSTER_SPIDER_MNT_DESTROY = 'TENDBCLUSTER_SPIDER_MNT_DESTROY', // Spider 运维节点下架 + TENDBCLUSTER_AUTHORIZE_RULES = 'TENDBCLUSTER_AUTHORIZE_RULES', TENDBCLUSTER_CHECKSUM = 'TENDBCLUSTER_CHECKSUM', // Spider checksum TENDBCLUSTER_CLIENT_CLONE_RULES = 'TENDBCLUSTER_CLIENT_CLONE_RULES', // Spider 客户端权限克隆 - TENDBCLUSTER_INSTANCE_CLONE_RULES = 'TENDBCLUSTER_INSTANCE_CLONE_RULES', // Spider DB 实例权限克隆 - TENDBCLUSTER_AUTHORIZE_RULES = 'TENDBCLUSTER_AUTHORIZE_RULES', + TENDBCLUSTER_DATA_REPAIR = 'TENDBCLUSTER_DATA_REPAIR', // spider 数据修复 + TENDBCLUSTER_DB_TABLE_BACKUP = 'TENDBCLUSTER_DB_TABLE_BACKUP', // Spider TenDBCluster 库表备份 + TENDBCLUSTER_DESTROY = 'TENDBCLUSTER_DESTROY', // spider 集群下架 + TENDBCLUSTER_DISABLE = 'TENDBCLUSTER_DISABLE', // spider 集群禁用 + TENDBCLUSTER_DUMP_DATA = 'TENDBCLUSTER_DUMP_DATA', // spider 数据导出 + TENDBCLUSTER_ENABLE = 'TENDBCLUSTER_ENABLE', // spider 集群启用 TENDBCLUSTER_EXCEL_AUTHORIZE_RULES = 'TENDBCLUSTER_EXCEL_AUTHORIZE_RULES', - TENDBCLUSTER_PARTITION = 'TENDBCLUSTER_PARTITION', // Spider 分区管理 - TENDBCLUSTER_IMPORT_SQLFILE = 'TENDBCLUSTER_IMPORT_SQLFILE', // Spider SQL变更执行 + TENDBCLUSTER_FLASHBACK = 'TENDBCLUSTER_FLASHBACK', // Spider 闪回 TENDBCLUSTER_FORCE_IMPORT_SQLFILE = 'TENDBCLUSTER_FORCE_IMPORT_SQLFILE', // Spider SQL变更执行 - TENDBCLUSTER_OPEN_AREA = 'TENDBCLUSTER_OPEN_AREA', // Spider 开区 + TENDBCLUSTER_FULL_BACKUP = 'TENDBCLUSTER_FULL_BACKUP', // Spider TenDBCluster 全备单据 + TENDBCLUSTER_IMPORT_SQLFILE = 'TENDBCLUSTER_IMPORT_SQLFILE', // Spider SQL变更执行 + TENDBCLUSTER_INSTANCE_CLONE_RULES = 'TENDBCLUSTER_INSTANCE_CLONE_RULES', // Spider DB 实例权限克隆 + TENDBCLUSTER_MASTER_FAIL_OVER = 'TENDBCLUSTER_MASTER_FAIL_OVER', // Spider remote主故障切换 + TENDBCLUSTER_MASTER_SLAVE_SWITCH = 'TENDBCLUSTER_MASTER_SLAVE_SWITCH', // Spider remote 主从切换 TENDBCLUSTER_MIGRATE_CLUSTER = 'TENDBCLUSTER_MIGRATE_CLUSTER', // spider 迁移主从 + TENDBCLUSTER_NODE_REBALANCE = 'TENDBCLUSTER_NODE_REBALANCE', // Spider 集群remote节点扩缩容 + TENDBCLUSTER_OPEN_AREA = 'TENDBCLUSTER_OPEN_AREA', // Spider 开区 + TENDBCLUSTER_PARTITION = 'TENDBCLUSTER_PARTITION', // Spider 分区管理 + TENDBCLUSTER_RENAME_DATABASE = 'TENDBCLUSTER_RENAME_DATABASE', // Spider Tendbcluster 重命名 TENDBCLUSTER_RESTORE_LOCAL_SLAVE = 'TENDBCLUSTER_RESTORE_LOCAL_SLAVE', // spider 重建从库-原地重建 TENDBCLUSTER_RESTORE_SLAVE = 'TENDBCLUSTER_RESTORE_SLAVE', // spider 重建从库-新机重建 - TENDBCLUSTER_DUMP_DATA = 'TENDBCLUSTER_DUMP_DATA', // spider 数据导出 - TENDBCLUSTER_DATA_REPAIR = 'TENDBCLUSTER_DATA_REPAIR', // spider 数据修复 + TENDBCLUSTER_ROLLBACK_CLUSTER = 'TENDBCLUSTER_ROLLBACK_CLUSTER', // Spider 定点回档 TENDBCLUSTER_SEMANTIC_CHECK = 'TENDBCLUSTER_SEMANTIC_CHECK', // spider 模拟执行 - TENDBCLUSTER_ACCOUNT_RULE_CHANGE = 'TENDBCLUSTER_ACCOUNT_RULE_CHANGE', // spider 权限变更 + TENDBCLUSTER_SPIDER_ADD_NODES = 'TENDBCLUSTER_SPIDER_ADD_NODES', // Spider扩容接入层 + TENDBCLUSTER_SPIDER_MNT_APPLY = 'TENDBCLUSTER_SPIDER_MNT_APPLY', // Spider 添加运维节点 + TENDBCLUSTER_SPIDER_MNT_DESTROY = 'TENDBCLUSTER_SPIDER_MNT_DESTROY', // Spider 运维节点下架 + TENDBCLUSTER_SPIDER_REDUCE_MNT = 'TENDBCLUSTER_SPIDER_REDUCE_MNT', // spider 运维节点下架 + TENDBCLUSTER_SPIDER_REDUCE_NODES = 'TENDBCLUSTER_SPIDER_REDUCE_NODES', // Spider缩容接入层 + TENDBCLUSTER_SPIDER_SLAVE_APPLY = 'TENDBCLUSTER_SPIDER_SLAVE_APPLY', // Spider 部署只读接入层 + TENDBCLUSTER_SPIDER_SLAVE_DESTROY = 'TENDBCLUSTER_SPIDER_SLAVE_DESTROY', // spider 只读集群下架 TENDBCLUSTER_TEMPORARY_DESTROY = 'TENDBCLUSTER_TEMPORARY_DESTROY', // 临时集群销毁 + TENDBCLUSTER_TRUNCATE_DATABASE = 'TENDBCLUSTER_TRUNCATE_DATABASE', // Spider tendbcluster 清档 } export enum TicketTypes { MONGODB_ADD_MONGOS = 'MONGODB_ADD_MONGOS', // mongo 扩容接入层 @@ -130,119 +130,119 @@ export enum TicketTypes { MONGODB_AUTHORIZE_RULES = 'MONGODB_AUTHORIZE_RULES', // MongoDB 集群授权 MONGODB_BACKUP = 'MONGODB_BACKUP', // mongo 库表备份 MONGODB_CUTOFF = 'MONGODB_CUTOFF', // mongo 整机替换 - MONGODB_DISABLE = 'MONGODB_DISABLE', // mongodb禁用 MONGODB_DESTROY = 'MONGODB_DESTROY', // MongoDB 集群删除 + MONGODB_DISABLE = 'MONGODB_DISABLE', // mongodb禁用 MONGODB_ENABLE = 'MONGODB_ENABLE', // MongoDB 集群启用 MONGODB_EXCEL_AUTHORIZE = 'MONGODB_EXCEL_AUTHORIZE', // MongoDB 导入授权 MONGODB_EXCEL_AUTHORIZE_RULES = 'MONGODB_EXCEL_AUTHORIZE_RULES', // MongoDB 导入授权 MONGODB_EXEC_SCRIPT_APPLY = 'MONGODB_EXEC_SCRIPT_APPLY', // mongo 变更脚本执行 + MONGODB_FULL_BACKUP = 'MONGODB_FULL_BACKUP', // mongo 全库备份 + MONGODB_INSTANCE_DEINSTALL = 'MONGODB_INSTANCE_DEINSTALL', // mongo 实例下架 MONGODB_INSTANCE_RELOAD = 'MONGODB_INSTANCE_RELOAD', // mongodb重启 - MONGODB_REMOVE_NS = 'MONGODB_REMOVE_NS', // mongo 清档 MONGODB_REDUCE_MONGOS = 'MONGODB_REDUCE_MONGOS', // mongo 缩容接入层 MONGODB_REDUCE_SHARD_NODES = 'MONGODB_REDUCE_SHARD_NODES', // mongo 缩容 shard 节点数 + MONGODB_REMOVE_NS = 'MONGODB_REMOVE_NS', // mongo 清档 + MONGODB_REPLICASET_APPLY = 'MONGODB_REPLICASET_APPLY', // MongoDB 副本集部署申请 MONGODB_RESTORE = 'MONGODB_RESTORE', // mongo 定点构造 MONGODB_SCALE_UPDOWN = 'MONGODB_SCALE_UPDOWN', // MongoDB 分片式集群单个容量变更 MONGODB_SHARD_APPLY = 'MONGODB_SHARD_APPLY', // MongoDB 分片式集群部署申请 - MONGODB_REPLICASET_APPLY = 'MONGODB_REPLICASET_APPLY', // MongoDB 副本集部署申请 MONGODB_TEMPORARY_DESTROY = 'MONGODB_TEMPORARY_DESTROY', // mongo 临时集群销毁 - MONGODB_FULL_BACKUP = 'MONGODB_FULL_BACKUP', // mongo 全库备份 - MONGODB_INSTANCE_DEINSTALL = 'MONGODB_INSTANCE_DEINSTALL', // mongo 实例下架 } export enum TicketTypes { - SQLSERVER_SINGLE_APPLY = 'SQLSERVER_SINGLE_APPLY', // sqlserver单节点部署 - SQLSERVER_HA_APPLY = 'SQLSERVER_HA_APPLY', // sqlserver主从部署 - SQLSERVER_DISABLE = 'SQLSERVER_DISABLE', // sqlserver 禁用 - SQLSERVER_ENABLE = 'SQLSERVER_ENABLE', // sqlserver 启用 - SQLSERVER_DESTROY = 'SQLSERVER_DESTROY', // sqlserver 删除 + SQLSERVER_ADD_SLAVE = 'SQLSERVER_ADD_SLAVE', // sqlserver 增加从库' SQLSERVER_AUTHORIZE_RULES = 'SQLSERVER_AUTHORIZE_RULES', // sqlserver 集群授权 - SQLSERVER_EXCEL_AUTHORIZE_RULES = 'SQLSERVER_EXCEL_AUTHORIZE_RULES', // sqlserver 导入授权 - SQLSERVER_RESET = 'SQLSERVER_RESET', // sqlserver 集群重置 SQLSERVER_BACKUP_DBS = 'SQLSERVER_BACKUP_DBS', // sqlserver 数据库备份 - SQLSERVER_DBRENAME = 'SQLSERVER_DBRENAME', // sqlserver 数据库重命名 - SQLSERVER_DATA_MIGRATE = 'SQLSERVER_DATA_MIGRATE', // sqlserver 数据迁移 + SQLSERVER_BUILD_DB_SYNC = 'SQLSERVER_BUILD_DB_SYNC', // DB建立同步 SQLSERVER_CLEAR_DBS = 'SQLSERVER_CLEAR_DBS', // sqlserver 清档 - SQLSERVER_MASTER_FAIL_OVER = 'SQLSERVER_MASTER_FAIL_OVER', // sqlserver 主故障切换 - SQLSERVER_MASTER_SLAVE_SWITCH = 'SQLSERVER_MASTER_SLAVE_SWITCH', // sqlserver 主从切换 - SQLSERVER_ROLLBACK = 'SQLSERVER_ROLLBACK', // sqlserver 定点回档 - SQLSERVER_ADD_SLAVE = 'SQLSERVER_ADD_SLAVE', // sqlserver 增加从库' - SQLSERVER_RESTORE_SLAVE = 'SQLSERVER_RESTORE_SLAVE', // sqlserver 重建从库_新机重建 - SQLSERVER_RESTORE_LOCAL_SLAVE = 'SQLSERVER_RESTORE_LOCAL_SLAVE', // sqlserver 重建从库_原地重建 - SQLSERVER_IMPORT_SQLFILE = 'SQLSERVER_IMPORT_SQLFILE', // sqlserver SQL变更执行' + SQLSERVER_DATA_MIGRATE = 'SQLSERVER_DATA_MIGRATE', // sqlserver 数据迁移 + SQLSERVER_DBRENAME = 'SQLSERVER_DBRENAME', // sqlserver 数据库重命名 + SQLSERVER_DESTROY = 'SQLSERVER_DESTROY', // sqlserver 删除 + SQLSERVER_DISABLE = 'SQLSERVER_DISABLE', // sqlserver 禁用 + SQLSERVER_ENABLE = 'SQLSERVER_ENABLE', // sqlserver 启用 + SQLSERVER_EXCEL_AUTHORIZE_RULES = 'SQLSERVER_EXCEL_AUTHORIZE_RULES', // sqlserver 导入授权 SQLSERVER_FULL_MIGRATE = 'SQLSERVER_FULL_MIGRATE', // sqlserver 全量迁移 + SQLSERVER_HA_APPLY = 'SQLSERVER_HA_APPLY', // sqlserver主从部署 + SQLSERVER_IMPORT_SQLFILE = 'SQLSERVER_IMPORT_SQLFILE', // sqlserver SQL变更执行' SQLSERVER_INCR_MIGRATE = 'SQLSERVER_INCR_MIGRATE', // sqlserver 增量迁移 - SQLSERVER_BUILD_DB_SYNC = 'SQLSERVER_BUILD_DB_SYNC', // DB建立同步 + SQLSERVER_MASTER_FAIL_OVER = 'SQLSERVER_MASTER_FAIL_OVER', // sqlserver 主故障切换 + SQLSERVER_MASTER_SLAVE_SWITCH = 'SQLSERVER_MASTER_SLAVE_SWITCH', // sqlserver 主从切换 SQLSERVER_MODIFY_STATUS = 'SQLSERVER_MODIFY_STATUS', // SQLServer 修改故障实例状态 + SQLSERVER_RESET = 'SQLSERVER_RESET', // sqlserver 集群重置 + SQLSERVER_RESTORE_LOCAL_SLAVE = 'SQLSERVER_RESTORE_LOCAL_SLAVE', // sqlserver 重建从库_原地重建 + SQLSERVER_RESTORE_SLAVE = 'SQLSERVER_RESTORE_SLAVE', // sqlserver 重建从库_新机重建 + SQLSERVER_ROLLBACK = 'SQLSERVER_ROLLBACK', // sqlserver 定点回档 + SQLSERVER_SINGLE_APPLY = 'SQLSERVER_SINGLE_APPLY', // sqlserver单节点部署 } export enum TicketTypes { ES_APPLY = 'ES_APPLY', - ES_DISABLE = 'ES_DISABLE', ES_DESTROY = 'ES_DESTROY', + ES_DISABLE = 'ES_DISABLE', ES_ENABLE = 'ES_ENABLE', + ES_REBOOT = 'ES_REBOOT', + ES_REPLACE = 'ES_REPLACE', ES_SCALE_UP = 'ES_SCALE_UP', ES_SHRINK = 'ES_SHRINK', - ES_REPLACE = 'ES_REPLACE', - ES_REBOOT = 'ES_REBOOT', } export enum TicketTypes { KAFKA_APPLY = 'KAFKA_APPLY', - KAFKA_ENABLE = 'KAFKA_ENABLE', - KAFKA_DISABLE = 'KAFKA_DISABLE', KAFKA_DESTROY = 'KAFKA_DESTROY', + KAFKA_DISABLE = 'KAFKA_DISABLE', + KAFKA_ENABLE = 'KAFKA_ENABLE', + KAFKA_REBOOT = 'KAFKA_REBOOT', + KAFKA_REPLACE = 'KAFKA_REPLACE', KAFKA_SCALE_UP = 'KAFKA_SCALE_UP', KAFKA_SHRINK = 'KAFKA_SHRINK', - KAFKA_REPLACE = 'KAFKA_REPLACE', - KAFKA_REBOOT = 'KAFKA_REBOOT', } export enum TicketTypes { HDFS_APPLY = 'HDFS_APPLY', - HDFS_ENABLE = 'HDFS_ENABLE', - HDFS_DISABLE = 'HDFS_DISABLE', HDFS_DESTROY = 'HDFS_DESTROY', + HDFS_DISABLE = 'HDFS_DISABLE', + HDFS_ENABLE = 'HDFS_ENABLE', + HDFS_REBOOT = 'HDFS_REBOOT', + HDFS_REPLACE = 'HDFS_REPLACE', HDFS_SCALE_UP = 'HDFS_SCALE_UP', HDFS_SHRINK = 'HDFS_SHRINK', - HDFS_REPLACE = 'HDFS_REPLACE', - HDFS_REBOOT = 'HDFS_REBOOT', } export enum TicketTypes { INFLUXDB_APPLY = 'INFLUXDB_APPLY', + INFLUXDB_DESTROY = 'INFLUXDB_DESTROY', INFLUXDB_DISABLE = 'INFLUXDB_DISABLE', + INFLUXDB_ENABLE = 'INFLUXDB_ENABLE', INFLUXDB_REBOOT = 'INFLUXDB_REBOOT', INFLUXDB_REPLACE = 'INFLUXDB_REPLACE', - INFLUXDB_ENABLE = 'INFLUXDB_ENABLE', - INFLUXDB_DESTROY = 'INFLUXDB_DESTROY', } export enum TicketTypes { PULSAR_APPLY = 'PULSAR_APPLY', - PULSAR_REBOOT = 'PULSAR_REBOOT', - PULSAR_ENABLE = 'PULSAR_ENABLE', - PULSAR_DISABLE = 'PULSAR_DISABLE', PULSAR_DESTROY = 'PULSAR_DESTROY', + PULSAR_DISABLE = 'PULSAR_DISABLE', + PULSAR_ENABLE = 'PULSAR_ENABLE', + PULSAR_REBOOT = 'PULSAR_REBOOT', PULSAR_REPLACE = 'PULSAR_REPLACE', - PULSAR_SHRINK = 'PULSAR_SHRINK', PULSAR_SCALE_UP = 'PULSAR_SCALE_UP', + PULSAR_SHRINK = 'PULSAR_SHRINK', } export enum TicketTypes { + TBINLOGDUMPER_DISABLE_NODES = 'TBINLOGDUMPER_DISABLE_NODES', // dumper 节点禁用 + TBINLOGDUMPER_ENABLE_NODES = 'TBINLOGDUMPER_ENABLE_NODES', // dumper 节点启动 TBINLOGDUMPER_INSTALL = 'TBINLOGDUMPER_INSTALL', // dumper 新建订阅 - TBINLOGDUMPER_SWITCH_NODES = 'TBINLOGDUMPER_SWITCH_NODES', // dumper 节点迁移 TBINLOGDUMPER_REDUCE_NODES = 'TBINLOGDUMPER_REDUCE_NODES', // dumper 节点下架 - TBINLOGDUMPER_ENABLE_NODES = 'TBINLOGDUMPER_ENABLE_NODES', // dumper 节点启动 - TBINLOGDUMPER_DISABLE_NODES = 'TBINLOGDUMPER_DISABLE_NODES', // dumper 节点禁用 + TBINLOGDUMPER_SWITCH_NODES = 'TBINLOGDUMPER_SWITCH_NODES', // dumper 节点迁移 } export enum TicketTypes { RIAK_CLUSTER_APPLY = 'RIAK_CLUSTER_APPLY', // Riak 集群申请 RIAK_CLUSTER_DESTROY = 'RIAK_CLUSTER_DESTROY', // Riak 集群删除 RIAK_CLUSTER_DISABLE = 'RIAK_CLUSTER_DISABLE', // Riak 集群禁用 RIAK_CLUSTER_ENABLE = 'RIAK_CLUSTER_ENABLE', // Riak 集群启用 - RIAK_CLUSTER_SCALE_OUT = 'RIAK_CLUSTER_SCALE_OUT', // Riak 集群扩容 - RIAK_CLUSTER_SCALE_IN = 'RIAK_CLUSTER_SCALE_IN', // Riak 集群缩容 RIAK_CLUSTER_REBOOT = 'RIAK_CLUSTER_REBOOT', // Riak 节点重启 + RIAK_CLUSTER_SCALE_IN = 'RIAK_CLUSTER_SCALE_IN', // Riak 集群缩容 + RIAK_CLUSTER_SCALE_OUT = 'RIAK_CLUSTER_SCALE_OUT', // Riak 集群扩容 } export enum TicketTypes { DORIS_APPLY = 'DORIS_APPLY', // Doris 集群申请 - DORIS_ENABLE = 'DORIS_ENABLE', // doris 启用 - DORIS_DISABLE = 'DORIS_DISABLE', // doris 禁用 DORIS_DESTROY = 'DORIS_DESTROY', // doris 删除 + DORIS_DISABLE = 'DORIS_DISABLE', // doris 禁用 + DORIS_ENABLE = 'DORIS_ENABLE', // doris 启用 DORIS_REBOOT = 'DORIS_REBOOT', // doris 重启 DORIS_REPLACE = 'DORIS_REPLACE', // doris 替换 DORIS_SCALE_UP = 'DORIS_SCALE_UP', // doris 扩容 diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/mongo/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/mongo/Index.vue index 76b0583cfc..a9ea002c67 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/mongo/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/mongo/Index.vue @@ -224,7 +224,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', minWidth: 250, showOverflowTooltip: true, render: ({ data }: { data: ResourceItem }) => ( diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/redis/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/redis/Index.vue index f7e308fb0b..88604fef9b 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/redis/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/redis/Index.vue @@ -209,7 +209,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', fixed: 'left', minWidth: 250, showOverflowTooltip: true, diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-ha/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-ha/Index.vue index c5a825a201..5dc3f6110b 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-ha/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-ha/Index.vue @@ -210,7 +210,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', width: 240, fixed: 'left', showOverflowTooltip: true, diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-single/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-single/Index.vue index 14917511fa..2a0bd93ba2 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-single/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/sqlserver-single/Index.vue @@ -211,7 +211,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', width: 280, fixed: 'left', showOverflowTooltip: true, diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/tendb-cluster/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/tendb-cluster/Index.vue index 06f6465b8f..cc7e960195 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/tendb-cluster/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/tendb-cluster/Index.vue @@ -212,7 +212,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', minWidth: 300, showOverflowTooltip: true, render: ({ data }: { data: ResourceItem }) => ( diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/tendb-single/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/tendb-single/Index.vue index ad7df62cdd..0de433b6fd 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/tendb-single/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/tendb-single/Index.vue @@ -215,7 +215,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', minWidth: 250, fixed: 'left', showOverflowTooltip: true, diff --git a/dbm-ui/frontend/src/components/cluster-selector/components/tendbha/Index.vue b/dbm-ui/frontend/src/components/cluster-selector/components/tendbha/Index.vue index f89a325c6a..4529eb654e 100644 --- a/dbm-ui/frontend/src/components/cluster-selector/components/tendbha/Index.vue +++ b/dbm-ui/frontend/src/components/cluster-selector/components/tendbha/Index.vue @@ -210,7 +210,7 @@ }, { label: t('访问入口'), - field: 'cluster_name', + field: 'master_domain', minWidth: 280, showOverflowTooltip: true, render: ({ data }: { data: ResourceItem }) => ( diff --git a/dbm-ui/frontend/src/components/editable-table/Column.vue b/dbm-ui/frontend/src/components/editable-table/Column.vue index c275ae8eeb..98ee70518d 100644 --- a/dbm-ui/frontend/src/components/editable-table/Column.vue +++ b/dbm-ui/frontend/src/components/editable-table/Column.vue @@ -4,11 +4,14 @@ ref="rootRef" class="bk-editable-table-body-column" :class="{ + [`fixed-${fixed}-column`]: fixed, 'is-focused': isFocused, 'is-error': validateState.isError, + 'is-readonly': readonly, 'is-disabled': Boolean(disabledTips), - [`is-column-fixed-${fixed}`]: fixed, 'is-previous-sibling-rowspan': isPreviousSiblingRowspan, + 'is-fixed': + (fixed === 'left' && tableContext?.fixedLeft.value) || (fixed === 'right' && tableContext?.fixedRight.value), }" :data-name="columnKey" :rowspan="rowspan"> @@ -17,25 +20,36 @@ content: disabledTips, disabled: !disabledTips, }" - class="bk-editable-table-field-cell"> + class="bk-editable-table-field-cell" + :style="{ + width: `${tableContext?.columnSizeConfig.value[columnKey]?.renderWidth}px`, + }"> +
- - - + v-if="loading" + class="bk-editable-table-column-loading"> +
+ +
+
+ + + +
diff --git a/dbm-ui/frontend/src/components/editable-table/Index.vue b/dbm-ui/frontend/src/components/editable-table/Index.vue index 29d2e2ecca..b0c30634c1 100644 --- a/dbm-ui/frontend/src/components/editable-table/Index.vue +++ b/dbm-ui/frontend/src/components/editable-table/Index.vue @@ -29,8 +29,11 @@
diff --git a/dbm-ui/frontend/src/components/editable-table/edit/DatePicker.vue b/dbm-ui/frontend/src/components/editable-table/edit/DatePicker.vue index a7fc6f07ed..a335989229 100644 --- a/dbm-ui/frontend/src/components/editable-table/edit/DatePicker.vue +++ b/dbm-ui/frontend/src/components/editable-table/edit/DatePicker.vue @@ -1,21 +1,58 @@ - + diff --git a/dbm-ui/frontend/src/components/editable-table/edit/Select.vue b/dbm-ui/frontend/src/components/editable-table/edit/Select.vue index d6ee9b6a5e..91b067ab40 100644 --- a/dbm-ui/frontend/src/components/editable-table/edit/Select.vue +++ b/dbm-ui/frontend/src/components/editable-table/edit/Select.vue @@ -1,22 +1,80 @@ - + diff --git a/dbm-ui/frontend/src/components/editable-table/edit/Textarea.vue b/dbm-ui/frontend/src/components/editable-table/edit/Textarea.vue index d8aaf10a66..c9f50935b7 100644 --- a/dbm-ui/frontend/src/components/editable-table/edit/Textarea.vue +++ b/dbm-ui/frontend/src/components/editable-table/edit/Textarea.vue @@ -1,46 +1,121 @@ diff --git a/dbm-ui/frontend/src/components/editable-table/edit/TimePicker.vue b/dbm-ui/frontend/src/components/editable-table/edit/TimePicker.vue index 472b801390..5d589dc8bf 100644 --- a/dbm-ui/frontend/src/components/editable-table/edit/TimePicker.vue +++ b/dbm-ui/frontend/src/components/editable-table/edit/TimePicker.vue @@ -1,21 +1,58 @@ - + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Index.vue new file mode 100644 index 0000000000..aca48f386b --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Index.vue @@ -0,0 +1,38 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Successed.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Successed.vue new file mode 100644 index 0000000000..20b0515ec2 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/Successed.vue @@ -0,0 +1,86 @@ + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/ClusterColumn.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/ClusterColumn.vue new file mode 100644 index 0000000000..0c36e7af43 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/ClusterColumn.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/DbNameColumn.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/DbNameColumn.vue new file mode 100644 index 0000000000..060f1c1e83 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/DbNameColumn.vue @@ -0,0 +1,96 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/OperationColumn.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/OperationColumn.vue new file mode 100644 index 0000000000..447a9deb82 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/OperationColumn.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/RecordColumn.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/RecordColumn.vue new file mode 100644 index 0000000000..37b18fd2d6 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/RecordColumn.vue @@ -0,0 +1,27 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/TableNameColumn.vue b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/TableNameColumn.vue new file mode 100644 index 0000000000..f3ac54540e --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_FLASHBACK/components/TableNameColumn.vue @@ -0,0 +1,56 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue index 10db1f1bc5..47e2ee2ade 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue @@ -28,6 +28,21 @@
{{ t('时区') }}
+
{{ t('闪回方式') }}
+ + + {{ t('库表闪回') }} + + + {{ t('记录及闪回') }} + + = {}; + const handleFlashbackTypeChange = (type: string) => { + if (type === 'RECORD_FLASHBACK') { + router.push({ + name: 'MYSQL_FLASHBACK', + }); + } + }; + // 批量录入 const handleShowBatchEntry = () => { isShowBatchEntry.value = true; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/routes.ts b/dbm-ui/frontend/src/views/db-manage/mysql/routes.ts index b485753e7a..a1ff79a44c 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/routes.ts +++ b/dbm-ui/frontend/src/views/db-manage/mysql/routes.ts @@ -191,6 +191,14 @@ export const mysqlToolboxChildrenRouters: RouteRecordRaw[] = [ }, component: () => import('@views/db-manage/mysql/version-upgrade/Index.vue'), }, + { + name: 'MYSQL_FLASHBACK', + path: 'MYSQL_FLASHBACK/:page?', + meta: { + navName: t('闪回'), + }, + component: () => import('@views/db-manage/mysql/MYSQL_FLASHBACK/Index.vue'), + }, ]; const singleRoutes: RouteRecordRaw[] = [ diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Create.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Create.vue new file mode 100644 index 0000000000..eef772b937 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Create.vue @@ -0,0 +1,276 @@ + + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Index.vue new file mode 100644 index 0000000000..aca48f386b --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Index.vue @@ -0,0 +1,38 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Successed.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Successed.vue new file mode 100644 index 0000000000..7f102147c9 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Successed.vue @@ -0,0 +1,86 @@ + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/ClusterColumn.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/ClusterColumn.vue new file mode 100644 index 0000000000..a8cbbef61b --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/ClusterColumn.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/DbNameColumn.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/DbNameColumn.vue new file mode 100644 index 0000000000..060f1c1e83 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/DbNameColumn.vue @@ -0,0 +1,96 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/OperationColumn.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/OperationColumn.vue new file mode 100644 index 0000000000..447a9deb82 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/OperationColumn.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/RecordColumn.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/RecordColumn.vue new file mode 100644 index 0000000000..37b18fd2d6 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/RecordColumn.vue @@ -0,0 +1,27 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/TableNameColumn.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/TableNameColumn.vue new file mode 100644 index 0000000000..f3ac54540e --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/components/TableNameColumn.vue @@ -0,0 +1,56 @@ + + diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/flashback/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/flashback/pages/page1/Index.vue index 8fab02cdaf..50355d2a0f 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/flashback/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/flashback/pages/page1/Index.vue @@ -20,6 +20,21 @@ :title="t('闪回:通过 flashback 工具,对 row 格式的 binlog 做逆向操作')" />
{{ t('时区') }}
+
{{ t('闪回方式') }}
+ + + {{ t('库表闪回') }} + + + {{ t('记录及闪回') }} + + { + if (type === 'RECORD_FLASHBACK') { + router.push({ + name: 'TENDBCLUSTER_FLASHBACK', + }); + } + }; + // 批量选择 const handleShowBatchSelector = () => { isShowBatchSelector.value = true; diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/routes.ts b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/routes.ts index 643dfc379d..6d077ce2c4 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/routes.ts +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/routes.ts @@ -24,231 +24,6 @@ import { checkDbConsole } from '@utils'; import { t } from '@locales/index'; -const spiderSqlExecuteRoute = { - path: 'sql-execute/:step?', - name: 'spiderSqlExecute', - meta: { - navName: t('SQL变更执行'), - }, - component: () => import('@views/db-manage/tendb-cluster/sql-execute/Index.vue'), -}; - -const spiderDbRenameRoute = { - path: 'db-rename/:page?', - name: 'spiderDbRename', - meta: { - navName: t('DB 重命名'), - }, - component: () => import('@views/db-manage/tendb-cluster/db-rename/Index.vue'), -}; - -const spiderMasterSlaveSwapRoute = { - path: 'master-slave-swap/:page?', - name: 'spiderMasterSlaveSwap', - meta: { - navName: t('主从互切'), - }, - component: () => import('@views/db-manage/tendb-cluster/master-slave-swap/Index.vue'), -}; - -const spiderMasterFailoverRoute = { - path: 'master-failover/:page?', - name: 'spiderMasterFailover', - meta: { - navName: t('主库故障切换'), - }, - component: () => import('@views/db-manage/tendb-cluster/master-failover/Index.vue'), -}; - -const spiderCapacityChangeRoute = { - path: 'capacity-change/:page?', - name: 'spiderCapacityChange', - meta: { - navName: t('集群容量变更'), - }, - component: () => import('@views/db-manage/tendb-cluster/capacity-change/Index.vue'), -}; - -const spiderProxyScaleUpRoute = { - name: 'SpiderProxyScaleUp', - path: 'proxy-scale-up/:page?', - meta: { - navName: t('扩容接入层'), - }, - component: () => import('@views/db-manage/tendb-cluster/proxy-scale-up/Index.vue'), -}; - -const spiderProxyScaleDownRoute = { - name: 'SpiderProxyScaleDown', - path: 'proxy-scale-down/:page?', - meta: { - navName: t('缩容接入层'), - }, - component: () => import('@views/db-manage/tendb-cluster/proxy-scale-down/Index.vue'), -}; - -const spiderProxySlaveApplyRoute = { - name: 'SpiderProxySlaveApply', - path: 'proxy-slave-apply/:page?', - meta: { - navName: t('部署只读接入层'), - }, - component: () => import('@views/db-manage/tendb-cluster/proxy-slave-apply/Index.vue'), -}; - -const spiderAddMntRoute = { - path: 'add-mnt/:page?', - name: 'spiderAddMnt', - meta: { - navName: t('添加运维节点'), - }, - component: () => import('@views/db-manage/tendb-cluster/add-mnt/Index.vue'), -}; - -const spiderDbTableBackupRoute = { - path: 'db-table-backup/:page?', - name: 'spiderDbTableBackup', - meta: { - navName: t('库表备份'), - }, - component: () => import('@views/db-manage/tendb-cluster/db-table-backup/Index.vue'), -}; - -const spiderDbBackupRoute = { - path: 'db-backup/:page?', - name: 'spiderDbBackup', - meta: { - navName: t('全库备份'), - }, - component: () => import('@views/db-manage/tendb-cluster/db-backup/Index.vue'), -}; - -const spiderFlashbackRoute = { - path: 'flashback/:page?', - name: 'spiderFlashback', - meta: { - navName: t('闪回'), - }, - component: () => import('@views/db-manage/tendb-cluster/flashback/Index.vue'), -}; - -const spiderRollbackRoute = { - path: 'rollback/:page?', - name: 'spiderRollback', - meta: { - navName: t('定点构造'), - }, - component: () => import('@views/db-manage/tendb-cluster/rollback/Index.vue'), -}; - -const spiderRollbackRecordRoute = { - path: 'rollback-record', - name: 'spiderRollbackRecord', - meta: { - navName: t('构造实例'), - }, - component: () => import('@views/db-manage/tendb-cluster/rollback-record/Index.vue'), -}; - -const spiderDbClearRoute = { - path: 'db-clear/:page?', - name: 'spiderDbClear', - meta: { - navName: t('清档'), - }, - component: () => import('@views/db-manage/tendb-cluster/db-clear/Index.vue'), -}; - -const spiderChecksumRoute = { - path: 'checksum/:page?', - name: 'spiderChecksum', - meta: { - navName: t('数据校验修复'), - }, - component: () => import('@views/db-manage/tendb-cluster/checksum/Index.vue'), -}; - -const spiderPrivilegeCloneClientRoute = { - path: 'privilege-clone-client/:page?', - name: 'spiderPrivilegeCloneClient', - meta: { - navName: t('客户端权限克隆'), - }, - component: () => import('@views/db-manage/tendb-cluster/privilege-clone-client/Index.vue'), -}; - -const spiderPrivilegeCloneInstRoute = { - path: 'privilege-clone-inst/:page?', - name: 'spiderPrivilegeCloneInst', - meta: { - navName: t('DB 实例权限克隆'), - }, - component: () => import('@views/db-manage/tendb-cluster/privilege-clone-inst/Index.vue'), -}; - -const spiderOpenareaTemplateRoute = { - path: 'openarea-template', - name: 'spiderOpenareaTemplate', - meta: { - navName: t('开区模版'), - }, - component: () => import('@views/db-manage/tendb-cluster/openarea-template/Index.vue'), -}; - -const spiderMasterSlaveCloneRoute = { - path: 'master-slave-clone/:page?', - name: 'spiderMasterSlaveClone', - meta: { - navName: t('迁移主从'), - activeMenu: 'spiderToolbox', - }, - component: () => import('@views/db-manage/tendb-cluster/master-slave-clone/Index.vue'), -}; - -const spiderSlaveRebuildRoute = { - path: 'slave-rebuild/:page?', - name: 'spiderSlaveRebuild', - meta: { - navName: t('重建从库'), - activeMenu: 'spiderToolbox', - }, - component: () => import('@views/db-manage/tendb-cluster/slave-rebuild/Index.vue'), -}; - -const spiderWebconsoleRoute = { - name: 'SpiderWebconsole', - path: 'webconsole', - meta: { - navName: 'Webconsole', - }, - component: () => import('@views/db-manage/tendb-cluster/webconsole/Index.vue'), -}; - -const toolboxDbConsoleRouteMap = { - 'tendbCluster.toolbox.sqlExecute': spiderSqlExecuteRoute, - 'tendbCluster.toolbox.dbRename': spiderDbRenameRoute, - 'tendbCluster.toolbox.rollback': spiderRollbackRoute, - 'tendbCluster.toolbox.rollbackRecord': spiderRollbackRecordRoute, - 'tendbCluster.toolbox.flashback': spiderFlashbackRoute, - 'tendbCluster.toolbox.dbTableBackup': spiderDbTableBackupRoute, - 'tendbCluster.toolbox.dbBackup': spiderDbBackupRoute, - 'tendbCluster.toolbox.clientPermissionClone': spiderPrivilegeCloneClientRoute, - 'tendbCluster.toolbox.dbInstancePermissionClone': spiderPrivilegeCloneInstRoute, - 'tendbCluster.toolbox.addMnt': spiderAddMntRoute, - 'tendbCluster.toolbox.proxySlaveApply': spiderProxySlaveApplyRoute, - 'tendbCluster.toolbox.masterSlaveSwap': spiderMasterSlaveSwapRoute, - 'tendbCluster.toolbox.masterFailover': spiderMasterFailoverRoute, - 'tendbCluster.toolbox.capacityChange': spiderCapacityChangeRoute, - 'tendbCluster.toolbox.proxyScaleDown': spiderProxyScaleDownRoute, - 'tendbCluster.toolbox.proxyScaleUp': spiderProxyScaleUpRoute, - 'tendbCluster.toolbox.dbClear': spiderDbClearRoute, - 'tendbCluster.toolbox.checksum': spiderChecksumRoute, - 'tendbCluster.toolbox.openareaTemplate': spiderOpenareaTemplateRoute, - 'tendbCluster.toolbox.slaveRebuild': spiderSlaveRebuildRoute, - 'tendbCluster.toolbox.masterSlaveClone': spiderMasterSlaveCloneRoute, - 'tendbCluster.toolbox.webconsole': spiderWebconsoleRoute, -}; - const tendbClusterInstanceRoute = { name: 'tendbClusterInstance', path: 'instance-list', @@ -307,7 +82,215 @@ const spiderToolboxRoute = { name: '', }, component: () => import('@views/db-manage/tendb-cluster/toolbox/Index.vue'), - children: [] as RouteRecordRaw[], + children: [ + { + path: 'sql-execute/:step?', + name: 'spiderSqlExecute', + meta: { + navName: t('SQL变更执行'), + dbConsole: 'tendbCluster.toolbox.sqlExecute', + }, + component: () => import('@views/db-manage/tendb-cluster/sql-execute/Index.vue'), + }, + { + path: 'db-rename/:page?', + name: 'spiderDbRename', + meta: { + navName: t('DB 重命名'), + dbConsole: 'tendbCluster.toolbox.dbRename', + }, + component: () => import('@views/db-manage/tendb-cluster/db-rename/Index.vue'), + }, + { + path: 'master-slave-swap/:page?', + name: 'spiderMasterSlaveSwap', + meta: { + navName: t('主从互切'), + dbConsole: 'tendbCluster.toolbox.masterSlaveSwap', + }, + component: () => import('@views/db-manage/tendb-cluster/master-slave-swap/Index.vue'), + }, + { + path: 'master-failover/:page?', + name: 'spiderMasterFailover', + meta: { + navName: t('主库故障切换'), + dbConsole: 'tendbCluster.toolbox.masterFailover', + }, + component: () => import('@views/db-manage/tendb-cluster/master-failover/Index.vue'), + }, + { + path: 'capacity-change/:page?', + name: 'spiderCapacityChange', + meta: { + navName: t('集群容量变更'), + dbConsole: 'tendbCluster.toolbox.capacityChange', + }, + component: () => import('@views/db-manage/tendb-cluster/capacity-change/Index.vue'), + }, + { + name: 'SpiderProxyScaleUp', + path: 'proxy-scale-up/:page?', + meta: { + navName: t('扩容接入层'), + dbConsole: 'tendbCluster.toolbox.proxyScaleUp', + }, + component: () => import('@views/db-manage/tendb-cluster/proxy-scale-up/Index.vue'), + }, + { + name: 'SpiderProxyScaleDown', + path: 'proxy-scale-down/:page?', + meta: { + navName: t('缩容接入层'), + dbConsole: 'tendbCluster.toolbox.proxyScaleDown', + }, + component: () => import('@views/db-manage/tendb-cluster/proxy-scale-down/Index.vue'), + }, + { + name: 'SpiderProxySlaveApply', + path: 'proxy-slave-apply/:page?', + meta: { + dbConsole: 'tendbCluster.toolbox.proxySlaveApply', + navName: t('部署只读接入层'), + }, + component: () => import('@views/db-manage/tendb-cluster/proxy-slave-apply/Index.vue'), + }, + { + path: 'add-mnt/:page?', + name: 'spiderAddMnt', + meta: { + navName: t('添加运维节点'), + dbConsole: 'tendbCluster.toolbox.addMnt', + }, + component: () => import('@views/db-manage/tendb-cluster/add-mnt/Index.vue'), + }, + { + path: 'db-table-backup/:page?', + name: 'spiderDbTableBackup', + meta: { + navName: t('库表备份'), + dbConsole: 'tendbCluster.toolbox.dbTableBackup', + }, + component: () => import('@views/db-manage/tendb-cluster/db-table-backup/Index.vue'), + }, + { + path: 'db-backup/:page?', + name: 'spiderDbBackup', + meta: { + navName: t('全库备份'), + dbConsole: 'tendbCluster.toolbox.dbBackup', + }, + component: () => import('@views/db-manage/tendb-cluster/db-backup/Index.vue'), + }, + { + path: 'flashback/:page?', + name: 'spiderFlashback', + meta: { + navName: t('闪回'), + dbConsole: 'tendbCluster.toolbox.flashback', + }, + component: () => import('@views/db-manage/tendb-cluster/flashback/Index.vue'), + }, + { + path: 'TENDBCLUSTER_FLASHBACK/:page?', + name: 'TENDBCLUSTER_FLASHBACK', + meta: { + navName: t('闪回'), + dbConsole: 'tendbCluster.toolbox.flashback', + }, + component: () => import('@views/db-manage/tendb-cluster/TENDBCLUSTER_FLASHBACK/Index.vue'), + }, + { + path: 'rollback/:page?', + name: 'spiderRollback', + meta: { + navName: t('定点构造'), + dbConsole: 'tendbCluster.toolbox.rollback', + }, + component: () => import('@views/db-manage/tendb-cluster/rollback/Index.vue'), + }, + { + path: 'rollback-record', + name: 'spiderRollbackRecord', + meta: { + navName: t('构造实例'), + dbConsole: 'tendbCluster.toolbox.rollbackRecord', + }, + component: () => import('@views/db-manage/tendb-cluster/rollback-record/Index.vue'), + }, + { + path: 'db-clear/:page?', + name: 'spiderDbClear', + meta: { + navName: t('清档'), + dbConsole: 'tendbCluster.toolbox.dbClear', + }, + component: () => import('@views/db-manage/tendb-cluster/db-clear/Index.vue'), + }, + { + path: 'checksum/:page?', + name: 'spiderChecksum', + meta: { + navName: t('数据校验修复'), + dbConsole: 'tendbCluster.toolbox.checksum', + }, + component: () => import('@views/db-manage/tendb-cluster/checksum/Index.vue'), + }, + { + path: 'privilege-clone-client/:page?', + name: 'spiderPrivilegeCloneClient', + meta: { + navName: t('客户端权限克隆'), + dbConsole: 'tendbCluster.toolbox.clientPermissionClone', + }, + component: () => import('@views/db-manage/tendb-cluster/privilege-clone-client/Index.vue'), + }, + { + path: 'privilege-clone-inst/:page?', + name: 'spiderPrivilegeCloneInst', + meta: { + navName: t('DB 实例权限克隆'), + dbConsole: 'tendbCluster.toolbox.dbInstancePermissionClone', + }, + component: () => import('@views/db-manage/tendb-cluster/privilege-clone-inst/Index.vue'), + }, + { + path: 'openarea-template', + name: 'spiderOpenareaTemplate', + meta: { + navName: t('开区模版'), + dbConsole: 'tendbCluster.toolbox.openareaTemplat', + }, + component: () => import('@views/db-manage/tendb-cluster/openarea-template/Index.vue'), + }, + { + path: 'master-slave-clone/:page?', + name: 'spiderMasterSlaveClone', + meta: { + navName: t('迁移主从'), + dbConsole: 'tendbCluster.toolbox.masterSlaveClone', + }, + component: () => import('@views/db-manage/tendb-cluster/master-slave-clone/Index.vue'), + }, + { + path: 'slave-rebuild/:page?', + name: 'spiderSlaveRebuild', + meta: { + navName: t('重建从库'), + dbConsole: 'tendbCluster.toolbox.slaveRebuild', + }, + component: () => import('@views/db-manage/tendb-cluster/slave-rebuild/Index.vue'), + }, + { + name: 'SpiderWebconsole', + path: 'webconsole', + meta: { + navName: 'Webconsole', + dbConsole: 'tendbCluster.toolbox.webconsole', + }, + component: () => import('@views/db-manage/tendb-cluster/webconsole/Index.vue'), + }, + ], }; const renderRoutes = [ @@ -371,21 +354,20 @@ export default function getRoutes(funControllerData: FunctionControllModel) { const mysqlController = funControllerData.getFlatData('mysql'); if (mysqlController.tendbcluster_toolbox) { - Object.entries(toolboxDbConsoleRouteMap).forEach(([key, routeItem]) => { - const dbConsoleValue = key as ExtractedControllerDataKeys; - if (!funControllerData[dbConsoleValue] || funControllerData[dbConsoleValue].is_enabled) { - spiderToolboxRoute.children!.push(routeItem); - if (routeItem.name === 'spiderSqlExecute') { - spiderToolboxRoute.redirect!.name = 'spiderSqlExecute'; - } - } + const toolboxRoutes = spiderToolboxRoute.children.filter((item) => { + const dbConsole = item.meta.dbConsole as ExtractedControllerDataKeys; + return !funControllerData[dbConsole] || funControllerData[dbConsole].is_enabled; }); - if (!spiderToolboxRoute.redirect!.name) { - spiderToolboxRoute.redirect!.name = (spiderToolboxRoute.children![0]?.name as string) ?? ''; + if (toolboxRoutes.length > 0) { + renderRoutes[0].children.push({ + ...spiderToolboxRoute, + redirect: { + name: toolboxRoutes[0].name, + }, + children: toolboxRoutes, + }); } - - renderRoutes[0].children.push(spiderToolboxRoute); } if (checkDbConsole('tendbCluster.instanceManage')) { diff --git a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/mysql/Flashback.vue b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/mysql/Flashback.vue index 13ef4407e3..87c171991e 100644 --- a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/mysql/Flashback.vue +++ b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/mysql/Flashback.vue @@ -12,7 +12,14 @@ --> - + - + + + + + + + {{ ticketDetails.details.force ? t('是') : t('否') }} + + diff --git a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/tendbCluster/Flashback.vue b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/tendbCluster/Flashback.vue index d2e3aecee3..5dde43edd7 100644 --- a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/tendbCluster/Flashback.vue +++ b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/tendbCluster/Flashback.vue @@ -12,7 +12,14 @@ --> diff --git a/dbm-ui/frontend/vite.config.mts b/dbm-ui/frontend/vite.config.mts index da419ebd57..cbccf20252 100644 --- a/dbm-ui/frontend/vite.config.mts +++ b/dbm-ui/frontend/vite.config.mts @@ -26,6 +26,8 @@ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()); const isHttps = mode === 'https'; + console.log('env === ', mode); + return { base: env.VITE_PUBLIC_PATH, resolve: { @@ -92,7 +94,6 @@ export default defineConfig(({ mode }) => { ViteHTMLEnv({ prefix: '{{', suffix: '}}', - envPrefixes: ['VITE_'], }), ].concat(isHttps ? [basicSsl()] : []), optimizeDeps: { @@ -102,6 +103,10 @@ export default defineConfig(({ mode }) => { strictPort: true, host: '127.0.0.1', allowedHosts: true, + hrm: true, + watch: { + usePolling: true, + }, port: 8088, proxy: { '/bkrepo_upload': {