import React, { useState } from 'react'; import { Plus, Search, Edit2, Trash2, MoreVertical, ChevronRight, ChevronDown } from 'lucide-react'; import DepartmentManagement from './DepartmentManagement'; import PositionManagement from './PositionManagement'; interface TableRow { id: number; [key: string]: any; } interface SystemConfigProps { subMenu: string; } export default function SystemConfig({ subMenu }: SystemConfigProps) { const [searchTerm, setSearchTerm] = useState(''); const [showAddModal, setShowAddModal] = useState(false); const [editingItem, setEditingItem] = useState(null); const [showDictionaryDetail, setShowDictionaryDetail] = useState(false); const [currentDictionary, setCurrentDictionary] = useState(''); const [dictionarySearchTerm, setDictionarySearchTerm] = useState(''); const [dictionaryFormMode, setDictionaryFormMode] = useState<'list' | 'form'>('list'); const [editingDictionaryItem, setEditingDictionaryItem] = useState(null); const [expandedMenuIds, setExpandedMenuIds] = useState([1, 2, 3, 4, 5, 6]); // 默认展开所有一级菜单 const [expandedDeptIds, setExpandedDeptIds] = useState([1]); // 部门树展开的节点 const [selectedDeptId, setSelectedDeptId] = useState(null); // 选中的部门ID // 树形菜单数据 const menuTreeData = [ { id: 1, name: '驾驶舱', path: '/cockpit', icon: '仪表盘', order: 1, status: '启用', createTime: '2025-01-01', children: [] }, { id: 2, name: '系统配置', path: '/system', icon: '设置', order: 2, status: '启用', createTime: '2025-01-02', children: [ { id: 21, name: '菜单管理', path: '/system/menu', icon: '菜单', order: 1, status: '启用', createTime: '2025-01-02', parentId: 2 }, { id: 22, name: '部门管理', path: '/system/dept', icon: '部门', order: 2, status: '启用', createTime: '2025-01-02', parentId: 2 }, { id: 26, name: '岗位管理', path: '/system/position', icon: '岗位', order: 3, status: '启用', createTime: '2025-01-02', parentId: 2 }, { id: 23, name: '角色管理', path: '/system/role', icon: '角色', order: 4, status: '启用', createTime: '2025-01-02', parentId: 2 }, { id: 24, name: '字典管理', path: '/system/dict', icon: '字典', order: 5, status: '启用', createTime: '2025-01-02', parentId: 2 }, { id: 25, name: '机柜管理', path: '/system/cabinet', icon: '机柜', order: 6, status: '启用', createTime: '2025-01-02', parentId: 2 }, ] }, { id: 3, name: '用户管理', path: '/users', icon: '用户', order: 3, status: '启用', createTime: '2025-01-03', children: [ { id: 31, name: '用户列表', path: '/users/list', icon: '列表', order: 1, status: '启用', createTime: '2025-01-03', parentId: 3 }, { id: 32, name: '通知管理', path: '/users/notification', icon: '通知', order: 2, status: '启用', createTime: '2025-01-03', parentId: 3 }, ] }, { id: 4, name: '硬件管理', path: '/hardware', icon: '硬件', order: 4, status: '启用', createTime: '2025-01-04', children: [ { id: 41, name: '机柜', path: '/hardware/cabinet', icon: '机柜', order: 1, status: '启用', createTime: '2025-01-04', parentId: 4 }, { id: 42, name: '钥匙', path: '/hardware/key', icon: '钥匙', order: 2, status: '启用', createTime: '2025-01-04', parentId: 4 }, { id: 43, name: '挂锁', path: '/hardware/lock', icon: '锁', order: 3, status: '启用', createTime: '2025-01-04', parentId: 4 }, { id: 44, name: '便携式', path: '/hardware/portable', icon: '便携', order: 4, status: '启用', createTime: '2025-01-04', parentId: 4 }, ] }, { id: 5, name: '点位管理', path: '/points', icon: '点位', order: 5, status: '启用', createTime: '2025-01-05', children: [ { id: 51, name: '点位列表', path: '/points/list', icon: '列表', order: 1, status: '启用', createTime: '2025-01-05', parentId: 5 }, { id: 52, name: '点位分组', path: '/points/group', icon: '分组', order: 2, status: '启用', createTime: '2025-01-05', parentId: 5 }, ] }, { id: 6, name: '隔离作业', path: '/isolation', icon: '作业', order: 6, status: '启用', createTime: '2025-01-06', children: [ { id: 61, name: '作业列表', path: '/isolation/list', icon: '列表', order: 1, status: '启用', createTime: '2025-01-06', parentId: 6 }, { id: 62, name: '作业审批', path: '/isolation/approval', icon: '审批', order: 2, status: '启用', createTime: '2025-01-06', parentId: 6 }, { id: 63, name: '作业记录', path: '/isolation/record', icon: '记录', order: 3, status: '启用', createTime: '2025-01-06', parentId: 6 }, ] }, ]; // 部门树形数据 const departmentTreeData = [ { id: 1, name: '总公司', manager: '李总', phone: '13800138000', email: 'ceo@company.com', memberCount: 120, createTime: '2024-01-01', children: [ { id: 2, name: '技术中心', manager: '张三', phone: '13800138001', email: 'tech@company.com', memberCount: 45, createTime: '2024-01-05', parentId: 1, children: [ { id: 21, name: '研发部', manager: '王研', phone: '13800138011', email: 'rd@company.com', memberCount: 25, createTime: '2024-01-10', parentId: 2 }, { id: 22, name: '测试部', manager: '赵测', phone: '13800138012', email: 'qa@company.com', memberCount: 12, createTime: '2024-01-10', parentId: 2 }, { id: 23, name: '运维部', manager: '李运', phone: '13800138013', email: 'ops@company.com', memberCount: 8, createTime: '2024-01-10', parentId: 2 } ] }, { id: 3, name: '市场中心', manager: '李四', phone: '13800138002', email: 'market@company.com', memberCount: 30, createTime: '2024-01-05', parentId: 1, children: [ { id: 31, name: '市场部', manager: '钱市', phone: '13800138021', email: 'marketing@company.com', memberCount: 18, createTime: '2024-01-10', parentId: 3 }, { id: 32, name: '销售部', manager: '孙销', phone: '13800138022', email: 'sales@company.com', memberCount: 12, createTime: '2024-01-10', parentId: 3 } ] }, { id: 4, name: '行政中心', manager: '王五', phone: '13800138003', email: 'admin@company.com', memberCount: 25, createTime: '2024-01-05', parentId: 1, children: [ { id: 41, name: '人力资源部', manager: '周人', phone: '13800138031', email: 'hr@company.com', memberCount: 10, createTime: '2024-01-10', parentId: 4 }, { id: 42, name: '财务部', manager: '吴财', phone: '13800138032', email: 'finance@company.com', memberCount: 8, createTime: '2024-01-10', parentId: 4 }, { id: 43, name: '行政部', manager: '郑行', phone: '13800138033', email: 'office@company.com', memberCount: 7, createTime: '2024-01-10', parentId: 4 } ] }, { id: 5, name: '安全部', manager: '赵六', phone: '13800138004', email: 'security@company.com', memberCount: 20, createTime: '2024-01-05', parentId: 1 } ] } ]; // 切换展开/收起 const toggleExpand = (id: number) => { setExpandedMenuIds(prev => prev.includes(id) ? prev.filter(item => item !== id) : [...prev, id] ); }; // 切换部门树展开/收起 const toggleDeptExpand = (id: number) => { setExpandedDeptIds(prev => prev.includes(id) ? prev.filter(item => item !== id) : [...prev, id] ); }; // 模拟数据 const menuData: TableRow[] = [ { id: 1, name: '系统配置', path: '/system', icon: '设置', order: 1, status: '启用', createTime: '2025-01-01' }, { id: 2, name: '用户管理', path: '/users', icon: '用户', order: 2, status: '启用', createTime: '2025-01-02' }, { id: 3, name: '硬件管理', path: '/hardware', icon: '硬件', order: 3, status: '启用', createTime: '2025-01-03' }, { id: 4, name: '点位管理', path: '/points', icon: '点位', order: 4, status: '启用', createTime: '2025-01-04' }, { id: 5, name: '隔离作业', path: '/isolation', icon: '作业', order: 5, status: '启用', createTime: '2025-01-05' }, ]; const departmentData: TableRow[] = [ { id: 1, name: '技术部', manager: '张三', phone: '13800138001', email: 'tech@example.com', memberCount: 15, createTime: '2025-01-01' }, { id: 2, name: '运维部', manager: '李四', phone: '13800138002', email: 'ops@example.com', memberCount: 10, createTime: '2025-01-02' }, { id: 3, name: '安全部', manager: '王五', phone: '13800138003', email: 'security@example.com', memberCount: 8, createTime: '2025-01-03' }, { id: 4, name: '测试部', manager: '赵六', phone: '13800138004', email: 'test@example.com', memberCount: 12, createTime: '2025-01-04' }, ]; const roleData: TableRow[] = [ { id: 1, name: '超级管理员', code: 'admin', description: '拥有系统所有权限', userCount: 2, status: '启用', createTime: '2025-01-01' }, { id: 2, name: '部门管理员', code: 'dept_admin', description: '管理部门用户和资源', userCount: 5, status: '启用', createTime: '2025-01-02' }, { id: 3, name: '操作员', code: 'operator', description: '执行日常操作任务', userCount: 20, status: '启用', createTime: '2025-01-03' }, { id: 4, name: '审计员', code: 'auditor', description: '查看系统日志和报表', userCount: 3, status: '启用', createTime: '2025-01-04' }, ]; const cabinetData: TableRow[] = [ { id: 1, name: '1号机柜', location: 'A区-1排', model: 'CAB-42U', capacity: 42, used: 28, temperature: '23°C', status: '正常', createTime: '2025-01-01' }, { id: 2, name: '2号机柜', location: 'A区-2排', model: 'CAB-42U', capacity: 42, used: 35, temperature: '24°C', status: '正常', createTime: '2025-01-02' }, { id: 3, name: '3号机柜', location: 'B区-1排', model: 'CAB-48U', capacity: 48, used: 40, temperature: '25°C', status: '告警', createTime: '2025-01-03' }, { id: 4, name: '4号机柜', location: 'B区-2排', model: 'CAB-48U', capacity: 48, used: 30, temperature: '22°C', status: '正常', createTime: '2025-01-04' }, ]; // 字典管理 - 使用卡片分组展示 const dictionaryCategories = [ { name: '用户分组', description: '用户分类管理', count: 12, items: ['管理员组', '普通用户组', '审计组', '访客组'] }, { name: '隔离方式', description: '能量隔离方式定义', count: 8, items: ['物理隔离', '逻辑隔离', '远程隔离', '手动隔离'] }, { name: '点位分组', description: '监控点位分类', count: 15, items: ['A区点位', 'B区点位', 'C区点位', 'D区点位'] }, { name: '设备类型', description: '设备分类字典', count: 20, items: ['变压器', '配电柜', '开关', '传感器'] }, ]; // 根据当前子菜单获取数据和列配置 const getTableConfig = () => { switch (subMenu) { case '菜单管理': return { data: menuData, columns: [ { key: 'name', label: '菜单名称', width: '15%' }, { key: 'path', label: '路径', width: '20%' }, { key: 'icon', label: '图标', width: '10%' }, { key: 'order', label: '排序', width: '10%' }, { key: 'status', label: '状态', width: '10%' }, { key: 'createTime', label: '创建时间', width: '15%' }, ], }; case '部门管理': return { data: departmentData, columns: [ { key: 'name', label: '部门名称', width: '15%' }, { key: 'manager', label: '负责人', width: '10%' }, { key: 'phone', label: '联系电话', width: '15%' }, { key: 'email', label: '邮箱', width: '20%' }, { key: 'memberCount', label: '成员数', width: '10%' }, { key: 'createTime', label: '创建时间', width: '15%' }, ], }; case '角色管理': return { data: roleData, columns: [ { key: 'name', label: '角色名称', width: '15%' }, { key: 'code', label: '角色编码', width: '15%' }, { key: 'description', label: '描述', width: '25%' }, { key: 'userCount', label: '用户数', width: '10%' }, { key: 'status', label: '状态', width: '10%' }, { key: 'createTime', label: '创建时间', width: '15%' }, ], }; case '机柜管理': return { data: cabinetData, columns: [ { key: 'name', label: '机柜名称', width: '12%' }, { key: 'location', label: '位置', width: '12%' }, { key: 'model', label: '型号', width: '10%' }, { key: 'capacity', label: '容量', width: '8%' }, { key: 'used', label: '已用', width: '8%' }, { key: 'temperature', label: '温度', width: '10%' }, { key: 'status', label: '状态', width: '10%' }, { key: 'createTime', label: '创建时间', width: '15%' }, ], }; default: return { data: [], columns: [] }; } }; const { data, columns } = getTableConfig(); // 过滤数据 const filteredData = data.filter((item) => Object.values(item).some((value) => String(value).toLowerCase().includes(searchTerm.toLowerCase()) ) ); const handleDelete = (id: number) => { if (confirm('确定要删除这条数据吗?')) { console.log('删除:', id); } }; const handleEdit = (item: TableRow) => { setEditingItem(item); setShowAddModal(true); }; // 字典管理使用卡片展示 if (subMenu === '字典管理') { return ( <>
{/* 工具栏 */}
setSearchTerm(e.target.value)} className="w-full h-10 pl-10 pr-4 bg-gray-50 border border-gray-200 rounded-xl outline-none focus:border-blue-400 focus:ring-4 focus:ring-blue-100 transition-all text-sm" />
{/* 字典分类卡片 */}
{dictionaryCategories.map((category, index) => (

{category.name}

{category.description}

{category.count}项
{category.items.map((item, idx) => (
{item}
))}
))}
{/* 字典详情弹窗 */} {showDictionaryDetail && (
{/* 弹窗头部 */}

{currentDictionary}

管理 {currentDictionary} 的所有字典项

{/* 工具栏 */}
{dictionaryFormMode === 'list' ? ( <>
setDictionarySearchTerm(e.target.value)} className="w-full h-10 pl-10 pr-4 bg-gray-50 border border-gray-200 rounded-xl outline-none focus:border-blue-400 focus:ring-4 focus:ring-blue-100 transition-all text-sm" />
) : ( )}
{/* 内容区域 - 根据模式切换 */} {dictionaryFormMode === 'list' ? ( // 表格视图
{[ { id: 1, key: 'admin_group', value: '管理员组', order: 1, status: '启用', remark: '系统管理员', createTime: '2025-01-01' }, { id: 2, key: 'user_group', value: '普通用户组', order: 2, status: '启用', remark: '普通用户', createTime: '2025-01-02' }, { id: 3, key: 'audit_group', value: '审计组', order: 3, status: '启用', remark: '审计人员', createTime: '2025-01-03' }, { id: 4, key: 'guest_group', value: '访客组', order: 4, status: '禁用', remark: '临时访客', createTime: '2025-01-04' }, { id: 5, key: 'test_group', value: '测试组', order: 5, status: '启用', remark: '测试人员', createTime: '2025-01-05' }, { id: 6, key: 'dev_group', value: '开发组', order: 6, status: '启用', remark: '开发人员', createTime: '2025-01-06' }, { id: 7, key: 'ops_group', value: '运维组', order: 7, status: '启用', remark: '运维人员', createTime: '2025-01-07' }, { id: 8, key: 'security_group', value: '安全组', order: 8, status: '启用', remark: '安全人员', createTime: '2025-01-08' }, { id: 9, key: 'manager_group', value: '经理组', order: 9, status: '启用', remark: '部门经理', createTime: '2025-01-09' }, { id: 10, key: 'director_group', value: '总监组', order: 10, status: '启用', remark: '部门总监', createTime: '2025-01-10' }, { id: 11, key: 'vp_group', value: 'VP组', order: 11, status: '启用', remark: '副总裁', createTime: '2025-01-11' }, { id: 12, key: 'ceo_group', value: 'CEO组', order: 12, status: '启用', remark: '首席执行官', createTime: '2025-01-12' }, ].map((item, index) => ( ))}
序号 字典键 字典值 排序 状态 备注 创建时间 操作
{item.id} {item.key} {item.value} {item.order} {item.status} {item.remark} {item.createTime}
) : ( // 表单视图
{/* 表单按钮 */}
)} {/* 底部分页 */}
12 条记录
)} ); } // 部门管理使用左右分栏布局 if (subMenu === '部门管理' || subMenu === 'departmentManagement') { return ; } // 岗位管理使用左右分栏布局 if (subMenu === '岗位管理' || subMenu === 'positionManagement') { return ; } // 其他菜单使用表格展示 return (
{/* 工具栏 */}
setSearchTerm(e.target.value)} className="w-full h-10 pl-10 pr-4 bg-gray-50 border border-gray-200 rounded-xl outline-none focus:border-blue-400 focus:ring-4 focus:ring-blue-100 transition-all text-sm" />
{/* 菜单管理使用树形结构,其他使用表格 */} {subMenu === '菜单管理' ? ( // 树形结构
{menuTreeData.map((parentMenu) => ( {/* 一级菜单 */} {/* 二级菜单 */} {expandedMenuIds.includes(parentMenu.id) && parentMenu.children && parentMenu.children.map((childMenu: any) => ( ))} ))}
菜单名称 路径 图标 排序 状态 创建时间 操作
{parentMenu.children && parentMenu.children.length > 0 ? ( ) : ( )} {parentMenu.name}
{parentMenu.path} {parentMenu.icon} {parentMenu.order} {parentMenu.status} {parentMenu.createTime}
{childMenu.name}
{childMenu.path} {childMenu.icon} {childMenu.order} {childMenu.status} {childMenu.createTime}
{/* 分页 */}
{menuTreeData.length} 个一级菜单
) : ( // 表格展示(其他子菜单)
{columns.map((column) => ( ))} {filteredData.map((row, index) => ( {columns.map((column) => ( ))} ))}
序号 {column.label} 操作
{index + 1} {column.key === 'status' ? ( {row[column.key]} ) : ( row[column.key] )}
{/* 分页 */}
{filteredData.length} 条记录
)} {/* 新增/编辑弹窗 */} {showAddModal && (
{/* 弹窗标题 */}

{editingItem ? `编辑${subMenu}` : `新增${subMenu}`}

{/* 弹窗内容 */}
{columns.slice(0, 4).map((column) => (
))}
{/* 弹窗底部 */}
)}
); }