import { Activity, AlertTriangle, ShieldCheck, Users } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import type { AuditLog, PublicAccount, RoleDefinition } from "@/modules/core/types"; import { ROLE_LABELS } from "@/modules/core/types"; type SettingsOverviewProps = { accounts: PublicAccount[]; roles: RoleDefinition[]; auditLogs: AuditLog[]; }; export function SettingsOverview({ accounts, roles, auditLogs, }: SettingsOverviewProps): React.ReactElement { const activeAccountCount = accounts.filter((account) => account.status === "active").length; const disabledAccountCount = accounts.length - activeAccountCount; const deniedAuditCount = auditLogs.filter((log) => log.result === "denied").length; const failureAuditCount = auditLogs.filter((log) => log.result === "failure").length; const successAuditCount = auditLogs.filter((log) => log.result === "success").length; const totalPermissionCount = roles.reduce((sum, role) => sum + role.permissions.length, 0); const actionCounts = auditLogs.reduce>((counts, log) => { counts[log.action] = (counts[log.action] ?? 0) + 1; return counts; }, {}); const topActions = Object.entries(actionCounts) .sort((left, right) => right[1] - left[1]) .slice(0, 4); return (
RBAC + Audit

权限设置

内置角色、账号状态和关键操作审计。

系统账号 {accounts.length}

启用 {activeAccountCount} 个,停用 {disabledAccountCount} 个

角色数量 {roles.length}

累计覆盖 {totalPermissionCount} 项权限

红色审计 {deniedAuditCount + failureAuditCount}

拒绝 {deniedAuditCount} 条,失败 {failureAuditCount} 条

审计日志 {auditLogs.length}

成功 {successAuditCount} 条,最近 100 条

风险标记
红色:拒绝/失败审计 {deniedAuditCount + failureAuditCount}
黄色:停用账号 {disabledAccountCount}
绿色:成功审计 {successAuditCount}
高频动作 {topActions.map(([action, count]) => (
{action} {count} 次
))} {topActions.length === 0 ?

暂无审计动作统计

: null}
内置角色 {roles.map((role) => (

{role.label}

{role.permissions.length} 权限

{role.description}

{role.permissions.map((permission) => ( {permission} ))}
))}
账号列表
{accounts.map((account) => ( ))}
账号 角色 状态 创建时间

{account.name}

{account.email}

{ROLE_LABELS[account.role]} {account.status === "active" ? "启用" : "停用"} {new Date(account.createdAt).toLocaleString("zh-CN")}
审计日志
{auditLogs.map((log) => ( ))} {auditLogs.length === 0 ? ( ) : null}
时间 操作者 动作 对象 结果 原因
{new Date(log.timestamp).toLocaleString("zh-CN")} {log.actorEmail ?? "系统"} {log.action} {log.targetType} {log.targetId ? ` / ${log.targetId.slice(0, 8)}` : ""} {log.result} {log.reason}
暂无审计日志
); }