- {visibleMenuItems.map((item) => (
+ {sidebarMenuItemsToRender.map((item) => (
{inWujieEnv && item.children?.length && hoveredTopId === item.id ? (
diff --git a/frontend-web/src/core/page-layout/sidebar-menu.ts b/frontend-web/src/core/page-layout/sidebar-menu.ts
index cea245cd..908e596a 100644
--- a/frontend-web/src/core/page-layout/sidebar-menu.ts
+++ b/frontend-web/src/core/page-layout/sidebar-menu.ts
@@ -1,11 +1,11 @@
/**
- * ?????????????????
+ * 全局侧边栏菜单数据与权限过滤逻辑。
*
- * ?? ``PageSidebar`` ??? ``PageSidebarDark`` ?????? ?? ?????
- * adminOnly ??????????????UI ???icon ??/????/hover flyout?
- * ?????????
+ * 浅色 ``PageSidebar`` 和深色 ``PageSidebarDark`` 共用这份数据 —— 菜单结构与
+ * adminOnly 权限策略对两种皮肤完全一致;UI 渲染(icon 显示/折叠样式/hover flyout)
+ * 在各自组件里实现。
*
- * ????????????? sidebar ?????
+ * 修改菜单只需改这一处,两个 sidebar 自动同步。
*/
import type { ElementType } from "react";
import {
@@ -24,13 +24,11 @@ import {
History,
Layers,
Layout,
+ Library,
List,
ListChecks,
ListTodo,
- MessageSquareCode,
Network,
- NotebookPen,
- Plus,
Settings,
Sparkles,
Target,
@@ -50,80 +48,46 @@ export type MenuItem = {
export const sidebarMenuItems: MenuItem[] = [
{
id: "qa-center",
- label: "????",
+ label: "问答中心",
icon: HelpCircle,
children: [
- { id: "general-qa", label: "????", icon: CircleHelp, path: "/page/workspace/chats/new" },
+ { id: "general-qa", label: "通用问答", icon: CircleHelp, path: "/page/workspace/chats/new" },
{
id: "multi-agent-roundtable",
- label: "??????",
+ label: "多智能体会商",
icon: Users,
path: "/page/strategy/qa/multi-agent-roundtable",
},
- // { id: "expert-qa", label: "????", icon: Brain, path: "/page/strategy/qa/expert-qa" },
+ // { id: "expert-qa", label: "专家问答", icon: Brain, path: "/page/strategy/qa/expert-qa" },
{
id: "qa-zzjc",
- label: "zzjc??",
+ label: "zzJC支持",
icon: Bot,
path: "/page/strategy/agents/6bf/chats/new",
},
- { id: "qa-zzxd", label: "zzXD??", icon: Layout, path: "/page/strategy/agents/10d69686718349688e58a8790cb61024/chats/new", },
- { id: "qa-research", label: "????", icon: FileText, path: "/page/canvas/ai-writing" },
+ { id: "qa-zzxd", label: "zzXD应用", icon: Layout, path: "/page/strategy/agents/10d69686718349688e58a8790cb61024/chats/new", },
+ { id: "qa-research", label: "课题研究", icon: FileText, path: "/page/canvas/ai-writing" },
],
},
- // {
- // id: "light-app-center",
- // label: "???",
- // icon: Grid3X3,
- // children: [
- // {
- // id: "light-app-note-management",
- // label: "????",
- // icon: NotebookPen,
- // children: [
- // {
- // id: "light-app-new-note",
- // label: "????",
- // icon: Plus,
- // path: "/page/strategy/light-app/new-note",
- // },
- // {
- // id: "light-app-note-list",
- // label: "????",
- // icon: List,
- // path: "/page/strategy/light-app/notes",
- // },
- // {
- // id: "light-app-note-qa",
- // label: "????",
- // icon: MessageSquareCode,
- // path: "/page/strategy/light-app/note-qa",
- // },
- // ],
- // },
- // { id: "light-app-square", label: "????", icon: Layout },
- // { id: "light-app-records", label: "????", icon: History },
- // ],
- // },
{
id: "task-management",
- label: "????",
+ label: "任务管理",
icon: Target,
children: [
{
id: "xk-center-task",
- label: "XK???",
+ label: "XK中任务",
icon: Folder,
children: [
{
id: "xk-task-jc",
- label: "??JC",
+ label: "任务JC",
icon: ListTodo,
path: "/page/strategy/task-management/xk-task-jc",
},
{
id: "xk-task-dispatch",
- label: "????",
+ label: "任务调度",
icon: ListTodo,
path: "/page/strategy/task-management/xk-task-dispatch",
},
@@ -131,7 +95,7 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "coh-center-task",
- label: "COH???",
+ label: "COH中任务",
icon: Folder,
children: [
{
@@ -142,7 +106,7 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "coh-task-fx",
- label: "??FX",
+ label: "任务FX",
icon: ListTodo,
path: "/page/strategy/task-management/plan-task/plan-task-fx",
},
@@ -156,12 +120,12 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "pg-center-task",
- label: "PG???",
+ label: "PG中任务",
icon: Folder,
children: [
{
id: "pg-task-pg",
- label: "??PG",
+ label: "任务PG",
icon: ListTodo,
path: "/page/strategy/task-management/effect-task-pg",
},
@@ -173,7 +137,7 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "pg-task-info-pg",
- label: "??PG",
+ label: "信息PG",
icon: ListTodo,
path: "/page/strategy/task-management/effect-info-pg",
},
@@ -181,24 +145,24 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "ty-center-task",
- label: "TY???",
+ label: "TY中任务",
icon: Folder,
children: [
{
id: "ty-task-xdty",
- label: "XDTY??",
+ label: "XDTY任务",
icon: ListTodo,
path: "/page/strategy/task-management/mnty-task-mechanism",
},
{
id: "ty-task-plan",
- label: "??TY??",
+ label: "方案TY任务",
icon: ListTodo,
path: "/page/strategy/task-management/mnty-task-plan",
},
{
id: "ty-task-xxty",
- label: "XXTY??",
+ label: "XXTY任务",
icon: ListTodo,
path: "/page/strategy/task-management/mnty-task-zsty",
},
@@ -206,63 +170,83 @@ export const sidebarMenuItems: MenuItem[] = [
},
],
},
+ {
+ id: "light-app-center",
+ label: "应用中心",
+ icon: Grid3X3,
+ children: [
+ {
+ id: "light-app-management",
+ label: "应用管理",
+ icon: Layout,
+ path: "/page/strategy/light-app/management",
+ adminOnly: true,
+ },
+ {
+ id: "light-app-apps",
+ label: "应用列表",
+ icon: List,
+ path: "/page/strategy/light-app/apps",
+ },
+ ],
+ },
{
id: "comprehensive-management",
- label: "????",
+ label: "综合管理",
icon: Settings,
children: [
- { id: "mgmt-agents", label: "?????", icon: Bot, path: "/page/strategy/agents" },
+ { id: "mgmt-agents", label: "智能体管理", icon: Bot, path: "/page/strategy/agents" },
{
id: "mgmt-business-chain-mapping",
- label: "????",
+ label: "配置管理",
icon: Network,
path: "/page/strategy/business-chain-mapping",
},
{
id: "mgmt-business-chains",
- label: "??????",
+ label: "业务链条配置",
icon: Layers,
path: "/page/strategy/business-chains",
},
- { id: "mgmt-skills", label: "????", icon: Sparkles, path: "/page/strategy/skills" },
- { id: "mgmt-memory", label: "????", icon: Brain, path: "/page/strategy/memory" },
+ { id: "mgmt-skills", label: "技能管理", icon: Sparkles, path: "/page/strategy/skills" },
+ { id: "mgmt-memory", label: "记忆管理", icon: Brain, path: "/page/strategy/memory" },
{
id: "mgmt-tasks",
- label: "????",
+ label: "定时任务",
icon: ListChecks,
path: "/page/strategy/scheduled/tasks",
},
{
id: "mgmt-llm-metrics",
- label: "???????",
+ label: "大模型调用统计",
icon: Gauge,
path: "/page/strategy/settings/llm-metrics",
adminOnly: true,
},
{
id: "mgmt-users",
- label: "????",
+ label: "用户管理",
icon: Users,
path: "/page/strategy/admin/users",
adminOnly: true,
},
{
id: "mgmt-user-leaderboard",
- label: "?????",
+ label: "用户排行榜",
icon: Trophy,
path: "/page/strategy/admin/user-leaderboard",
adminOnly: true,
},
{
id: "mgmt-admin-scheduled-tasks",
- label: "??????",
+ label: "定时任务管理",
icon: CalendarClock,
path: "/page/strategy/admin/scheduled-tasks",
adminOnly: true,
},
{
id: "mgmt-user-activity",
- label: "??????",
+ label: "用户活动审计",
icon: History,
path: "/page/strategy/admin/user-activity",
adminOnly: true,
@@ -271,24 +255,30 @@ export const sidebarMenuItems: MenuItem[] = [
},
{
id: "resource-management",
- label: "????",
+ label: "资源管理",
icon: Database,
children: [
{
id: "resource-network-xwt",
- label: "??xwt????",
+ label: "网络xwt资源管理",
icon: Network,
path: "/page/strategy/resource-management/resource-network-actor",
},
{
id: "resource-knowledge-native",
- label: "????",
+ label: "问答梳理",
icon: BookOpen,
path: "/page/workspace/knowledge",
},
+ {
+ id: "resource-knowledge-base",
+ label: "知识库资源管理",
+ icon: Library,
+ path: "/page/strategy/resource-management/resource-knowledge-base",
+ },
{
id: "resource-evaluation-index",
- label: "??????",
+ label: "作战资源管理",
icon: FileBox,
path: "/page/strategy/resource-management/resource-evaluation-index",
},
@@ -296,7 +286,7 @@ export const sidebarMenuItems: MenuItem[] = [
},
];
-/** ??????? id ????????????????? */
+/** 默认展开的菜单 id 集合(浅色版可折叠交互的初始状态) */
export const defaultExpandedIds: ReadonlySet = new Set([
"qa-center",
"light-app-center",
@@ -306,7 +296,7 @@ export const defaultExpandedIds: ReadonlySet = new Set([
"comprehensive-management",
]);
-/** ? admin ???????? admin ??? ``adminOnly: true`` ?????? */
+/** 按 admin 角色过滤菜单:非 admin 不展示 ``adminOnly: true`` 的项及其子项 */
export function filterMenuItemsByRole(items: MenuItem[], isAdmin: boolean): MenuItem[] {
return items
.filter((item) => !item.adminOnly || isAdmin)
diff --git a/frontend-web/src/pages/StrategyRoutes.tsx b/frontend-web/src/pages/StrategyRoutes.tsx
index 0fd8ae17..469d9a0d 100644
--- a/frontend-web/src/pages/StrategyRoutes.tsx
+++ b/frontend-web/src/pages/StrategyRoutes.tsx
@@ -78,11 +78,11 @@ export default function StrategyRoutes() {
} />
}
+ element={}
/>
}
+ element={}
/>
cn(
@@ -35,7 +35,7 @@ const Header = ({ collapsed }: HeaderProps) => {
const { pathname } = useLocation();
const isAdmin = getStoredAuth()?.system_role === "admin";
const visibleMenuItems = useSidebarMenuItems(!!isAdmin);
- const showTopSubmenu = isDark && !collapsed && !isWujieEnv();
+ const showTopNav = isDark && !collapsed && !isWujieEnv();
const hasActiveChild = (item: MenuItem): boolean => {
if (item.path && pathname === item.path) {
@@ -64,11 +64,10 @@ const Header = ({ collapsed }: HeaderProps) => {
};
const activeTopItem = visibleMenuItems.find(hasActiveChild);
- const topSubNavItems = activeTopItem?.children ?? [];
- const activeSecondItem = topSubNavItems.find(hasActiveChild);
+ const activeSecondItem = activeTopItem?.children?.find(hasActiveChild);
const thirdSubNavItems = activeSecondItem?.children ?? [];
- const handleTopSubNavClick = (item: MenuItem) => {
+ const handleNavItemClick = (item: MenuItem) => {
const path = item.path ?? findFirstRoutePath(item.children);
if (path) {
navigate(path);
@@ -99,14 +98,14 @@ const Header = ({ collapsed }: HeaderProps) => {
{!collapsed && (
-
+
CM助手
)}
- {showTopSubmenu && topSubNavItems.length ? (
-