一句话定位

多官方基座 + Frankfurter 市场参考的汇率采集与可视化面板:Flask 聚合落库,Next.js 暗色概览卡片一眼分清「官方」与「市场」。

问题背景

跨境业务要持续跟踪多币种汇率。临时查网页或贴表难复盘;更麻烦的是把官方中间价 / 卖出价与市场中间价混在一起比绝对水平,口径一错结论就偏。

核心能力

四基座并行采集

基座数据源价格类型
CNY国家外汇管理局(SAFE)/ CFETS官方中间价
IDRBank Indonesia(BI)官方卖出价
HKD香港银行公会(HKAB)官方卖出价
USDFrankfurter市场参考中间价(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 官方中间价 / 卖出价」。

典型使用场景举例

  1. 财务日常盯盘:打开 Next 概览,先看 CNY 官方中间价卡片今日涨跌,再进详情看近 30 日趋势。
  2. 印尼 / 香港业务:切换 IDR(BI 卖出价)或 HKD(HKAB 卖出价)基座,与 CNY 分区对照,不混口径。
  3. 补数与对账:上游偶发失败时 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)。

截图

概览卡片(官方 vs 市场分区)

详情趋势与表格

源码链接

→ https://github.com/myyyisbest/exchange-data-panel