2026秋软工实践 FitPulse——项目原型设计+概要设计
| 项目 | 内容 |
|---|---|
| 作业所属课程 | 202601软件工程 |
| 作业要求 | 2026秋软工实践团队作业第二次 |
| 作业的目标 | 在第一次需求分析的基础上,完成软件原型设计(用户端+管理后台),进行概要设计(系统架构、UML建模),设计数据库结构,制定详细开发计划,并建立团队GitHub仓库作为项目文档与代码的管理中心 |
| 团队名称 | FitPulse |
| 团队成员学号-名字 | 102401317-罗炜、102401529-陈加豪、102401527-林复彬、102401521-陈辉腾、102401218-罗堉楠、102401328-马锦城、102401531-徐心铭、102401121-张智轩、102401119-林祺皓、102401203-连向薇、102401222-李江炜 |
一、原型设计(40%)
1.1 原型设计工具与在线展示
- 设计工具:墨刀(Modao)+ HTML/CSS 高保真原型
- 原型展示链接:🔗 在线预览(GitHub托管) | 📁 源代码
1.2 设计理念
FitPulse 是一款面向学生健身新手的「随身智能教练」。原型设计围绕以下核心理念展开:
- 对话即交互:用户与智能Agent通过自然语言对话完成所有操作——查询动作、生成计划、上传纠错,无需复杂菜单层级。
- 三屏合一:教练对话、训练计划、个人记录三个核心视图通过底部导航一键切换。
- Agent 可见:设计上让用户清楚感知「正在和智能教练对话」,而非传统的表单填写式工具。
- 虚拟陪练形象:加入 AI 虚拟陪练人物(卡通健身教练),以动画形象呈现于对话页和计划页,提供陪伴感和鼓励反馈,降低健身过程的枯燥感。
1.3 用户端应用原型
1.3.1 首页——智能教练对话
用户打开应用即进入与 FitPulse 智能教练的对话界面:
- 欢迎引导:首次进入时,Agent 主动问候并采集用户基本信息(健身水平、目标、可用器械、每周可训练天数),以对话气泡形式逐条询问,降低填写负担。
- 对话输入:底部固定输入框 + 发送按钮,支持文字输入;右侧「📷」按钮支持拍照/上传动作照片用于纠错。
- 回答展示:Agent 回答以富文本卡片形式呈现——文字说明、配图、结构化列表(如训练计划表格),并标注知识出处(如「参考:运动解剖学·深蹲篇」)。
- 快捷入口:对话顶部提供三个快捷按钮——「🔍 查动作」「📋 生成计划」「🩺 动作纠错」,点击后自动填入引导性提问。
- 虚拟陪练形象:页面顶部展示 AI 虚拟陪练动画人物(卡通健身教练),以浮动动画效果呈现,并配有「AI虚拟陪练在线」标记。Agent 消息旁配有小尺寸虚拟形象 + 对话气泡,如「你好!我是你的AI虚拟陪练,会一直陪着你训练,加油!💪」,增强陪伴感和激励机制。
1.3.2 训练计划页
- 计划列表:按日期展示当前周的训练计划,每天一张卡片,包含:日期、训练部位、动作列表(动作名+组数+次数+休息时间)、预计时长。
- 计划详情:点击卡片展开完整计划,每个动作配有要领缩略图、目标肌群标注。
- 完成打卡:每个动作可勾选「已完成」,当日全部完成时卡片变为绿色并显示「✅ 今日完成」。
- 刷新计划:顶部「🔄 重新生成」按钮,点击后 Agent 根据用户最新状态重新生成一周计划。
1.3.3 动作纠错页
- 上传入口:支持两种方式——「📸 拍照」实时拍摄动作照片、「🖼️ 从相册选择」上传已有照片。
- 纠错结果:上传后 Agent 分析并返回结构化纠错反馈:
- 整体评价(如「俯卧撑整体不错,但有一个关键问题需要调整」)
- 问题列表(每条标注问题部位 + 问题描述 + 纠正建议 + 参考图对比)
- 安全提示(如有疼痛/不适,建议停止并就医)
- 历史记录:下方按时间倒序展示历史纠错记录,可展开查看详情。
1.3.4 个人中心
- 个人资料:头像、昵称、健身水平、目标、可用器械,均可编辑修改。
- 训练统计:本周训练天数、累计训练次数、总训练时长、完成率环形图。
- 我的纠错:历史纠错记录汇总入口。
- 关于 FitPulse:版本信息、使用帮助、反馈入口。
1.4 后台管理原型
后台管理面向系统管理员,用于管理知识库内容和查看系统运行状态:
- 知识库管理:三大领域知识模块(标准动作/肌肉发力/错误姿势)的条目列表,支持新增、编辑、删除、批量导入。每条知识包含标题、模块分类、正文内容、配图、出处来源。
- 用户管理:用户列表(ID、昵称、注册时间、训练天数),支持查看用户详情。
- 系统概览:仪表盘——总用户数、今日活跃用户、本周纠错次数、知识库条目数、API 调用量趋势图。
- 反馈管理:用户反馈列表,支持标记处理状态。
1.5 智能体交互界面与任务流程
FitPulse 的核心差异在于「Agent 驱动的对话式交互」。原型中重点设计了三条 Agent 任务流程:
流程一:查询动作要领
用户点击「🔍 查动作」→ 输入框自动填入"我想了解……"
→ 用户输入"深蹲的标准动作"
→ Agent 识别意图 → 调用「动作库查询」工具 → 检索知识库
→ 返回结构化回答:📌 深蹲(标准动作)目标肌群:股四头肌、臀大肌、核心起始姿势:双脚与肩同宽,脚尖微外展……动作轨迹:吸气下蹲至大腿与地面平行……呼吸:下蹲吸气,起身呼气节奏:2-1-2(下2秒-底停1秒-上2秒)⚠️ 常见错误:膝内扣、塌腰、重心前移📷 [配图:深蹲标准姿势]📚 参考:运动解剖学·下肢篇
流程二:生成训练计划
用户点击「📋 生成计划」
→ Agent 检查用户档案(已采集过则跳过)
→ 若未采集:依次询问「你的健身水平?」「目标?」「有什么器械?」「每周能练几天?」
→ 调用「训练计划生成」工具
→ 输出结构化周计划卡片(动作+组数+次数+休息+配图+选择理由)
→ 用户可「保存到我的计划」
流程三:动作纠错
用户点击「🩺 动作纠错」→ 拍照/选照片上传
→ Agent 接收图片 → 调用「动作纠错」工具
→ 结合「标准动作」+「错误姿势危害」知识分析
→ 返回纠错卡片:整体评价 + 问题列表(问题部位/描述/纠正/参考图)
→ 若检测到明显伤痛信号 → 走安全边界:建议就医
1.6 UI 设计说明
- 配色方案:主色活力橙
#FF6B35,辅色深灰#2D2D2D,背景浅灰#F5F5F5,强调健康、活力、专业的品牌感。 - 字体:系统默认中文字体(苹方/PingFang SC / 微软雅黑),标题加粗,正文常规。
- 圆角卡片:所有内容以圆角卡片承载,视觉上温和友好。
- 底部导航:三个Tab——「💬 教练」「📋 计划」「👤 我的」,教练Tab居中突出。
- 交互动效:对话气泡淡入、卡片点击微缩放、纠错结果逐条展开,提升操作反馈感。
二、概要设计(40%)
2.1 系统架构设计
FitPulse 采用前后端分离 + Agent 编排架构,整体分为四层:
┌────────────────────────────────────────────────────────────┐
│ 用户接入层 │
│ 响应式网页(移动端优先) │
│ React SPA · 对话/计划/纠错/个人中心 │
└────────────────────────┬───────────────────────────────────┘│ HTTPS / WebSocket
┌────────────────────────▼───────────────────────────────────┐
│ API 网关层 │
│ Nginx 反向代理 · 路由分发 · 限流 · 鉴权 │
└────────────────────────┬───────────────────────────────────┘│
┌────────────────────────▼───────────────────────────────────┐
│ 业务编排层(核心) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 意图识别 │ │ 工具调度 │ │ 上下文管理 │ │
│ │ Router │ │ Dispatcher │ │ Context Manager │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ┌──────▼────────────────▼─────────────────────▼──────────┐ │
│ │ Agent 编排引擎 (Orchestrator) │ │
│ │ 接收用户输入 → 意图分类 → 装配上下文 → 调度工具 → 生成响应 │ │
│ └────────────────────────┬───────────────────────────────┘ │
└───────────────────────────┼─────────────────────────────────┘│
┌───────────────────────────▼─────────────────────────────────┐
│ 能力支撑层 │
│ ┌──────────┐ ┌──────────────┐ ┌────────────────────────┐ │
│ │ LLM API │ │ 知识检索 RAG │ │ 工具集 (Tools) │ │
│ │ (Claude) │ │ (向量检索+重排)│ │ 计划生成/纠错/动作查询 │ │
│ └──────────┘ └──────────────┘ └────────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘│
┌───────────────────────────▼─────────────────────────────────┐
│ 数据持久层 │
│ ┌──────────┐ ┌──────────────┐ ┌────────────────────────┐ │
│ │ MySQL │ │ 向量数据库 │ │ 对象存储 (OSS) │ │
│ │ 用户/计划 │ │ Milvus/Chroma │ │ 动作图片/纠错照片 │ │
│ │ /记录 │ │ 知识向量 │ │ │ │
│ └──────────┘ └──────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
架构说明
| 层 | 职责 | 技术选型 |
|---|---|---|
| 用户接入层 | 前端界面,用户交互 | React 18 + TailwindCSS,移动端优先响应式布局 |
| API 网关层 | 统一入口,流量控制 | Nginx + JWT 鉴权 |
| 业务编排层 | Agent 核心:意图识别、工具调度、上下文管理、生成响应 | Python (FastAPI) + LangChain/LlamaIndex |
| 能力支撑层 | LLM 调用、知识检索、工具执行 | Claude API、Chroma/Milvus、自定义工具 |
| 数据持久层 | 业务数据、知识向量、文件存储 | MySQL 8.0、向量数据库、MinIO/OSS |
2.2 智能体集成设计
2.2.1 Agent 与系统的集成方式
FitPulse 的智能体不是独立的对话机器人,而是深度嵌入软件系统的编排核心:
用户输入(文字/图片)│▼
┌──────────────────┐
│ 系统提示词 │ ← 角色设定:专业健身教练
│ System Prompt │ 输出规范、安全边界
└──────┬───────────┘│▼
┌──────────────────┐
│ 意图分类器 │ ← 判断用户意图类别:
│ Intent Router │ 动作查询 / 计划生成 / 动作纠错 / 闲聊
└──────┬───────────┘│├── 动作查询 ──→ [知识检索 RAG] ──→ [组装上下文] ──→ LLM 生成│├── 计划生成 ──→ [采集用户档案] ──→ [计划生成工具] ──→ LLM 润色│├── 动作纠错 ──→ [图片预处理] ──→ [知识检索] ──→ [纠错工具] ──→ LLM 分析│└── 闲聊 ──→ 直接 LLM 回复(不触发工具)
2.2.2 领域知识在系统中的作用
| 知识模块 | 存储方式 | 检索方式 | 在Agent中的作用 |
|---|---|---|---|
| 标准动作 | 结构化条目 + 向量 | 语义检索(按动作名/目标肌群/描述) | 回答动作要领、提供配图、作为纠错基准 |
| 肌肉发力 | 结构化条目 + 向量 | 语义检索(按动作名/肌群) | 解释发力感、分析代偿、回答"为什么酸这里" |
| 错误姿势危害 | 结构化条目 + 向量 | 语义检索(按动作名/错误类型) | 定位纠错原因、评估风险、给出纠正步骤 |
2.2.3 工具调用与任务流程
| 工具名称 | 触发条件 | 输入 | 输出 | 调用的领域知识 |
|---|---|---|---|---|
query_exercise |
用户询问动作要领 | 动作名/肌群名 | 动作卡片(要领+图文+出处) | 标准动作、肌肉发力 |
generate_plan |
用户要求生成计划 | 用户档案(水平/目标/器械/时间) | 结构化周计划 | 标准动作、肌肉发力 |
correct_posture |
用户上传动作照片/描述不适 | 图片 + 可选文字描述 | 纠错卡片(问题+纠正+对比) | 标准动作、错误姿势危害 |
get_progress |
用户查询训练进度 | 用户ID | 统计数据+可视化数据 | 用户训练记录 |
2.3 UML 设计
2.3.1 用例图(Use Case Diagram)
┌─────────────────────────────────────────┐│ FitPulse 系统 ││ │┌──────────┐ │ ┌──────────────────────────────┐ ││ │ 查询动作要领 │ │ │ ││ │─────────────────▶│ 「查询动作要领」 │ ││ │ │ │ extend: 显示配图 │ ││ │ │ │ extend: 标注知识出处 │ ││ │ │ └──────────────────────────────┘ ││ │ │ ││ 普通 │ 生成训练计划 │ ┌──────────────────────────────┐ ││ 用户 │─────────────────▶│ 「生成训练计划」 │ ││ │ │ │ include: 采集用户档案 │ ││ │ │ │ extend: 保存到我的计划 │ ││ │ │ └──────────────────────────────┘ ││ │ │ ││ │ 动作纠错 │ ┌──────────────────────────────┐ ││ │─────────────────▶│ 「动作纠错」 │ ││ │ │ │ include: 上传动作照片 │ ││ │ │ │ extend: 安全就医建议 │ ││ │ │ └──────────────────────────────┘ ││ │ │ ││ │ 打卡/记录 │ ┌──────────────────────────────┐ ││ │─────────────────▶│ 「训练打卡与进度查看」 │ │└──────────┘ │ └──────────────────────────────┘ ││ │┌──────────┐ │ ┌──────────────────────────────┐ ││ │ 管理知识库 │ │ │ ││ 系统 │─────────────────▶│ 「知识库管理」 │ ││ 管理员 │ │ │ CRUD知识条目、批量导入 │ ││ │ 管理用户 │ └──────────────────────────────┘ ││ │─────────────────▶│ 「用户管理」 ││ │ 查看系统概览 │ └──────────────────────────────┘ ││ │─────────────────▶│ 「系统概览仪表盘」 │└──────────┘ │ └──────────────────────────────┘ │└─────────────────────────────────────────┘
2.3.2 活动图(Activity Diagram)——训练计划生成流程
┌──────┐
│ 开始 │
└──┬───┘│▼
┌─────────────────┐
│ 用户请求生成计划 │
└────────┬────────┘│▼
┌─────────────────┐ ┌─────────────────┐
│ 检查用户档案 │────▶│ 档案不完整 │
│ 是否完整? │ │ 逐项询问采集 │
└────────┬────────┘ └────────┬────────┘│ 完整 │ 采集完成▼ ▼
┌─────────────────────────────────────┐
│ 调用「训练计划生成」工具 │
│ 输入:水平/目标/器械/可用时间/偏好 │
└────────────────┬────────────────────┘│▼
┌─────────────────────────────────────┐
│ RAG 检索相关动作 │
│ 按目标肌群 + 器械筛选 + 难度匹配 │
└────────────────┬────────────────────┘│▼
┌─────────────────────────────────────┐
│ 规则引擎编排 │
│ · 每周训练天数 → 分割训练部位 │
│ · 每个动作 3-4 组 × 8-15 次 │
│ · 组间休息 60-90s │
│ · 热身 + 主体训练 + 拉伸 │
└────────────────┬────────────────────┘│▼
┌─────────────────────────────────────┐
│ LLM 组装并润色 │
│ · 为每个动作选择理由生成说明文字 │
│ · 标注注意事项 │
│ · 配图标注 │
└────────────────┬────────────────────┘│▼
┌─────────────────┐
│ 返回结构化周计划 │
│ 展示给用户 │
└────────┬────────┘│┌────▼────┐│ 用户操作 │└─┬───┬──┘│ │保存 │ │ 重新生成│ │▼ ▼┌────┐ ┌──────────┐│结束│ │回到「检查 │└────┘ │用户档案」 │└──────────┘
2.3.3 活动图(Activity Diagram)——动作纠错流程
┌──────┐
│ 开始 │
└──┬───┘│▼
┌─────────────────┐
│ 用户上传动作照片 │
│ + 可选文字描述 │
└────────┬────────┘│▼
┌─────────────────┐
│ 图片预处理 │
│ · 格式校验 │
│ · 尺寸标准化 │
│ · 质量检查 │
└────────┬────────┘│┌────▼────┐│ 描述是否 ││ 包含动作名?│└─┬───┬──┘│ │是 │ │ 否│ │▼ ▼
┌──────────┐ ┌──────────────┐
│ 直接检索 │ │ 视觉分析估测 │
│ 对应动作 │ │ 动作类型 │
│ 知识 │ │ (多模态模型) │
└────┬─────┘ └──────┬───────┘│ │└──────┬───────┘│▼
┌─────────────────────────────────────┐
│ RAG 检索:标准动作 + 错误姿势危害 │
│ 同时获取「应该怎样」和「常见错法」 │
└────────────────┬────────────────────┘│▼
┌─────────────────────────────────────┐
│ 调用「动作纠错」工具 │
│ · 对比标准姿势 vs 用户照片 │
│ · 识别偏差部位 │
│ · 匹配已知错误类型 │
└────────────────┬────────────────────┘│▼
┌─────────────────────────────────────┐
│ LLM 生成纠错报告 │
│ · 整体评价 │
│ · 问题列表(部位/描述/纠正/参考图) │
│ · 安全兜底检查 │
└────────────────┬────────────────────┘│┌──────▼──────┐│ 是否检测到 ││ 伤痛信号? │└──┬──────┬───┘│ │是 │ │ 否│ │▼ ▼┌─────────────┐ ┌──────────────┐│ 追加安全提示 │ │ 返回纠错卡片 ││ 建议停止并 │ │ ││ 就医 │ │ │└──────┬──────┘ └──────┬───────┘│ │└───────┬───────┘│▼┌──────┐│ 结束 │└──────┘
2.3.4 类图(Class Diagram)
classDiagramclass User {+String userId+String nickname+String avatarUrl+String fitnessLevel+String goal+String[] equipment+Int weeklyDays+DateTime createdAt+DateTime updatedAt+getProfile() UserProfile+updateProfile(data) void}class Exercise {+String exerciseId+String name+String category+String[] targetMuscles+String[] synergists+String difficulty+String equipmentNeeded+String instructions+String breathing+String tempo+String[] imageUrls+String[] commonErrors+String source}class KnowledgeChunk {+String chunkId+String module+String exerciseId+String content+String[] tags+String source+Float[] embedding+DateTime createdAt}class TrainingPlan {+String planId+String userId+Int weekNumber+DateTime startDate+DateTime endDate+PlanDay[] days+String explanation+String status+generatePlan(user) void+updateProgress(dayIndex, exerciseIndex, done) void}class PlanDay {+Int dayIndex+String focusArea+PlanExercise[] exercises+Int estimatedMinutes+Boolean completed}class PlanExercise {+String exerciseId+Int sets+Int reps+Int restSeconds+String notes+Boolean done}class PostureCorrection {+String correctionId+String userId+String imageUrl+String userDescription+String detectedExercise+CorrectionIssue[] issues+String overallAssessment+String safetyNote+DateTime createdAt}class CorrectionIssue {+String bodyPart+String problemDescription+String correctionAdvice+String referenceImageUrl+String severity}class WorkoutRecord {+String recordId+String userId+String planId+Int dayIndex+DateTime completedAt+String feedback+Int difficultyRating}class AgentSession {+String sessionId+String userId+Message[] history+String currentIntent+Map~String,Object~ context+DateTime createdAt+DateTime lastActiveAt}class Message {+String role+String content+ToolCall[] toolCalls+DateTime timestamp}class ToolCall {+String toolName+Map~String,Object~ args+String result+DateTime executedAt}class SystemConfig {+String key+String value+String description}class Feedback {+String feedbackId+String userId+String type+String content+String status+DateTime createdAt}User "1" --> "*" TrainingPlan : 拥有User "1" --> "*" WorkoutRecord : 记录User "1" --> "*" PostureCorrection : 纠错User "1" --> "*" AgentSession : 对话User "1" --> "*" Feedback : 反馈TrainingPlan "1" --> "*" PlanDay : 包含PlanDay "1" --> "*" PlanExercise : 包含PlanExercise "*" --> "1" Exercise : 引用PostureCorrection "1" --> "*" CorrectionIssue : 包含AgentSession "1" --> "*" Message : 包含Message "1" --> "*" ToolCall : 触发KnowledgeChunk "*" --> "1" Exercise : 关联
2.3.5 时序图(Sequence Diagram)——生成训练计划
用户 前端 API网关 编排器 RAG服务 LLM API 计划工具 数据库│ │ │ │ │ │ │ ││ 点击生成计划 │ │ │ │ │ │ ││────────────▶│ │ │ │ │ │ ││ │ POST /plan │ │ │ │ │ ││ │─────────────▶│ │ │ │ │ ││ │ │ 路由+鉴权 │ │ │ │ ││ │ │────────────▶│ │ │ │ ││ │ │ │ 查用户档案 │ │ │ ││ │ │ │──────────────────────────────────────────▶││ │ │ │◀──────────────────────────────────────────││ │ │ │ │ │ │ ││ │ │ │ 档案不完整 → 返回采集问题 │ ││ │◀────────────────────────────│ │ │ │ ││ 回答采集问题 │ │ │ │ │ │ ││────────────▶│─────────────▶│────────────▶│ │ │ │ ││ │ │ │ 按目标肌群检索知识 │ ││ │ │ │──────────▶│ │ │ ││ │ │ │◀──────────│ │ │ ││ │ │ │ 相关知识条目 │ ││ │ │ │ │ │ │ ││ │ │ │ 调用计划生成工具 ││ │ │ │───────────────────────────────────────────────────────▶││ │ │ │◀───────────────────────────────────────────────────────││ │ │ │ 结构化计划数据 ││ │ │ │ │ │ │ ││ │ │ │ 组装 prompt(系统提示词+知识+用户档案+计划数据+输出格式) ││ │ │ │───────────────────────▶│ │ ││ │ │ │◀───────────────────────│ │ ││ │ │ │ 润色后的计划文本 │ │ ││ │ │ │ │ │ │ ││ │ │ │ 保存计划到数据库 ││ │ │ │───────────────────────────────────────────────────────▶││ │ │ │◀───────────────────────────────────────────────────────││ │ │ │ │ │ │ ││ │ 返回计划卡片 │ │ │ │ │ ││ │◀────────────────────────────│ │ │ │ ││ 展示计划 │ │ │ │ │ │ ││◀───────────│ │ │ │ │ │ │
2.3.6 协作图(Collaboration Diagram)——动作纠错场景
┌──────────────────────────────────────────────────────────────────┐
│ 动作纠错协作场景 │
│ │
│ ┌──────────┐ │
│ │ 用户 │ │
│ └────┬─────┘ │
│ │ │
│ 1. 上传动作照片 + 文字描述 │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 前端 (React SPA) │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ 纠错上传组件 │ │ │
│ │ │ · 拍照/选照片 │ │ │
│ │ │ · 预览 + 文字描述输入 │ │ │
│ │ │ · 上传进度 │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └──────────────────┬───────────────────────┘ │
│ │ 2. POST /api/correct (multipart/form) │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 业务编排器 (Orchestrator) │ │
│ │ 3. 图片预处理 │ │
│ │ 4. 意图分类 → "动作纠错" │ │
│ │ 5. 调用视觉模型分析动作类型 │ │
│ │ 6. 组装纠错工具调用参数 │ │
│ │ 7. 返回纠错报告给前端 │ │
│ └───┬──────────────┬──────────────┬─────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌───────────┐ ┌──────────┐ │
│ │ LLM API │ │ RAG 服务 │ │ 纠错工具 │ │
│ │ (Claude) │ │ │ │ (Tool) │ │
│ │ │ │ 按动作名 │ │ │ │
│ │ 视觉分析 │ │ 检索: │ │ 对比: │ │
│ │ +文本生成 │ │ · 标准动作 │ │ 用户图 │ │
│ │ │ │ · 错误姿势 │ │ vs │ │
│ │ │ │ · 纠正方法 │ │ 标准图 │ │
│ └──────────┘ └───────────┘ └──────────┘ │
│ │ │ │ │
│ └──────────────┴──────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 数据存储层 │ │
│ │ ┌──────────┐ ┌──────────────────────┐ │ │
│ │ │ MySQL │ │ 对象存储 (OSS) │ │ │
│ │ │ 纠错记录 │ │ 用户上传的原始照片 │ │ │
│ │ │ 用户档案 │ │ 标注后的对比图 │ │ │
│ │ └──────────┘ └──────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
│ │
│ 消息传递: │
│ 1→2: uploadImage(image, description) │
│ 2→3: preprocess(image) → normalizedImage │
│ 3→4: classifyIntent("动作纠错") │
│ 4→5: analyzeImage(normalizedImage) → detectedExercise │
│ 5→6: searchKnowledge(detectedExercise, ["标准动作","错误姿势"]) │
│ 5→7: comparePosture(normalizedImage, referenceImages) → issues │
│ 6→7: generateReport(issues, knowledge) → correctionReport │
│ 7→2: return correctionReport │
│ 2→1: display correctionReport │
└──────────────────────────────────────────────────────────────────┘
三、数据库设计
3.1 ER 图(实体-关系图)
erDiagramUser ||--o{ TrainingPlan : "拥有"User ||--o{ WorkoutRecord : "记录"User ||--o{ PostureCorrection : "发起纠错"User ||--o{ AgentSession : "对话"User ||--o{ Feedback : "提交反馈"TrainingPlan ||--o{ PlanDay : "包含"PlanDay ||--o{ PlanExercise : "包含"PlanExercise }o--|| Exercise : "引用"PostureCorrection ||--o{ CorrectionIssue : "包含"AgentSession ||--o{ Message : "包含"Message ||--o{ ToolCall : "触发"Exercise ||--o{ KnowledgeChunk : "关联知识"User {varchar user_id PKvarchar nicknamevarchar avatar_urlvarchar fitness_levelvarchar goaljson equipmentint weekly_daysdatetime created_atdatetime updated_at}Exercise {varchar exercise_id PKvarchar name UKvarchar categoryjson target_musclesvarchar difficultytext instructionsjson image_urlsvarchar source}TrainingPlan {varchar plan_id PKvarchar user_id FKint week_numberdate start_datedate end_datevarchar statusdatetime created_at}PlanDay {varchar day_id PKvarchar plan_id FKint day_indexvarchar focus_areaint estimated_minutesboolean completed}PlanExercise {varchar id PKvarchar day_id FKvarchar exercise_id FKint setsint repsint rest_secondsboolean done}PostureCorrection {varchar correction_id PKvarchar user_id FKvarchar image_urlvarchar detected_exercisetext overall_assessmenttext safety_notedatetime created_at}CorrectionIssue {varchar issue_id PKvarchar correction_id FKvarchar body_parttext problem_descriptiontext correction_advicevarchar severity}KnowledgeChunk {varchar chunk_id PKvarchar modulevarchar exercise_id FKtext contentjson tagsvarchar sourcevector embedding}AgentSession {varchar session_id PKvarchar user_id FKvarchar current_intentjson contextdatetime created_atdatetime last_active_at}Message {varchar message_id PKvarchar session_id FKvarchar roletext contentdatetime timestamp}ToolCall {varchar call_id PKvarchar message_id FKvarchar tool_namejson argstext resultdatetime executed_at}WorkoutRecord {varchar record_id PKvarchar user_id FKvarchar plan_id FKint day_indexdatetime completed_attext feedbackint difficulty_rating}Feedback {varchar feedback_id PKvarchar user_id FKvarchar typetext contentvarchar statusdatetime created_at}
3.2 关系数据模型
| 表名 | 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|---|
| users | user_id | VARCHAR(36) | PK | UUID |
| nickname | VARCHAR(50) | NOT NULL | 昵称 | |
| avatar_url | VARCHAR(500) | 头像URL | ||
| fitness_level | ENUM('beginner','intermediate','advanced') | NOT NULL | 健身水平 | |
| goal | ENUM('lose_fat','build_muscle','improve_posture','general') | NOT NULL | 目标 | |
| equipment | JSON | 可用器械列表 | ||
| weekly_days | TINYINT | 1-7 | 每周可训练天数 | |
| created_at | DATETIME | NOT NULL, DEFAULT NOW() | ||
| updated_at | DATETIME | NOT NULL, ON UPDATE NOW() | ||
| exercises | exercise_id | VARCHAR(36) | PK | |
| name | VARCHAR(100) | UK, NOT NULL | 动作名称 | |
| category | VARCHAR(50) | NOT NULL | 分类(胸/背/腿/肩/核心/全身) | |
| target_muscles | JSON | NOT NULL | 目标肌群 | |
| synergists | JSON | 协同肌群 | ||
| difficulty | ENUM('beginner','intermediate','advanced') | NOT NULL | ||
| equipment_needed | VARCHAR(200) | 所需器械 | ||
| instructions | TEXT | NOT NULL | 动作要领(Markdown) | |
| breathing | VARCHAR(500) | 呼吸方法 | ||
| tempo | VARCHAR(50) | 动作节奏 | ||
| image_urls | JSON | 配图URL列表 | ||
| common_errors | JSON | 常见错误列表 | ||
| source | VARCHAR(500) | 知识出处 | ||
| created_at | DATETIME | NOT NULL | ||
| training_plans | plan_id | VARCHAR(36) | PK | |
| user_id | VARCHAR(36) | FK→users, NOT NULL | ||
| week_number | INT | NOT NULL | 第几周 | |
| start_date | DATE | NOT NULL | ||
| end_date | DATE | NOT NULL | ||
| status | ENUM('active','completed','abandoned') | DEFAULT 'active' | ||
| explanation | TEXT | 计划说明 | ||
| created_at | DATETIME | NOT NULL | ||
| plan_days | day_id | VARCHAR(36) | PK | |
| plan_id | VARCHAR(36) | FK→training_plans, NOT NULL | ||
| day_index | TINYINT | NOT NULL, 1-7 | 星期几 | |
| focus_area | VARCHAR(100) | NOT NULL | 训练部位 | |
| estimated_minutes | INT | 预估时长(分钟) | ||
| completed | BOOLEAN | DEFAULT FALSE | ||
| plan_exercises | id | VARCHAR(36) | PK | |
| day_id | VARCHAR(36) | FK→plan_days, NOT NULL | ||
| exercise_id | VARCHAR(36) | FK→exercises, NOT NULL | ||
| sets | TINYINT | NOT NULL | 组数 | |
| reps | SMALLINT | NOT NULL | 次数 | |
| rest_seconds | SMALLINT | DEFAULT 60 | 组间休息(秒) | |
| notes | VARCHAR(500) | 备注 | ||
| done | BOOLEAN | DEFAULT FALSE | ||
| sort_order | TINYINT | DEFAULT 0 | 排序 | |
| posture_corrections | correction_id | VARCHAR(36) | PK | |
| user_id | VARCHAR(36) | FK→users, NOT NULL | ||
| image_url | VARCHAR(500) | NOT NULL | 上传的图片URL | |
| user_description | TEXT | 用户文字描述 | ||
| detected_exercise | VARCHAR(100) | 识别出的动作 | ||
| overall_assessment | TEXT | 整体评价 | ||
| safety_note | TEXT | 安全提醒 | ||
| created_at | DATETIME | NOT NULL | ||
| correction_issues | issue_id | VARCHAR(36) | PK | |
| correction_id | VARCHAR(36) | FK→posture_corrections, NOT NULL | ||
| body_part | VARCHAR(50) | NOT NULL | 问题部位 | |
| problem_description | TEXT | NOT NULL | 问题描述 | |
| correction_advice | TEXT | NOT NULL | 纠正建议 | |
| reference_image_url | VARCHAR(500) | 参考配图 | ||
| severity | ENUM('mild','moderate','severe') | DEFAULT 'moderate' | ||
| knowledge_chunks | chunk_id | VARCHAR(36) | PK | |
| module | ENUM('standard_action','muscle_activation','error_harm') | NOT NULL | 知识模块 | |
| exercise_id | VARCHAR(36) | FK→exercises, NULLABLE | 关联动作 | |
| content | TEXT | NOT NULL | 知识内容 | |
| tags | JSON | 检索标签 | ||
| source | VARCHAR(500) | 出处 | ||
| embedding | VECTOR(1536) | 向量(Claude embedding) | ||
| created_at | DATETIME | NOT NULL | ||
| agent_sessions | session_id | VARCHAR(36) | PK | |
| user_id | VARCHAR(36) | FK→users, NOT NULL | ||
| current_intent | VARCHAR(50) | 当前意图 | ||
| context | JSON | 上下文状态 | ||
| created_at | DATETIME | NOT NULL | ||
| last_active_at | DATETIME | NOT NULL | ||
| messages | message_id | VARCHAR(36) | PK | |
| session_id | VARCHAR(36) | FK→agent_sessions, NOT NULL | ||
| role | ENUM('user','assistant','system','tool') | NOT NULL | ||
| content | TEXT | NOT NULL | ||
| timestamp | DATETIME | NOT NULL | ||
| tool_calls | call_id | VARCHAR(36) | PK | |
| message_id | VARCHAR(36) | FK→messages, NOT NULL | ||
| tool_name | VARCHAR(100) | NOT NULL | ||
| args | JSON | 调用参数 | ||
| result | TEXT | 返回结果 | ||
| executed_at | DATETIME | NOT NULL | ||
| workout_records | record_id | VARCHAR(36) | PK | |
| user_id | VARCHAR(36) | FK→users, NOT NULL | ||
| plan_id | VARCHAR(36) | FK→training_plans | ||
| day_index | TINYINT | NOT NULL | ||
| completed_at | DATETIME | NOT NULL | ||
| feedback | TEXT | 训练感受 | ||
| difficulty_rating | TINYINT | 1-5 | 难度评价 | |
| feedbacks | feedback_id | VARCHAR(36) | PK | |
| user_id | VARCHAR(36) | FK→users, NOT NULL | ||
| type | ENUM('bug','feature','praise','other') | NOT NULL | ||
| content | TEXT | NOT NULL | ||
| status | ENUM('pending','processing','resolved') | DEFAULT 'pending' | ||
| created_at | DATETIME | NOT NULL |
3.3 对象关系映射(ORM 映射)
以 Python SQLAlchemy 为例,核心实体与库表的映射关系:
| 实体类 | 库表 | 映射说明 |
|---|---|---|
User |
users |
equipment 字段使用 JSON 类型映射为 Python list;fitness_level/goal 使用 Enum 类型 |
Exercise |
exercises |
target_muscles/image_urls 等用 JSON 类型;instructions 为 Markdown 文本 |
TrainingPlan |
training_plans |
与 PlanDay 为一对多关系,通过 plan_days 反向引用 |
PlanDay |
plan_days |
与 PlanExercise 为一对多关系 |
PlanExercise |
plan_exercises |
通过 exercise_id 外键关联 Exercise |
PostureCorrection |
posture_corrections |
与 CorrectionIssue 为一对多关系 |
KnowledgeChunk |
knowledge_chunks |
embedding 字段为 VECTOR 类型,由向量数据库插件处理 |
AgentSession |
agent_sessions |
context 为 JSON 字典,存储会话中间状态 |
Message |
messages |
与 ToolCall 为一对多关系 |
WorkoutRecord |
workout_records |
同时关联 User 和 TrainingPlan |
3.4 领域知识与智能体数据存储设计
3.4.1 知识库存储
- 结构化管理:三大领域知识模块(标准动作/肌肉发力/错误姿势危害)以结构化条目存储在
knowledge_chunks表中,每条知识关联到具体的Exercise。 - 向量化存储:知识条目通过 Claude Embedding API 向量化(1536维),存入向量数据库(Chroma/Milvus)。用户提问时通过语义相似度检索 Top-K 条相关知识,注入 LLM 上下文。
- 出处标注:每条知识记录
source字段,Agent 回答时标注引用,实现可追溯。
3.4.2 用户交互记录存储
- 会话记录:
agent_sessions+messages+tool_calls三表记录完整的对话历史,支持上下文连续对话、工具调用回溯。 - 训练记录:
workout_records记录每次训练完成情况,difficulty_rating和feedback用于分析计划合理性和调整难度。 - 纠错记录:
posture_corrections+correction_issues记录每次纠错的完整结果,支持用户回溯查看。
3.4.3 任务执行结果存储
- 训练计划:
training_plans+plan_days+plan_exercises三表完整存储生成计划,用户可随时查看和修改完成状态。 - 工具调用日志:
tool_calls表记录每次工具调用的参数和结果,用于分析 Agent 行为、优化工具效果、调试排错。
四、团队协作记录(20%)
4.1 预期开发计划时间安排
以下计划从第二次作业截止日期(2026.11.09)开始,覆盖后续全部开发阶段,直至最终答辩。
| 周次 | 日期范围 | 阶段 | 里程碑 | 产出 |
|---|---|---|---|---|
| 第9周 | 11.10–11.16 | 环境搭建与知识库整理 | 开发环境就绪、知识库初版完成 | ① 云服务器/数据库/向量数据库部署完成 ② 三大领域知识库各≥15条结构化条目 ③ 知识向量化入库 |
| 第10周 | 11.17–11.23 | Agent 核心开发 | Agent 原型跑通三大任务 | ① 系统提示词定稿 ② RAG 检索链路跑通 ③ 三大工具(动作查询/计划生成/纠错)可独立调用 |
| 第11周 | 11.24–11.30 | 前端 + 后端联调 | 前后端联调通过 | ① 前端对话/计划/纠错三个页面开发完成 ② API 接口联调通过 ③ 端到端流程可走通 |
| 第12周 | 12.01–12.07 | 功能完善与测试 | 功能冻结、测试完成 | ① 所有核心功能完成 ② 测试用例全部通过 ③ UI 细节优化 |
| 第13周 | 12.08–12.14 | 典型案例对比与上线 | 系统上线、典型案例完成 | ① 部署上线(公网可访问) ② 定制前vs定制后三组对比案例完成 ③ 用户验收测试 |
| 第14周 | 12.15–12.21 | 答辩准备 | 答辩材料完成 | ① PPT 定稿 ② 现场演示流程排练 ③ 博客总结 |
| 第15周 | 12.22–12.28 | 答辩与复盘 | 答辩完成 | ① 现场答辩 ② 复盘总结 |
4.2 预期开发计划分工安排
| 序号 | 学号-姓名 | 角色 | 详细负责部分 | 所属阶段 |
|---|---|---|---|---|
| 1 | 102401317-罗炜 | 队长/项目统筹 | 整体规划、进度管理、风险把控、答辩主讲、架构设计 | 全阶段 |
| 2 | 102401529-陈加豪 | 产品经理/需求 | 需求细化、用户画像完善、PRD更新、验收标准跟踪 | 第9-12周 |
| 3 | 102401527-林复彬 | 领域知识研究员A | 「标准动作」库:深蹲/俯卧撑/平板支撑/弓步/臀桥/卷腹/肩推等≥15个动作的要领+配图整理 | 第9-10周 |
| 4 | 102401521-陈辉腾 | 领域知识研究员B | 「肌肉发力」+「错误姿势危害」库:每个动作的肌群分析+常见错误+纠正方法,≥15条错误条目 | 第9-10周 |
| 5 | 102401218-罗堉楠 | 提示词工程师 | 系统提示词设计、角色设定、输出格式规范、安全边界、few-shot样例编写 | 第10周 |
| 6 | 102401328-马锦城 | RAG/知识库工程师 | 知识切片策略、向量化、Chroma/Milvus部署、检索+重排链路、出处标注 | 第9-11周 |
| 7 | 102401531-徐心铭 | 后端/API集成 | FastAPI服务端、Claude API集成、数据库设计落地、计划生成/纠错/查询API | 第9-11周 |
| 8 | 102401121-张智轩 | 前端工程师 | React页面开发:对话界面、计划展示、纠错上传、个人中心、响应式适配 | 第11-12周 |
| 9 | 102401119-林祺皓 | 工具调用/流程编排 | 工具定义(schema设计)、Agent任务流程编排、意图路由、上下文管理 | 第10-11周 |
| 10 | 102401203-连向薇 | 测试工程师 | 测试用例编写、功能测试、三组典型案例对比(定制前vs定制后)、验收报告 | 第12-13周 |
| 11 | 102401222-李江炜 | UI/UX设计+文档 | 界面视觉设计、原型设计(墨刀)、PPT美化、博客撰写与排版、文档管理 | 第9-14周 |
4.3 本次作业协作过程记录
4.3.1 分工记录
| 任务 | 负责人 | 完成情况 |
|---|---|---|
| 原型设计(用户端 4 页面 + 后台管理 3 页面) | 李江炜、罗炜 | ✅ 已完成 |
| 原型交互流程设计(三条 Agent 任务流程) | 罗炜、罗堉楠 | ✅ 已完成 |
| 系统架构设计(四层架构图) | 罗炜、徐心铭 | ✅ 已完成 |
| UML 建模(用例图/活动图/类图/时序图/协作图) | 罗炜、林祺皓 | ✅ 已完成 |
| 数据库设计(ER图/关系模型/ORM/知识存储) | 徐心铭、马锦城 | ✅ 已完成 |
| 开发计划与分工安排 | 罗炜、陈加豪 | ✅ 已完成 |
| 系统设计说明书文档 | 罗炜、陈加豪 | ✅ 已完成 |
| 数据库设计说明书文档 | 徐心铭、马锦城 | ✅ 已完成 |
| 博客撰写与排版 | 李江炜、罗炜 | ✅ 已完成 |
| GitHub 团队仓库建立 | 罗炜 | ✅ 已完成 |
五、原型设计展示
- 原型展示链接:在线预览(GitHub托管)
原型设计中的重要突出特点
-
Agent 驱动对话式交互:不同于传统应用的表单+列表模式,FitPulse 原型以对话为核心交互方式。
-
智能体可见性设计:Agent 回答带有角色标识、知识出处标注。
-
AI 虚拟陪练形象:创新加入卡通健身教练动画人物——浮动动画呈现,通过对话气泡与用户互动,提供陪伴感和激励机制,解决居家健身「缺乏陪伴」的核心痛点。
-
安全边界内嵌:伤痛信号检测 → 建议就医的安全兜底路径。
-
后台知识库可管理:领域知识不是写死在代码里,而是通过后台知识库管理界面可增删改,支持持续迭代优化。
六、后端设计展示
所有后端设计图已在第二章「概要设计」中展示,包括:
- 系统架构图(四层架构)
- 用例图(系统功能边界与参与者)
- 活动图(训练计划生成流程、动作纠错流程)
- 类图(Mermaid 格式,完整实体关系)
- 时序图(训练计划生成时序)
- 协作图(动作纠错协作场景)
- ER 图(数据库实体关系)
以上设计图在博客中以 ASCII Art / Mermaid 格式呈现。在《系统设计说明书》和《数据库设计说明书》PDF 中将提供更规范的图形版本。
七、GitHub 仓库与文档下载(5')
| 资源 | 链接 |
|---|---|
| GitHub 团队仓库 | https://github.com/power819/FitPulse |
| FitPulse_系统设计说明书.pdf | GitHub下载 |
| FitPulse_数据库设计说明书.pdf | GitHub下载 |
说明:PDF 文档将上传至团队 GitHub 仓库
docs/目录,同时提供云盘备用下载链接。
八、参考资料
- 软件系统设计说明书国标参考:GB/T 8567-2006《计算机软件文档编制规范》
- 数据库设计说明书国标参考:GB/T 8567-2006
- UML 建模参考:OMG UML 2.5 Specification
- 智能体平台参考:文心智能体平台、Kimi+、ChatGPT/GPTs、扣子、Dify、LangChain