import React, { useState, useRef, useEffect } from 'react'; import { Button, Form, Input, Select, Modal, message, Popconfirm, PageHeader, Spin } from 'antd'; import { DeleteOutlined } from '@ant-design/icons'; import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table'; const { Option } = Select; import { fetchMenuList, fetchMenuTreeList, updateMenu, deleteMenu, createMenu, MenuData } from "@/pages/System/Menu/service"; // 菜单数据结构,扩展服务接口 type MenuItem = MenuData & { id: string; menuId: string; key: string; createBy?: string; createDate?: string; updateBy?: string; updateDate?: string; isCache?: number; children?: MenuItem[]; // 用于处理树结构 }; // 工具函数:将平铺数组转为树形结构 function listToTree(list: T[], parentId: string = '0'): T[] { return list .filter(item => (item.parentId ?? '0') === parentId) .map(item => ({ ...item, children: listToTree(list, item.menuId) })); } // 菜单管理组件 const MenuManagement: React.FC = () => { const [form] = Form.useForm(); const [folder, setFolder] = useState(false); const [btn, setBtn] = useState(false); const [loading, setLoading] = useState(false); const [menuList, setMenuList] = useState([]); const [visible, setVisible] = useState(false); const [editingItem, setEditingItem] = useState(null); const [title, setTitle] = useState(''); const [spin, setSpin] = useState(false); const actionRef = useRef(); const [pageData, setPageData] = useState({ pageNo: 1, pageSize: 10 }); const layout = { labelCol: { span: 6 }, wrapperCol: { span: 13 }, }; const fetchMenu = async (params: any) => { setSpin(true); try { const result = await fetchMenuTreeList(params); const flatData = result.data?.records || result.data || []; let res = { data: flatData, total: result.data?.total || flatData.length, success: true, pageSize: result.data?.size || 10, current: result.data?.current || 1 } console.log(res); return res; } catch (error) { message.error('获取菜单列表失败'); return { data: [], total: 0, success: false, pageSize: 10, current: 1 }; } finally { setSpin(false); } }; // 处理编辑 const handleEdit = (item: MenuItem) => { debugger; setEditingItem(item); form.setFieldsValue({ id: item.menuId, parentId: item.parentId, // parentName: item.parentName, menuName: item.menuName, menuOrder: item.menuOrder, menuUrl: item.menuUrl, componet: item.componet, menuFrame: item.menuFrame, isCache: item.isCache, menuType: item.menuType, menuVisible: item.menuVisible, menuStatus: item.menuStatus, menuPerms: item.menuPerms, menuIcon: item.menuIcon, remark: item.remark, menuScope: item.menuScope, menuOu: item.menuOu, menuAuth: item.menuAuth, menuSuspension: item.menuSuspension, menuDefault: item.menuDefault, tenantId: item.tenantId, versions: item.versions, menuDesc: item.menuDesc, }); setVisible(true); }; const handleDelete = async (menuItem: MenuItem) => { Modal.confirm({ title: '确认删除该菜单?', onOk: async () => { try { await deleteMenu(menuItem.menuId); message.success('删除成功'); actionRef.current?.reload(); } catch (error) { message.error('删除失败'); } }, }); }; // 处理新增子菜单 const handleAddSub = (parentItem: MenuItem) => { setEditingItem({ ...parentItem, menuId: '-1', // 临时标识新增项 }); form.setFieldsValue({ id: null, menuName: '', menuOrder: 0, menuUrl: '', componet: '', menuFrame: 'N', isCache: 0, menuType: 'menu', menuVisible: 'show', menuStatus: 'valid', menuPerms: '', menuIcon: '', remark: '', parentId: parentItem.menuId, menuScope: '', menuOu: '', menuAuth: 'N', menuSuspension: 'N', menuDefault: 'N', tenantId: '', versions: 1, menuDesc: '' }); setVisible(true); setTitle('新增子菜单'); }; // 表格列配置 const columns: ProColumns[] = [ { title: '菜单名称', dataIndex: 'menuName', key: 'menuName', ellipsis: true, }, { title: '排序', dataIndex: 'menuOrder', key: 'menuOrder', search: false, }, { title: '权限标识', dataIndex: 'menuPerms', key: 'menuPerms', search: false, }, { title: '组件路径', dataIndex: 'componet', key: 'componet', search: false, }, { title: '状态', dataIndex: 'menuStatus', key: 'menuStatus', valueEnum: { 'valid': { text: '正常', status: 'Success' }, 'invalid': { text: '停用', status: 'Error' }, }, }, { title: '创建时间', dataIndex: 'createDate', key: 'createDate', valueType: 'dateTime', search: false, }, { title: '操作', key: 'action', valueType: 'option', render: (_: any, record: MenuItem) => [ , , handleDelete(record)} okText="确定" cancelText="取消" > ], }, ]; // 显示模态框 const handleAdd = () => { setEditingItem(null); form.resetFields(); // 设置新增时的默认值 form.setFieldsValue({ menuType: 'menu', menuFrame: 'N', menuVisible: 'show', menuStatus: 'valid', menuAuth: 'N', menuSuspension: 'N', menuDefault: 'N', versions: 1, isCache: 0, parentId: '0', }); setVisible(true); setTitle('新增菜单'); }; // 模态框确定按钮处理 const handleOk = async () => { try { const values = await form.validateFields(); if (!values.parentId) values.parentId = '0'; if (editingItem && editingItem.menuId !== '-1') { // 编辑操作 await updateMenu(values); message.success('修改成功'); } else { // 新增操作 await createMenu(values); message.success('创建成功'); } closeModal(); } catch (error) { console.error(error); } }; // 关闭模态框 const closeModal = () => { actionRef.current?.reload(); form.resetFields(); setVisible(false); }; // 模态框取消按钮处理 const handleCancel = () => { closeModal(); }; const handleMenuTypeChange = (value: string) => { if (value === 'folder') { setFolder(true) setBtn(false) } else if (value === 'operation') { setBtn(true) setFolder(false) } else { setFolder(false) setBtn(false) } }; return (
actionRef={actionRef} columns={columns} options={false} bordered={false} className='tableSearch' size='small' search={{ labelWidth: 'auto', span: 6 }} request={(params) => fetchMenu(params)} toolBarRender={() => [ , ]} pagination={{ defaultPageSize: 10, showSizeChanger: false, onChange: (page, pageSize) => setPageData({ pageNo: page, pageSize: pageSize }), onShowSizeChange: (current, size) => setPageData({ pageNo: current, pageSize: size }), }} onReset={() => { setPageData({ pageNo: 1, pageSize: 10 }) }} rowKey="menuId" expandable={{ defaultExpandAllRows: false }} />
); }; export default MenuManagement;