101 lines
3.3 KiB
TypeScript
101 lines
3.3 KiB
TypeScript
import type { Component } from 'vue'
|
|
import type { MenuItem } from '../components/ContextMenu.vue'
|
|
import { IconEye, IconEdit, IconDelete, IconRefresh, IconCheck, IconCode, IconCopy, IconPlus } from '@arco-design/web-vue/es/icon'
|
|
|
|
/**
|
|
* 菜单项注册表
|
|
* 根据节点类型返回对应的菜单项配置
|
|
*/
|
|
export function useMenuRegistry() {
|
|
/**
|
|
* 获取连接节点菜单项
|
|
*/
|
|
const getConnectionMenuItems = (): MenuItem[] => {
|
|
return [
|
|
{ key: 'view-structure', label: '查看结构', icon: IconEye },
|
|
{ key: 'edit', label: '编辑连接', icon: IconEdit },
|
|
{ key: 'delete', label: '删除连接', icon: IconDelete, divider: true },
|
|
{ key: 'refresh', label: '刷新', icon: IconRefresh },
|
|
{ key: 'test', label: '测试连接', icon: IconCheck }
|
|
]
|
|
}
|
|
|
|
/**
|
|
* 获取数据库节点菜单项
|
|
*/
|
|
const getDatabaseMenuItems = (dbType: string): MenuItem[] => {
|
|
const items: MenuItem[] = []
|
|
|
|
// 新建表/集合/Key
|
|
if (dbType === 'mysql') {
|
|
items.push({ key: 'create-table', label: '新建表', icon: IconPlus })
|
|
} else if (dbType === 'mongo') {
|
|
items.push({ key: 'create-table', label: '新建集合', icon: IconPlus })
|
|
} else if (dbType === 'redis') {
|
|
items.push({ key: 'create-table', label: '新建Key', icon: IconPlus })
|
|
}
|
|
|
|
items.push({ key: 'view-structure', label: '查看结构', icon: IconEye, divider: true })
|
|
|
|
if (dbType === 'mysql' || dbType === 'mongo') {
|
|
items.push({ key: 'generate-sql', label: dbType === 'mysql' ? '生成SELECT语句' : '生成find语句', icon: IconCode })
|
|
} else if (dbType === 'redis') {
|
|
items.push({ key: 'generate-sql', label: '生成KEYS命令', icon: IconCode })
|
|
}
|
|
|
|
items.push({ key: 'refresh', label: '刷新', icon: IconRefresh, divider: true })
|
|
|
|
return items
|
|
}
|
|
|
|
/**
|
|
* 获取表节点菜单项
|
|
*/
|
|
const getTableMenuItems = (dbType: string): MenuItem[] => {
|
|
const items: MenuItem[] = [
|
|
{ key: 'view-structure', label: '查看结构', icon: IconEye }
|
|
]
|
|
|
|
if (dbType === 'mysql') {
|
|
items.push({ key: 'generate-sql', label: '生成SELECT语句', icon: IconCode })
|
|
items.push({ key: 'copy-name', label: '复制表名', icon: IconCopy, divider: true })
|
|
} else if (dbType === 'mongo') {
|
|
items.push({ key: 'generate-sql', label: '生成find语句', icon: IconCode })
|
|
items.push({ key: 'copy-name', label: '复制集合名', icon: IconCopy, divider: true })
|
|
} else if (dbType === 'redis') {
|
|
items.push({ key: 'generate-sql', label: '生成GET命令', icon: IconCode })
|
|
items.push({ key: 'copy-name', label: '复制Key名', icon: IconCopy, divider: true })
|
|
}
|
|
|
|
items.push({ key: 'refresh', label: '刷新', icon: IconRefresh })
|
|
|
|
return items
|
|
}
|
|
|
|
/**
|
|
* 根据节点类型获取菜单项
|
|
*/
|
|
const getMenuItems = (nodeType: string, dbType?: string): MenuItem[] => {
|
|
switch (nodeType) {
|
|
case 'connection':
|
|
return getConnectionMenuItems()
|
|
case 'database':
|
|
return getDatabaseMenuItems(dbType || 'mysql')
|
|
case 'table':
|
|
case 'collection':
|
|
case 'key':
|
|
return getTableMenuItems(dbType || 'mysql')
|
|
default:
|
|
return []
|
|
}
|
|
}
|
|
|
|
return {
|
|
getMenuItems,
|
|
getConnectionMenuItems,
|
|
getDatabaseMenuItems,
|
|
getTableMenuItems
|
|
}
|
|
}
|
|
|