Files
model-platform/frontend/app/routes/platform.navigation.tsx
T
郑龙捷 7d5e3e9a50 fix: 对齐运维页面原型并收口权限边界
- 删除模型大类概览和细分银行概览中原型未包含的过渡跳转按钮,保留卡片点击、筛选、指标趋势和详情入口。

- 移除运维系统配置页中的模型平台新增页面依赖、登录角色来源等内部说明,仅保留实际配置内容。

- 将开发工作台访问控制统一收敛到 dashboard:view,业务团队仅保留运维工作台权限;直接访问开发工作台时自动回到运维工作台。

- 补充架构实现基线、外部写入协议、运维 API 清单、三角色权限验收说明和首条纵向链路联调手册。

- 按当前实现更新架构变更记录和本周目标完成情况。
2026-09-02 17:39:36 +08:00

157 lines
6.5 KiB
TypeScript

import {
Activity,
Building2,
Calendar,
ChartNoAxesColumn,
ClipboardList,
Code,
BookOpen,
FileText,
Files,
Folder,
Gauge,
GitBranch,
Home,
Layers3,
ListFilter,
MessageSquareText,
Settings,
ShieldCheck,
Users,
Wrench,
} from "lucide-react";
import type { ComponentType } from "react";
import type { OperationsRole } from "~/features/operations/operationsRole";
export type ActivePage = "home" | "scripts" | "schedules" | "operations" | "system";
export type SubPage =
| "users"
| "projects"
| "roles"
| "usage"
| "models"
| "banks"
| "deployed-models"
| "monitoring"
| "reports"
| "report-summary"
| "workflows"
| "knowledge"
| "rules"
| "prompts"
| "settings";
export type NavigationItem = {
/** 菜单显示名 */
label: string;
/** 渲染在菜单前的图标组件(lucide-react 或等价) */
icon: ComponentType;
/** 入口页 — 点击后由 guardedNavigate 处理 */
page: ActivePage;
/** 子页段,仅 children 项使用 */
sub?: SubPage;
/** 命中高亮的 pathname;不填则按 pathForPage(page) 派生 */
activePath?: string;
/** 子菜单点击后直达的路径;用于跨域工作台入口 */
targetPath?: string;
/** 当前端可访问的权限码;未配置时视为所有人可访问 */
permission?: string;
/** 运维域登录角色适配,仅用于界面展示,不承担权限管理 */
visibleToOperationsRoles?: OperationsRole[];
/** 子菜单条目 */
children?: NavigationItem[];
};
export function pathForPage(page: ActivePage): string {
if (page === "home") return "/workbench";
return `/${page}`;
}
function normalizePath(pathname: string): string {
const trimmed = pathname.replace(/\/+$/, "");
return trimmed || "/";
}
/** 根据当前 pathname 解析顶栏标题:二级菜单显示子项名称,一级菜单显示自身名称。 */
export function pageTitleFromPath(pathname: string): string {
const path = normalizePath(pathname);
for (const item of navigation) {
if (item.children) {
for (const child of item.children) {
const childPath =
child.activePath ?? `${pathForPage(child.page)}/${child.sub}`;
if (path === childPath) {
return child.label;
}
}
}
}
for (const item of navigation) {
const itemPath = item.activePath ?? pathForPage(item.page);
if (path === itemPath) {
return item.label;
}
}
return "工作台";
}
export const navigation: NavigationItem[] = [
{
label: "工作台",
icon: Home,
page: "home",
children: [
{ label: "开发工作台", icon: Home, page: "home", activePath: "/workbench", targetPath: "/workbench", permission: "dashboard:view" },
{ label: "运维工作台", icon: Gauge, page: "operations", activePath: "/operations", targetPath: "/operations", permission: "operations:workbench:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "平台使用统计", icon: ChartNoAxesColumn, page: "operations", activePath: "/operations/usage", targetPath: "/operations/usage", permission: "operations:usage:view", visibleToOperationsRoles: ["admin"] },
],
},
{ label: "构建脚本", icon: Code, page: "scripts", permission: "script:view" },
{ label: "调度配置", icon: Calendar, page: "schedules", permission: "schedule:view" },
{
label: "上线管理域",
icon: Layers3,
page: "operations",
children: [
{ label: "模型大类概览", icon: Layers3, page: "operations", sub: "models", activePath: "/operations/models", permission: "operations:model-overview:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "细分银行概览", icon: Building2, page: "operations", sub: "banks", activePath: "/operations/banks", permission: "operations:bank-overview:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "已上线模型详情", icon: ClipboardList, page: "operations", sub: "deployed-models", activePath: "/operations/deployed-models", permission: "operations:deployed-models:view", visibleToOperationsRoles: ["model", "admin"] },
],
},
{
label: "监控运维域",
icon: Activity,
page: "operations",
children: [
{ label: "监控明细", icon: ListFilter, page: "operations", sub: "monitoring", activePath: "/operations/monitoring", permission: "operations:monitoring-overview:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "监控诊断报告", icon: FileText, page: "operations", sub: "reports", activePath: "/operations/reports", permission: "operations:report:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "历史报告汇总", icon: Files, page: "operations", sub: "report-summary", activePath: "/operations/report-summary", permission: "operations:report-summary:view", visibleToOperationsRoles: ["business", "model", "admin"] },
],
},
{
label: "开发评审域",
icon: GitBranch,
page: "operations",
children: [
{ label: "全流程进度", icon: GitBranch, page: "operations", sub: "workflows", activePath: "/operations/workflows", permission: "operations:workflow:view", visibleToOperationsRoles: ["business", "model", "admin"] },
{ label: "文档知识库", icon: BookOpen, page: "operations", sub: "knowledge", activePath: "/operations/knowledge", permission: "operations:knowledge:view", visibleToOperationsRoles: ["model", "admin"] },
],
},
{
label: "系统管理",
icon: Settings,
page: "system",
children: [
{ label: "用户管理", icon: Users, page: "system", sub: "users", permission: "system:user:view" },
{ label: "项目管理", icon: Folder, page: "system", sub: "projects", permission: "system:project:view" },
{ label: "角色管理", icon: ShieldCheck, page: "system", sub: "roles", permission: "system:role:view" },
{ label: "监控等级规则", icon: ShieldCheck, page: "operations", sub: "rules", activePath: "/operations/rules", permission: "operations:rules:view", visibleToOperationsRoles: ["model", "admin"] },
{ label: "报告 Prompt 管理", icon: MessageSquareText, page: "operations", sub: "prompts", activePath: "/operations/prompts", permission: "operations:prompt:view", visibleToOperationsRoles: ["model", "admin"] },
{ label: "运维系统配置", icon: Wrench, page: "operations", sub: "settings", activePath: "/operations/settings", permission: "operations:settings:view", visibleToOperationsRoles: ["admin"] },
],
},
];