diff --git a/dbm-ui/frontend/src/components/db-app-select/Index.vue b/dbm-ui/frontend/src/components/db-app-select/Index.vue index 02e02cf099..e9741692c7 100644 --- a/dbm-ui/frontend/src/components/db-app-select/Index.vue +++ b/dbm-ui/frontend/src/components/db-app-select/Index.vue @@ -126,6 +126,10 @@ diff --git a/dbm-ui/frontend/src/components/webconsole/components/FontChange.vue b/dbm-ui/frontend/src/components/webconsole/components/FontSetting.vue similarity index 73% rename from dbm-ui/frontend/src/components/webconsole/components/FontChange.vue rename to dbm-ui/frontend/src/components/webconsole/components/FontSetting.vue index 6abc43dcd0..d56fc6cbeb 100644 --- a/dbm-ui/frontend/src/components/webconsole/components/FontChange.vue +++ b/dbm-ui/frontend/src/components/webconsole/components/FontSetting.vue @@ -16,10 +16,10 @@ v-for="(item, index) in fontSizeList" :key="index" class="font-item" - :class="{ 'font-item-active': item.fontSize === currentFontSize }" - @click="() => handleChangeFontSize(index)"> + :class="{ 'font-item-active': item.fontSize === modelValue.fontSize }" + @click="() => handleChangeFontSize(item)"> @@ -29,21 +29,25 @@ diff --git a/dbm-ui/frontend/src/components/webconsole/components/UseHelp.vue b/dbm-ui/frontend/src/components/webconsole/components/UseHelp.vue deleted file mode 100644 index 5c28b5c7d5..0000000000 --- a/dbm-ui/frontend/src/components/webconsole/components/UseHelp.vue +++ /dev/null @@ -1,32 +0,0 @@ - - diff --git a/dbm-ui/frontend/src/components/webconsole/components/UseingHelpPanel.vue b/dbm-ui/frontend/src/components/webconsole/components/UseingHelpPanel.vue deleted file mode 100644 index 26d0b638a4..0000000000 --- a/dbm-ui/frontend/src/components/webconsole/components/UseingHelpPanel.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - diff --git a/dbm-ui/frontend/src/components/webconsole/components/console-panel/Index.vue b/dbm-ui/frontend/src/components/webconsole/components/console-panel/Index.vue index af2ef2ef4e..f640cc9635 100644 --- a/dbm-ui/frontend/src/components/webconsole/components/console-panel/Index.vue +++ b/dbm-ui/frontend/src/components/webconsole/components/console-panel/Index.vue @@ -2,23 +2,19 @@
+ @click="handleInputFocus">
Waiting...
@@ -29,6 +25,7 @@ :disabled="loading" :style="{ height: realHeight }" :value="command" + @blur="handleInputBlur" @input="handleInputChange" @keyup.down="handleClickDownBtn" @keyup.enter.stop="handleClickSendCommand" @@ -40,72 +37,114 @@ diff --git a/dbm-ui/frontend/src/locales/zh-cn.json b/dbm-ui/frontend/src/locales/zh-cn.json index 706f80809f..1398a51a0e 100644 --- a/dbm-ui/frontend/src/locales/zh-cn.json +++ b/dbm-ui/frontend/src/locales/zh-cn.json @@ -3235,6 +3235,10 @@ "不能选择临时集群": "不能选择临时集群", "账号创建后,不支持修改。": "账号创建后,不支持修改。", "平台不会保存密码,请自行保管好。": "平台不会保存密码,请自行保管好。", + "Raw 模式": "Raw 模式", + "开启后可正常显示中文": "开启后可正常显示中文", + "关闭后,内容将不会再在保存,请谨慎操作!": "关闭后,内容将不会再在保存,请谨慎操作!", + "确认关闭当前窗口?": "确认关闭当前窗口?", "授权的IP": "授权的IP", "生成的目标 DB 范式": "生成的目标 DB 范式", "安全认证": "安全认证", @@ -3251,5 +3255,8 @@ "SQL 来源": "SQL 来源", "请添加 SQL 文件": "请添加 SQL 文件", "DB名不允许重复": "DB名不允许重复", + "只支持读取类的指令": "只支持读取类的指令", + "get、mget指令,返回的value需小于1M": "get、mget指令,返回的value需小于1M", + "复合类型,返回member需小于1000": "复合类型,返回member需小于1000", "这行勿动!新增翻译请在上一行添加!": "" } diff --git a/dbm-ui/frontend/src/services/model/redis/redis.ts b/dbm-ui/frontend/src/services/model/redis/redis.ts index 9ced7748a2..2a922c1815 100644 --- a/dbm-ui/frontend/src/services/model/redis/redis.ts +++ b/dbm-ui/frontend/src/services/model/redis/redis.ts @@ -161,6 +161,7 @@ export default class Redis { redis_plugin_dns_bind_clb: boolean; redis_purge: boolean; redis_view: boolean; + redis_webconsole: boolean; }; phase: string; proxy: Node[]; diff --git a/dbm-ui/frontend/src/services/model/spider/tendbCluster.ts b/dbm-ui/frontend/src/services/model/spider/tendbCluster.ts index 24545405fe..590806a964 100644 --- a/dbm-ui/frontend/src/services/model/spider/tendbCluster.ts +++ b/dbm-ui/frontend/src/services/model/spider/tendbCluster.ts @@ -126,6 +126,7 @@ export default class TendbCluster { tendbcluster_spider_reduce_nodes: boolean; tendbcluster_view: boolean; tendb_spider_slave_destroy: boolean; + tendbcluster_webconsole: boolean; access_entry_edit: boolean; }; phase: 'online' | 'offline'; diff --git a/dbm-ui/frontend/src/views/redis/list/components/list/Index.vue b/dbm-ui/frontend/src/views/redis/list/components/list/Index.vue index b43e1cf041..37df60c33e 100644 --- a/dbm-ui/frontend/src/views/redis/list/components/list/Index.vue +++ b/dbm-ui/frontend/src/views/redis/list/components/list/Index.vue @@ -454,7 +454,7 @@ const isCN = computed(() => locale.value === 'zh-cn'); const tableOperationWidth = computed(() => { if (!isStretchLayoutOpen.value) { - return isCN.value ? 240 : 320; + return isCN.value ? 290 : 370; } return 60; }); @@ -854,6 +854,21 @@ render: ({ data }: ColumnRenderData) => { const getOperations = (theme = 'primary') => { const baseOperations = [ + + handleGoWebconsole(data.id)}> + Webconsole + + , { + router.push({ + name: 'RedisWebconsole', + query: { + clusterId + } + }); + } + const handleShowBackup = (data: RedisModel[] = []) => { if ( data.some(item => item.operations.length > 0 diff --git a/dbm-ui/frontend/src/views/redis/routes.ts b/dbm-ui/frontend/src/views/redis/routes.ts index a958d47e1b..aaa726a607 100644 --- a/dbm-ui/frontend/src/views/redis/routes.ts +++ b/dbm-ui/frontend/src/views/redis/routes.ts @@ -28,7 +28,7 @@ const redisCapacityChangeRoute = { navName: t('集群容量变更'), }, component: () => import('@views/redis/capacity-change/Index.vue'), -} +}; const redisProxyScaleUpRoute = { name: 'RedisProxyScaleUp', @@ -37,7 +37,7 @@ const redisProxyScaleUpRoute = { navName: t('扩容接入层'), }, component: () => import('@views/redis/proxy-scale-up/Index.vue'), -} +}; const redisProxyScaleDownRoute = { name: 'RedisProxyScaleDown', @@ -46,7 +46,7 @@ const redisProxyScaleDownRoute = { navName: t('缩容接入层'), }, component: () => import('@views/redis/proxy-scale-down/Index.vue'), -} +}; const redisDBCreateSlaveRoute = { name: 'RedisDBCreateSlave', @@ -55,7 +55,7 @@ const redisDBCreateSlaveRoute = { navName: t('重建从库'), }, component: () => import('@views/redis/db-create-slave/Index.vue'), -} +}; const redisMasterFailoverRoute = { name: 'RedisMasterFailover', @@ -64,7 +64,7 @@ const redisMasterFailoverRoute = { navName: t('主从切换'), }, component: () => import('@views/redis/master-failover/Index.vue'), -} +}; const redisDBReplaceRoute = { name: 'RedisDBReplace', @@ -73,7 +73,7 @@ const redisDBReplaceRoute = { navName: t('整机替换'), }, component: () => import('@views/redis/db-replace/Index.vue'), -} +}; const redisClusterShardUpdateRoute = { name: 'RedisClusterShardUpdate', @@ -82,7 +82,7 @@ const redisClusterShardUpdateRoute = { navName: t('集群分片变更'), }, component: () => import('@views/redis/cluster-shard-update/Index.vue'), -} +}; const redisClusterTypeUpdateRoute = { name: 'RedisClusterTypeUpdate', @@ -91,7 +91,7 @@ const redisClusterTypeUpdateRoute = { navName: t('集群类型变更'), }, component: () => import('@views/redis/cluster-type-update/Index.vue'), -} +}; const redisDBStructureRoute = { name: 'RedisDBStructure', @@ -100,7 +100,7 @@ const redisDBStructureRoute = { navName: t('定点构造'), }, component: () => import('@views/redis/db-structure/Index.vue'), -} +}; const redisStructureInstanceRoute = { name: 'RedisStructureInstance', @@ -109,7 +109,7 @@ const redisStructureInstanceRoute = { navName: t('构造实例'), }, component: () => import('@views/redis/structure-instance/Index.vue'), -} +}; const redisRecoverFromInstanceRoute = { name: 'RedisRecoverFromInstance', @@ -118,7 +118,7 @@ const redisRecoverFromInstanceRoute = { navName: t('以构造实例恢复'), }, component: () => import('@views/redis/recover-from-instance/Index.vue'), -} +}; const redisDBDataCopyRoute = { name: 'RedisDBDataCopy', @@ -127,7 +127,7 @@ const redisDBDataCopyRoute = { navName: t('数据复制'), }, component: () => import('@views/redis/db-data-copy/Index.vue'), -} +}; const redisDBDataCopyRecordRoute = { name: 'RedisDBDataCopyRecord', @@ -136,7 +136,7 @@ const redisDBDataCopyRecordRoute = { navName: t('数据复制记录'), }, component: () => import('@views/redis/db-data-copy-record/Index.vue'), -} +}; const redisVersionUpgradeRoute = { name: 'RedisVersionUpgrade', @@ -145,7 +145,16 @@ const redisVersionUpgradeRoute = { navName: t('版本升级'), }, component: () => import('@views/redis/version-upgrade/Index.vue'), -} +}; + +const redisWebconsoleRoute = { + name: 'RedisWebconsole', + path: 'webconsole', + meta: { + navName: 'Webconsole', + }, + component: () => import('@views/redis/webconsole/Index.vue'), +}; const toolboxDbConsoleRouteMap = { 'redis.toolbox.capacityChange': redisCapacityChangeRoute, @@ -162,7 +171,8 @@ const toolboxDbConsoleRouteMap = { 'redis.toolbox.recoverFromInstance': redisRecoverFromInstanceRoute, 'redis.toolbox.dataCopy': redisDBDataCopyRoute, 'redis.toolbox.dataCopyRecord': redisDBDataCopyRecordRoute, -} + 'redis.toolbox.webconsole': redisWebconsoleRoute, +}; const toolboxRoutes = [ { @@ -196,7 +206,7 @@ const redisInstanceListRoute = { fullscreen: true, }, component: () => import('@views/redis/instance-list/Index.vue'), -} +}; const redisHaInstanceListRoute = { name: 'DatabaseRedisHaInstanceList', @@ -206,7 +216,7 @@ const redisHaInstanceListRoute = { fullscreen: true, }, component: () => import('@views/redis/instance-list-ha/Index.vue'), -} +}; const redisDatabaseHaList = { name: 'DatabaseRedisHaList', @@ -244,7 +254,7 @@ const routes: RouteRecordRaw[] = [ ]; export default function getRoutes(funControllerData: FunctionControllModel) { - const controller = funControllerData.getFlatData('redis') + const controller = funControllerData.getFlatData('redis'); if (controller.redis !== true) { return []; @@ -273,13 +283,13 @@ export default function getRoutes(funControllerData: FunctionControllModel) { if (!funControllerData[dbConsoleValue] || funControllerData[dbConsoleValue].is_enabled) { toolboxRoutes[0].children!.push(routeItem); if (routeItem.name === 'RedisCapacityChange') { - toolboxRoutes[0].redirect!.name = 'RedisCapacityChange' + toolboxRoutes[0].redirect!.name = 'RedisCapacityChange'; } } }); if (!toolboxRoutes[0].redirect!.name) { - toolboxRoutes[0].redirect!.name = toolboxRoutes[0].children![0]?.name as string ?? ''; + toolboxRoutes[0].redirect!.name = (toolboxRoutes[0].children![0]?.name as string) ?? ''; } routes[0].children?.push(...toolboxRoutes); } diff --git a/dbm-ui/frontend/src/views/redis/toolbox-menu.ts b/dbm-ui/frontend/src/views/redis/toolbox-menu.ts index 3c3140186e..eace25a4d4 100644 --- a/dbm-ui/frontend/src/views/redis/toolbox-menu.ts +++ b/dbm-ui/frontend/src/views/redis/toolbox-menu.ts @@ -108,6 +108,19 @@ export default [ }, ], }, + { + name: t('数据查询'), + id: 'redis_data_query', + icon: 'db-icon-search', + children: [ + { + name: 'Webconsole', + id: 'RedisWebconsole', + parentId: 'redis_data_query', + dbConsoleValue: 'redis.toolbox.webconsole', + }, + ], + }, ], }, { diff --git a/dbm-ui/frontend/src/views/redis/webconsole/Index.vue b/dbm-ui/frontend/src/views/redis/webconsole/Index.vue new file mode 100644 index 0000000000..df2aef1681 --- /dev/null +++ b/dbm-ui/frontend/src/views/redis/webconsole/Index.vue @@ -0,0 +1,8 @@ + + diff --git a/dbm-ui/frontend/src/views/spider-manage/list/components/list/Index.vue b/dbm-ui/frontend/src/views/spider-manage/list/components/list/Index.vue index f912299759..6f50a86e06 100644 --- a/dbm-ui/frontend/src/views/spider-manage/list/components/list/Index.vue +++ b/dbm-ui/frontend/src/views/spider-manage/list/components/list/Index.vue @@ -895,6 +895,20 @@ render: ({ data }: IColumn) => { const getOperations = (theme = 'primary') => { const operations = [ + + handleGoWebconsole(data.id)}> + Webconsole + + , { + router.push({ + name: 'SpiderWebconsole', + query: { + clusterId + } + }); + } + // 下架运维节点 const handleRemoveMNT = (data: TendbClusterModel) => { InfoBox({ diff --git a/dbm-ui/frontend/src/views/spider-manage/routes.ts b/dbm-ui/frontend/src/views/spider-manage/routes.ts index ceccd03ebd..972f60c422 100644 --- a/dbm-ui/frontend/src/views/spider-manage/routes.ts +++ b/dbm-ui/frontend/src/views/spider-manage/routes.ts @@ -28,7 +28,7 @@ const spiderSqlExecuteRoute = { navName: t('SQL变更执行'), }, component: () => import('@views/spider-manage/sql-execute/Index.vue'), -} +}; const spiderDbRenameRoute = { path: 'db-rename/:page?', @@ -37,7 +37,7 @@ const spiderDbRenameRoute = { navName: t('DB 重命名'), }, component: () => import('@views/spider-manage/db-rename/Index.vue'), -} +}; const spiderMasterSlaveSwapRoute = { path: 'master-slave-swap/:page?', @@ -46,7 +46,7 @@ const spiderMasterSlaveSwapRoute = { navName: t('主从互切'), }, component: () => import('@views/spider-manage/master-slave-swap/Index.vue'), -} +}; const spiderMasterFailoverRoute = { path: 'master-failover/:page?', @@ -55,7 +55,7 @@ const spiderMasterFailoverRoute = { navName: t('主库故障切换'), }, component: () => import('@views/spider-manage/master-failover/Index.vue'), -} +}; const spiderCapacityChangeRoute = { path: 'capacity-change/:page?', @@ -64,7 +64,7 @@ const spiderCapacityChangeRoute = { navName: t('集群容量变更'), }, component: () => import('@views/spider-manage/capacity-change/Index.vue'), -} +}; const spiderProxyScaleUpRoute = { name: 'SpiderProxyScaleUp', @@ -73,7 +73,7 @@ const spiderProxyScaleUpRoute = { navName: t('扩容接入层'), }, component: () => import('@views/spider-manage/proxy-scale-up/Index.vue'), -} +}; const spiderProxyScaleDownRoute = { name: 'SpiderProxyScaleDown', @@ -82,7 +82,7 @@ const spiderProxyScaleDownRoute = { navName: t('缩容接入层'), }, component: () => import('@views/spider-manage/proxy-scale-down/Index.vue'), -} +}; const spiderProxySlaveApplyRoute = { name: 'SpiderProxySlaveApply', @@ -91,7 +91,7 @@ const spiderProxySlaveApplyRoute = { navName: t('部署只读接入层'), }, component: () => import('@views/spider-manage/proxy-slave-apply/Index.vue'), -} +}; const spiderAddMntRoute = { path: 'add-mnt/:page?', @@ -100,7 +100,7 @@ const spiderAddMntRoute = { navName: t('添加运维节点'), }, component: () => import('@views/spider-manage/add-mnt/Index.vue'), -} +}; const spiderDbTableBackupRoute = { path: 'db-table-backup/:page?', @@ -109,7 +109,7 @@ const spiderDbTableBackupRoute = { navName: t('库表备份'), }, component: () => import('@views/spider-manage/db-table-backup/Index.vue'), -} +}; const spiderDbBackupRoute = { path: 'db-backup/:page?', @@ -118,7 +118,7 @@ const spiderDbBackupRoute = { navName: t('全库备份'), }, component: () => import('@views/spider-manage/db-backup/Index.vue'), -} +}; const spiderFlashbackRoute = { path: 'flashback/:page?', @@ -127,7 +127,7 @@ const spiderFlashbackRoute = { navName: t('闪回'), }, component: () => import('@views/spider-manage/flashback/Index.vue'), -} +}; const spiderRollbackRoute = { path: 'rollback/:page?', @@ -136,7 +136,7 @@ const spiderRollbackRoute = { navName: t('定点构造'), }, component: () => import('@views/spider-manage/rollback/Index.vue'), -} +}; const spiderRollbackRecordRoute = { path: 'rollback-record', @@ -145,7 +145,7 @@ const spiderRollbackRecordRoute = { navName: t('构造实例'), }, component: () => import('@views/spider-manage/rollback-record/Index.vue'), -} +}; const spiderDbClearRoute = { path: 'db-clear/:page?', @@ -154,7 +154,7 @@ const spiderDbClearRoute = { navName: t('清档'), }, component: () => import('@views/spider-manage/db-clear/Index.vue'), -} +}; const spiderChecksumRoute = { path: 'checksum/:page?', @@ -163,7 +163,7 @@ const spiderChecksumRoute = { navName: t('数据校验修复'), }, component: () => import('@views/spider-manage/checksum/Index.vue'), -} +}; const spiderPrivilegeCloneClientRoute = { path: 'privilege-clone-client/:page?', @@ -172,7 +172,7 @@ const spiderPrivilegeCloneClientRoute = { navName: t('客户端权限克隆'), }, component: () => import('@views/spider-manage/privilege-clone-client/Index.vue'), -} +}; const spiderPrivilegeCloneInstRoute = { path: 'privilege-clone-inst/:page?', @@ -181,7 +181,7 @@ const spiderPrivilegeCloneInstRoute = { navName: t('DB 实例权限克隆'), }, component: () => import('@views/spider-manage/privilege-clone-inst/Index.vue'), -} +}; const spiderOpenareaTemplateRoute = { path: 'openarea-template', @@ -190,7 +190,7 @@ const spiderOpenareaTemplateRoute = { navName: t('开区模版'), }, component: () => import('@views/spider-manage/openarea-template/Index.vue'), -} +}; const spiderMasterSlaveCloneRoute = { path: 'master-slave-clone/:page?', @@ -200,7 +200,7 @@ const spiderMasterSlaveCloneRoute = { activeMenu: 'spiderToolbox', }, component: () => import('@views/spider-manage/master-slave-clone/Index.vue'), -} +}; const spiderSlaveRebuildRoute = { path: 'slave-rebuild/:page?', @@ -210,7 +210,16 @@ const spiderSlaveRebuildRoute = { activeMenu: 'spiderToolbox', }, component: () => import('@views/spider-manage/slave-rebuild/Index.vue'), -} +}; + +const spiderWebconsoleRoute = { + name: 'SpiderWebconsole', + path: 'webconsole', + meta: { + navName: 'Webconsole', + }, + component: () => import('@views/spider-manage/webconsole/Index.vue'), +}; const toolboxDbConsoleRouteMap = { 'tendbCluster.toolbox.sqlExecute': spiderSqlExecuteRoute, @@ -234,7 +243,8 @@ const toolboxDbConsoleRouteMap = { 'tendbCluster.toolbox.openareaTemplate': spiderOpenareaTemplateRoute, 'tendbCluster.toolbox.slaveRebuild': spiderSlaveRebuildRoute, 'tendbCluster.toolbox.masterSlaveClone': spiderMasterSlaveCloneRoute, -} + 'tendbCluster.toolbox.webconsole': spiderWebconsoleRoute, +}; const tendbClusterInstanceRoute = { name: 'tendbClusterInstance', @@ -244,7 +254,7 @@ const tendbClusterInstanceRoute = { fullscreen: true, }, component: () => import('@views/spider-manage/list-instance/Index.vue'), -} +}; const spiderPartitionManageRoute = { path: 'partition-manage', @@ -253,7 +263,7 @@ const spiderPartitionManageRoute = { navName: t('【TenDB Cluster】分区管理'), }, component: () => import('@views/spider-manage/partition-manage/Index.vue'), -} +}; const permissionManageRoutes = [ { @@ -280,7 +290,7 @@ const permissionManageRoutes = [ }, component: () => import('@views/whitelist/list/Index.vue'), }, -] +]; const spiderToolboxRoute = { path: 'toolbox', @@ -294,7 +304,7 @@ const spiderToolboxRoute = { }, component: () => import('@views/spider-manage/toolbox/Index.vue'), children: [] as RouteRecordRaw[], -} +}; const renderRoutes = [ { @@ -362,15 +372,15 @@ export default function getRoutes(funControllerData: FunctionControllModel) { if (!funControllerData[dbConsoleValue] || funControllerData[dbConsoleValue].is_enabled) { spiderToolboxRoute.children!.push(routeItem); if (routeItem.name === 'spiderSqlExecute') { - spiderToolboxRoute.redirect!.name = 'spiderSqlExecute' + spiderToolboxRoute.redirect!.name = 'spiderSqlExecute'; } } }); if (!spiderToolboxRoute.redirect!.name) { - spiderToolboxRoute.redirect!.name = spiderToolboxRoute.children![0]?.name as string ?? ''; + spiderToolboxRoute.redirect!.name = (spiderToolboxRoute.children![0]?.name as string) ?? ''; } - + renderRoutes[0].children.push(spiderToolboxRoute); } diff --git a/dbm-ui/frontend/src/views/spider-manage/toolbox-menu.ts b/dbm-ui/frontend/src/views/spider-manage/toolbox-menu.ts index 5faa38105c..fc01df5a44 100644 --- a/dbm-ui/frontend/src/views/spider-manage/toolbox-menu.ts +++ b/dbm-ui/frontend/src/views/spider-manage/toolbox-menu.ts @@ -210,4 +210,17 @@ export default [ }, ], }, + { + name: t('数据查询'), + id: 'spider_data_query', + icon: 'db-icon-search', + children: [ + { + name: 'Webconsole', + id: 'SpiderWebconsole', + parentId: 'spider_data_query', + dbConsoleValue: 'tendbCluster.toolbox.webconsole', + }, + ], + }, ]; diff --git a/dbm-ui/frontend/src/views/spider-manage/webconsole/Index.vue b/dbm-ui/frontend/src/views/spider-manage/webconsole/Index.vue new file mode 100644 index 0000000000..bbe1eb1180 --- /dev/null +++ b/dbm-ui/frontend/src/views/spider-manage/webconsole/Index.vue @@ -0,0 +1,8 @@ + +