从零搭建全球指数历史数据平台:Go + React + PostgreSQL + Docker 全栈实战
2026/7/2 4:17:15 网站建设 项目流程

本文配套完整源码已上传至 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东方财富
中国科创50000688.SH东方财富
美国纳斯达克综合指数IXICYahoo Finance
美国标普500指数GSPCYahoo Finance
日本日经225指数N225Yahoo 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。在项目根目录执行:

dockercompose-fdocker/docker-compose.yml up-d--build

启动后:

  • 前端:http://localhost
  • 后端 API:http://localhost:8080/api
  • PostgreSQL:localhost:5432(postgres / postgres,库:index_platform)

首次启动会自动初始化数据库、启动后端并 AutoMigrate 兜底、启动前端 Nginx 反向代理/api。进入页面后,在「数据同步」点击「同步全部」即可拉取历史数据。

停止与清理:

dockercompose-fdocker/docker-compose.yml down# 停止dockercompose-fdocker/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-XPOST 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。

下载链接:》〉》

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询