'use client' import { useEffect, useState, useCallback } from 'react' import { Search, Plus, Loader2, ChevronLeft, ChevronRight, Pencil, Ban, CheckCircle2, } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Badge } from '@/components/ui/badge' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription, } from '@/components/ui/dialog' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { api } from '@/lib/api-client' import { ApiRequestError } from '@/lib/api-client' import { formatDate } from '@/lib/utils' import type { AccountPublic } from '@/lib/types' const PAGE_SIZE = 20 const roleLabels: Record = { super_admin: '超级管理员', admin: '管理员', user: '普通用户', } const statusColors: Record = { active: 'success', disabled: 'destructive', suspended: 'warning', } const statusLabels: Record = { active: '正常', disabled: '已禁用', suspended: '已暂停', } export default function AccountsPage() { const [accounts, setAccounts] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [search, setSearch] = useState('') const [roleFilter, setRoleFilter] = useState('all') const [statusFilter, setStatusFilter] = useState('all') const [loading, setLoading] = useState(true) const [error, setError] = useState('') // 编辑 Dialog const [editTarget, setEditTarget] = useState(null) const [editForm, setEditForm] = useState({ display_name: '', email: '', role: 'user' }) const [editSaving, setEditSaving] = useState(false) // 确认 Dialog const [confirmTarget, setConfirmTarget] = useState<{ id: string; action: string; status: string } | null>(null) const [confirmSaving, setConfirmSaving] = useState(false) const fetchAccounts = useCallback(async () => { setLoading(true) setError('') try { const params: Record = { page, page_size: PAGE_SIZE } if (search.trim()) params.search = search.trim() if (roleFilter !== 'all') params.role = roleFilter if (statusFilter !== 'all') params.status = statusFilter const res = await api.accounts.list(params) setAccounts(res.items) setTotal(res.total) } catch (err) { if (err instanceof ApiRequestError) { setError(err.body.message) } else { setError('加载失败') } } finally { setLoading(false) } }, [page, search, roleFilter, statusFilter]) useEffect(() => { fetchAccounts() }, [fetchAccounts]) const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE)) function openEditDialog(account: AccountPublic) { setEditTarget(account) setEditForm({ display_name: account.display_name, email: account.email, role: account.role, }) } async function handleEditSave() { if (!editTarget) return setEditSaving(true) try { await api.accounts.update(editTarget.id, { display_name: editForm.display_name, email: editForm.email, role: editForm.role as AccountPublic['role'], }) setEditTarget(null) fetchAccounts() } catch (err) { if (err instanceof ApiRequestError) { setError(err.body.message) } } finally { setEditSaving(false) } } function openConfirmDialog(account: AccountPublic) { const newStatus = account.status === 'active' ? 'disabled' : 'active' setConfirmTarget({ id: account.id, action: newStatus === 'disabled' ? '禁用' : '启用', status: newStatus, }) } async function handleConfirmSave() { if (!confirmTarget) return setConfirmSaving(true) try { await api.accounts.updateStatus(confirmTarget.id, { status: confirmTarget.status as AccountPublic['status'], }) setConfirmTarget(null) fetchAccounts() } catch (err) { if (err instanceof ApiRequestError) { setError(err.body.message) } } finally { setConfirmSaving(false) } } return (
{/* 搜索和筛选 */}
{ setSearch(e.target.value); setPage(1) }} className="pl-10" />
{/* 错误提示 */} {error && (
{error}
)} {/* 表格 */} {loading ? (
) : accounts.length === 0 ? (
暂无数据
) : ( <> 用户名 邮箱 显示名 角色 状态 创建时间 操作 {accounts.map((account) => ( {account.username} {account.email} {account.display_name || '-'} {roleLabels[account.role] || account.role} {statusLabels[account.status] || account.status} {formatDate(account.created_at)}
))}
{/* 分页 */}

第 {page} 页 / 共 {totalPages} 页 ({total} 条)

)} {/* 编辑 Dialog */} setEditTarget(null)}> 编辑账号 修改账号信息
setEditForm({ ...editForm, display_name: e.target.value })} />
setEditForm({ ...editForm, email: e.target.value })} />
{/* 确认 Dialog */} setConfirmTarget(null)}> 确认{confirmTarget?.action} 确定要{confirmTarget?.action}该账号吗?此操作将立即生效。
) }