"use client"; import { DeleteOutlined, EditOutlined, PlusOutlined, ReloadOutlined, SearchOutlined } from "@ant-design/icons"; import { ProTable, type ProColumns } from "@ant-design/pro-components"; import { Avatar, Button, Card, Col, Flex, Form, Input, InputNumber, Modal, Row, Select, Space, Tag, Tooltip, Typography } from "antd"; import { useEffect, useState } from "react"; import type { AdminUser } from "@/services/api/admin"; import { useAdminUsers } from "./use-admin-users"; type UserFormValues = Partial & { password?: string }; const roleOptions = [ { label: "普通用户", value: "user" }, { label: "管理员", value: "admin" }, ]; const statusOptions = [ { label: "正常", value: "active" }, { label: "禁用", value: "ban" }, ]; export default function AdminUsersPage() { const { users, keyword, page, pageSize, total, isLoading, searchUsers, changePage, changePageSize, resetFilters, refreshUsers, saveUser: saveAdminUser, deleteUser } = useAdminUsers(); const [form] = Form.useForm(); const [keywordText, setKeywordText] = useState(keyword); const [editingUser, setEditingUser] = useState | null>(null); const [deletingUser, setDeletingUser] = useState(null); useEffect(() => setKeywordText(keyword), [keyword]); useEffect(() => { if (editingUser) form.setFieldsValue({ role: "user", status: "active", credits: 0, ...editingUser, password: "" }); }, [editingUser, form]); const saveUser = async () => { const value = await form.validateFields(); await saveAdminUser({ ...editingUser, ...value, password: value.password || undefined }); setEditingUser(null); }; const columns: ProColumns[] = [ { title: "用户", dataIndex: "username", width: 260, render: (_, item) => ( {(item.displayName || item.username || "U").slice(0, 1).toUpperCase()} {item.displayName || item.username} {item.username} ), }, { title: "角色", dataIndex: "role", width: 100, render: (_, item) => {item.role === "admin" ? "管理员" : "用户"}, }, { title: "状态", dataIndex: "status", width: 90, render: (_, item) => {item.status === "ban" ? "禁用" : "正常"}, }, { title: "算力点", dataIndex: "credits", width: 100, render: (_, item) => {item.credits}, }, { title: "Linux.do", dataIndex: "linuxDoId", width: 140, render: (_, item) => {item.linuxDoId || "-"}, }, { title: "最近登录", dataIndex: "lastLoginAt", width: 180, render: (_, item) => {item.lastLoginAt || "-"}, }, { title: "操作", key: "actions", width: 96, align: "right", render: (_, item) => ( rowKey="id" columns={columns} dataSource={users} loading={isLoading} search={false} defaultSize="middle" tableLayout="fixed" cardProps={{ variant: "borderless" }} headerTitle={ 用户列表 {total} 人 } options={{ density: true, setting: true, reload: () => void refreshUsers() }} toolBarRender={() => [ , ]} pagination={{ current: page, pageSize, total, showSizeChanger: true, pageSizeOptions: [10, 20, 50, 100], showTotal: (value) => `共 ${value} 人`, onChange: (nextPage, nextPageSize) => (nextPageSize !== pageSize ? changePageSize(nextPageSize) : changePage(nextPage)), }} /> setEditingUser(null)} onOk={() => void saveUser()} okText="保存" cancelText="取消" destroyOnHidden>
setDeletingUser(null)} onOk={async () => { if (!deletingUser) return; await deleteUser(deletingUser.id); setDeletingUser(null); }} okText="删除" okButtonProps={{ danger: true }} cancelText="取消" > 确定删除「{deletingUser?.displayName || deletingUser?.username}」吗?删除后该账号将无法继续登录。 ); }