import { Layout, Menu, Button, Popconfirm, Avatar, theme } from 'antd' import { MenuFoldOutlined, MenuUnfoldOutlined, LogoutOutlined, UserOutlined } from '@ant-design/icons' import { useNavigate, useLocation, Outlet } from 'react-router-dom' import { routes } from '@/router/routes' import { useAppStore } from '@/store/app' import { useUserStore } from '@/store/user' import type { MenuProps } from 'antd' const { Sider, Header, Content } = Layout const SIDER_WIDTH = 220 const SIDER_COLLAPSED_WIDTH = 64 const HEADER_HEIGHT = 64 // 将 RouteConfig 转换为 antd Menu 的 items 格式 const menuItems: MenuProps['items'] = routes .filter(r => !r.hideInMenu) .map(r => ({ key: r.path, icon: r.icon, label: r.label, children: r.children ?.filter(c => !c.hideInMenu) .map(c => ({ key: c.path, icon: c.icon, label: c.label, })), })) function BasicLayout() { const navigate = useNavigate() const location = useLocation() const { token } = theme.useToken() // app store:侧边栏折叠状态 const collapsed = useAppStore(s => s.siderCollapsed) const setSiderCollapsed = useAppStore(s => s.setSiderCollapsed) const toggleSider = useAppStore(s => s.toggleSider) // user store:登出、用户信息 const logout = useUserStore(s => s.logout) const userInfo = useUserStore(s => s.userInfo) const siderWidth = collapsed ? SIDER_COLLAPSED_WIDTH : SIDER_WIDTH const handleMenuClick: MenuProps['onClick'] = ({ key }) => { navigate(key) } const handleLogout = () => { logout() navigate('/login', { replace: true }) } return ( {/* 固定侧边栏 */} setSiderCollapsed(broken)} theme="light" style={{ position: 'fixed', insetInlineStart: 0, top: 0, bottom: 0, overflowY: 'auto', overflowX: 'hidden', borderInlineEnd: `1px solid ${token.colorBorderSecondary}`, zIndex: 100, }} > {/* Logo 区域 */}
{collapsed ? 'S' : 'SmartServe'}
{/* 右侧主区域,留出侧边栏宽度 */} {/* 固定顶部标题栏 */}
{/* 收起/展开按钮 */}
{/* 内容区,撑开顶部空间 */}
) } export default BasicLayout