| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- import React from 'react';
- import { useNavigate } from 'react-router';
- import type { MenuProps } from 'antd';
- import {
- UserOutlined,
- DashboardOutlined,
- TeamOutlined,
- SettingOutlined,
- FileOutlined,
- MessageOutlined,
- InfoCircleOutlined,
- BarChartOutlined,
- EnvironmentOutlined,
- MoonOutlined,
- SunOutlined,
- CalendarOutlined,
- DatabaseOutlined,
- PieChartOutlined,
- MonitorOutlined
- } from '@ant-design/icons';
- import { useTheme } from './hooks_sys.tsx';
- export interface MenuItem {
- key: string;
- label: string;
- icon?: React.ReactNode;
- children?: MenuItem[];
- path?: string;
- permission?: string;
- }
- /**
- * 菜单搜索 Hook
- * 封装菜单搜索相关逻辑
- */
- export const useMenuSearch = (menuItems: MenuItem[]) => {
- const [searchText, setSearchText] = React.useState('');
- // 过滤菜单项
- const filteredMenuItems = React.useMemo(() => {
- if (!searchText) return menuItems;
-
- const filterItems = (items: MenuItem[]): MenuItem[] => {
- return items
- .map(item => {
- // 克隆对象避免修改原数据
- const newItem = { ...item };
- if (newItem.children) {
- newItem.children = filterItems(newItem.children);
- }
- return newItem;
- })
- .filter(item => {
- // 保留匹配项或其子项匹配的项
- const match = item.label.toLowerCase().includes(searchText.toLowerCase());
- if (match) return true;
- if (item.children?.length) return true;
- return false;
- });
- };
-
- return filterItems(menuItems);
- }, [menuItems, searchText]);
- // 清除搜索
- const clearSearch = () => {
- setSearchText('');
- };
- return {
- searchText,
- setSearchText,
- filteredMenuItems,
- clearSearch
- };
- };
- export const useMenu = () => {
- const { isDark, toggleTheme } = useTheme();
- const navigate = useNavigate();
- const [collapsed, setCollapsed] = React.useState(false);
- const [openKeys, setOpenKeys] = React.useState<string[]>([]);
- // 基础菜单项配置
- const menuItems: MenuItem[] = [
- {
- key: 'dashboard',
- label: '控制台',
- icon: <DashboardOutlined />,
- path: '/admin/dashboard'
- },
- {
- key: 'monitor',
- icon: <DatabaseOutlined />,
- label: '监控管理',
- children: [
- {
- key: 'device-monitor',
- label: '设备实时监控',
- path: '/admin/device-monitor',
- },
- {
- key: 'temperature-humidity',
- label: '温湿度监控',
- path: '/admin/temperature-humidity',
- },
- {
- key: 'smoke-water',
- label: '烟感及水浸监控',
- path: '/admin/smoke-water',
- },
- {
- key: 'device-map',
- label: '设备地图监控',
- path: '/admin/device-map',
- },
- {
- key: 'alert-records',
- label: '告警记录',
- path: '/admin/alert-records',
- },
- {
- key: 'alert-handle-logs',
- label: '告警处理记录',
- path: '/admin/alert-handle-logs',
- },
- {
- key: 'alert-notify-configs',
- label: '告警通知配置',
- path: '/admin/alert-notify-configs',
- },
- {
- key: 'device-alert-rules',
- label: '设备告警规则',
- path: '/admin/device-alert-rules',
- },
- ],
- },
- {
- key: 'zichan',
- icon: <CalendarOutlined />,
- label: '资产管理',
- children: [
- {
- key: 'zichan-categorys',
- label: '资产分类',
- path: '/admin/zichan-categorys'
- },
- {
- key: 'zichan-areas',
- label: '资产区域',
- path: '/admin/zichan-areas',
- },
- {
- key: 'zichan-info',
- label: '资产信息',
- path: '/admin/zichan',
- },
- {
- key: 'zichan-transfer',
- label: '资产流转',
- path: '/admin/zichan-transfer',
- },
- ],
- },
- {
- key: 'device',
- icon: <SettingOutlined />,
- label: '设备管理',
- children: [
- {
- key: 'device-types',
- label: '设备类型',
- path: '/admin/device-types',
- },
- {
- key: 'device-instances',
- label: '设备实例',
- path: '/admin/device-instances',
- },
- {
- key: 'modbus-rtu-devices',
- label: 'Modbus RTU设备',
- path: '/admin/modbus-rtu-devices',
- },
- {
- key: "greenhouse-protocol",
- label: "温室协议设置",
- path: "/admin/greenhouse-protocol"
- },
- {
- key: 'racks',
- label: '机柜管理',
- path: '/admin/racks',
- },
- {
- key: 'rack-server-types',
- label: '机柜服务器类型',
- path: '/admin/rack-server-types',
- },
- {
- key: 'rack-servers',
- label: '机柜服务器',
- path: '/admin/rack-servers',
- },
- ],
- },
- {
- key: "work-orders",
- label: "工单管理",
- icon: <MonitorOutlined />,
- path: "/admin/work-orders"
- },
- {
- key: 'inspection',
- label: '巡检管理',
- icon: <MonitorOutlined />,
- path: '/admin/inspections'
- },
- {
- key: 'analysis',
- icon: <PieChartOutlined />,
- label: '分析报表',
- children: [
- {
- key: 'analysis-alert-trend',
- label: '告警趋势图',
- path: '/admin/analysis/alert-trend',
- },
- {
- key: 'analysis-asset-category',
- label: '资产分类统计图',
- path: '/admin/analysis/asset-category',
- },
- {
- key: 'analysis-online-devices',
- label: '设备在线统计图',
- path: '/admin/analysis/online-devices',
- },
- {
- key: 'analysis-asset-transfer',
- label: '资产流转统计图',
- path: '/admin/analysis/asset-transfer',
- },
- ],
- },
- {
- key: 'users',
- label: '用户管理',
- icon: <TeamOutlined />,
- path: '/admin/users',
- permission: 'user:manage'
- },
- {
- key: 'settings',
- label: '系统设置',
- icon: <SettingOutlined />,
- children: [
- {
- key: 'theme-settings',
- label: '主题设置',
- path: '/admin/theme-settings',
- permission: 'system:settings'
- },
- {
- key: 'system-settings',
- label: '系统配置',
- path: '/admin/settings',
- permission: 'system:settings'
- }
- ]
- },
- {
- key: 'content',
- label: '内容管理',
- icon: <FileOutlined />,
- children: [
- {
- key: 'know-info',
- label: '知识库',
- path: '/admin/know-info',
- permission: 'content:manage'
- },
- {
- key: 'file-library',
- label: '文件库',
- path: '/admin/file-library',
- permission: 'content:manage'
- }
- ]
- },
- {
- key: 'messages',
- label: '消息中心',
- icon: <MessageOutlined />,
- path: '/admin/messages',
- permission: 'message:view'
- },
- {
- key: 'sms-module',
- label: '短信模块',
- icon: <MessageOutlined />,
- path: '/admin/sms-module',
- permission: 'message:view'
- },
- {
- key: 'charts',
- label: '数据图表',
- icon: <BarChartOutlined />,
- path: '/admin/chart-dashboard',
- permission: 'chart:view'
- },
- {
- key: 'maps',
- label: '地图',
- icon: <EnvironmentOutlined />,
- path: '/admin/map-dashboard',
- permission: 'map:view'
- }
- ];
- // 用户菜单项
- const userMenuItems: MenuProps['items'] = [
- {
- key: 'profile',
- label: '个人资料',
- icon: <UserOutlined />
- },
- {
- key: 'theme',
- label: isDark ? '切换到亮色模式' : '切换到暗色模式',
- icon: isDark ? <SunOutlined /> : <MoonOutlined />,
- onClick: () => toggleTheme()
- },
- {
- key: 'logout',
- label: '退出登录',
- icon: <InfoCircleOutlined />,
- danger: true
- }
- ];
- // 处理菜单点击
- const handleMenuClick = (item: MenuItem) => {
- if (item.path) {
- navigate(item.path);
- }
- };
- // 处理菜单展开变化
- const onOpenChange = (keys: string[]) => {
- const latestOpenKey = keys.find(key => openKeys.indexOf(key) === -1);
- setOpenKeys(latestOpenKey ? [latestOpenKey] : []);
- };
- return {
- menuItems,
- userMenuItems,
- openKeys,
- collapsed,
- setCollapsed,
- handleMenuClick,
- onOpenChange
- };
- };
|