feat: enhance Druid integration and improve user management features

This commit is contained in:
2026-07-16 09:59:27 +08:00
parent 2e88885a27
commit f9f5ceac9d
10 changed files with 253 additions and 72 deletions

View File

@@ -23,10 +23,11 @@ const handleAdd = async (fields: API.System.Dept) => {
hide();
if (resp.code === 200) {
message.success('添加成功');
return true;
} else {
message.error(resp.msg);
message.error(resp.msg || '添加失败');
return false;
}
return true;
} catch (error) {
hide();
message.error('添加失败请重试!');
@@ -46,10 +47,11 @@ const handleUpdate = async (fields: API.System.Dept) => {
hide();
if (resp.code === 200) {
message.success('更新成功');
return true;
} else {
message.error(resp.msg);
message.error(resp.msg || '更新失败');
return false;
}
return true;
} catch (error) {
hide();
message.error('配置失败请重试!');
@@ -70,10 +72,11 @@ const handleRemove = async (selectedRows: API.System.Dept[]) => {
hide();
if (resp.code === 200) {
message.success('删除成功,即将刷新');
return true;
} else {
message.error(resp.msg);
message.error(resp.msg || '删除失败');
return false;
}
return true;
} catch (error) {
hide();
message.error('删除失败,请重试');
@@ -90,10 +93,11 @@ const handleRemoveOne = async (selectedRow: API.System.Dept) => {
hide();
if (resp.code === 200) {
message.success('删除成功,即将刷新');
return true;
} else {
message.error(resp.msg);
message.error(resp.msg || '删除失败');
return false;
}
return true;
} catch (error) {
hide();
message.error('删除失败,请重试');
@@ -101,6 +105,16 @@ const handleRemoveOne = async (selectedRow: API.System.Dept) => {
}
};
/**
* 获取树表格中所有有下级部门的节点,确保异步加载后能够展开到任意层级。
*/
const getExpandableRowKeys = (nodes: any[]): React.Key[] =>
nodes.flatMap((node) => {
if (!Array.isArray(node.children) || node.children.length === 0) {
return [];
}
return [node.deptId, ...getExpandableRowKeys(node.children)];
});
const DeptTableList: React.FC = () => {
const formTableRef = useRef<FormInstance>();
@@ -110,6 +124,7 @@ const DeptTableList: React.FC = () => {
const actionRef = useRef<ActionType>();
const [currentRow, setCurrentRow] = useState<API.System.Dept>();
const [selectedRows, setSelectedRows] = useState<API.System.Dept[]>([]);
const [expandedRowKeys, setExpandedRowKeys] = useState<React.Key[]>([]);
const [deptTree, setDeptTree] = useState<any>([]);
const [statusOptions, setStatusOptions] = useState<any>([]);
@@ -125,6 +140,22 @@ const DeptTableList: React.FC = () => {
});
}, []);
const openAddModal = async (parentId?: number) => {
const res = await getDeptList();
if (res.code !== 200) {
message.warning(res.msg || '部门列表加载失败');
return;
}
setDeptTree(buildTreeData(res.data, 'deptId', 'deptName', '', '', ''));
setCurrentRow(
parentId === undefined
? undefined
: ({ parentId, orderNum: 1, status: '0' } as API.System.Dept),
);
setModalVisible(true);
};
const columns: ProColumns<API.System.Dept>[] = [
{
title: <FormattedMessage id="system.dept.dept_name" defaultMessage="部门名称" />,
@@ -148,14 +179,14 @@ const DeptTableList: React.FC = () => {
{
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
dataIndex: 'option',
width: '220px',
width: '300px',
valueType: 'option',
render: (_, record) => [
<Button
type="link"
size="small"
key="edit"
hidden={!access.hasPerms('system:dept:edit.tsx')}
hidden={!access.hasPerms('system:dept:edit')}
onClick={() => {
getDeptListExcludeChild(record.deptId).then((res) => {
if (res.code === 200) {
@@ -174,6 +205,15 @@ const DeptTableList: React.FC = () => {
>
</Button>,
<Button
type="link"
size="small"
key="addChild"
hidden={!access.hasPerms('system:dept:add')}
onClick={() => openAddModal(record.deptId)}
>
<PlusOutlined />
</Button>,
<Button
type="link"
size="small"
@@ -218,22 +258,16 @@ const DeptTableList: React.FC = () => {
search={{
labelWidth: 120,
}}
expandable={{
expandedRowKeys,
onExpandedRowsChange: (keys) => setExpandedRowKeys(keys),
}}
toolBarRender={() => [
<Button
type="primary"
key="add"
hidden={!access.hasPerms('system:dept:add')}
onClick={async () => {
getDeptList().then((res) => {
if (res.code === 200) {
setDeptTree(buildTreeData(res.data, 'deptId', 'deptName', '', '', ''));
setCurrentRow(undefined);
setModalVisible(true);
} else {
message.warning(res.msg);
}
});
}}
onClick={() => openAddModal()}
>
<PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="新建" />
</Button>,
@@ -264,8 +298,10 @@ const DeptTableList: React.FC = () => {
]}
request={(params) =>
getDeptList({ ...params } as API.System.DeptListParams).then((res) => {
const treeData = buildTreeData(res.data, 'deptId', 'deptName', '', '', '');
setExpandedRowKeys(getExpandableRowKeys(treeData));
const result = {
data: buildTreeData(res.data, 'deptId', '', '', '', ''),
data: treeData,
total: res.data.length,
success: true,
};
@@ -293,7 +329,7 @@ const DeptTableList: React.FC = () => {
<Button
key="remove"
danger
hidden={!access.hasPerms('system:dept:del')}
hidden={!access.hasPerms('system:dept:remove')}
onClick={async () => {
Modal.confirm({
title: '删除',