import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; async function getSignals() { const DB = "/home/fzq1228/polyscout/data/polyscout.db"; const { execSync } = await import("child_process"); const py = `import sqlite3,json; conn=sqlite3.connect('${DB}'); c=conn.cursor(); c.execute("""SELECT market_id, score, expected_edge, risk, created_at FROM signals ORDER BY score DESC LIMIT 50"""); print(json.dumps(c.fetchall(), ensure_ascii=False, default=str)); conn.close()`; try { return JSON.parse(execSync(`python3 -c ${JSON.stringify(py)}`, { encoding: "utf8" })); } catch { return []; } } const riskMap: Record = { low: "低", medium: "中", high: "高" }; const riskVariant: Record = { low: "default", medium: "secondary", high: "destructive" }; export default async function SignalsPage() { const rows = await getSignals(); return (

套利信号

评分 ≥ 75 自动推送 Discord,按评分排序

{rows.length === 0 ? ( ) : rows.map((r: any[], i: number) => ( ))}
市场 评分 预期收益 风险 时间
暂无信号
{String(r[0]).slice(0, 16)}
{r[1]}
= 75 ? "bg-green-500" : r[1] >= 60 ? "bg-yellow-500" : "bg-blue-500"}`} style={{ width: `${r[1]}%` }} />
+{r[2]}% {riskMap[r[3]] ?? r[3]} {String(r[4]).slice(0, 16)}
); }