import { formatBytes, getDashboardMetrics } from "@/lib/store"; function getNodePill(node: { enabled: number; last_error_message: string | null; }) { if (!node.enabled) { return { label: "已禁用", className: "status-pill status-pill--off" }; } if (node.last_error_message) { return { label: "同步异常", className: "status-pill status-pill--danger" }; } return { label: "运行健康", className: "status-pill status-pill--ok" }; } export default async function DashboardPage() { const data = await getDashboardMetrics(); return (
OVERVIEW

仪表盘

汇总多节点在线、鉴权失败、同步错误和用户用量,作为当前运行态的统一入口。

HTTP 鉴权在线 轮询聚合已启用 节点 {data.totals.enabled_nodes}
活动连接 {data.totals.total_online_connections}
累计流量 {formatBytes(data.totals.total_traffic)}
总用户 {data.totals.total_users} 启用 {data.totals.enabled_users} / 管理员 {data.totals.admin_users}
活跃用户 {data.totals.active_presence_rows} 在线连接 {data.totals.total_online_connections}
启用节点 {data.totals.enabled_nodes} 轮询与 kick 生效范围
累计流量 {formatBytes(data.totals.total_traffic)} 已聚合到 SQLite

节点健康

{data.nodeHealth.map((node) => (
{node.name}

/{node.slug}

{getNodePill(node).label}

在线 {node.last_online_users} / 流 {node.last_stream_count}

最近成功 {node.last_sync_ok_at ?? "无"}

{node.last_error_message ? (

{node.last_error_message}

) : null}
))}

用量排行

{data.topUsers.map((user) => (
{user.username}

{user.auth_id}

{formatBytes(user.total_bytes)}

TX {formatBytes(user.used_tx_bytes)} / RX {formatBytes(user.used_rx_bytes)}

))}

最近鉴权失败

{data.recentFailures.map((item, index) => (
{item.reason}

{item.node_name ?? "未知节点"} / {item.username ?? "未知用户"}

{item.addr ?? "-"}

{item.created_at}

))}

最近流量入账

{data.recentUsage.map((item, index) => (
{item.username ?? item.auth_id}

{item.node_name ?? "未知节点"}

+{formatBytes(item.tx_bytes + item.rx_bytes)}

{item.created_at}

))}

节点同步错误

{data.syncErrors.length === 0 ? (

暂无同步错误。

) : ( data.syncErrors.map((item, index) => (
{item.node_name}

{item.error_message ?? "unknown error"}

{item.created_at}

)) )}
); }