import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Link } from 'react-router-dom'; import { apiFetch } from '../../lib/api'; type UserItem = { id: string; email: string; name: string; role: string; disabled: boolean; createdAt: string; avatarUrl: string | null; _count: { projects: number }; }; type UsersResponse = { users: UserItem[]; total: number; page: number; limit: number; }; export default function Users() { const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [searchInput, setSearchInput] = useState(''); const limit = 20; const { data, isLoading } = useQuery({ queryKey: ['admin', 'users', page, search], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); return apiFetch(`/admin/users?${params}`); }, }); const totalPages = data ? Math.ceil(data.total / limit) : 0; const handleSearch = (e: React.FormEvent) => { e.preventDefault(); setSearch(searchInput); setPage(1); }; return (
{/* Header */}

用户管理

共 {data?.total ?? 0} 个用户

{/* Search */}
setSearchInput(e.target.value)} placeholder="搜索用户名或邮箱..." className="input-base max-w-xs" /> {search && ( )}
{/* Table */}
{isLoading ? ( Array.from({ length: 5 }).map((_, i) => ( )) ) : data?.users.length === 0 ? ( ) : ( data?.users.map((user) => ( )) )}
用户 角色 项目数 注册时间 状态 操作
无匹配用户
{user.name.split(' ').map(w => w[0]).join('').toUpperCase().slice(0, 2)}
{user.name}
{user.email}
{user.role} {user._count.projects} {new Date(user.createdAt).toLocaleDateString('zh-CN')} {user.disabled ? '已禁用' : '正常'} 查看
{/* Pagination */} {totalPages > 1 && (
第 {page} / {totalPages} 页
)}
); }