DailyFit 是一个全栈健身管理应用,旨在帮助用户轻松记录和管理日常训练数据。通过直观的界面和强大的数据可视化功能,用户可以追踪训练进度、分析趋势并实现健身目标。
- 📊 数据驱动:通过图表和统计信息深入了解训练表现
- 🎨 现代 UI:基于 Mantine UI 构建的美观界面
- 🔒 安全可靠:完整的用户认证和授权系统
- 📱 响应式设计:完美适配桌面和移动设备
- ⚡ 高性能:使用 Vite 构建,快速加载和热更新
- 安全的登录系统
- Token 认证机制
- 自动登录状态验证
- 路由守卫保护
- 训练日历热力图
- 体重趋势分析
- 个人记录追踪
- 训练统计概览
- 多维度数据可视化(ECharts)
- 支持多种训练类型:
- 💪 力量训练(重量、组数、次数)
- 🏃 有氧运动(时长、距离、心率)
- 🧘 功能性训练
- 🤸 柔韧性训练
- 训练记录 CRUD 操作
- 分页和筛选功能
- 日期选择器
- 用户信息管理
- 个人资料编辑
- 头像上传(规划中)
- 明暗主题切换
- 流畅的动画过渡
- 系统主题自动检测
- 精美的 Landing Page 设计
- 核心功能展示卡片
- 动画效果增强用户体验
- 响应式布局适配
- 路由懒加载优化
- 全局通知系统
- 模态框管理
- 404 错误页面
- 响应式布局
- Lottie 动画提升加载体验
- Vercel Serverless Function 支持
| 技术 | 版本 | 用途 |
|---|---|---|
| React | 19.1.1 | UI 框架 |
| TypeScript | 5.9.3 | 类型安全 |
| Vite | 7.1.7 | 构建工具 |
| React Router | 7.9.5 | 路由管理 |
| Mantine UI | 8.3.7 | UI 组件库 |
| Zustand | 5.0.8 | 状态管理 |
| Axios | 1.13.2 | HTTP 客户端 |
| ECharts | 6.0.0 | 数据可视化 |
| Framer Motion | 12.23.24 | 动画库 |
| Day.js | 1.11.19 | 日期处理 |
| React Hook Form | 7.66.0 | 表单管理 |
| Lottie React | 2.4.1 | 动画播放 |
| 技术 | 版本 | 用途 |
|---|---|---|
| Express | 4.21.2 | Web 框架 |
| Node.js | - | 运行时环境 |
| CORS | 2.8.5 | 跨域支持 |
| Body Parser | 1.20.3 | 请求体解析 |
- pnpm - 高性能包管理器(版本 10.20.0)
- ESLint + Prettier + Husky - 提交前的自动化代码质量保障
- ESLint Flat Config - 使用新的扁平化配置格式(
eslint.config.js) - Concurrently - 并发运行脚本
- TypeScript ESLint - TypeScript 代码检查
- GitHub Actions - 持续集成与自动化测试
- Vercel - 无服务器化全栈部署平台(支持 Serverless Functions)
DailyFit/
├── api/ # Vercel Serverless Function
│ └── index.js # Serverless 入口文件
├── public/ # 静态资源
│ └── favicon.ico
├── server/ # 后端服务
│ ├── controllers/ # 控制器
│ │ ├── authController.js
│ │ ├── dashboardController.js
│ │ └── logbookController.js
│ ├── data/ # 数据文件(JSON)
│ │ ├── dashboard.json
│ │ ├── logbook.json
│ │ └── users.json
│ ├── middleware/ # 中间件
│ │ └── index.js
│ ├── routes/ # 路由定义
│ │ ├── auth.js
│ │ ├── dashboard.js
│ │ └── logbook.js
│ ├── utils/ # 工具函数
│ │ └── dataPath.js
│ └── index.js # 服务器入口
├── src/ # 前端源码
│ ├── assets/ # 资源文件
│ │ └── logo.png
│ ├── components/ # 组件
│ │ ├── AppShell/ # 主布局
│ │ ├── AuthGuard/ # 路由守卫
│ │ └── ThemeToggle/ # 主题切换
│ ├── pages/ # 页面组件
│ │ ├── Dashboard/ # 仪表板
│ │ ├── Home/ # 首页
│ │ ├── Logbook/ # 训练日志
│ │ ├── Login/ # 登录页
│ │ ├── Profile/ # 个人资料
│ │ └── NotFound/ # 404 页面
│ ├── router/ # 路由配置
│ │ └── index.tsx
│ ├── stores/ # 状态管理
│ │ ├── authStore.ts
│ │ └── themeStore.ts
│ ├── utils/ # 工具函数
│ │ ├── logbook.ts
│ │ └── request.tsx
│ ├── App.tsx # 根组件
│ ├── main.tsx # 入口文件
│ └── index.css # 全局样式
├── eslint.config.js # ESLint 配置(Flat Config)
├── prettier.config.js # Prettier 配置
├── index.html # HTML 模板
├── package.json # 项目配置
├── pnpm-lock.yaml # 依赖锁定文件
├── pnpm-workspace.yaml # pnpm 工作区配置
├── tsconfig.json # TypeScript 配置
├── tsconfig.app.json # TypeScript 应用配置
├── tsconfig.node.json # TypeScript Node 配置
├── vercel.json # Vercel 部署配置
└── vite.config.ts # Vite 配置
- Node.js >= 18.0.0
- pnpm >= 10.20.0(推荐,项目使用
pnpm@10.20.0)或 npm >= 9.0.0
# 使用 pnpm(推荐)
pnpm install
# 或使用 npm
npm install启动前端和后端开发服务器(同时运行):
pnpm dev或者分别启动:
# 启动前端开发服务器(默认端口 5173)
pnpm dev:client
# 启动后端服务器(默认端口 3000)
pnpm dev:server访问应用:
- 前端:http://localhost:5173
- 后端 API:http://localhost:3000
# 构建前端
pnpm build
# 启动生产服务器
pnpm start项目使用 ESLint(Flat Config 格式)和 Prettier 进行代码规范检查:
# 检查代码规范
pnpm lint
# 自动修复代码格式
pnpm formatGit 提交前会自动运行格式化和检查(通过 Husky)。
配置文件位置:
- ESLint 配置:
eslint.config.js(使用新的扁平化配置格式) - Prettier 配置:
prettier.config.js
开发服务器代理配置在 vite.config.ts 中:
server: {
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true,
},
},
}tsconfig.json- 主配置文件tsconfig.app.json- 应用配置tsconfig.node.json- Node.js 配置
路由定义在 src/router/index.tsx 中,支持:
- 公开路由:无需认证即可访问(如
/home、/login) - 私有路由:需要登录认证(如
/dashboard、/logbook、/profile) - 布局控制:可选择是否使用主布局
- 懒加载:所有页面组件使用 React.lazy 懒加载
示例路由配置:
{
path: '/dashboard',
element: <DashboardPage />,
requiresAuth: true, // 需要认证
hasLayout: true, // 使用主布局
}当前路由列表:
/- 重定向到/login/home- 首页(公开路由,使用主布局)/login- 登录页(公开路由,无布局)/dashboard- 仪表板(私有路由)/logbook- 训练日志(私有路由)/profile- 个人资料(私有路由)*- 404 页面(无布局)
- GitHub Actions:建议在
.github/workflows/ci.yml中创建流水线,使用pnpm安装依赖并运行pnpm lint、pnpm test(如有)以保障主干质量。 - Vercel Preview:将仓库连接到 Vercel,每次推送或 Pull Request 会自动生成预览环境,便于回归验证。
- 受保护的主分支:结合 Husky 的本地钩子与 Actions 上的远端校验,确保格式化与静态检查双重通过后再合并。
- 开发环境:
http://localhost:3000 - 生产环境:根据部署配置
POST /api/login
Content-Type: application/json
{
"username": "string",
"password": "string"
}响应:
{
"success": true,
"token": "jwt_token_string",
"user": {
"id": "string",
"username": "string",
"email": "string"
}
}GET /api/auth/verify
Authorization: Bearer {token}GET /api/profile
Authorization: Bearer {token}PUT /api/profile
Authorization: Bearer {token}
Content-Type: application/json
{
"email": "string",
"name": "string"
}GET /api/dashboard
Authorization: Bearer {token}响应:
{
"trainingCalendar": [["2024-01-01", 5], ...],
"weightTrend": [["2024-01-01", 70.5], ...],
"personalRecords": [...],
"statistics": {...}
}GET /api/logbook?page=1&limit=10
Authorization: Bearer {token}GET /api/logbook/:id
Authorization: Bearer {token}POST /api/logbook
Authorization: Bearer {token}
Content-Type: application/json
{
"date": "2024-01-01",
"type": "strength",
"items": [...]
}PUT /api/logbook/:id
Authorization: Bearer {token}
Content-Type: application/json
{
"date": "2024-01-01",
"type": "strength",
"items": [...]
}DELETE /api/logbook/:id
Authorization: Bearer {token}GET /api/health创建 .env 文件(可选):
# 服务器端口
PORT=3000
# 环境模式
NODE_ENV=development
# JWT 密钥(生产环境必须设置)
JWT_SECRET=your_secret_key_here# 构建前端
pnpm build
# 构建产物在 dist/ 目录-
构建项目
pnpm build
-
设置环境变量
在生产服务器上设置必要的环境变量。
-
启动服务器
pnpm start
或使用 PM2:
pm2 start server/index.js --name dailyfit
-
配置反向代理(推荐)
使用 Nginx 作为反向代理:
server { listen 80; server_name your-domain.com; location /api { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location / { root /path/to/dailyfit/dist; try_files $uri $uri/ /index.html; } }
项目已配置 Vercel Serverless Function,通过 api/index.js 将 Express 应用转换为无服务器函数。
-
配置 Vercel 项目
- 在 Vercel 中导入 GitHub 仓库,选择
pnpm作为包管理器。 - 设置环境变量,与本地
.env保持一致。 - Vercel 会自动识别
vercel.json配置文件。
- 在 Vercel 中导入 GitHub 仓库,选择
-
Vercel 配置说明
vercel.json配置了:- Serverless Function:
api/index.js作为 API 入口 - 静态构建:前端构建产物在
dist/目录 - 路由重写:
/api/*请求转发到 Serverless Function,其他请求返回index.html
- Serverless Function:
-
创建 GitHub Actions 工作流(示例)
name: CI on: push: branches: [main] pull_request: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 with: version: 10.20.0 - uses: actions/setup-node@v4 with: node-version: 18 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm lint - run: pnpm build
-
启用 Vercel Git 集成
- Actions 构建通过后,Vercel 根据主分支自动触发生产部署。
- Pull Request 将自动生成 Preview URL 供验收。
- Serverless Function 会自动部署,无需额外配置。
欢迎贡献代码!请遵循以下步骤:
-
Fork 项目
-
创建功能分支
git checkout -b feature/AmazingFeature
-
提交更改
git commit -m 'Add some AmazingFeature' -
推送到分支
git push origin feature/AmazingFeature
-
开启 Pull Request
- 使用有意义的提交信息
- 确保代码通过 ESLint 检查
- 确保代码格式符合 Prettier 规范
- 添加必要的注释和文档
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
⭐ 如果这个项目对您有帮助,请给个 Star!
Made with ❤️ by fufu39
