目录
[查询框触发筛选 Bug](#查询框触发筛选 Bug)
[Cookie 跨域+ 登录刷新状态丢失问题](#Cookie 跨域+ 登录刷新状态丢失问题)
[订阅套餐重复记录 + 无法二次取消问题](#订阅套餐重复记录 + 无法二次取消问题)
[Dify AI 集成系列问题](#Dify AI 集成系列问题)
最近一周,我进行了一个简单的小型项目的编写和答辩,我会在这篇博客中进行功能的复现,顺便聊聊项目的技术框架。算是对这段时间努力的一个总结,也希望能给有需要的朋友一些参考。(想要直观看到整个项目框架和代码的直接看资源即可)
这个项目的主题是一个健康打卡系统,接下来我会从六个方向对该项目进行一个讲解
一、项目背景
做这个项目的初衷 在于:现代生活的快节奏,网络上现在关于自律、改善身体素质而出现的跑步类,健身类博主越来越多,这也反映出人们对于健康的重视程度日益提升。
可是传统健康管理方式仍有许多不便:
信息过载:健康资讯鱼龙混杂,筛选可靠信息成本高
数据零散:睡眠、运动、饮食等健康数据分散在不同平台,难以统一管理
缺乏指导:遇到健康问题时,难以获得及时、个性化的专业建议
项目目标:让用户进行每日的打卡任务,建立规律健康的作息习惯
通过用户给出的打卡信息,结合用户自身信息,多维度记录和分析,让用户能更直观掌握自身健康变化
用户可以通过询问集成AI 健康顾问,得到科学,个性化的专业指导
融入社交与激励机制,增强用户进行健康生活的动力
二、项目业务流程
用户首先进行注册 ,填写个人信息后,通过用户名和密码进行登录 ;进入页面后对新增打卡信息 进行填写,随后获得打卡记录 ,通过随时查看、编辑和删除对打卡记录进行管理
基于打卡记录中用户的健康打卡数据 ,AI健康咨询助手 会对应提供智能且专业 的个性化建议和即时的健康回答服务
同样的这里有多样化的付费套餐 可供选择,满足更进阶的用户更深层次的需求;可以收藏他人的打卡记录,构建活跃的互助社区,从而增强用户粘性
三、项目架构
(1)技术栈
前端方面
用到的是简单的前端三件套
- HTML5| 定义页面语义化结构与骨架
- CSS3| 视觉呈现与多端响应式布局
- JavaScript| 实现页面动态交互逻辑
主要开发语言
Python 3.x
后端Web框架
FastAPI
数据库连接
SQLAlchemy的orm设计和SQLite
AI能力集成
Dify AI平台
(2)项目结构
(3)数据库设计
核心实体
User表 ------ 用户基础信息
Record表 ------ 打卡/行为记录
Package表 ------ 服务套餐定义
Collect表 ------ 用户间记录的收藏关系
UserPackage表 ------ 套餐订阅关系映射
实体属性一览User(用户)
- id、username、password、email、phone、avatar、age、height、weight、habit、created_at
Record(打卡记录)
- id、user_id、day、get_up、sleep、sport_name、sport_time、eat_morning、eat_noon、eat_night、remark
Collect(收藏)
- id、user_id、record_id、created_at
Package(套餐)
- id、name、desc、price
UserPackage(用户套餐中间表)
- id、user_id、package_id、bind_time、expires_at、is_active
关键逻辑关系
1:N 关系
关系 说明 User → Record 一个用户可产生多条打卡记录 User → Collect 一个用户可收藏多条记录 N:N 关系
关系 中间表 说明 User ↔ Package user_packages用户与套餐为多对多订阅关系
系统整体实体关系模型(ER图)
额外补充:外键 -- record user_id(关联user) collect user_id,record_id; userpackage user_id,package_id
(4)项目架构图
- 分层架构设计
- **用户界面层:**登录/注册、个人中心、健康打卡、AI咨询、健康报告、日程提醒
- **业务逻辑层:**用户认证、健康打卡处理、AI助手、套餐管理、收藏管理
- **数据访问层:**用户管理、打卡数据、AI服务、套餐订阅、外部API
- 架构特点
- **高内聚低耦合:**模块职责清晰,易于维护
- **分层解耦:**界面层→业务层→数据层,层层传递
- **可扩展性:**新功能可独立添加,不影响现有系统
四、项目演示
(1)用户管理
用户注册
用户登录
退出登录以及个人信息管理
(2)打卡功能的增删改查
新增打卡
删除打卡记录
修改打卡记录内容
查询打卡记录(采用模糊查询)
(3)收藏功能的添加取消和查看
添加收藏
收藏记录界面
查看详情页
(4)套餐的订阅与取消
套餐订阅
我的套餐以及取消订阅
(5)AI健康咨询助手
dify平台接入
AI咨询界面
用户问题以及助手回复
五、关键技术讲解
(1)数据库的设计和AI的接入
- ORM设计
- ORM设计是用对象操作数据库,不用写SQL语句,代码更直观;
- 会自动处理表关联关系,不用手动JOIN;
- 模型定义就是表结构,代码和数据库自动同步,开发效率更高。
- AI助手接入
- 通过dify平台接入AI大语言模型,实现智能化健康咨询;
- 系统自动汇聚 用户的健康档案数据,在用户发起咨询时,将其年龄、身高、体重、运动习惯及饮食记录等信息 作为上下文传递给 AI,从而生成针对性的专业建议。
(2)FastAPI设计与架构
Fast API作为后端的框架 ,基于Starlette (一个轻量级,高性能的异步Web架构)和Pydantic (提供数据校验与模型),能快速且安全的写后端接口
- 异步支持:原生支持异步请求处理,提升并发性能
- 自动文档:访问 /docs 即可获得交互式 API 文档
- 类型提示:结合 Pydantic 实现请求参数自动校验和序列化
- 依赖注入:通过 Depends() 实现数据库连接等资源的自动管理
- 利用中间件(Middleware)实现 CORS 跨域资源共享配置,保障前端灵活接入。
- 严格遵循 RESTful 架构原则,设计语义清晰、资源导向的 API 端点,降低系统耦合度。
- 建立全局异常拦截与标准化响应机制,规范错误码体系,提升前后端联调与排障效率。
(3)用户认证模块
路由层:
python@router.post("/login") async def login(request: LoginRequest, db: Session = Depends(get_db), response: Response = None): result = login_user(db, request) if result["success"]: user = result["data"] response.set_cookie(key="user_id", value=str(user.id), httponly=True, samesite="strict", secure=False, path="/") return {"success": True, "message": "登录成功", "data": { "id": user.id, "username": user.username, "email": user.email, "phone": user.phone, "age": user.age, "height": user.height, "weight": user.weight, "habit": user.habit }} return result服务层:
pythondef login_user(db: Session, request: LoginRequest): try: user = db.query(User).filter(User.username == request.username).first() if not user: return {"success": False, "message": "用户名不存在"} if not verify_password(request.password, user.password): return {"success": False, "message": "密码错误"} return {"success": True, "data": user} except Exception as e: return {"success": False, "message": "登录失败"}
- 功能定位:负责用户登录、注册和退出功能。
- 实现流程:用户在登录页输入账号密码后,前端携带用户名密码通过 `fetch` 发送 POST 请求到 `/login` 接口。后端通过 Pydantic 自动校验参数,依赖注入获取数据库连接,调用服务层验证用户信息。验证成功后设置 HttpOnly Cookie 保持登录状态,返回用户信息到前端,前端将用户信息临时存储在 localStorage 中,用于页面展示和渲染,并跳转到首页。
(4)健康打卡模块
路由层:
python@router.post("/add_record") async def add_checkin_record(request: RecordRequest, user_id: int = Cookie(None), db: Session = Depends(get_db)): if not user_id: return {"success": False, "message": "未登录"} result = add_record(db, user_id, request) if result["success"]: record_dict = RecordResponse.from_orm(result["data"]).dict() if record_dict["get_up"]: record_dict["get_up"] = record_dict["get_up"].strftime("%H:%M:%S") if record_dict["sleep"]: record_dict["sleep"] = record_dict["sleep"].strftime("%H:%M:%S") return {"success": True, "message": "打卡成功", "data": record_dict} return result服务层:
pythondef add_record(db: Session, user_id: int, request: RecordRequest): try: record = Record(user_id=user_id, **request.dict()) db.add(record) db.commit() db.refresh(record) return {"success": True, "data": record} except Exception as e: db.rollback() return {"success": False, "message": "添加记录失败"}
- 功能定位:负责打卡记录的添加、查看、更新和删除。
- 实现流程:用户在打卡页面填写数据(起床时间、运动信息、饮食记录等)后提交,前端通过
fetch发送 POST 请求到/add\_record接口。后端验证登录状态,通过 Pydantic 校验数据格式,调用服务层将记录保存到数据库。返回格式化的打卡记录数据,前端更新页面展示。
(5)AI健康咨询模块
路由层:
python@router.post("/ai/ask") async def ask_ai(request: AIRequest, user_id: int = Cookie(None), db: Session = Depends(get_db)): user_data = None if user_id: user_result = get_user_by_id(db, user_id) if user_result["success"]: user = user_result["data"] # 获取用户最新的打卡记录 latest_record = db.query(Record).filter(Record.user_id == user_id).order_by(Record.day.desc()).first() user_data = { "id": user.id, "age": user.age, "height": user.height, "weight": user.weight, "habit": user.habit, "eat_morning": latest_record.eat_morning if latest_record else "", "eat_noon": latest_record.eat_noon if latest_record else "", "eat_night": latest_record.eat_night if latest_record else "" } result = ai_ask(request.question, user_data) return {"success": True, "data": {"answer": result["data"]}}服务层:
pythondef ai_ask(question: str, user_data=None): """ 调用 Dify API 进行 AI 咨询 :param question: 用户问题 :param user_data: 用户健康数据(身高、体重、年龄、运动习惯等) """ # Dify 本地部署配置 DIFY_API_URL = "http://localhost/v1/chat-messages" DIFY_API_KEY = "app-MbOZfFpWm0EY9V6bnpGfzuAU" # 替换为您的 Dify API Key try: # 构建用户健康数据作为 inputs inputs = {} if user_data: inputs = { "age": str(user_data.get("age", "")), "height": str(user_data.get("height", "")), "weight": str(user_data.get("weight", "")), "habit": str(user_data.get("habit", "")), "eat_morning": str(user_data.get("eat_morning", "")), "eat_noon": str(user_data.get("eat_noon", "")), "eat_night": str(user_data.get("eat_night", "")) } # 调用 Dify API response = requests.post( DIFY_API_URL, headers={ "Authorization": f"Bearer {DIFY_API_KEY}", "Content-Type": "application/json" }, json={ "inputs": inputs, "query": question, "response_mode": "blocking", "user": f"health-user-{user_data.get('id', 'unknown')}" if user_data else "health-checkin-user" }, )
- 功能定位:为用户提供个性化健康建议。
- 实现流程:用户在 AI 咨询页面输入问题后提交,前端发送 POST 请求到
/ai/ask接口,携带问题内容。后端若用户已登录,获取用户健康数据(年龄、身高、体重、运动习惯、饮食记录等),调用服务层的 AI 咨询函数,将用户数据作为上下文传入。返回 AI 生成的个性化健康建议,前端展示回答内容。支持 AI 服务不可用时的降级处理。
六、项目总结
(1)项目中遇到的问题
查询框触发筛选 Bug
- 问题:在登录后,向查询框中输入内容,没有点击查询而是点击收藏等按钮也会触发查询
- 解决:后续单独写了一个新函数,将查询按钮功能独立出来,点击其他按钮就不会触发查询了
Cookie 跨域+ 登录刷新状态丢失问题
- 问题:登录后没有正常返回登录成功样式而是显示网络错误无法加载记录
- 解决:发现不是简单的代码逻辑问题,新增了一个校验函数,页面刷新会自动检查cookie,并修改cookie的配置,使浏览器能正常携带登录信息
订阅套餐重复记录 + 无法二次取消问题
- 问题:无法重复进行订阅套餐和去掉订阅,而且数据库还会有重复的记录
- 解决:后端修改订阅函数使得能正常取消和订阅,当用户订阅时先找到之前的记录直接复用,不会新建数据;套餐界面在退出登录后会重置界面
Dify AI 集成系列问题
- 问题:对接AI时出现无法回复,格式渲染报错
- 解决:后续重新核对了路径以及API Key,将流式响应改成了简单的阻塞模式,提取回复内容,用Markdown语法转成正常的文字格式
(2)不足与改进
- 性能优化
- 当前使用的SQLite在高并发场景下可能存在性能瓶颈 ,后续可考虑迁移到PostgreSQL等更强大的数据库以支撑业务增长。
- 当前不存在缓存机制 ,后续开发可以使用集成Redis缓存热点数据
- 安全性增强
- 需要进一步加强全链路安全防护体系,重点防御SQL注入、XSS跨站脚本攻击及CSRF跨站请求伪造,保障用户数据与系统安全。
- 现阶段没有进行Token认证 ,后续可以引入JWT/OAuth2认证体系
- 扩展性提升
- 随着用户规模扩大,当前单体架构将面临维护和部署挑战,需逐步向微服务架构演进,实现系统模块解耦与弹性扩展。
- 当前阶段无自动化流程 ,后续可以搭建GitLab CI/CD流水线,实现自动化测试和部署
- 用户体验优化
- 增加页面交互反馈与流畅的动画过渡效果。
- 同时完善功能矩阵:添加好友系统、支持离线打卡、增加数据导出、健康报告自动生成、多渠道消息推送功能。
(3)收获与展望
技术能力提升
- 深入掌握了FastAPI框架的核心特性(异步处理、依赖注入、自动API文档),提升了后端接口开发的效率。
- 清晰理解了前后端分离 开发模式下的完整协作流程,有效提升了跨端协同能力。
- 熟练运用关系型数据库设计原则 (一对一、一对多关系),并掌握了SQLAlchemy ORM的简单应用。
- 打通了 LLM的技术链路,实现了健康咨询AI功能,积累了实际项目经验
工程思维培养
- 建立了完整的软件工程化思维 ,在代码编写过程中,开始有意识地注重代码结构的规范性(使用装饰器优化重复代码)、系统的可维护性以及模块的可测试性。
- 学会了运用分层架构思想 拆解复杂业务,通过合理的模块化设计 降低系统耦合度,显著提升了系统的扩展性与未来迭代效率。遇到技术难题时,学会了通过文档阅读、社区搜索、AI运用等方式独立解决问题
感谢浏览
Python 3.x
FastAPI

Dify AI平台
















