From 142bbd265dbf120c9ac96d58021fa90f0dc3ced4 Mon Sep 17 00:00:00 2001 From: zongyangleo Date: Wed, 21 May 2025 04:42:30 +0000 Subject: [PATCH] =?UTF-8?q?!134=20feat:=20=E6=96=B0=E5=A2=9E=E6=94=AF?= =?UTF-8?q?=E6=8C=81es=E5=92=8C=E8=BF=9E=E6=8E=A5=E6=B1=A0=20*=20feat:=20?= =?UTF-8?q?=E5=90=84=E8=BF=9E=E6=8E=A5=EF=BC=8C=E6=94=AF=E6=8C=81=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=B1=A0=20*=20feat=EF=BC=9A=E6=94=AF=E6=8C=81es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.eslintrc.cjs | 8 +- frontend/src/assets/icon/es/es-color.svg | 1 + frontend/src/assets/icon/es/es.svg | 1 + frontend/src/common/Api.ts | 8 +- frontend/src/common/commonEnum.ts | 6 +- frontend/src/common/utils/format.ts | 16 +- frontend/src/components/contextmenu/index.vue | 5 + .../src/components/monaco/MonacoEditor.vue | 22 +- frontend/src/hooks/useRequest.ts | 73 +- frontend/src/i18n/en/common.ts | 8 + frontend/src/i18n/en/db.ts | 7 + frontend/src/i18n/en/es.ts | 122 ++ frontend/src/i18n/zh-cn/common.ts | 8 + frontend/src/i18n/zh-cn/es.ts | 121 ++ frontend/src/i18n/zh-cn/tag.ts | 1 + .../src/layout/navBars/tagsView/tagsView.vue | 3 +- frontend/src/store/themeConfig.ts | 6 +- frontend/src/theme/element.scss | 3 + frontend/src/views/flow/ProcdefList.vue | 1 - .../views/ops/component/ResourceOpPanel.vue | 2 - .../views/ops/component/SshTunnelSelect.vue | 1 + frontend/src/views/ops/es/EsOperation.vue | 1201 +++++++++++++++++ frontend/src/views/ops/es/InstanceEdit.vue | 195 +++ frontend/src/views/ops/es/InstanceList.vue | 195 +++ frontend/src/views/ops/es/api.ts | 55 + .../src/views/ops/es/component/EsAddIndex.vue | 164 +++ .../views/ops/es/component/EsDashboard.vue | 385 ++++++ .../src/views/ops/es/component/EsEditRow.vue | 138 ++ .../views/ops/es/component/EsIndexDetail.vue | 213 +++ .../ops/es/component/EsIndexTemplate.vue | 284 ++++ .../src/views/ops/es/component/EsReindex.vue | 85 ++ .../src/views/ops/es/component/EsSearch.vue | 621 +++++++++ frontend/src/views/ops/redis/RedisEdit.vue | 105 +- .../views/ops/redis/components/CmdExecBox.ts | 28 - .../ops/redis/components/CmdExecDialog.vue | 95 -- frontend/src/views/ops/tag/TagTreeList.vue | 14 + server/.gitignore | 5 +- server/internal/db/api/db.go | 8 + server/internal/db/api/db_transfer.go | 3 + .../internal/db/application/db_data_sync.go | 5 + server/internal/db/application/db_sql_exec.go | 2 + server/internal/db/application/db_transfer.go | 3 + server/internal/db/dbm/dbi/conn.go | 18 +- server/internal/db/dbm/dbm.go | 109 +- server/internal/es/api/api.go | 7 + server/internal/es/api/es_instance.go | 170 +++ server/internal/es/api/form/instance.go | 18 + server/internal/es/api/vo/instance.go | 31 + server/internal/es/application/application.go | 15 + server/internal/es/application/dto/dto.go | 12 + server/internal/es/application/es_instance.go | 284 ++++ .../internal/es/domain/entity/es_instance.go | 36 + server/internal/es/domain/entity/query.go | 16 + .../es/domain/repository/es_instance.go | 14 + server/internal/es/esm/esi/buffer_pool.go | 29 + server/internal/es/esm/esi/conn.go | 55 + server/internal/es/esm/esi/es_info.go | 142 ++ server/internal/es/imsg/en.go | 9 + server/internal/es/imsg/imsg.go | 19 + server/internal/es/imsg/zh_cn.go | 9 + .../infrastructure/persistence/es_instance.go | 34 + .../infrastructure/persistence/persistence.go | 9 + server/internal/es/init/init.go | 18 + server/internal/es/readme.md | 41 + server/internal/machine/api/machine.go | 17 +- server/internal/machine/api/machine_file.go | 2 + server/internal/machine/api/machine_script.go | 3 + .../internal/machine/application/machine.go | 5 - .../machine/application/machine_cronjob.go | 5 +- .../machine/application/machine_file.go | 9 + server/internal/machine/mcm/client.go | 7 +- server/internal/machine/mcm/client_cache.go | 147 +- server/internal/machine/mcm/machine.go | 2 +- server/internal/machine/mcm/sshtunnel.go | 156 ++- server/internal/mongo/api/mongo.go | 14 + server/internal/mongo/mgm/conn_cache.go | 104 +- server/internal/mongo/mgm/info.go | 2 +- server/internal/pkg/consts/consts.go | 4 + server/internal/pkg/starter/gorm.go | 5 + server/internal/redis/api/redis.go | 5 + server/internal/redis/rdm/conn_cache.go | 106 +- server/internal/tag/api/tag_tree.go | 6 + server/internal/tag/domain/entity/tag_tree.go | 3 +- server/main.go | 1 + server/migration/migrations/v1_10.go | 115 +- server/pkg/httpx/httpx.go | 23 +- server/pkg/pool/channel.go | 216 +++ server/pkg/pool/pool.go | 21 + server/pkg/req/conf.go | 9 +- 89 files changed, 5734 insertions(+), 575 deletions(-) create mode 100644 frontend/src/assets/icon/es/es-color.svg create mode 100644 frontend/src/assets/icon/es/es.svg create mode 100644 frontend/src/i18n/en/es.ts create mode 100644 frontend/src/i18n/zh-cn/es.ts create mode 100644 frontend/src/views/ops/es/EsOperation.vue create mode 100644 frontend/src/views/ops/es/InstanceEdit.vue create mode 100644 frontend/src/views/ops/es/InstanceList.vue create mode 100644 frontend/src/views/ops/es/api.ts create mode 100644 frontend/src/views/ops/es/component/EsAddIndex.vue create mode 100644 frontend/src/views/ops/es/component/EsDashboard.vue create mode 100644 frontend/src/views/ops/es/component/EsEditRow.vue create mode 100644 frontend/src/views/ops/es/component/EsIndexDetail.vue create mode 100644 frontend/src/views/ops/es/component/EsIndexTemplate.vue create mode 100644 frontend/src/views/ops/es/component/EsReindex.vue create mode 100644 frontend/src/views/ops/es/component/EsSearch.vue delete mode 100644 frontend/src/views/ops/redis/components/CmdExecBox.ts delete mode 100644 frontend/src/views/ops/redis/components/CmdExecDialog.vue create mode 100644 server/internal/es/api/api.go create mode 100644 server/internal/es/api/es_instance.go create mode 100644 server/internal/es/api/form/instance.go create mode 100644 server/internal/es/api/vo/instance.go create mode 100644 server/internal/es/application/application.go create mode 100644 server/internal/es/application/dto/dto.go create mode 100644 server/internal/es/application/es_instance.go create mode 100644 server/internal/es/domain/entity/es_instance.go create mode 100644 server/internal/es/domain/entity/query.go create mode 100644 server/internal/es/domain/repository/es_instance.go create mode 100644 server/internal/es/esm/esi/buffer_pool.go create mode 100644 server/internal/es/esm/esi/conn.go create mode 100644 server/internal/es/esm/esi/es_info.go create mode 100644 server/internal/es/imsg/en.go create mode 100644 server/internal/es/imsg/imsg.go create mode 100644 server/internal/es/imsg/zh_cn.go create mode 100644 server/internal/es/infrastructure/persistence/es_instance.go create mode 100644 server/internal/es/infrastructure/persistence/persistence.go create mode 100644 server/internal/es/init/init.go create mode 100644 server/internal/es/readme.md create mode 100644 server/pkg/pool/channel.go create mode 100644 server/pkg/pool/pool.go diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs index d48dcf86..a354db97 100644 --- a/frontend/.eslintrc.cjs +++ b/frontend/.eslintrc.cjs @@ -11,7 +11,7 @@ module.exports = { parser: '@typescript-eslint/parser', sourceType: 'module', }, - extends: ['plugin:vue/vue3-essential', 'plugin:vue/essential', 'eslint:recommended'], + extends: ['plugin:vue/essential', 'eslint:recommended'], plugins: ['vue', '@typescript-eslint'], overrides: [ { @@ -35,9 +35,8 @@ module.exports = { '@typescript-eslint/ban-types': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-redeclare': 'error', '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', - '@typescript-eslint/no-unused-vars': [2], + '@typescript-eslint/no-unused-vars': 'off', 'vue/custom-event-name-casing': 'off', 'vue/attributes-order': 'off', 'vue/one-component-per-file': 'off', @@ -53,6 +52,7 @@ module.exports = { 'vue/no-arrow-functions-in-watch': 'off', 'vue/no-template-key': 'off', 'vue/no-v-html': 'off', + 'vue/no-unused-vars': 'off', 'vue/comment-directive': 'off', 'vue/no-parsing-error': 'off', 'vue/no-deprecated-v-on-native-modifier': 'off', @@ -67,7 +67,7 @@ module.exports = { 'generator-star-spacing': 'off', 'no-unreachable': 'off', 'no-multiple-template-root': 'off', - 'no-unused-vars': 'error', + 'no-unused-vars': 'off', 'no-v-model-argument': 'off', 'no-case-declarations': 'off', // 'no-console': 'error', diff --git a/frontend/src/assets/icon/es/es-color.svg b/frontend/src/assets/icon/es/es-color.svg new file mode 100644 index 00000000..52b093d7 --- /dev/null +++ b/frontend/src/assets/icon/es/es-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icon/es/es.svg b/frontend/src/assets/icon/es/es.svg new file mode 100644 index 00000000..3a9d01ef --- /dev/null +++ b/frontend/src/assets/icon/es/es.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/common/Api.ts b/frontend/src/common/Api.ts index 3a4c6b78..2085088f 100644 --- a/frontend/src/common/Api.ts +++ b/frontend/src/common/Api.ts @@ -1,5 +1,5 @@ import request from './request'; -import { useApiFetch } from '@/hooks/useRequest'; +import { RequestOptions, useApiFetch } from '@/hooks/useRequest'; /** * 可用于各模块定义各自api请求 @@ -49,7 +49,7 @@ class Api { * @param reqOptions 其他可选值 * @returns */ - useApi(params: any = null, reqOptions: RequestInit = {}) { + useApi(params: any = null, reqOptions?: RequestOptions) { return useApiFetch(this, params, reqOptions); } @@ -59,8 +59,8 @@ class Api { */ async request(param: any = null, options: any = {}): Promise { const { execute, data } = this.useApi(param, options); - await execute(); - return data.value; + const res = await execute(); + return data.value || res; } /** diff --git a/frontend/src/common/commonEnum.ts b/frontend/src/common/commonEnum.ts index 0f0ee127..5ed55897 100644 --- a/frontend/src/common/commonEnum.ts +++ b/frontend/src/common/commonEnum.ts @@ -15,6 +15,8 @@ export const ResourceTypeEnum = { Db: EnumValue.of(2, '数据库实例').setExtra({ icon: 'Coin', iconColor: 'var(--el-color-warning)' }).tagTypeWarning(), Redis: EnumValue.of(3, 'redis').setExtra({ icon: 'icon redis/redis', iconColor: 'var(--el-color-danger)' }).tagTypeInfo(), Mongo: EnumValue.of(4, 'mongo').setExtra({ icon: 'icon mongo/mongo', iconColor: 'var(--el-color-success)' }).tagTypeDanger(), + AuthCert: EnumValue.of(5, '授权凭证').setExtra({ icon: 'Ticket', iconColor: 'var(--el-color-success)' }), + Es: EnumValue.of(6, 'ES实例').setExtra({ icon: 'Coin', iconColor: 'var(--el-color-warning)' }).tagTypeWarning(), }; // 标签关联的资源类型 @@ -24,9 +26,10 @@ export const TagResourceTypeEnum = { Machine: ResourceTypeEnum.Machine, DbInstance: ResourceTypeEnum.Db, + EsInstance: ResourceTypeEnum.Es, Redis: ResourceTypeEnum.Redis, Mongo: ResourceTypeEnum.Mongo, - AuthCert: EnumValue.of(5, '授权凭证').setExtra({ icon: 'Ticket', iconColor: 'var(--el-color-success)' }), + AuthCert: ResourceTypeEnum.AuthCert, Db: EnumValue.of(22, '数据库').setExtra({ icon: 'Coin' }), }; @@ -37,4 +40,5 @@ export const TagResourceTypePath = { DbInstanceAuthCert: `${TagResourceTypeEnum.DbInstance.value}/${TagResourceTypeEnum.AuthCert.value}`, Db: `${TagResourceTypeEnum.DbInstance.value}/${TagResourceTypeEnum.AuthCert.value}/${TagResourceTypeEnum.Db.value}`, + Es: `${TagResourceTypeEnum.EsInstance.value}/${TagResourceTypeEnum.AuthCert.value}`, }; diff --git a/frontend/src/common/utils/format.ts b/frontend/src/common/utils/format.ts index f18945ba..4f921f29 100644 --- a/frontend/src/common/utils/format.ts +++ b/frontend/src/common/utils/format.ts @@ -30,6 +30,18 @@ export function formatByteSize(size: number, fixed = 2) { return parseFloat((size / Math.pow(base, exponent)).toFixed(fixed)) + units[exponent]; } +export function formatDocSize(size: number, fixed = 2) { + if (size === 0) { + return '0'; + } + + const units = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + const base = 1000; + const exponent = Math.floor(Math.log(size) / Math.log(base)); + + return parseFloat((size / Math.pow(base, exponent)).toFixed(fixed)) + units[exponent]; +} + /** * 容量转为对应的字节大小,如 1KB转为 1024 * @param sizeString 1kb 1gb等 @@ -86,8 +98,8 @@ export function formatTime(time: number, unit: string = 's') { let result = ''; const timeUnits = Object.entries(units).map(([unit, duration]) => { - const value = Math.floor(seconds / duration); - seconds %= duration; + const value = Math.floor(seconds / (duration as any)); + seconds %= duration as any; return { value, unit }; }); diff --git a/frontend/src/components/contextmenu/index.vue b/frontend/src/components/contextmenu/index.vue index 531036fe..dc0253f6 100644 --- a/frontend/src/components/contextmenu/index.vue +++ b/frontend/src/components/contextmenu/index.vue @@ -8,6 +8,7 @@ :style="`top: ${state.dropdown.y + 5}px;left: ${state.dropdown.x}px;`" :key="Math.random()" v-show="state.isShow && !allHide" + @contextmenu="headerContextmenuClick" >
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +