import { useEffect, useState } from 'react' import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts' import { Card, List, NavBar } from 'antd-mobile' import { api } from '../../api/client.js' import TrendBadge, { calcTrend } from '../../components/TrendBadge.jsx' // 策略研究 // 列表态 (默认): 列出所有策略, 每行显示主指标 (债务/GDP) 最新值 + 趋势 // 详情态: 顶部 NavBar (返回) + 4 张图 (debt/gdp/debtToGdp/interestToGdp) + 表格 const SERIES = [ { key: 'debt', label: '政府债务 (万亿美元)', color: '#8884d8' }, { key: 'gdp', label: 'GDP (万亿美元)', color: '#3cb44b' }, { key: 'debtToGdp', label: '债务/GDP (%)', color: '#4363d8' }, { key: 'interestToGdp', label: '债务利息/GDP (%)', color: '#f58231' }, ] // 取最后一个有效数据点 function lastRow(rows) { for (let i = rows.length - 1; i >= 0; i--) { if (rows[i] && typeof rows[i].debtToGdp === 'number') return rows[i] } return null } export default function StrategyView() { const [strategies, setStrategies] = useState([]) const [err, setErr] = useState('') const [loading, setLoading] = useState(true) const [selected, setSelected] = useState(null) useEffect(() => { let cancelled = false setLoading(true) api('/strategies') .then((data) => { if (!cancelled) setStrategies(data.strategies || []) }) .catch((e) => !cancelled && setErr(e.message)) .finally(() => !cancelled && setLoading(false)) return () => { cancelled = true } }, []) if (loading) return
加载中...
if (err) return
{err}
if (!strategies.length) return
暂无策略数据
// 详情态 if (selected) { const cur = strategies.find((s) => s.name === selected) if (cur) return setSelected(null)} /> } // 列表态: 主指标 = 债务/GDP, 趋势基于其最近变化 return (
策略研究
{strategies.map((s) => { const rows = (s.data && s.data.rows) || [] const last = lastRow(rows) const { trend, change } = calcTrend(rows) return ( {last.debtToGdp}% · 债务利息/GDP {last.interestToGdp}% · {last.year} : '暂无数据'} extra={
{last && Math.abs(change) >= 1 && ( {change > 0 ? '+' : ''}{change.toFixed(1)}% )}
} arrowIcon clickable onClick={() => setSelected(s.name)} /> ) })}
) } // 详情: 4 张图 + 表格 function StrategyDetail({ strategy, onBack }) { const s = strategy const rows = (s.data && s.data.rows) || [] const last = lastRow(rows) const { trend } = calcTrend(rows) return (
{s.description || s.name}
数据 {rows.length} 条 · 来源 {s.data.source || 'seed'} · {last && <> 最新 {last.year} 债务/GDP {last.debtToGdp}% }
{SERIES.map((s2) => (
{s2.label}
))}
{rows.map((r) => ( ))}
年份 债务 GDP 债务/GDP 利息/GDP
{r.year} {r.debt} {r.gdp} {r.debtToGdp} {r.interestToGdp}
) }