import { NavLink, Outlet, useLocation, useNavigate, Navigate } from "react-router-dom"; import { QrCode, Package, ArrowLeft, LayoutDashboard, Smartphone, GitBranch, LogOut, User, Users, BarChart3, Table2, Tv, ScrollText } from "lucide-react"; import { useAuth } from "../../contexts/AuthContext"; const MENU = [ { title: "全局概览", path: "/admin/dashboard", icon: LayoutDashboard, description: "生产数据总览 · 产品 + 任务统计", }, { title: "产品管理", path: "/admin/products", icon: Package, description: "创建产品 · 生成二维码 · 打印标签", }, { title: "任务全景", path: "/admin/tasks", icon: GitBranch, description: "身份证查任务树 · 裂变/返工可视化", }, { title: "人员看板", path: "/admin/people", icon: Users, description: "按负责人查看在制品设备分布", }, { title: "效能分析", path: "/admin/analytics", icon: BarChart3, description: "人员效能 / 设备流转 ECharts 可视化", }, { title: "WIP 分布矩阵", path: "/admin/matrix", icon: Table2, description: "规格型号 × 人员/工序 在制品透视表", }, { title: "操作审计", path: "/admin/audit", icon: ScrollText, description: "谁在何时操作了什么 · 含失败与被拒请求", }, { title: "管理层大屏", path: "/admin/screen", icon: Tv, description: "全屏数据大盘 · 直通率 / 产量趋势 / 不良分布", }, ]; export default function AdminLayout() { const location = useLocation(); const navigate = useNavigate(); const { user, logout, isAuthenticated, loading } = useAuth(); // 认证加载中 if (loading) { return (
); } // 未登录 → 跳转登录页 if (!isAuthenticated) { return ; } async function handleLogout() { // 必须 await:logout() 要先完成审计上报再清 token, // 提前 navigate 会把请求掐断,退出就留不下痕 await logout(); navigate("/admin/login", { replace: true }); } return (
{/* 侧边栏 */}
管理端 / {MENU.find((m) => location.pathname.startsWith(m.path))?.title ?? "页面"}
{/* 用户信息 + 登出 */}
{user?.display_name ?? user?.username ?? "—"}
); }