diff --git a/frontend/src/pages/System/User/index.tsx b/frontend/src/pages/System/User/index.tsx index daa787d7..bd630e21 100644 --- a/frontend/src/pages/System/User/index.tsx +++ b/frontend/src/pages/System/User/index.tsx @@ -1,331 +1,331 @@ -import React, { useEffect, useState } from 'react'; -import { Table, Button, Modal, Form, Input, Space, message, Switch, TreeSelect } 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 { getUsers, createUser, updateUser, deleteUser, resetPassword } from './service'; -import { useTableData } from '@/hooks/useTableData'; -import type { FixedType, AlignType } from 'rc-table/lib/interface'; +import React, {useEffect, useState} from 'react'; +import {Table, Button, Modal, Form, Input, Space, message, Switch, TreeSelect} 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 {getUsers, createUser, updateUser, deleteUser, resetPassword} from './service'; +import {useTableData} from '@/hooks/useTableData'; +import type {FixedType, AlignType} from 'rc-table/lib/interface'; const UserPage: React.FC = () => { - const { - list: users, - pagination, - loading, - loadData: fetchUsers, - onPageChange, - handleCreate, - handleUpdate, - handleDelete - } = useTableData({ - service: { - list: getUsers, - create: createUser, - update: updateUser, - delete: deleteUser - }, - defaultParams: { - sortField: 'createTime', - sortOrder: 'desc' - }, - message: { - createSuccess: '用户创建成功', - updateSuccess: '用户更新成功', - deleteSuccess: '用户删除成功', - loadError: '获取用户列表失败' - } - }); - - 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 handleAdd = () => { - setEditingUser(null); - form.resetFields(); - form.setFieldsValue({ - enabled: true + const { + list: users, + pagination, + loading, + loadData: fetchUsers, + onPageChange, + handleCreate, + handleUpdate, + handleDelete + } = useTableData({ + service: { + list: getUsers, + create: createUser, + update: updateUser, + delete: deleteUser + }, + defaultParams: { + sortField: 'createTime', + sortOrder: 'desc' + }, + message: { + createSuccess: '用户创建成功', + updateSuccess: '用户更新成功', + deleteSuccess: '用户删除成功', + loadError: '获取用户列表失败' + } }); - setModalVisible(true); - }; - const handleEdit = (record: UserResponse) => { - setEditingUser(record); - form.setFieldsValue({ - ...record - }); - setModalVisible(true); - }; + 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 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) { - message.error('密码重置失败'); - } - }; - - const handleSubmit = async () => { - try { - const values = await form.validateFields(); - if (editingUser) { - await updateUser(editingUser.id, { - ...values, - version: editingUser.version + const handleAdd = () => { + setEditingUser(null); + form.resetFields(); + form.setFieldsValue({ + enabled: true }); - message.success('更新成功'); - } else { - await createUser(values); - message.success('创建成功'); - } - setModalVisible(false); - fetchUsers(); - } catch (error) { - message.error('操作失败'); - } - }; + setModalVisible(true); + }; - const getTreeData = (deps: DepartmentDTO[]): any[] => { - return deps.map(dept => ({ - title: dept.name, - value: dept.id, - children: dept.children && dept.children.length > 0 ? getTreeData(dept.children) : undefined - })); - }; + const handleEdit = (record: UserResponse) => { + setEditingUser(record); + form.setFieldsValue({ + ...record + }); + setModalVisible(true); + }; - // const handleAssignRoles = (record: UserResponse) => { - // setSelectedUser(record); - // setRoleModalVisible(true); - // }; + const handleResetPassword = (record: UserResponse) => { + setEditingUser(record); + passwordForm.resetFields(); + setResetPasswordModalVisible(true); + }; - const columns = [ - { - title: 'ID', - dataIndex: 'id', - key: 'id', - width: 80, - fixed: 'left' as FixedType - }, - { - title: '用户名', - dataIndex: 'username', - key: 'username', - width: 120, - }, - { - title: '昵称', - dataIndex: 'nickname', - key: 'nickname', - width: 120, - }, - { - title: '邮箱', - dataIndex: 'email', - key: 'email', - width: 200, - ellipsis: true, - }, - { - title: '手机号', - dataIndex: 'phone', - key: 'phone', - width: 120, - }, - { - title: '角色', - dataIndex: 'roles', - key: 'roles', - width: 150, - ellipsis: true, - render: (roles: Role[]) => roles?.map(role => role.name).join(', ') || '-' - }, - { - title: '创建时间', - dataIndex: 'createTime', - key: 'createTime', - width: 180, - }, - { - title: '更新时间', - dataIndex: 'updateTime', - key: 'updateTime', - width: 180, - }, - { - title: '状态', - dataIndex: 'enabled', - key: 'enabled', - width: 80, - align: 'center' as AlignType, - render: (enabled: boolean) => ( - - ), - }, - { - title: '操作', - key: 'action', - width: 180, - fixed: 'right' as FixedType, - render: (_: any, record: UserResponse) => ( - - - - - - ), - }, - ]; + const handleResetPasswordSubmit = async () => { + try { + const values = await passwordForm.validateFields(); + if (editingUser) { + await resetPassword(editingUser.id, values.password); + message.success('密码重置成功'); + setResetPasswordModalVisible(false); + } + } catch (error) { + message.error('密码重置失败'); + } + }; - return ( -
-
- -
+ const handleSubmit = async () => { + try { + const values = await form.validateFields(); + if (editingUser) { + await updateUser(editingUser.id, { + ...values, + version: editingUser.version + }); + message.success('更新成功'); + } else { + await createUser(values); + message.success('创建成功'); + } + setModalVisible(false); + fetchUsers(); + } catch (error) { + message.error('操作失败'); + } + }; - `共 ${total} 条记录`, - onChange: onPageChange, - size: 'small' - }} - rowSelection={{ - type: 'checkbox', - onChange: (selectedRowKeys, selectedRows) => { - console.log('selectedRowKeys:', selectedRowKeys); - console.log('selectedRows:', selectedRows); - }, - getCheckboxProps: (record) => ({ - disabled: record.username === 'admin', - }), - fixed: true, - }} - size="middle" - bordered - /> + const getTreeData = (deps: DepartmentDTO[]): any[] => { + return deps.map(dept => ({ + title: dept.name, + value: dept.id, + children: dept.children && dept.children.length > 0 ? getTreeData(dept.children) : undefined + })); + }; - setModalVisible(false)} - width={600} - destroyOnClose - > -
- - - - - {!editingUser && ( - - - - )} + // const handleAssignRoles = (record: UserResponse) => { + // setSelectedUser(record); + // setRoleModalVisible(true); + // }; - - - - - - - - - - - roles?.map(role => role.name).join(', ') || '-' + }, + { + title: '创建时间', + dataIndex: 'createTime', + key: 'createTime', + width: 150, + }, + { + title: '更新时间', + dataIndex: 'updateTime', + key: 'updateTime', + width: 150, + }, + { + title: '状态', + dataIndex: 'enabled', + key: 'enabled', + width: 60, + align: 'center' as AlignType, + render: (enabled: boolean) => ( + + ), + }, + { + title: '操作', + key: 'action', + width: 240, + fixed: 'right' as FixedType, + render: (_: any, record: UserResponse) => ( + + + + + + ), + }, + ]; + + return ( +
+
+ +
+ +
`共 ${total} 条记录`, + onChange: onPageChange, + size: 'small' + }} + rowSelection={{ + type: 'checkbox', + onChange: (selectedRowKeys, selectedRows) => { + console.log('selectedRowKeys:', selectedRowKeys); + console.log('selectedRows:', selectedRows); + }, + getCheckboxProps: (record) => ({ + disabled: record.username === 'admin', + }), + fixed: true, + }} + size="middle" + bordered /> - - - - - - - {/* 注释掉RoleModal相关代码 + setModalVisible(false)} + width={600} + destroyOnClose + > +
+ + + + + {!editingUser && ( + + + + )} + + + + + + + + + + + + + + + + + +
+ + {/* 注释掉RoleModal相关代码 {selectedUser && ( { )} */} - setResetPasswordModalVisible(false)} - destroyOnClose - > -
- - - - ({ - validator(_, value) { - if (!value || getFieldValue('password') === value) { - return Promise.resolve(); - } - return Promise.reject(new Error('两次输入的密码不一致')); - }, - }), - ]} - > - - - -
- - ); + setResetPasswordModalVisible(false)} + destroyOnClose + > +
+ + + + ({ + validator(_, value) { + if (!value || getFieldValue('password') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('两次输入的密码不一致')); + }, + }), + ]} + > + + + +
+ + ); }; export default UserPage; \ No newline at end of file