可以看ant-design-pro文档
效果:
import React, { useState, useEffect } from "react";
import { PlusOutlined, EditOutlined, DeleteOutlined, CloseOutlined, CheckOutlined } from '@ant-design/icons';
import { Modal, Tree, Input, Form, Button, Space, message } from 'antd';
import {
querySysModule, addSysFunction, deleteSysFunction, querySysFunctionById, updateSysFunction
} from "@/services/uav-platform/featureApi";
type QuerySysModuleList = {
pageIndex: string | number;
pageSize: string | number;
}
type SysModule = {
isLeaf: boolean;
children?: string
sysFunctionVOList?: string;
key?: string;
sysModuleId?: string;
title?: string;
moduleName?: string;
moduleId?: string
SysModule?: string
functionName?: string
remark?: string,
functionPath?: string,
functionId?: string
isEditable?: boolean
}
//input
type FieldType = {
functionName?: string;
remark?: string;
functionPath?: string;
moduleId?: string;
};
// tree
const { TreeNode } = Tree;
interface DataNode {
title: string;
key: string;
isLeaf?: boolean;
children?: DataNode[];
moduleName?: string;
moduleId?: string
SysModule?: string
functionName?: string
remark?: string,
functionPath?: string,
functionId?: string
isEditable?: boolean
}
const initTreeData: DataNode[] = [
{ title: `111`, key: '0' ,children:[{title: `111`, key: '0' ,}]},
{ title: 'Expand to load', key: '1' },
{ title: 'Tree Node', key: '2', isLeaf: true },
];
const updateTreeData = (list: DataNode[], key: React.Key, children: DataNode[]): DataNode[] =>
list.map((node) => {
if (node.key === key) {
return {
...node,
children,
};
}
if (node.children) {
return {
...node,
children: updateTreeData(node.children, key, children),
};
}
return node;
});
export default () => {
//提示
const [messageApi, contextHolder] = message.useMessage();
const [treeData, setTreeData] = useState(initTreeData);
const [featureData, setfeatureData] = useState(treeData);
const [pageIndex, setPageIndex] = useState<number>(1);
const [pageSize, setPageSize] = useState<number>(10);
const [isModalOpen, setIsModalOpen] = useState(false);
const [moduleId, setModuleId] = useState<number>();
const [functionId, setFunctionId] = useState<number>();
const [title, setTitle] = useState('新增');
const [form] = Form.useForm();
//分页查询功能信息
const fetchModuleList = async (values: QuerySysModuleList) => {
// 获取所有模块
const res = await querySysModule({ ...values })
console.log('res分页查询功能信息:', res);
const { arr } = res
const _treeData: DataNode[] = arr.map((item: SysModule, index: number) => {
item.title = item.moduleName
item.key = item.sysModuleId
return item
})
console.log('_treeData:',_treeData);
setTreeData(_treeData);
setfeatureData(_treeData)
}
useEffect(() => {
fetchModuleList({ pageIndex, pageSize })
}, [initTreeData, moduleId, functionId])
//新增
const onAdd = (key: number) => {
console.log('onAdd', key);
setModuleId(key)存储模块id
if (!key) {
console.log('!key');
return
}
setIsModalOpen(true);
};
//删除
const onDelete = (key: any) => {
console.log('onDelete', key);
deleteSysFunction(key).then((res) => {
if (res.msg === 'ok') {
messageApi.open({
type: 'success',
content: '删除用户成功',
});
fetchModuleList({ pageIndex, pageSize })
// window.location.reload() // 强制页面刷新
}
})
};
//编辑
const onEdit = (key: any) => {
console.log('key:', key);
setFunctionId(key) //存储功能id
setTitle('编辑') //弹框名字改为编辑
setIsModalOpen(true); //打开弹框
querySysFunctionById(key).then((res) => {
console.log('res详情:', res);
const { data } = res
setModuleId(data.moduleId)//存储模块id
form.setFieldsValue(data)
})
};
//tree
const onLoadData = ({ key, children, sysFunctionVOList }: any) =>
new Promise<void>((resolve) => {
if (children) {
children = sysFunctionVOList
children.forEach((item: SysModule) => {
console.log('item:', item);
item.title = item.functionName
item.isLeaf = true
});
setTreeData((origin) =>
updateTreeData(origin, key, sysFunctionVOList),
);
setfeatureData((origin) =>
updateTreeData(origin, key, sysFunctionVOList),
)
resolve();
return;
}
setTimeout(() => {
setTreeData((origin) =>
updateTreeData(origin, key, sysFunctionVOList),
);
setfeatureData((origin) =>
updateTreeData(origin, key, sysFunctionVOList),
)
resolve();
}, 1000);
});
//新增-编辑保存
const onFinish = (values: any) => {
if (title === '新增') {
values.moduleId = moduleId
console.log('Success:', values);
addSysFunction({ ...values }).then((res) => {
console.log('res新增', res);
if (res.msg === 'ok') {
messageApi.open({
type: 'success',
content: '新增权限成功',
});
fetchModuleList({ pageIndex, pageSize })
// window.location.reload() // 强制页面刷新
}
})
} else {
values.moduleId = moduleId
values.functionId = functionId
console.log('Success:', values);
updateSysFunction({ ...values }).then((res) => {
console.log('res编辑', res);
if (res.msg === 'ok') {
messageApi.open({
type: 'success',
content: '编辑权限成功',
});
fetchModuleList({ pageIndex, pageSize })
// window.location.reload() // 强制页面刷新
}
})
}
setIsModalOpen(false);
form.resetFields();
};
//modal的方法
const handleCancel = () => {
setIsModalOpen(false);
fetchModuleList({ pageIndex, pageSize })
};
const renderTreeNodes = (data: any) => {
let nodeArr = data.map((item: any) => {
item.title = (
<div>
<span>
{item.moduleName ? item.moduleName : item.functionName}</span>
<span>
{item.moduleName ? <PlusOutlined style={{ marginLeft: 10 }}
onClick={() => onAdd(item.sysModuleId)} /> : <></>}
{item.functionName ? <EditOutlined style={{ marginLeft: 10 }}
onClick={() => onEdit(item.sysModuleId || item.functionId)} /> : <></>}
<DeleteOutlined style={{ marginLeft: 10 }} onClick={() => onDelete(item.sysModuleId || item.functionId)} />
</span>
</div>
);
if (item.sysFunctionVOList) {
return (
<TreeNode title={item.title} key={item.sysModuleId}>
{renderTreeNodes(item.sysFunctionVOList)}
</TreeNode>
);
}
return <TreeNode title={item.title} key={item.sysModuleId} />;
});
return nodeArr;
};
return (
<>
{contextHolder}
<Modal title={title} open={isModalOpen} onCancel={handleCancel} footer={null}>
<Form
name="basic"
form={form}
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
style={{ maxWidth: 600 }}
initialValues={{ remember: true }}
onFinish={onFinish}
autoComplete="off"
>
<Form.Item<FieldType>
label="功能名称"
name="functionName"
rules={[{ required: true }]}
>
<Input />
</Form.Item>
<Form.Item<FieldType>
label="备注"
name="remark"
rules={[{ required: true }]}
>
<Input />
</Form.Item>
<Form.Item<FieldType>
label="路径"
name="functionPath"
rules={[{ required: true }]}
>
<Input />
</Form.Item>
<Form.Item wrapperCol={{ offset: 8, span: 16 }}>
<Space>
<Button type="primary" htmlType="submit" >
确定
</Button>
<Button htmlType="button" onClick={handleCancel}>
取消
</Button>
</Space>
</Form.Item>
</Form>
</Modal >
<Tree loadData={onLoadData} treeData={treeData} fieldNames={ {title: 'title', key: 'key', children: 'sysFunctionVOList'} }>
{treeData?.length && renderTreeNodes(featureData)}
</Tree>
</>
);
}