本文配套完整源码已上传至 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 CONFLICT upsert)。
  • 定时同步:基于 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"

七、如何扩展新数据源 / 新指数

新增数据源(例如新浪财经):

  1. internal/crawler/ 新建 sina.go,实现 IndexCrawler 接口(Source()Fetch())。
  2. cmd/server/main.gocrawler.NewRegistry(...) 中注册该爬虫(新增一行)。
  3. 业务层(Service / API)无需任何改动。

新增指数

  1. sql/02_seed.sql 增加一行,指定其 source
  2. 在对应爬虫的代码映射表中补充该指数的源端符号。

八、总结

本项目是一个可直接运行、结构清晰的 Go + React 全栈工程范例,涵盖了分层架构、接口抽象与注册表、幂等 upsert、定时任务、统一响应、结构化日志、Docker Compose 编排等企业级实践,非常适合作为 Go 后端与全栈开发的学习模板。

完整源码见 CSDN 资源下载,欢迎交流与 Star。

下载链接:》〉》

更多推荐