From 1159c22a0e27bec57a97d6b9d5e1af051a56c951 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 17 May 2026 06:15:50 +0800 Subject: [PATCH] auto-sync: 2026-05-17 06:15:50 --- src/frontend/src/pages/Monitor.tsx | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/frontend/src/pages/Monitor.tsx diff --git a/src/frontend/src/pages/Monitor.tsx b/src/frontend/src/pages/Monitor.tsx new file mode 100644 index 0000000..2721cb6 --- /dev/null +++ b/src/frontend/src/pages/Monitor.tsx @@ -0,0 +1,87 @@ +// 全局监控页面 + +import React from 'react'; +import { useDaemonStatus } from '../hooks/useApi'; +import { useProjects } from '../hooks/useApi'; + +export function Monitor() { + const { status, refresh: refreshStatus } = useDaemonStatus(); + const { projects, loading, refresh: refreshProjects } = useProjects(); + + return ( +
+
+

全局监控

+ +
+ + {/* Daemon 状态 */} +
+
+
{status?.status === 'running' ? '🟢' : '🔴'}
+
Daemon 状态
+
+
+
{status?.tick_count ?? '-'}
+
Tick 计数
+
+
+
{status?.active_projects ?? '-'}
+
活跃项目
+
+
+
{status?.uptime_seconds ? Math.floor(status.uptime_seconds / 60) + 'm' : '-'}
+
运行时间
+
+
+ + {/* 项目列表 */} +

项目列表

+ {loading ? ( +
加载中...
+ ) : ( +
+
+ + + + + + + + + + + {projects.map(p => ( + + + + + + + ))} + {projects.length === 0 && ( + + )} + +
ID名称状态创建时间
{p.id.substring(0, 8)}{p.name} + + {p.status} + + {p.created_at?.substring(0, 19) ?? '-'}
暂无项目
+
+
+ )} + + {/* 最近事件 */} +

最近事件

+
+
+

通过 SSE 实时推送事件(连接后显示)

+
+
+
+ ); +}