欢迎来到 Garmin Running Data Analytics 的文档中心。这里提供了完整的使用指南和技术文档。
| 文档 | 说明 |
|---|---|
| 部署指南 | 如何部署到 Vercel 和配置 GitHub Actions |
| 数据同步说明 | Garmin 数据同步原理和配置方法 |
| 常见问题 | 常见问题和故障排查 |
| 文档 | 说明 |
|---|---|
| API 接口文档 | 完整的 RESTful API 参考 |
| VDOT 计算说明 | VDOT 跑力计算公式和训练建议 |
| 文档 | 说明 |
|---|---|
| 环境变量示例 | 环境变量配置模板(含 Garmin 账号密码与 Token 说明) |
- 阅读 VDOT 计算说明 了解原理
- 查看 API 文档 - VDOT 趋势 了解如何获取数据
- 根据 VDOT 制定训练计划
- 阅读 API 接口文档 了解所有可用接口
- 查看接口示例和响应格式
- 根据需求调用相应的 API
- 查看 常见问题 寻找解决方案
- 使用故障排查清单诊断问题
- 在 GitHub Issues 提问
Garmin Connect → 数据同步 → SQLite 数据库 → API 服务 → Web 界面
- Garmin Connect: 运动数据的来源
- 数据同步: 通过 GitHub Actions 每日自动同步
- SQLite 数据库: 离线存储,随代码部署
- API 服务: Next.js API Routes 提供 RESTful 接口
- Web 界面: ECharts 可视化展示
- 前端: Next.js 16 + React 19 + TailwindCSS
- 后端: Next.js API Routes + SQLite
- 数据同步: Node.js + Garmin Connect API
- 部署: Vercel + GitHub Actions
- 可视化: ECharts
- 完全免费: 无需购买云数据库
- 数据离线化: SQLite 随代码部署
- 自动同步: GitHub Actions 每日自动运行
- 隐私安全: 数据存储在自己的 GitHub 仓库
garmin_data/
├── app/ # Next.js 应用
│ ├── api/ # API 路由
│ │ ├── activities/ # 活动相关接口
│ │ ├── stats/ # 统计相关接口
│ │ ├── analysis/ # 分析相关接口
│ │ └── vdot/ # VDOT 接口
│ ├── list/ # 活动列表页面
│ ├── analysis/ # 数据分析页面
│ ├── stats/ # 统计页面
│ ├── lib/ # 工具库
│ │ ├── db.ts # 数据库访问
│ │ ├── types.ts # 类型定义
│ │ └── format.ts # 格式化工具
│ └── data/ # SQLite 数据库
│ └── activities.db
├── scripts/ # 数据同步脚本
│ ├── sync-garmin.js # 主同步脚本
│ ├── garmin-client.js # Garmin API 客户端
│ ├── fit-parser.js # FIT 文件解析
│ ├── vdot-calculator.js # VDOT 计算
│ └── db-manager.js # 数据库管理
├── .github/workflows/ # GitHub Actions
│ └── sync_garmin_data.yml
└── docs/ # 文档
├── README.md # 文档索引(本文件)
├── deployment.md # 部署指南
├── data-sync.md # 数据同步说明
├── api-reference.md # API 文档
├── vdot-calculation.md # VDOT 说明
└── faq.md # 常见问题
| 表名 | 说明 | 记录数(示例) |
|---|---|---|
activities |
活动汇总数据 | 150+ |
laps |
分段数据 | 1500+ |
records |
记录点数据 | 450000+ |
hr_zones |
心率区间统计(缓存) | 150+ |
vdot_trend |
VDOT 趋势数据(缓存) | 150+ |
详细结构请参考 数据同步说明 - 数据结构。
| 端点 | 说明 | 文档 |
|---|---|---|
GET /api/activities |
获取活动列表 | API 文档 |
GET /api/activities/{id} |
获取活动详情 | API 文档 |
GET /api/activities/{id}/laps |
获取分段数据 | API 文档 |
GET /api/stats |
获取统计数据 | API 文档 |
GET /api/vdot |
获取 VDOT 趋势 | API 文档 |
GET /api/analysis/hr-zones |
心率区间分析 | API 文档 |
GET /api/analysis/pace-zones |
配速分布分析 | API 文档 |
完整 API 文档: api-reference.md
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 启动生产服务器
npm start# 初始化所有历史数据
npm run init:data
# 同步最近 10 条活动
node scripts/sync-garmin.js --limit 10
# 增量同步新活动
node scripts/sync-garmin.js
# 强制重新解析所有活动
node scripts/sync-garmin.js --force# 更新统计缓存
node scripts/preprocess-stats-cache.js --mode full
# 验证数据完整性
node scripts/validate-data.js
# 清理旧数据(保留最近 1 年)
node scripts/db-manager.js --clean --keep-days 365
# 压缩数据库
node scripts/db-manager.js --vacuum- Jack Daniels' Running Formula - VDOT 理论的权威著作
- 80/20 Running - 80/20 训练法则
- Training and Racing with a Power Meter - 跑步功率训练
- GitHub Discussions - 讨论和交流
- GitHub Issues - 问题反馈
- Changelog - 版本更新日志
欢迎贡献代码、文档或建议!
- 报告 Bug: 在 Issues 中提交
- 建议新功能: 在 Discussions 中讨论
- 提交代码: 创建 Pull Request
- 改进文档: 直接编辑 Markdown 文件
本项目实现参考了 yihong0618/running_page(Make your own running home page),特此致谢。
感谢所有为本项目做出贡献的开发者!
查看完整的 贡献者列表。
本项目采用 MIT License 开源。
- GitHub: @xuandao
- Email: your-email@example.com
- 项目主页: GitHub
- 在线演示: Demo
查看 Releases 了解最新更新。
- v1.0.0 (2026-02-14): 首次发布
- 完整的 Garmin 数据同步功能
- VDOT 计算和趋势分析
- 心率区间和配速分布分析
- Vercel 一键部署
如有任何问题或建议,欢迎在 GitHub Issues 中反馈!