# 健身学习可视化追踪系统
## 项目概述
一个个人成长可视化平台,记录并展示健身和学习数据,让成长轨迹一目了然。
**核心理念:** 一切可视化 —— 大脑看不清数据就会焦虑,可视化让进步看得见。
---
## 技术栈
| 层级 | 技术 | 说明 |
|------|------|------|
| 前端 | Next.js 14 + TypeScript | React 框架,App Router |
| 样式 | Tailwind CSS + shadcn/ui | 现代化 UI 组件库 |
| 图表 | Recharts / Chart.js | 数据可视化 |
| 后端 | Next.js API Routes | 轻量级后端 |
| 数据库 | SQLite / PostgreSQL | 数据持久化 |
| ORM | Prisma | 数据库操作 |
| 部署 | Vercel / 自建服务器 | 上线部署 |
---
## 功能模块
### 1. 健身追踪模块
#### 1.1 跑步记录
- 记录每次跑步:日期、距离(km)、时长(分钟)、配速、卡路里
- 可视化展示:
- 周/月/年跑步里程趋势图
- 配速变化曲线
- 累计里程统计卡片
- 跑步日历热力图
#### 1.2 力量训练
- 记录每次训练:部位、动作、组数、重量、次数
- 可视化展示:
- 各部位训练频次统计
- 重量进步曲线(如卧推 60kg → 80kg)
- 训练容量趋势
#### 1.3 身体数据
- 记录:体重、体脂率、胸围、臂围等
- 可视化:身体指标变化曲线
### 2. 学习追踪模块
#### 2.1 学习记录
- 记录每次学习:日期、科目/技能、学习时长、学习内容摘要
- 支持标签分类:编程、英语、专业课等
#### 2.2 可视化展示
- 学习时长周/月统计
- 各科目时间分配饼图
- 学习 streak(连续学习天数)
- 知识积累时间线
### 3. 综合仪表盘
- 今日概览:今日运动、学习时长
- 本周目标完成进度条
- 近期趋势图表
- 成就徽章系统
---
## 数据库设计
### 数据模型
```prisma
// schema.prisma
model User {
id String @id @default(uuid())
name String
createdAt DateTime @default(now())
runs Run[]
workouts Workout[]
bodyStats BodyStat[]
studies Study[]
}
model Run {
id String @id @default(uuid())
date DateTime
distance Float // km
duration Int // minutes
pace Float // min/km
calories Int?
note String?
userId String
user User @relation(fields: [userId], references: [id])
}
model Workout {
id String @id @default(uuid())
date DateTime
bodyPart String // 胸部、背部、腿部等
exercises Json // [{name: "卧推", sets: 4, weight: 60, reps: 10}]
duration Int? // minutes
userId String
user User @relation(fields: [userId], references: [id])
}
model BodyStat {
id String @id @default(uuid())
date DateTime
weight Float? // kg
bodyFat Float? // %
chest Float? // cm
arm Float? // cm
waist Float? // cm
userId String
user User @relation(fields: [userId], references: [id])
}
model Study {
id String @id @default(uuid())
date DateTime
subject String // 编程、英语、专业课
duration Int // minutes
content String? // 学习内容摘要
tags String[] // 标签
userId String
user User @relation(fields: [userId], references: [id])
}
```
---
## 页面结构
```
app/
├── page.tsx # 首页仪表盘
├── layout.tsx # 根布局
├── globals.css # 全局样式
│
├── fitness/
│ ├── page.tsx # 健身总览
│ ├── running/
│ │ ├── page.tsx # 跑步记录列表
│ │ └── new/page.tsx # 新增跑步记录
│ ├── workout/
│ │ ├── page.tsx # 力量训练记录
│ │ └── new/page.tsx # 新增训练记录
│ └── body/
│ ├── page.tsx # 身体数据
│ └── new/page.tsx # 记录身体数据
│
├── study/
│ ├── page.tsx # 学习总览
│ ├── new/page.tsx # 新增学习记录
│ └── subjects/
│ └── [subject]/page.tsx # 单科详情
│
├── api/
│ ├── runs/route.ts # 跑步 API
│ ├── workouts/route.ts # 训练 API
│ ├── body-stats/route.ts # 身体数据 API
│ └── studies/route.ts # 学习 API
│
└── components/
├── ui/ # shadcn 组件
├── charts/ # 图表组件
│ ├── RunningChart.tsx
│ ├── WorkoutChart.tsx
│ ├── StudyChart.tsx
│ └── CalendarHeatmap.tsx
└── forms/ # 表单组件
├── RunForm.tsx
├── WorkoutForm.tsx
└── StudyForm.tsx
```
---
## 核心组件实现
### 1. 跑步趋势图组件
```tsx
// components/charts/RunningChart.tsx
"use client";
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from "recharts";
interface RunData {
date: string;
distance: number;
pace: number;
}
export function RunningChart({ data }: { data: RunData[] }) {
return (
);
}
```
### 2. 学习时长统计组件
```tsx
// components/charts/StudyChart.tsx
"use client";
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from "recharts";
interface StudyData {
subject: string;
duration: number;
}
export function StudyChart({ data }: { data: StudyData[] }) {
return (
);
}
```
### 3. 日历热力图组件
```tsx
// components/charts/CalendarHeatmap.tsx
// 使用 react-calendar-heatmap 或自定义实现
// 展示每天的运动/学习强度
```
---
## API 接口设计
### 跑步记录 API
```typescript
// GET /api/runs
// 获取跑步记录列表
// Query: startDate, endDate, limit
// POST /api/runs
// 创建跑步记录
// Body: { date, distance, duration, pace, calories, note }
// GET /api/runs/stats
// 获取跑步统计
// Response: { totalDistance, totalRuns, avgPace, thisWeekDistance }
```
### 学习记录 API
```typescript
// GET /api/studies
// 获取学习记录
// POST /api/studies
// 创建学习记录
// Body: { date, subject, duration, content, tags }
// GET /api/studies/stats
// 获取学习统计
// Response: { totalHours, streakDays, subjectBreakdown }
```
---
## 开发步骤
### Phase 1: 项目初始化
1. 创建 Next.js 项目:`npx create-next-app@latest fitness-tracker --typescript --tailwind --app`
2. 安装依赖:`npm install recharts prisma @prisma/client`
3. 初始化 Prisma:`npx prisma init`
4. 配置数据库连接
### Phase 2: 数据库搭建
1. 编写 schema.prisma 数据模型
2. 运行迁移:`npx prisma migrate dev`
3. 生成客户端:`npx prisma generate`
### Phase 3: 核心功能开发
1. 实现跑步记录 CRUD
2. 实现学习记录 CRUD
3. 实现力量训练记录 CRUD
4. 实现身体数据记录
### Phase 4: 可视化界面
1. 搭建仪表盘首页
2. 实现各模块图表
3. 添加数据录入表单
4. 优化 UI/UX
### Phase 5: 部署上线
1. 构建项目:`npm run build`
2. 部署到 Vercel 或自有服务器
3. 配置域名和 HTTPS
---
## 数据录入示例
### 跑步记录
```json
{
"date": "2026-04-23",
"distance": 3.0,
"duration": 18,
"pace": 6.0,
"calories": 240,
"note": "傍晚跑步,状态不错"
}
```
### 学习记录
```json
{
"date": "2026-04-23",
"subject": "编程",
"duration": 120,
"content": "学习了 Next.js 路由和数据获取",
"tags": ["Next.js", "React", "前端"]
}
```
### 力量训练
```json
{
"date": "2026-04-23",
"bodyPart": "胸部",
"exercises": [
{ "name": "卧推", "sets": 4, "weight": 60, "reps": 10 },
{ "name": "上斜哑铃", "sets": 3, "weight": 20, "reps": 12 }
],
"duration": 45
}
```
---
## 参考资源
- [shadcn/ui 组件库](https://ui.shadcn.com/)
- [Recharts 图表库](https://recharts.org/)
- [Prisma ORM](https://www.prisma.io/)
- [Next.js 文档](https://nextjs.org/docs)
---
## 扩展功能(未来)
- [ ] 用户认证系统(多用户支持)
- [ ] 数据导入导出(CSV/Excel)
- [ ] 目标设定与提醒
- [ ] 社交分享功能
- [ ] 移动端 App(React Native)
- [ ] AI 训练建议(基于历史数据分析)
---
*文档创建时间:2026-04-24*
*适用技术栈:Next.js 14 + TypeScript + Tailwind + Prisma*