import { useEffect, useState } from 'react'; import { Layout, Menu, Avatar, Space, Typography, Button } from 'antd'; import { DashboardOutlined, UserOutlined, LogoutOutlined, CloudServerOutlined, TeamOutlined, ApiOutlined, KeyOutlined, MenuFoldOutlined, MenuUnfoldOutlined, } from '@ant-design/icons'; import { useNavigate, useLocation, Outlet } from 'react-router-dom'; import { getUser, clearAuth, hasPerm, type AuthUser } from '../store/auth'; import { authApi } from '../api/modules'; const { Sider, Content } = Layout; const { Text } = Typography; const ROLE_LABELS: Record = { super_admin: '超级管理员', operation: '运营', support: '客服', }; export default function MainLayout({ onLogout }: { onLogout?: () => void }) { const navigate = useNavigate(); const location = useLocation(); const [user] = useState(getUser()); const [collapsed, setCollapsed] = useState(false); useEffect(() => { if (!user) navigate('/login'); }, [user]); if (!user) return null; const menuItems: any[] = []; // Dashboard - 所有人可见 menuItems.push({ key: '/', label: '概览', icon: }); // 账号管理 if (hasPerm(user, 'account:view_all') || hasPerm(user, 'account:view_assigned')) { menuItems.push({ key: '/accounts', label: '账号管理', icon: }); } // 登录任务 if (hasPerm(user, 'login:batch') || hasPerm(user, 'login:view_assigned')) { menuItems.push({ key: '/login-tasks', label: '登录任务', icon: }); } // Cookie 管理 if (hasPerm(user, 'cookie:view')) { menuItems.push({ key: '/cookies', label: 'Cookie 管理', icon: }); } // 代理配置 if (hasPerm(user, 'proxy:manage')) { menuItems.push({ key: '/proxy', label: '代理配置', icon: }); } // 用户管理 if (hasPerm(user, 'user:view')) { menuItems.push({ key: '/users', label: '用户管理', icon: }); } const handleLogout = async () => { try { await authApi.logout(); } catch {} clearAuth(); onLogout?.(); navigate('/login', { replace: true }); }; return (
{collapsed ? '鱼' : '斗鱼登录后台'}
navigate(key)} style={{ flex: 1, overflow: 'auto', marginTop: 8 }} />
} size="small" /> {!collapsed && ( <> {user.username} ({ROLE_LABELS[user.role] || user.role}) )} {!collapsed && ( )}
); }