import { Suspense, useMemo } from 'react' import { Outlet, useNavigate, useLocation } from 'react-router' import { ProLayout } from '@ant-design/pro-components' import { Spin } from 'antd' import { DashboardOutlined, UserOutlined, TeamOutlined, MenuOutlined, SettingOutlined, BookOutlined, FileOutlined, NotificationOutlined, AuditOutlined, FileSearchOutlined, WarningOutlined, MonitorOutlined, } from '@ant-design/icons' import { useAppStore } from '@/stores/useAppStore' import { useAuthStore } from '@/stores/useAuthStore' import { usePermissionStore } from '@/stores/usePermissionStore' import HeaderRight from './HeaderRight' import type { MenuItem } from '@/api/menu' const iconMap: Record = { dashboard: , user: , users: , role: , roles: , menu: , menus: , config: , dict: , file: , files: , notice: , loginlog: , oplog: , exceptionlog: , monitor: , } interface ProLayoutRoute { path: string name: string icon?: React.ReactNode routes?: ProLayoutRoute[] } function convertToProRoutes(items: MenuItem[]): ProLayoutRoute[] { return items .filter((item) => item.type !== 'button' && item.visible !== false) .map((item) => { const icon = iconMap[item.icon] || iconMap[item.permission] const route: ProLayoutRoute = { path: item.path || `/custom/${item.id}`, name: item.name, icon, } if (item.children?.length) { const childRoutes = convertToProRoutes(item.children) if (childRoutes.length > 0) { route.routes = childRoutes } } return route }) } export default function DefaultLayout() { const collapsed = useAppStore((s) => s.collapsed) const toggleCollapsed = useAppStore((s) => s.toggleCollapsed) const username = useAuthStore((s) => s.username) const menus = usePermissionStore((s) => s.menus) const navigate = useNavigate() const location = useLocation() const route = useMemo(() => ({ path: '/', routes: [ { path: '/dashboard', name: '仪表盘', icon: }, ...convertToProRoutes(menus), ], }), [menus]) return ( ( { if (item.path) navigate(item.path) }} > {dom} )} subMenuItemRender={(_item, dom) => {dom}} headerTitleRender={(logo, title) => ( {logo}{title} )} avatarProps={{ title: username || '用户', render: () => , }} > }> ) }