import { useEffect, useRef, useState } from 'react'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import { Layout, Menu, Typography, Button, Space } from 'antd'; import type { MenuProps } from 'antd'; import { DashboardOutlined, UserOutlined, ShoppingOutlined, ShopOutlined, TeamOutlined, GiftOutlined, CarOutlined, SafetyOutlined, LogoutOutlined, CloudUploadOutlined, FileTextOutlined, LockOutlined, } from '@ant-design/icons'; import { clearAuth, request, type HqProfile } from '../lib/api'; import { bindAdminEllipsisTitle } from '../lib/ellipsis-title'; const { Header, Sider, Content } = Layout; const MENU_ITEMS: MenuProps['items'] = [ { key: '/', icon: , label: '概览' }, { key: '/users', icon: , label: '用户' }, { key: '/wechat-bindings', icon: , label: '微信绑定' }, { key: 'products-group', icon: , label: '商品', children: [ { key: '/products', label: '商品列表' }, { key: '/product-detail-templates', label: '详情模板' }, ], }, { key: '/orders', icon: , label: '订单' }, { key: '/promo-codes', icon: , label: '推广码' }, { key: 'stores-group', icon: , label: '门店', children: [ { key: '/stores', label: '门店列表' }, { key: '/store-accounts', label: '门店账户' }, { key: '/store-bills', label: '门店账单' }, { key: '/store-media', label: '门店资源' }, ], }, { key: 'partners-group', icon: , label: '开城', children: [ { key: '/cities', label: '城市' }, { key: '/city-partners', label: '城市合伙人' }, { key: '/city-warehouses', label: '仓库' }, { key: '/partner-bills', label: '合伙人结算' }, ], }, { key: 'benefit-group', icon: , label: '好客权益', children: [ { key: '/benefit/coupons', label: '权益券' }, { key: '/benefit/ledgers', label: '流水' }, { key: '/redeem-records', label: '核销记录' }, { key: '/redeem-pending', label: '待处理核销' }, { key: '/redeem/debug', label: '核销调试' }, ], }, { key: 'deliveries-group', icon: , label: '配送单', children: [ { key: '/deliveries', label: '配送单列表' }, { key: '/deliveries/xiaofeixia', label: '小飞侠联调' }, ], }, { key: '/tickets', icon: , label: '工单中心' }, { key: '/resources', icon: , label: 'OSS 资源库' }, { key: 'logs-group', icon: , label: '日志', children: [ { key: '/logs/users', label: '用户日志' }, { key: '/logs/stores', label: '商户日志' }, { key: '/logs/partners', label: '合伙人日志' }, { key: '/logs/hq', label: 'HQ 操作日志' }, { key: '/logs/third-party', label: '第三方日志' }, ], }, { key: '/hq-permissions', icon: , label: '权限分配' }, { key: '/hq-accounts', icon: , label: 'HQ账户' }, ]; export default function AdminLayout() { const navigate = useNavigate(); const location = useLocation(); const contentRef = useRef(null); const [profile, setProfile] = useState(null); useEffect(() => { request('/admin/auth/me').then(setProfile).catch(() => {}); }, []); useEffect(() => { contentRef.current?.scrollTo({ top: 0, left: 0 }); }, [location.pathname]); useEffect(() => { return bindAdminEllipsisTitle(); }, []); function logout() { clearAuth(); navigate('/login'); } const selectedKey = location.pathname.startsWith('/promo-codes') ? '/promo-codes' : location.pathname; return (
杜康 HQ
{ if (key.startsWith('/')) navigate(key); }} />
管理后台 {profile?.name || '—'} {profile?.adminRole}
); }