import React, {useEffect, useState} from 'react'; import {Table, Button, Modal, Form, Input, Space, message, Switch, TreeSelect, Select, Tag} from 'antd'; import {PlusOutlined, EditOutlined, DeleteOutlined, KeyOutlined, TeamOutlined} from '@ant-design/icons'; import type {UserResponse, Role} from './types'; import type {DepartmentDTO} from '../Department/types'; import {resetPassword, assignRoles, getAllRoles} from './service'; import {useTableData} from '@/hooks/useTableData'; import type {FixedType, AlignType, SortOrder} from 'rc-table/lib/interface'; import {Response} from "@/utils/request.ts"; import {TablePaginationConfig} from "antd/es/table"; import {FilterValue, SorterResult} from "antd/es/table/interface"; import { getDepartmentTree } from '../Department/service'; // 导入部门树接口 interface TreeNode { title: string; value: number; children?: TreeNode[]; } const UserPage: React.FC = () => { const { list: users, pagination, loading, loadData: fetchUsers, handleCreate, handleUpdate, handleDelete } = useTableData({ service: { baseUrl: '/api/v1/user' }, defaultParams: { sortField: 'createTime', sortOrder: 'descend' } }); const [departments, setDepartments] = useState([]); const [modalVisible, setModalVisible] = useState(false); const [resetPasswordModalVisible, setResetPasswordModalVisible] = useState(false); const [editingUser, setEditingUser] = useState(null); const [form] = Form.useForm(); const [passwordForm] = Form.useForm(); const [roleModalVisible, setRoleModalVisible] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const [selectedRoles, setSelectedRoles] = useState([]); const [allRoles, setAllRoles] = useState([]); useEffect(() => { getAllRoles().then(roles => setAllRoles(roles)); }, []); const handleAdd = () => { setEditingUser(null); form.resetFields(); form.setFieldsValue({ enabled: true }); setModalVisible(true); }; const handleEdit = (record: UserResponse) => { setEditingUser(record); form.setFieldsValue({ ...record }); setModalVisible(true); }; const handleResetPassword = (record: UserResponse) => { setEditingUser(record); passwordForm.resetFields(); setResetPasswordModalVisible(true); }; const handleResetPasswordSubmit = async () => { try { const values = await passwordForm.validateFields(); if (editingUser) { await resetPassword(editingUser.id, values.password); message.success('密码重置成功'); setResetPasswordModalVisible(false); } } catch (error: any) { message.error(error.message || '密码重置失败'); } }; const handleSubmit = async (values: any) => { try { if (editingUser) { const success = await handleUpdate(editingUser.id, { ...values, enabled: values.enabled ?? true }); if (success) { message.success('更新成功'); setModalVisible(false); fetchUsers(); } } else { const success = await handleCreate({ ...values, enabled: values.enabled ?? true }); if (success) { message.success('创建成功'); setModalVisible(false); fetchUsers(); } } } catch (error: any) { message.error(error.message || '操作失败'); } }; const loadDepartmentTree = async () => { try { const data = await getDepartmentTree(); setDepartments(data); } catch (error) { message.error('加载部门数据失败'); } }; useEffect(() => { loadDepartmentTree(); }, []); const getTreeData = (departments: DepartmentDTO[]): TreeNode[] => { return departments.map(dept => ({ title: dept.name, value: dept.id, children: dept.children ? getTreeData(dept.children) : undefined })); }; const handleAssignRoles = (record: UserResponse) => { setSelectedUser(record); setSelectedRoles(record.roles?.map(role => role.id) || []); setRoleModalVisible(true); }; const handleAssignRoleSubmit = async () => { if (selectedUser) { try { await assignRoles(selectedUser.id, selectedRoles); message.success("角色分配成功") setRoleModalVisible(false); fetchUsers(); } catch (error) { message.error("角色分配失败") console.log(error); } } }; const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 60, fixed: 'left' as FixedType, sorter: true }, { title: '用户名', dataIndex: 'username', key: 'username', width: 100, sorter: true }, { title: '昵称', dataIndex: 'nickname', key: 'nickname', width: 100, }, { title: '邮箱', dataIndex: 'email', key: 'email', width: 200, }, { title: '部门', dataIndex: 'departmentName', key: 'departmentName', width: 150, }, { title: '状态', dataIndex: 'enabled', key: 'enabled', width: 100, render: (enabled: boolean) => ( {enabled ? '启用' : '禁用'} ), }, { title: '手机号', dataIndex: 'phone', key: 'phone', width: 120, }, { title: '角色', dataIndex: 'roles', key: 'roles', width: 120, ellipsis: true, render: (roles: Role[]) => roles?.map(role => role.name).join(', ') || '-' }, { title: '创建时间', dataIndex: 'createTime', key: 'createTime', width: 150, sorter: true, defaultSortOrder: 'descend' as SortOrder }, { title: '更新时间', dataIndex: 'updateTime', key: 'updateTime', width: 150, sorter: true }, { title: '操作', key: 'action', width: 320, fixed: 'right' as FixedType, render: (_: any, record: UserResponse) => ( ), }, ]; const handleTableChange = ( pagination: TablePaginationConfig, filters: Record, sorter: SorterResult | SorterResult[] ) => { const {field, order} = Array.isArray(sorter) ? sorter[0] : sorter; fetchUsers({ sortField: field as string, sortOrder: order }); }; return (
form.validateFields().then(handleSubmit)} onCancel={() => setModalVisible(false)} width={600} destroyOnClose >
{!editingUser && ( )}
{/* 注释掉RoleModal相关代码 {selectedUser && ( { setRoleModalVisible(false); setSelectedUser(null); }} onSuccess={() => { setRoleModalVisible(false); setSelectedUser(null); fetchUsers(); }} /> )} */} setResetPasswordModalVisible(false)} destroyOnClose >
({ validator(_, value) { if (!value || getFieldValue('password') === value) { return Promise.resolve(); } return Promise.reject(new Error('两次输入的密码不一致')); }, }), ]} >
setRoleModalVisible(false)} width={600} destroyOnClose >
); }; export default UserPage;