import Link from "next/link"; import { buttonVariants } from "@/components/ui/button"; import { formatLocalDateTime } from "@/lib/datetime"; import { formatBytes, getDashboardMetrics } from "@/lib/store"; import { DashboardCharts } from "./dashboard-charts"; function getNodePill(node: { enabled: number; node_type: "hy2" | "custom" | "anytls"; last_error_message: string | null; last_sync_ok_at: string | null; }) { if (!node.enabled) { return { label: "已禁用", className: "status-pill status-pill--off" }; } if (node.node_type === "custom") return { label: "自定义订阅", className: "status-pill status-pill--ink" }; if ( node.node_type === "anytls" && (!node.last_sync_ok_at || Date.parse(node.last_sync_ok_at) < new Date().getTime() - 90_000) ) return { label: "心跳超时", className: "status-pill status-pill--danger" }; 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 (
概览

仪表盘

在线 {data.totals.total_online_connections} 节点 {data.totals.enabled_nodes}
总用户 {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} 当前可用
累计流量 {formatBytes(data.totals.total_traffic)} 全量累计
node.node_type !== "custom", )} trafficTrend={data.trafficTrend} trafficBuckets={data.trafficBuckets} trafficUserOptions={data.trafficUserOptions} loadTrend={data.loadTrend} failureTrend={data.failureTrend} topConsumerRows={data.topConsumerRows} />

节点健康

管理节点 →
{data.nodeHealth.length === 0 && (

暂无节点,请先添加节点。

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

/{node.slug}

{getNodePill(node).label}

{node.node_type === "custom" ? "仅订阅 · 不参与轮询" : node.node_type === "anytls" ? `AnyTLS · 流 ${node.last_stream_count}` : `在线 ${node.last_online_users} / 流 ${node.last_stream_count}`}

{node.node_type !== "custom" && (

最近成功 {formatLocalDateTime(node.last_sync_ok_at)}

)} {node.last_error_message ? (

{node.last_error_message}

) : null}
))}

用量排行

管理用户 →
{data.topUsers.length === 0 && (

暂无用户用量。

)} {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.length === 0 && (

暂无鉴权失败。

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

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

{item.addr ?? "-"}

{formatLocalDateTime(item.created_at)}

))}

最近流量入账

{data.recentUsage.length === 0 && (

暂无流量入账记录。

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

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

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

{formatLocalDateTime(item.created_at)}

))}

节点同步错误

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

暂无同步错误。

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

{item.error_message ?? "unknown error"}

{formatLocalDateTime(item.created_at)}

)) )}
); }