"use client";
import { useEffect, useState } from "react";
import { RefreshCcw } from "lucide-react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { opsApi } from "@/lib/ops-api";
import type { SystemStatusPayload } from "@/types/ops";
import Link from "next/link";
function StatRow({ label, value }: { label: string; value: React.ReactNode }) {
return (
{label}
{value}
);
}
export function TrainingPageClient() {
const [loading, setLoading] = useState(true);
const [status, setStatus] = useState(null);
const load = async () => {
setLoading(true);
try {
const s = await opsApi.systemStatus() as SystemStatusPayload;
setStatus(s);
} catch { /* */ }
setLoading(false);
};
useEffect(() => { void load(); }, []);
if (loading) return 加载中...
;
if (!status) return 加载失败
;
const td = status.training_data;
const truth = td?.truth_records;
const features = td?.training_features;
const coverage = td?.city_coverage;
const modelCities = td?.model_cities;
return (
训练数据
真值记录
训练特征
城市覆盖
{modelCities ? (
最强城市
{modelCities.strongest?.length ? (
{modelCities.strongest.map((c, i) => (
-
{c.city}
真值:{c.truth_rows ?? "—"} 特征:{c.feature_rows ?? "—"}
))}
) : 无数据}
覆盖缺口
{modelCities.gaps?.length ? (
{modelCities.gaps.map((c) => (
{c}
))}
) : 无缺口}
) : null}
真值历史浏览
按城市和日期筛选查看历史真值记录。
打开真值历史 →
);
}