import { redirect } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table } from "@/components/ui/table"; import { getCurrentAuthContext, toPublicAccount } from "@/modules/core/server/auth"; import { getRoleDefinitions, hasPermission } from "@/modules/core/server/permissions"; import { readData } from "@/modules/core/server/store"; import { ROLE_LABELS } from "@/modules/core/types"; import type { RoleId } from "@/modules/core/types"; import { TableToolbar } from "@/modules/settings/components/TableToolbar"; import { UserAccountActions, UserManagementClient } from "@/modules/settings/components/UserManagementClient"; import { getPage, getPageCount, getSearchParam, paginate, type SearchParams } from "@/modules/settings/lib/pagination"; import { UserAvatar } from "@/modules/shared/components/UserAvatar"; type UsersPageProps = { searchParams?: Promise; }; function formatRoleLabel(role: string): string { if (role in ROLE_LABELS) { return ROLE_LABELS[role as RoleId]; } return role; } export default async function UsersPage({ searchParams }: UsersPageProps): Promise { const context = await getCurrentAuthContext(); if (!context) { redirect("/login"); } if (!hasPermission(context.permissions, "account:read")) { redirect("/app/dashboard"); } const params = (await searchParams) ?? {}; const query = getSearchParam(params, "q"); const page = getPage(params); const data = await readData(); const roles = await getRoleDefinitions(context.organization?.id); const roleById = new Map(roles.map((role) => [role.id, role])); const organizationById = new Map(data.organizations.map((organization) => [organization.id, organization])); const accounts = data.accounts.map((account) => { const membership = context.organization?.id ? data.memberships.find( (item) => item.accountId === account.id && item.organizationId === context.organization?.id && item.status === "active", ) : data.memberships.find((item) => item.accountId === account.id && item.status === "active"); const organization = membership ? organizationById.get(membership.organizationId) : undefined; const platformRole = account.platformRoleId ? roleById.get(account.platformRoleId) : undefined; return toPublicAccount(account, platformRole?.key ?? membership?.roleKey, organization); }); const normalizedQuery = query.trim().toLowerCase(); const filteredAccounts = accounts.filter((account) => [account.name, account.email, account.status, String(account.role), account.organization ?? ""] .join(" ") .toLowerCase() .includes(normalizedQuery), ); const pageCount = getPageCount(filteredAccounts.length); const visibleAccounts = paginate(filteredAccounts, page); return (
Accounts

用户管理

账号创建、机构加入审批、角色分配和账号列表。

账号列表
账号 角色 机构 状态 创建时间 操作 {visibleAccounts.map((account) => (

{account.name}

{account.email}

{formatRoleLabel(account.role)} {account.organization ?? "-"} {account.status === "active" ? "启用" : account.status === "pending" ? "待审批" : "停用"} {new Date(account.createdAt).toLocaleString("zh-CN")}
))} {visibleAccounts.length === 0 ? ( 暂无匹配账号 ) : null}
); }