Files
郑龙捷 74dd97428f feat: 接入运维真实数据与三角色权限链路
- 新增 model_deploy 与 model_operations 双库查询,支持模型列表、模型详情、单月监控结果和运维工作台真实接口。

- 关闭运维模块生产 Mock 数据,补充缺表/空数据降级、工作台空状态和首条纵向链路测试。

- 按业务团队、模型团队、管理员权限矩阵接入菜单、页面、操作按钮和后端接口权限校验,支持 business_team 角色。

- 更新工作台布局、深色欢迎卡片、全宽页面适配、顶部回退,以及权限分组展示。

- 新增架构实现基线、周目标完成情况和角色权限矩阵初始化 SQL 文档。
2026-09-02 15:02:47 +08:00

44 lines
1.8 KiB
TypeScript

import { LockKeyhole } from "lucide-react";
import { Outlet, useLocation, useNavigate } from "react-router";
import { Button } from "~/components/ui/button";
import { Card, CardContent } from "~/components/ui/card";
import { OperationsDataBoundary, OperationsDataProvider } from "~/features/operations/OperationsDataContext";
import {
isOperationsPageVisibleForRole,
useCanOperationsPage,
operationsPageFromPath,
useOperationsRole,
} from "~/features/operations/operationsRole";
export default function OperationsLayout() {
const role = useOperationsRole();
const location = useLocation();
const navigate = useNavigate();
const page = operationsPageFromPath(location.pathname);
const canViewByPermission = useCanOperationsPage(page);
if (!isOperationsPageVisibleForRole(role, page) || !canViewByPermission) {
return (
<section className="grid h-full place-items-center bg-bg p-6">
<Card className="w-full max-w-xl">
<CardContent className="flex flex-col items-center py-12 text-center">
<span className="grid size-12 place-items-center rounded-2xl bg-warning-soft text-warning"><LockKeyhole className="size-6" /></span>
<h2 className="mt-4 text-xl font-bold text-foreground">当前角色不展示该页面</h2>
<p className="mt-2 text-sm leading-6 text-muted-foreground">运维前端根据登录返回的角色适配界面。该显示规则不替代独立权限模块的服务端授权。</p>
<Button className="mt-5" onClick={() => navigate("/operations")}>返回运维工作台</Button>
</CardContent>
</Card>
</section>
);
}
return (
<OperationsDataProvider>
<OperationsDataBoundary>
<Outlet />
</OperationsDataBoundary>
</OperationsDataProvider>
);
}