Skip to content

前端架构

技术栈

技术版本用途
React19.2UI 框架
Vite7.3构建工具 + 开发服务器
TypeScript5.9类型系统
Tailwind CSS4.1原子化 CSS 框架
React Router7.13客户端路由
Lucide React0.563图标库

路由结构

定义于 App.tsx,所有页面共享 Layout 组件(含侧边栏):

路径组件说明
/Dashboard运行列表仪表盘(首页)
/createCreateRun创建新运行
/runs/:runIdRunDetail运行详情(指标/trace/产物)
/compareABCompareA/B 运行对比
/monitorLiveMonitor实时运行监控
/configSystemConfig系统配置查看
/healthHealthCheck节点健康检查
/scenariosScenarioList场景列表
/scenarios/newScenarioEditor新建场景
/scenarios/:id/editScenarioEditor编辑场景

组件架构

共享组件(11 个)

组件文件职责
LayoutLayout.tsx页面布局骨架(Sidebar + Outlet)
SidebarSidebar.tsx侧边导航栏
PageHeaderPageHeader.tsx页面标题与操作区
CardCard.tsx通用卡片容器
MetaCardMetaCard.tsx带标签的指标卡片
StatusBadgeStatusBadge.tsx运行状态徽章(颜色编码)
RunsTableRunsTable.tsx运行列表表格
BarChartBarChart.tsx柱状图组件
PaginationPagination.tsx分页控件
TabGroupTabGroup.tsx标签页切换
HealthStripHealthStrip.tsx健康状态条

页面组件(10 个)

组件文件数据来源
DashboardDashboard.tsxfetchRuns()
CreateRunCreateRun.tsxfetchScenariosMerged() + fetchStrategies() + createRun()
RunDetailRunDetail.tsxfetchRunDetail() + fetchRunMetrics() + fetchRunTraces() + fetchRunArtifacts()
LiveMonitorLiveMonitor.tsxuseRunPolling() + useWebSocket()
ABCompareABCompare.tsxfetchRuns() + fetchRunMetrics()
SystemConfigSystemConfig.tsxfetchConfig()
HealthCheckHealthCheck.tsxusePolling(fetchNodeHealth, 15000)
ScenarioListScenarioList.tsxfetchScenariosMerged()
ScenarioEditorScenarioEditor.tsxfetchScenarioFull() + createScenario() / updateScenario()

API 层 (api/client.ts)

统一的 HTTP 客户端封装,所有请求以 /api 为 base path:

typescript
const BASE = "/api";

// REST 示例
export async function fetchRuns(params?): Promise<RunListResponse> { ... }
export async function createRun(body): Promise<Run> { ... }
export async function startRun(runId): Promise<Run> { ... }

// WebSocket
export function connectRunWebSocket(runId: string): WebSocket {
  const protocol = location.protocol === "https:" ? "wss:" : "ws:";
  return new WebSocket(`${protocol}//${host}/api/ws/runs/${runId}`);
}

完整 API 函数清单:

函数方法路径
fetchHealth()GET/health
fetchNodeHealth()GET/health/nodes
fetchConfig()GET/config
fetchStrategies()GET/strategies
fetchRuns()GET/runs
createRun()POST/runs
startRun()POST/runs/{id}/start
stopRun()POST/runs/{id}/stop
fetchRunDetail()GET/runs/{id}
fetchRunStatus()GET/runs/{id}/status
fetchRunMetrics()GET/runs/{id}/metrics
fetchRunTraces()GET/runs/{id}/traces
fetchRunArtifacts()GET/runs/{id}/artifacts
fetchScenariosMerged()GET/scenarios
fetchScenarioFull()GET/scenarios/{id}
createScenario()POST/scenarios
updateScenario()PUT/scenarios/{id}
deleteScenario()DELETE/scenarios/{id}
exportScenario()POST/scenarios/{id}/export
importScenario()POST/scenarios/import
runLocationInit()POST/config/location-init/run
connectRunWebSocket()WS/ws/runs/{id}

Hooks

usePolling

通用轮询 hook,支持自动刷新开关和手动刷新:

typescript
const { data, loading, error, refetch } = usePolling<T>(fetcher, intervalMs, enabled);

useRunPolling

运行状态专用轮询,调用 GET /runs/{id}/status

typescript
const { run, summary, currentStep, totalSteps, latestMetrics, loading, error }
  = useRunPolling({ runId, interval: 1000, enabled: true });
  • 默认 1 秒轮询间隔
  • 运行进入终态(finished/stopped/failed)后自动停止轮询

useWebSocket

WebSocket 连接管理:

typescript
const { connected, lastEvent } = useWebSocket({
  runId,
  onEvent: (event) => { ... },
});
  • 自动建立/断开连接(跟随 runId 变化)
  • 消息解析为 WsEvent 类型

Vite Proxy 配置

开发模式下 Vite 代理配置(vite.config.ts):

浏览器 → http://localhost:5173/api/runs
         ↓ Vite proxy rewrite: /api → /
         http://localhost:8000/runs

浏览器 → ws://localhost:5173/api/ws/runs/{id}
         ↓ Vite proxy rewrite
         ws://localhost:8000/ws/runs/{id}

后端端口通过 VITE_API_PORT 环境变量配置,默认 8000