"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import api from "@/lib/api"; import type { PlatformUser, PlatformOrg } from "@/lib/types"; 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 { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { toast } from "sonner"; import { Building2 } from "lucide-react"; import { Pagination } from "@/components/ui/pagination"; const roleLabels: Record = { super_admin: "平台管理员", admin: "机构管理员", creator: "创作者", user: "普通用户", }; const roleColors: Record = { super_admin: "destructive", admin: "default", creator: "secondary", user: "outline", }; export default function PlatformUsersPage() { const qc = useQueryClient(); const [search, setSearch] = useState(""); const [orgFilter, setOrgFilter] = useState("all"); const [roleFilter, setRoleFilter] = useState("all"); const [page, setPage] = useState(1); const [migrateTarget, setMigrateTarget] = useState(null); const [newOrgID, setNewOrgID] = useState(""); const { data: orgs } = useQuery({ queryKey: ["platformOrgs"], queryFn: () => api.get("/api/v1/platform/orgs"), }); const { data } = useQuery({ queryKey: ["platformUsers", search, orgFilter, roleFilter, page], queryFn: () => { const p = new URLSearchParams(); p.set("page", String(page)); if (search) p.set("q", search); if (orgFilter !== "all") p.set("org_id", orgFilter); if (roleFilter !== "all") p.set("role", roleFilter); return api.get<{ items: PlatformUser[]; total: number; page: number; page_size: number; }>(`/api/v1/platform/users?${p}`); }, }); // 切换过滤条件时重置到第一页 const resetSearch = (v: string) => { setSearch(v); setPage(1); }; const resetOrg = (v: string | null) => { setOrgFilter(v ?? "all"); setPage(1); }; const resetRole = (v: string | null) => { setRoleFilter(v ?? "all"); setPage(1); }; const updateRole = useMutation({ mutationFn: ({ id, role }: { id: string; role: string }) => api.put(`/api/v1/platform/users/${id}/role`, { role }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["platformUsers"] }); toast.success("角色已更新"); }, onError: (e: Error) => toast.error(e.message), }); const updateStatus = useMutation({ mutationFn: ({ id, status }: { id: string; status: string }) => api.put(`/api/v1/platform/users/${id}/status`, { status }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["platformUsers"] }); toast.success("状态已更新"); }, onError: (e: Error) => toast.error(e.message), }); const assignOrg = useMutation({ mutationFn: ({ id, org_id }: { id: string; org_id: string }) => api.put(`/api/v1/platform/users/${id}/org`, { org_id }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["platformUsers"] }); toast.success("已迁移到目标机构"); setMigrateTarget(null); setNewOrgID(""); }, onError: (e: Error) => toast.error(e.message), }); return (

全局用户

共 {data?.total ?? 0} 条
resetSearch(e.target.value)} className="w-64" />
{data?.items?.map((u) => ( ))}
用户 所属机构 角色 状态 登录 操作
{u.name.charAt(0)}
{u.name}
{u.email}
{u.org_name ? ( {u.org_short || u.org_name} ) : ( —(平台级) )} {roleLabels[u.role]} {u.status === "active" ? "正常" : "禁用"} {u.login_count} 次
{/* 迁移机构对话框 */} !o && setMigrateTarget(null)}> 迁移用户机构

将用户「{migrateTarget?.name}」迁移到目标机构

); }