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 @@
-
-
-
-
- {{ t('使用帮助') }}
-
-
-
-
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 @@
-
-
-
-
-
## {{ t('使用帮助') }}
-
1. {{ t('支持 show databases、show tables from db1 等部分 show 语句') }};
-
- 2. {{ t('只能输入select,不支持 insert, delete, update,且 select 必须带limit控制行数,行数<=1000') }};
-
-
3. {{ t('暂时不支持 use 语句') }};
-
4. {{ t('不允许访问系统库,如 mysql information_schema performance_schema db_infobase') }};
-
5. {{ t('查询结果数据量不能大于64M') }};
-
## {{ t('示例') }}
-
- show databases;
-
- show tables from db1;
-
- select * from [db.]table [where cond] [order by ...] limit [skip,]N; (N<=1000)
-
-
-
-
-
-
-
-
-
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">
-
{{ item.message }}
-
+
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 @@
+
+
+
+