"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import api from "@/lib/api"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { toast } from "sonner"; interface User { id: string; name: string; email: string; avatar_url?: string; role: string; status: string; employee_id?: string; last_login_at?: string; login_count: number; created_at: string; } const roleLabels: Record = { super_admin: "平台管理员", admin: "机构管理员", creator: "创作者", user: "普通用户", }; const roleColors: Record = { super_admin: "destructive", admin: "default", creator: "secondary", user: "outline", }; export default function UsersPage() { const [search, setSearch] = useState(""); const queryClient = useQueryClient(); const { data } = useQuery({ queryKey: ["adminUsers", search], queryFn: () => api.get<{ items: User[] }>(`/api/v1/admin/users?q=${search}`), }); const updateRole = useMutation({ mutationFn: ({ id, role }: { id: string; role: string }) => api.put(`/api/v1/admin/users/${id}/role`, { role }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["adminUsers"] }); toast.success("角色更新成功"); }, onError: (err: Error) => toast.error(err.message), }); const updateStatus = useMutation({ mutationFn: ({ id, status }: { id: string; status: string }) => api.put(`/api/v1/admin/users/${id}/status`, { status }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["adminUsers"] }); toast.success("状态更新成功"); }, onError: (err: Error) => toast.error(err.message), }); return (

用户管理

setSearch(e.target.value)} className="w-64" />
{data?.items?.map((user) => ( ))}
用户 角色 状态 登录次数 操作
{user.name.charAt(0)}
{user.name}
{user.email}
{roleLabels[user.role]} {user.status === "active" ? "正常" : "禁用"} {user.login_count}
); }