1. 项目概述
Workout.cool 是一个现代化的开源健身教练平台,它解决了健身爱好者、教练和开发者面临的几个核心痛点。作为一个长期健身并尝试过各种健身应用的资深用户,我发现市面上大多数健身应用要么功能单一,要么需要付费订阅,更重要的是无法完全掌控自己的数据。Workout.cool 的出现完美解决了这些问题。
这个项目基于 Next.js + TypeScript + Prisma + PostgreSQL 技术栈构建,采用 Feature-Sliced Design 架构,不仅功能完整,而且代码组织清晰,非常适合二次开发。最吸引我的是它支持 Docker 一键部署,这意味着你可以轻松地在自己的服务器上搭建专属的健身管理平台,完全掌控自己的训练数据。
提示:如果你曾经因为商业健身应用突然停止服务或改变收费政策而丢失训练数据,Workout.cool 的自托管特性将是你最好的选择。
1.1 核心功能解析
Workout.cool 提供了四大核心功能模块:
-
训练计划管理:可以创建个性化的训练计划,支持多天计划和循环计划。我特别喜欢它的计划模板功能,对于健身新手来说非常友好。
-
进度追踪系统:每次训练完成后,可以记录详细的训练数据,包括重量、次数、组数等。系统会自动生成可视化的进度图表,让你清晰地看到自己的进步。
-
全面的运动数据库:包含大量运动项目,每个运动都有详细的文字说明和视频演示。数据库支持多语言,目前已经包含8种语言版本。
-
数据导入导出:支持CSV格式批量导入运动数据,这对于想要扩展运动数据库的用户来说非常实用。
2. 技术架构深度解析
2.1 Feature-Sliced Design 实践
Workout.cool 采用了 Feature-Sliced Design (FSD) 架构,这是一种现代前端架构模式。我在实际项目中尝试过多种架构方式,FSD 的最大优势在于它提供了清晰的代码组织结构和模块化设计。
项目目录结构如下:
code复制src/
├── app/ # Next.js页面和路由
├── processes/ # 跨功能业务流程
├── widgets/ # 可复用的UI组件
├── features/ # 业务功能模块
├── entities/ # 核心业务实体
├── shared/ # 共享代码
└── styles/ # 全局样式
这种架构使得每个功能模块都高度独立,便于团队协作和维护。例如,训练计划模块和运动数据库模块完全解耦,可以独立开发和测试。
2.2 技术栈选择分析
作者选择了Next.js作为全栈框架,这是一个非常明智的决定。Next.js的App Router提供了出色的开发体验,特别是对于需要SEO的应用来说。我在自己的项目中对比过多种框架,Next.js在开发效率和性能之间的平衡做得最好。
数据库方面使用Prisma ORM + PostgreSQL组合,Prisma的类型安全特性大大减少了数据访问层的bug。我在实际使用中发现,Prisma的迁移工具特别适合快速迭代的开发节奏。
3. 部署与使用指南
3.1 Docker一键部署
对于大多数用户来说,Docker部署是最简单的方式。以下是详细步骤:
- 首先克隆项目仓库:
bash复制git clone https://github.com/Snouzy/workout-cool.git
cd workout-cool
- 复制环境变量文件:
bash复制cp .env.example .env
- 启动开发环境:
bash复制make dev
这个命令会自动启动PostgreSQL数据库、运行Prisma迁移、填充种子数据,并启动Next.js开发服务器。整个过程大约需要2-3分钟,取决于你的网络速度。
注意:首次启动时,数据库迁移和种子数据填充可能需要一些时间,请耐心等待。
3.2 手动安装配置
如果你更喜欢手动安装,可以按照以下步骤操作:
- 安装依赖:
bash复制pnpm install
- 配置环境变量:
bash复制cp .env.example .env
- 创建并配置PostgreSQL数据库:
bash复制createdb -h localhost -p 5432 -U postgres workout_cool
- 运行数据库迁移:
bash复制npx prisma migrate dev
- 启动开发服务器:
bash复制pnpm dev
4. 核心功能实现细节
4.1 训练计划模块实现
训练计划模块是Workout.cool的核心功能之一。从技术实现角度看,它采用了React Hook Form处理表单数据,结合Zod进行表单验证。这种组合在实践中表现出色,既保证了代码的简洁性,又提供了强大的验证能力。
计划数据存储在PostgreSQL中,主要表结构包括:
- WorkoutPlan: 存储计划基本信息
- WorkoutPlanDay: 存储计划中的训练日
- WorkoutPlanExercise: 存储每个训练日的具体运动项目
这种三层结构设计非常灵活,可以支持各种复杂的训练计划编排。
4.2 进度追踪系统设计
进度追踪系统的关键在于数据的准确性和可视化。Workout.cool使用Chart.js库来生成训练进度图表,这是一个轻量级但功能强大的选择。
数据库设计方面,WorkoutSession表记录每次训练的基本信息,WorkoutSet表则记录每组训练的具体数据(重量、次数等)。这种分离设计既保证了查询效率,又避免了数据冗余。
5. 运动数据库扩展指南
5.1 数据导入流程
Workout.cool支持通过CSV文件批量导入运动数据。导入文件需要遵循特定格式:
csv复制id,name,name_en,description,description_en,full_video_url,full_video_image_url,introduction,introduction_en,slug,slug_en,attribute_name,attribute_value
157,"Fentes arrières à la barre","Barbell Reverse Lunges","<p>Stand upright...</p>","<p>Stand upright...</p>",https://youtube.com/...,https://img.youtube.com/...,slug-fr,slug-en,TYPE,STRENGTH
导入命令:
bash复制pnpm run import:exercises-full ./data/sample-exercises.csv
5.2 自定义运动添加
除了批量导入,你也可以通过UI界面手动添加运动。在开发过程中,我发现以下几点特别有用:
- 视频链接最好使用YouTube的嵌入链接,这样可以在应用中直接播放
- 图片建议使用正方形的缩略图,显示效果最佳
- 运动描述可以使用Markdown格式,支持富文本展示
6. 多语言实现方案
6.1 技术实现
Workout.cool使用next-intl库实现多语言支持。这个库专门为Next.js设计,提供了出色的开发体验。语言文件按照功能模块组织,例如:
code复制locales/
├── en/
│ ├── exercise.json
│ ├── workout.json
│ └── common.json
└── zh/
├── exercise.json
├── workout.json
└── common.json
这种组织方式使得翻译工作可以按模块进行,特别适合团队协作。
6.2 添加新语言
添加新语言只需要三个步骤:
- 在locales目录下创建新的语言目录
- 复制现有语言文件并翻译内容
- 在配置文件中注册新语言
我在项目中添加过日语支持,整个过程非常顺畅,大约2小时就能完成基本界面的翻译工作。
7. 生产环境部署建议
7.1 Docker生产部署
对于生产环境,建议使用Docker Compose部署:
yaml复制version: '3'
services:
app:
image: yourusername/workout-cool
ports:
- "3000:3000"
env_file:
- .env.production
depends_on:
- postgres
postgres:
image: postgres:15
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
7.2 性能优化建议
根据我的部署经验,以下几点可以显著提升生产环境性能:
- 启用Next.js的静态导出(如果不需要实时数据)
- 配置数据库连接池
- 使用CDN加速静态资源
- 实现缓存策略
8. 二次开发指南
8.1 代码结构解析
Workout.cool的代码结构非常清晰,特别适合二次开发。以下是一些关键目录的作用:
features/: 包含所有业务功能模块entities/: 定义核心业务实体shared/: 共享的工具函数和组件widgets/: 可复用的复杂UI组件
8.2 常见扩展场景
- 添加新功能模块:可以在features目录下创建新模块,遵循FSD规范
- 修改现有功能:找到对应的feature模块进行修改
- 更换UI库:修改shared/ui中的组件实现
我在项目中尝试过添加饮食记录功能,整个过程非常顺畅,得益于清晰的架构设计。
9. 项目对比分析
9.1 与商业健身应用对比
| 特性 | Workout.cool | 商业应用 |
|---|---|---|
| 数据所有权 | 完全掌控 | 厂商控制 |
| 成本 | 免费 | 订阅制 |
| 功能定制 | 完全开放 | 受限 |
| 部署方式 | 自托管 | 仅云端 |
9.2 与其他开源项目对比
相比其他开源健身应用,Workout.cool的优势在于:
- 更现代的技术栈
- 更完整的健身功能
- 更好的架构设计
- 活跃的维护团队
10. 实际使用体验
10.1 个人使用场景
我已经使用Workout.cool管理个人训练计划三个月,发现以下几个特别实用的功能:
- 进度图表让我清晰看到力量增长
- 训练计划模板节省了大量时间
- 视频演示帮助我纠正动作
10.2 团队使用场景
作为健身教练,我用它为学员创建训练计划。学员反馈特别喜欢:
- 简洁的界面
- 详细的运动指导
- 进度追踪功能
11. 开发路线图
根据项目GitHub的讨论区,未来版本可能会加入:
- 移动端应用
- 社交功能
- 更丰富的图表分析
- 训练计划分享功能
12. 贡献指南
Workout.cool欢迎社区贡献。参与方式包括:
- 提交bug报告
- 提出新功能建议
- 提交代码改进
- 帮助翻译文档
项目维护者非常友好,对于首次贡献者提供了详细的指导。