From a64cc86e4ac10ebc3c544985d9be27423ec54659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?cls=5F=E5=AE=81=E6=B3=A2=E6=9C=AC=E6=9C=BA?= <908705107@qq.com> Date: Fri, 12 Jun 2026 20:52:37 +0800 Subject: [PATCH] feat: expose light ai admin menus --- .../zq-form/zq-icon-picker/icons.ts | 2 + .../src/locales/langs/zh-CN/menu-title.json | 1 + web/apps/web-ele/src/router/access.ts | 59 ++++++++++++++++++- .../@core/base/icons/src/iconify-icon.ts | 4 ++ .../src/components/icon-picker/icons.ts | 2 + 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/web/apps/web-ele/src/components/zq-form/zq-icon-picker/icons.ts b/web/apps/web-ele/src/components/zq-form/zq-icon-picker/icons.ts index 909b285..0776714 100644 --- a/web/apps/web-ele/src/components/zq-form/zq-icon-picker/icons.ts +++ b/web/apps/web-ele/src/components/zq-form/zq-icon-picker/icons.ts @@ -43,10 +43,12 @@ const LOCAL_ICONS_MAP: Recordable = { lucide: [ 'lucide:bot', 'lucide:check-square', + 'lucide:history', 'lucide:layout-grid', 'lucide:library-big', 'lucide:list', 'lucide:megaphone', + 'lucide:settings', 'lucide:square-check-big', 'lucide:square-user', 'lucide:workflow', diff --git a/web/apps/web-ele/src/locales/langs/zh-CN/menu-title.json b/web/apps/web-ele/src/locales/langs/zh-CN/menu-title.json index f88538d..87a34f5 100644 --- a/web/apps/web-ele/src/locales/langs/zh-CN/menu-title.json +++ b/web/apps/web-ele/src/locales/langs/zh-CN/menu-title.json @@ -5,6 +5,7 @@ "aiAgent": "智能体", "workflowOrchestration": "流程编排", "workflowRunHistory": "执行历史", + "modelConfig": "模型配置", "knowledgeBase": "知识库", "codex": "Codex", "startChat": "开始聊天", diff --git a/web/apps/web-ele/src/router/access.ts b/web/apps/web-ele/src/router/access.ts index 6324fbf..b7a64b9 100644 --- a/web/apps/web-ele/src/router/access.ts +++ b/web/apps/web-ele/src/router/access.ts @@ -1,6 +1,7 @@ import type { ComponentRecordType, GenerateMenuAndRoutesOptions, + RouteRecordStringComponent, } from '@vben/types'; import { generateAccessible } from '@vben/access'; @@ -52,6 +53,61 @@ function isLightMenuRoute(route: { name?: string }) { return isLightMenuName(route.name); } +function createLightAiMenuRoute( + route: Pick & { + meta: RouteRecordStringComponent['meta']; + }, +): RouteRecordStringComponent { + return route as RouteRecordStringComponent; +} + +const LIGHT_AI_PLATFORM_MENU_ROUTES = [ + createLightAiMenuRoute({ + component: '/ai-platform/model/index', + meta: { + fullPathKey: true, + icon: 'lucide:settings', + order: 30, + title: 'menu-title.modelConfig', + }, + name: 'AIModelConfig', + path: '/ai-platform/model', + }), + createLightAiMenuRoute({ + component: '/ai-platform/workflow-runs/index', + meta: { + fullPathKey: true, + icon: 'lucide:history', + order: 40, + title: 'menu-title.workflowRunHistory', + }, + name: 'AIWorkflowRuns', + path: '/ai-platform/workflow-runs', + }), +]; + +function appendLightAiPlatformMenus(routes: RouteRecordStringComponent[]) { + return routes.map((route) => { + const children = route.children + ? appendLightAiPlatformMenus(route.children) + : undefined; + + if (route.name !== 'AIPlatform') { + return children ? { ...route, children } : route; + } + + const existingNames = new Set(children?.map((item) => item.name)); + const missingRoutes = LIGHT_AI_PLATFORM_MENU_ROUTES.filter( + (item) => !existingNames.has(item.name), + ); + const nextChildren = [...(children || []), ...missingRoutes].sort( + (a, b) => Number(a.meta?.order || 0) - Number(b.meta?.order || 0), + ); + + return { ...route, children: nextChildren }; + }); +} + function filterAvailableRoutes< T extends { children?: T[]; @@ -149,7 +205,8 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) { ? await getAllMenusApi(appContextStore.appCode) : await getAllMenusApi(); - return filterAvailableRoutes(menus, routePageMap, layoutMap); + const lightMenus = filterAvailableRoutes(menus, routePageMap, layoutMap); + return appendLightAiPlatformMenus(lightMenus); }, forbiddenComponent, layoutMap, diff --git a/web/packages/@core/base/icons/src/iconify-icon.ts b/web/packages/@core/base/icons/src/iconify-icon.ts index 2561415..52f7676 100644 --- a/web/packages/@core/base/icons/src/iconify-icon.ts +++ b/web/packages/@core/base/icons/src/iconify-icon.ts @@ -17,12 +17,14 @@ import { ChevronRight, Circle, Edit, + History, LayoutGrid, List, Mail, Megaphone, Plus, RefreshCw, + Settings, SquareCheckBig, Trash2, TriangleAlert, @@ -58,10 +60,12 @@ const localIconMap: Record = { 'ep:refresh-right': RefreshCw, 'lucide:bot': Bot, 'lucide:check-square': CheckSquare, + 'lucide:history': History, 'lucide:layout-grid': LayoutGrid, 'lucide:library-big': BookOpen, 'lucide:list': List, 'lucide:megaphone': Megaphone, + 'lucide:settings': Settings, 'lucide:square-check-big': SquareCheckBig, 'lucide:square-user': UserRound, 'lucide:workflow': Workflow, diff --git a/web/packages/effects/common-ui/src/components/icon-picker/icons.ts b/web/packages/effects/common-ui/src/components/icon-picker/icons.ts index 909b285..0776714 100644 --- a/web/packages/effects/common-ui/src/components/icon-picker/icons.ts +++ b/web/packages/effects/common-ui/src/components/icon-picker/icons.ts @@ -43,10 +43,12 @@ const LOCAL_ICONS_MAP: Recordable = { lucide: [ 'lucide:bot', 'lucide:check-square', + 'lucide:history', 'lucide:layout-grid', 'lucide:library-big', 'lucide:list', 'lucide:megaphone', + 'lucide:settings', 'lucide:square-check-big', 'lucide:square-user', 'lucide:workflow',