1
0

feat: 将 demo 项目转化为 HTTP 拨测监控工具

新增 YAML 配置解析(Bun 内置 YAML)、SQLite 数据存储(bun:sqlite)、按 interval 分组并发拨测引擎、REST API(/api/summary、/api/targets、/api/targets/:id/history、/api/targets/:id/trend)、React 前端 Dashboard(统计卡片、目标表格、可展开详情面板、recharts 趋势图)。CLI 简化为仅接受配置文件路径。移除 /api/demo 路由和相关 demo 代码。保留 /health、静态资源服务和 SPA fallback。
This commit is contained in:
2026-05-09 17:04:25 +08:00
parent 9267f6585c
commit 57d3a5cfb4
43 changed files with 2910 additions and 525 deletions

30
src/web/hooks/useTrend.ts Normal file
View File

@@ -0,0 +1,30 @@
import { useCallback, useState } from "react";
import type { TrendPoint } from "../../shared/api";
export function useTrend(targetId: number | null) {
const [data, setData] = useState<TrendPoint[]>([]);
const [error, setError] = useState<string | null>(null);
const [loading, setLoading] = useState(false);
const fetchTrend = useCallback(async () => {
if (targetId === null) return;
setLoading(true);
setError(null);
try {
const response = await fetch(`/api/targets/${targetId}/trend?hours=24`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = (await response.json()) as TrendPoint[];
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : "请求失败");
} finally {
setLoading(false);
}
}, [targetId]);
return { data, error, loading, fetchTrend };
}