从零搭建全球指数历史数据平台:Go + React + PostgreSQL + Docker 全栈实战
本文配套完整源码已上传至 CSDN 资源(搜索「全球指数历史数据平台 Go+React」即可下载),解压后一条
docker compose命令即可启动全栈环境。
一、项目简介
Global Index History Platform(全球指数历史数据平台) 是一个企业级的全球股票指数历史数据采集与展示平台。后端使用 Go + Gin + GORM + PostgreSQL,前端使用 React + TypeScript + Vite + Ant Design + ECharts,支持 Docker Compose 一键部署。
平台内置六个指数,并通过统一的数据源接口设计,可在不修改业务代码的前提下扩展新指数与新数据源。
| 市场 | 指数 | 代码 | 数据源 |
|---|---|---|---|
| 中国 | 上证指数 | 000001.SH | 东方财富 |
| 中国 | 深证成指 | 399001.SZ | 东方财富 |
| 中国 | 科创50 | 000688.SH | 东方财富 |
| 美国 | 纳斯达克综合指数 | IXIC | Yahoo Finance |
| 美国 | 标普500指数 | GSPC | Yahoo Finance |
| 日本 | 日经225指数 | N225 | Yahoo Finance |
二、技术栈
- 后端:Go 1.24+、Gin、GORM、PostgreSQL、robfig/cron、Resty、Zap、Viper
- 前端:React 18、TypeScript、Vite、Ant Design 5、Axios、ECharts 5
- 部署:Docker、Docker Compose、Nginx
三、系统架构
请求自上而下严格分层,依赖只指向内层,数据访问只发生在 Repository:
Browser ──▶ React SPA (Nginx) Dashboard / History / Sync
│ /api (Axios 统一封装)
▼
Gin Router (middleware: Recovery / AccessLog / CORS)
│
API (Handler) —— 仅解析参数、返回统一响应
│
Service —— 业务逻辑:SyncOne / SyncAll / Latest…
│
Crawler.Registry ──▶ IndexCrawler 接口
├── YahooCrawler
└── EastmoneyCrawler
│
Repository —— CRUD / 分页 / 事务 / Upsert
▼
PostgreSQL
Scheduler (robfig/cron) ──▶ 复用同一个 SyncService
核心解耦点:Service 仅依赖 crawler.IndexCrawler 接口与 crawler.Registry,通过 index_info.source 字段决定使用哪个爬虫。新增数据源不需要改动任何业务代码。
四、核心功能特性
- 多数据源采集:统一
IndexCrawler接口,已实现 Yahoo Finance 与东方财富两个数据源。 - 历史数据存储:按
(code, trade_date)唯一约束去重,重复同步幂等(ON CONFLICTupsert)。 - 定时同步:基于 robfig/cron 每日自动全量同步,支持失败重试。
- 手动同步:支持同步单个指数或全部指数,并记录同步日志。
- 可视化前端:指数概览 Dashboard、历史走势 ECharts 折线图(缩放 / Tooltip)、数据同步页。
- 统一响应与异常处理:所有接口返回
{ code, message, data };中间件统一 panic 恢复。 - 结构化日志:Zap 记录请求耗时、错误、同步过程。
- 多环境配置:Viper 支持 dev / test / prod,并允许环境变量覆盖。
五、快速开始(Docker 一键部署)
前置:已安装 Docker 与 Docker Compose。在项目根目录执行:
docker compose -f docker/docker-compose.yml up -d --build
启动后:
- 前端:http://localhost
- 后端 API:http://localhost:8080/api
- PostgreSQL:localhost:5432(postgres / postgres,库:index_platform)
首次启动会自动初始化数据库、启动后端并 AutoMigrate 兜底、启动前端 Nginx 反向代理 /api。进入页面后,在「数据同步」点击「同步全部」即可拉取历史数据。
停止与清理:
docker compose -f docker/docker-compose.yml down # 停止
docker compose -f docker/docker-compose.yml down -v # 停止并删除数据卷
六、接口文档
所有接口统一返回 { "code": 0, "message": "success", "data": {} },code == 0 表示成功。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health | 健康检查 |
| GET | /api/index/list | 返回所有指数 |
| GET | /api/index/latest | 返回各指数最新行情(含涨跌) |
| GET | /api/index/history | 查询历史数据(分页) |
| POST | /api/index/sync | 同步单个或全部指数 |
| GET | /api/index/sync/logs | 查询同步日志(分页) |
示例:
# 同步全部
curl -X POST http://localhost:8080/api/index/sync -H 'Content-Type: application/json' -d '{}'
# 查询历史
curl "http://localhost:8080/api/index/history?code=000001.SH&start=2024-01-01&end=2024-12-31&page=1&size=20"
七、如何扩展新数据源 / 新指数
新增数据源(例如新浪财经):
- 在
internal/crawler/新建sina.go,实现IndexCrawler接口(Source()与Fetch())。 - 在
cmd/server/main.go的crawler.NewRegistry(...)中注册该爬虫(新增一行)。 - 业务层(Service / API)无需任何改动。
新增指数:
- 在
sql/02_seed.sql增加一行,指定其source。 - 在对应爬虫的代码映射表中补充该指数的源端符号。
八、总结
本项目是一个可直接运行、结构清晰的 Go + React 全栈工程范例,涵盖了分层架构、接口抽象与注册表、幂等 upsert、定时任务、统一响应、结构化日志、Docker Compose 编排等企业级实践,非常适合作为 Go 后端与全栈开发的学习模板。
完整源码见 CSDN 资源下载,欢迎交流与 Star。
更多推荐
所有评论(0)