import { useRef, useState } from 'react' import { ProTable } from '@ant-design/pro-components' import type { ProColumns, ActionType } from '@ant-design/pro-components' import { Button, Tag, message, Tooltip } from 'antd' import { PlusOutlined, ReloadOutlined } from '@ant-design/icons' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import type { AdminUser } from '@/types/admin' import { ADMIN_ROLE_LABELS, ADMIN_ROLE_COLORS } from '@/constants/roles' import { getAdminUsers, deleteAdminUser } from '@/services/admin-api' import DetailDrawer from '@/components/DetailDrawer' import ConfirmDangerModal from '@/components/ConfirmDangerModal' const statusLabelMap: Record = { ACTIVE: '正常', DISABLED: '已禁用', } const statusColorMap: Record = { ACTIVE: 'green', DISABLED: 'red', } export default function UserManagement() { const actionRef = useRef(undefined) const queryClient = useQueryClient() const [detailOpen, setDetailOpen] = useState(false) const [selectedUser, setSelectedUser] = useState(null) const [deleteTarget, setDeleteTarget] = useState(null) const { data, isLoading } = useQuery({ queryKey: ['admin-users'], queryFn: () => getAdminUsers({ page: 1, limit: 20 }), }) const deleteMutation = useMutation({ mutationFn: (id: string) => deleteAdminUser(id), onSuccess: () => { message.success('已删除') queryClient.invalidateQueries({ queryKey: ['admin-users'] }) }, onError: () => message.error('删除失败'), }) const columns: ProColumns[] = [ { title: '姓名', dataIndex: 'displayName', width: 130, ellipsis: true, }, { title: '邮箱', dataIndex: 'email', width: 200, ellipsis: true, }, { title: '角色', dataIndex: 'role', width: 120, valueType: 'select', valueEnum: { SUPER_ADMIN: { text: '超级管理员' }, ADMIN: { text: '管理员' }, OPERATIONS: { text: '运营人员' }, DEVELOPER: { text: '开发者' }, READONLY: { text: '只读用户' }, }, render: (_, record) => ( {ADMIN_ROLE_LABELS[record.role]} ), }, { title: '状态', dataIndex: 'status', width: 90, valueType: 'select', valueEnum: { ACTIVE: { text: '正常' }, DISABLED: { text: '已禁用' }, }, render: (_, record) => ( {statusLabelMap[record.status]} ), }, { title: '最后登录', dataIndex: 'lastLoginAt', width: 160, search: false, render: (_, record) => record.lastLoginAt ? new Date(record.lastLoginAt).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }) : '-', }, { title: '创建时间', dataIndex: 'createdAt', width: 160, search: false, render: (_, record) => new Date(record.createdAt).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }), }, { title: '操作', valueType: 'option', width: 100, render: (_, record) => [ { setSelectedUser(record) setDetailOpen(true) }} > 详情 , { if (record.role !== 'SUPER_ADMIN') { setDeleteTarget(record) } }} > 删除 , ], }, ] return ( <> actionRef={actionRef} columns={columns} dataSource={data?.items || []} loading={isLoading} rowKey="id" search={false} options={false} pagination={ data ? { current: data.page, pageSize: data.limit, total: data.total, showSizeChanger: true, showTotal: (total) => `共 ${total} 条`, } : false } headerTitle="管理员列表" toolbar={{ actions: [ , , ], }} /> setDetailOpen(false)} title="管理员详情" > {selectedUser && (
姓名
{selectedUser.displayName}
邮箱
{selectedUser.email}
角色
{ADMIN_ROLE_LABELS[selectedUser.role]}
状态
{statusLabelMap[selectedUser.status]}
两步验证
{selectedUser.twoFactorEnabled ? '已启用' : '未启用'}
最后登录时间
{selectedUser.lastLoginAt || '-'}
最后登录 IP
{selectedUser.lastLoginIp || '-'}
创建时间
{selectedUser.createdAt}
)}
setDeleteTarget(null)} onConfirm={() => { if (deleteTarget) { deleteMutation.mutate(deleteTarget.id) setDeleteTarget(null) } }} title="删除管理员" description="此操作不可撤销。请输入管理员邮箱确认删除:" targetName={deleteTarget?.email || ''} loading={deleteMutation.isPending} /> ) }