"use client" import { useState, useEffect } from "react" import Link from "next/link" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Search, MoreHorizontal, Edit, Trash, UserPlus, Loader2 } from "lucide-react" import { Badge } from "@/components/ui/badge" import { useToast } from "@/components/ui/use-toast" import { getAdministrators, deleteAdministrator, Administrator } from "@/lib/admin-api" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" export default function AdminsPage() { const [searchTerm, setSearchTerm] = useState("") const [isLoading, setIsLoading] = useState(true) const [isDeleting, setIsDeleting] = useState(false) const [administrators, setAdministrators] = useState([]) const [totalCount, setTotalCount] = useState(0) const [currentPage, setCurrentPage] = useState(1) const [pageSize] = useState(10) const { toast } = useToast() // 删除对话框状态 const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) const [adminToDelete, setAdminToDelete] = useState(null) // 加载管理员列表 useEffect(() => { fetchAdministrators() // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentPage]) // 获取管理员列表 const fetchAdministrators = async (keyword: string = searchTerm) => { setIsLoading(true) try { const response = await getAdministrators(currentPage, pageSize, keyword) if (response.code === 200 && response.data) { setAdministrators(response.data.list) setTotalCount(response.data.total) } else { toast({ title: "获取管理员列表失败", description: response.msg || "请稍后重试", variant: "destructive", }) setAdministrators([]) setTotalCount(0) } } catch (error) { console.error("获取管理员列表出错:", error) toast({ title: "获取管理员列表失败", description: "请检查网络连接后重试", variant: "destructive", }) setAdministrators([]) setTotalCount(0) } finally { setIsLoading(false) } } // 处理搜索 const handleSearch = () => { setCurrentPage(1) // 重置为第一页 fetchAdministrators() } // Enter键搜索 const handleSearchKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleSearch() } } // 检查是否为超级管理员(id为1) const isSuperAdmin = (id: number) => { return id === 1 } // 打开删除确认对话框 const openDeleteDialog = (admin: Administrator) => { setAdminToDelete(admin) setDeleteDialogOpen(true) } // 确认删除管理员 const confirmDelete = async () => { if (!adminToDelete) return setIsDeleting(true) try { const response = await deleteAdministrator(adminToDelete.id) if (response.code === 200) { toast({ title: "删除成功", description: `管理员 ${adminToDelete.username} 已成功删除`, variant: "success", }) // 重新获取管理员列表 fetchAdministrators() } else { toast({ title: "删除失败", description: response.msg || "请稍后重试", variant: "destructive", }) } } catch (error) { console.error("删除管理员出错:", error) toast({ title: "删除失败", description: "请检查网络连接后重试", variant: "destructive", }) } finally { setIsDeleting(false) setDeleteDialogOpen(false) setAdminToDelete(null) } } return (

管理员列表

setSearchTerm(e.target.value)} onKeyDown={handleSearchKeyDown} />
账号 用户名 角色 权限 创建时间 最后登录 操作 {isLoading ? (
) : administrators.length > 0 ? ( administrators.map((admin) => ( {admin.account} {admin.username} {admin.role}
{admin.permissions.map((permission) => ( {permission} ))}
{admin.createdAt} {admin.lastLogin} 编辑管理员 {!isSuperAdmin(admin.id) && ( openDeleteDialog(admin)} > 删除管理员 )}
)) ) : ( 未找到管理员 )}
{totalCount > pageSize && (
第 {currentPage} 页 / 共 {Math.ceil(totalCount / pageSize)} 页
)} {/* 删除确认对话框 */} 确认删除管理员 您确定要删除管理员 "{adminToDelete?.username}" 吗?此操作无法撤销。 取消 {isDeleting ? ( <> 删除中... ) : ( "确认删除" )}
) }