一句话定位
多官方基座 + Frankfurter 市场参考的汇率采集与可视化面板:Flask 聚合落库,Next.js 暗色概览卡片一眼分清「官方」与「市场」。
问题背景
跨境业务要持续跟踪多币种汇率。临时查网页或贴表难复盘;更麻烦的是把官方中间价 / 卖出价与市场中间价混在一起比绝对水平,口径一错结论就偏。
核心能力
四基座并行采集
| 基座 | 数据源 | 价格类型 |
|---|---|---|
| CNY | 国家外汇管理局(SAFE)/ CFETS | 官方中间价 |
| IDR | Bank Indonesia(BI) | 官方卖出价 |
| HKD | 香港银行公会(HKAB) | 官方卖出价 |
| USD | Frankfurter | 市场参考中间价(blended) |
- 定时抓取 + 启动回填:APScheduler(时区
Asia/Shanghai),断线可补抓。 - 历史导入:Excel / CSV 与
backfill.py按源回填。 - REST API:最新 / 按日 / 区间 / 统一多基座视图 / 手动 crawl / 偏好存储。
Next.js 概览与详情
- 概览页:CNY / IDR / HKD 官方基座卡片与 USD 市场参考分区展示,避免误比绝对水平。
- 详情页:汇率表、涨跌幅、趋势图、多币种对比、常用币种过滤、手动抓取。
- 旧版 Flask 模板仍挂在
:5000根路径,与新前端互不影响。
官方 vs 市场的产品约束
USD(Frankfurter)与 SAFE / BI / HKAB 含义不同。跨基座请优先看相对涨跌或各自时间序列,不要用绝对数值直接对比「市场中间价 vs 官方中间价 / 卖出价」。
典型使用场景举例
- 财务日常盯盘:打开 Next 概览,先看 CNY 官方中间价卡片今日涨跌,再进详情看近 30 日趋势。
- 印尼 / 香港业务:切换 IDR(BI 卖出价)或 HKD(HKAB 卖出价)基座,与 CNY 分区对照,不混口径。
- 补数与对账:上游偶发失败时
POST /api/crawl单源补抓,或用backfill.py --source USD --days 30回填市场参考序列。
技术栈与架构要点
SAFE | BI | HKAB | Frankfurter
│
▼
Flask scrapers + APScheduler
│
▼
SQLite (data/)
│
├─► Flask REST + 旧版 Web :5000
└─► Next.js(rewrites /api/*):3000
- 后端:Python、Flask、SQLite、各源独立 scraper。
- 前端:Next.js App Router + Tailwind 暗色仪表盘;Recharts 趋势。
- 配置经环境变量注入(
APP_PORT、CRAWL_HOUR、FRANKFURTER_*、FLASK_API_ORIGIN)。
截图

