import { useState, useEffect } from 'react' import { Table, Button, Modal, Form, Input, Select, Tag, Space, message, Popconfirm } from 'antd' import { PlusOutlined, EditOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons' import type { ColumnsType } from 'antd/es/table' import { userApi } from '@/api/user.api' import { roleApi } from '@/api/role.api' import type { User, CreateUserRequest, UpdateUserRequest, UserPageRequest } from '@/api/user.api' import type { Role } from '@/api/role.api' import type { PageResponse } from '@/api/user.api' import { UserStatus, userStatusMap } from '@/constants/status' import { VALIDATION } from '@/constants/validation-rules' import PermissionGuard from '@/components/PermissionGuard' export default function UserManagement() { const [users, setUsers] = useState([]) const [loading, setLoading] = useState(false) const [modalOpen, setModalOpen] = useState(false) const [editingUser, setEditingUser] = useState(null) const [roles, setRoles] = useState([]) const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0 }) const [form] = Form.useForm() useEffect(() => { loadUsers() loadRoles() }, []) async function loadUsers() { setLoading(true) try { const params: UserPageRequest = { page: pagination.current - 1, size: pagination.pageSize } const res = await userApi.getPage(params) const data = res as unknown as PageResponse setUsers(data.content) setPagination((prev) => ({ ...prev, total: data.totalElements })) } catch { message.error('加载用户列表失败') } finally { setLoading(false) } } async function loadRoles() { try { const res = await roleApi.getAll() setRoles(Array.isArray(res) ? res : []) } catch { /* ignored */ } } function handleAdd() { setEditingUser(null) form.resetFields() setModalOpen(true) } function handleEdit(record: User) { setEditingUser(record) form.setFieldsValue({ nickname: record.nickname, email: record.email, phone: record.phone, roles: record.roles, status: record.status, }) setModalOpen(true) } async function handleDelete(id: string) { try { await userApi.delete(id) message.success('删除成功') loadUsers() } catch { message.error('删除失败') } } async function handleSubmit() { try { const values = await form.validateFields() if (editingUser) { const data: UpdateUserRequest = { ...values } await userApi.update(editingUser.id, data) message.success('更新成功') } else { const data: CreateUserRequest = { ...values } await userApi.create(data) message.success('创建成功') } setModalOpen(false) loadUsers() } catch { /* ignored */ } } const columns: ColumnsType = [ { title: '用户名', dataIndex: 'username', key: 'username' }, { title: '昵称', dataIndex: 'nickname', key: 'nickname' }, { title: '邮箱', dataIndex: 'email', key: 'email' }, { title: '手机', dataIndex: 'phone', key: 'phone' }, { title: '状态', dataIndex: 'status', key: 'status', render: (status: UserStatus) => { const info = userStatusMap[status] return {info?.label || status} }, }, { title: '角色', dataIndex: 'roles', key: 'roles', render: (roles: string[]) => roles?.map((r) => {r}), }, { title: '操作', key: 'action', render: (_, record) => ( rowKey="id" columns={columns} dataSource={users} loading={loading} pagination={{ ...pagination, showSizeChanger: true, showTotal: (total) => `共 ${total} 条`, onChange: (page, pageSize) => { setPagination((prev) => ({ ...prev, current: page, pageSize })) setTimeout(loadUsers, 0) }, }} /> setModalOpen(false)} destroyOnHidden >
{!editingUser && ( )} {!editingUser && ( )} ({ label: info.label, value }))} /> )}
) }