import { useState, useEffect } from 'react' import { Layout, Menu, Badge, message } from 'antd' import { useNavigate, useLocation } from 'react-router-dom' import { DashboardOutlined, DesktopOutlined, GlobalOutlined, CloudServerOutlined, UserOutlined, AppstoreOutlined, SettingOutlined, BlockOutlined, FolderOutlined, FileTextOutlined, SafetyOutlined, TeamOutlined, } from '@ant-design/icons' import { getUserMenus } from '@/api/menu' import './AppSider.css' const { Sider } = Layout // 图标映射 const iconMap = { DashboardOutlined, DesktopOutlined, GlobalOutlined, CloudServerOutlined, UserOutlined, AppstoreOutlined, SettingOutlined, BlockOutlined, FolderOutlined, FileTextOutlined, SafetyOutlined, TeamOutlined, } function AppSider({ collapsed, onToggle }) { const navigate = useNavigate() const location = useLocation() const [openKeys, setOpenKeys] = useState([]) const [menuData, setMenuData] = useState([]) const [loading, setLoading] = useState(true) // 加载菜单数据 useEffect(() => { loadMenus() }, []) const loadMenus = async () => { try { const res = await getUserMenus() if (res.data) { setMenuData(res.data) } } catch (error) { console.error('Load menus error:', error) message.error('加载菜单失败') } finally { setLoading(false) } } // 根据当前路径获取应该打开的父菜单 const getDefaultOpenKeys = () => { const path = location.pathname for (const item of menuData) { if (item.children) { const hasChild = item.children.some((c) => c.path === path) if (hasChild) { return [item.menu_code] } } } return [] } // 监听路径变化和收拢状态,自动打开父菜单 useEffect(() => { if (!collapsed && menuData.length > 0) { const defaultKeys = getDefaultOpenKeys() setOpenKeys(defaultKeys) } }, [location.pathname, collapsed, menuData]) const handleMenuClick = ({ key }) => { // 查找对应的路径 for (const item of menuData) { if (item.menu_code === key && item.path) { navigate(item.path) return } if (item.children) { const child = item.children.find((c) => c.menu_code === key) if (child && child.path) { navigate(child.path) return } } } } const handleOpenChange = (keys) => { setOpenKeys(keys) } // 获取当前选中的菜单项 const getSelectedKey = () => { const path = location.pathname for (const item of menuData) { if (item.path === path) return item.menu_code if (item.children) { const child = item.children.find((c) => c.path === path) if (child) return child.menu_code } } return '' } // 生成菜单项配置 const getMenuItems = () => { return menuData.map((item) => { const IconComponent = iconMap[item.icon] const icon = IconComponent ? : null // 如果有子菜单 if (item.children && item.children.length > 0) { return { key: item.menu_code, icon: icon, label: item.menu_name, popupClassName: 'sider-submenu-popup', children: item.children.map((child) => ({ key: child.menu_code, label: child.menu_name, })), } } // 普通菜单项 return { key: item.menu_code, icon: icon, label: item.menu_name, } }) } return ( {/* 菜单 */} ) } export default AppSider