/** * 主布局与路由配置。 * * - Ant Design Layout:Sider + Content * - react-router-dom v6 路由 * - 未认证重定向到 /login * - 路由:/login, /applications, /users, /excel, /clues, / → /applications */ import React from "react"; import { Routes, Route, Navigate, useNavigate, useLocation } from "react-router-dom"; import { Layout, Menu, Button, Tooltip } from "antd"; import { AuditOutlined, TeamOutlined, FileExcelOutlined, SolutionOutlined, LogoutOutlined, UserSwitchOutlined, } from "@ant-design/icons"; import type { MenuProps } from "antd"; import { AuthProvider, useAuth } from "./hooks/useAuth"; import Login from "./pages/Login"; import UserApproval from "./pages/UserApproval"; import UserManagement from "./pages/UserManagement"; import ExcelUpload from "./pages/ExcelUpload"; import RetentionClues from "./pages/RetentionClues"; import SiteAdmins from "./pages/SiteAdmins"; const { Sider, Content } = Layout; /* ------------------------------------------------------------------ */ /* 侧边栏导航配置 */ /* ------------------------------------------------------------------ */ function getNavItems(adminType: string): MenuProps["items"] { const items: MenuProps["items"] = [ { key: "/applications", icon: , label: "用户审核" }, { key: "/users", icon: , label: "用户管理" }, { key: "/excel", icon: , label: "Excel 上传" }, { key: "/clues", icon: , label: "维客线索管理" }, ]; // 仅租户管理员可见 if (adminType === "tenant_admin") { items.push({ key: "/site-admins", icon: , label: "店铺管理员" }); } return items; } /* ------------------------------------------------------------------ */ /* 路由守卫 */ /* ------------------------------------------------------------------ */ const PrivateRoute: React.FC<{ children: React.ReactNode }> = ({ children }) => { const { isAuthenticated } = useAuth(); return isAuthenticated ? <>{children}> : ; }; /* ------------------------------------------------------------------ */ /* 主布局(含侧边栏) */ /* ------------------------------------------------------------------ */ const AppLayout: React.FC = () => { const navigate = useNavigate(); const location = useLocation(); const { logout, user } = useAuth(); const navItems = getNavItems(user?.adminType ?? "site_admin"); const onMenuClick: MenuProps["onClick"] = ({ key }) => { navigate(key); }; const handleLogout = () => { logout(); }; return ( 租户管理后台 } onClick={handleLogout} style={{ color: "rgba(255,255,255,0.65)", width: "100%" }} > 退出 } /> } /> } /> } /> } /> } /> ); }; /* ------------------------------------------------------------------ */ /* 根组件 */ /* ------------------------------------------------------------------ */ const App: React.FC = () => { return ( } /> } /> ); }; export default App;