import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Link } from 'react-router-dom'; import { apiFetch } from '../../lib/api'; type ProjectItem = { id: string; name: string; description: string | null; openApiVersion: string; createdAt: string; user: { id: string; name: string; email: string }; _count: { endpoints: number; modules: number }; }; type ProjectsResponse = { projects: ProjectItem[]; total: number; page: number; limit: number; }; export default function AdminProjects() { const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [searchInput, setSearchInput] = useState(''); const limit = 20; const { data, isLoading } = useQuery({ queryKey: ['admin', 'projects', page, search], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); return apiFetch(`/admin/projects?${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) => ( {Array.from({ length: 7 }).map((_, j) => ( ))} )) ) : data?.projects.length === 0 ? ( ) : ( data?.projects.map((project) => ( )) )}
项目 所有者 版本 模块 端点 创建时间 操作
无匹配项目
{project.name}
{project.description && (
{project.description}
)}
{project.user.name} {project.openApiVersion} {project._count.modules} {project._count.endpoints} {new Date(project.createdAt).toLocaleDateString('zh-CN')} 查看
{/* Pagination */} {totalPages > 1 && (
第 {page} / {totalPages} 页
)}
); }