健康打卡系统项目总结

目录

一、项目背景

二、项目业务流程

三、项目架构

(1)技术栈

前端方面

主要开发语言

后端Web框架

数据库连接

AI能力集成

(2)项目结构

(3)数据库设计

核心实体

关键逻辑关系

系统整体实体关系模型(ER图)

(4)项目架构图

四、项目演示

(1)用户管理

(2)打卡功能的增删改查

(3)收藏功能的添加取消和查看

(4)套餐的订阅与取消

(5)AI健康咨询助手

五、关键技术讲解

(1)数据库的设计和AI的接入

(2)FastAPI设计与架构

(3)用户认证模块

(4)健康打卡模块

(5)AI健康咨询模块

六、项目总结

(1)项目中遇到的问题

[查询框触发筛选 Bug](#查询框触发筛选 Bug)

[Cookie 跨域+ 登录刷新状态丢失问题](#Cookie 跨域+ 登录刷新状态丢失问题)

[订阅套餐重复记录 + 无法二次取消问题](#订阅套餐重复记录 + 无法二次取消问题)

[Dify AI 集成系列问题](#Dify AI 集成系列问题)

(2)不足与改进

(3)收获与展望

技术能力提升

工程思维培养


最近一周,我进行了一个简单的小型项目的编写和答辩,我会在这篇博客中进行功能的复现,顺便聊聊项目的技术框架。算是对这段时间努力的一个总结,也希望能给有需要的朋友一些参考。(想要直观看到整个项目框架和代码的直接看资源即可)

这个项目的主题是一个健康打卡系统,接下来我会从六个方向对该项目进行一个讲解

一、项目背景

做这个项目的初衷 在于:现代生活的快节奏,网络上现在关于自律、改善身体素质而出现的跑步类,健身类博主越来越多,这也反映出人们对于健康的重视程度日益提升。
可是传统健康管理方式仍有许多不便

  • 信息过载:健康资讯鱼龙混杂,筛选可靠信息成本高

  • 数据零散:睡眠、运动、饮食等健康数据分散在不同平台,难以统一管理

  • 缺乏指导:遇到健康问题时,难以获得及时、个性化的专业建议
    项目目标:

  • 让用户进行每日的打卡任务,建立规律健康的作息习惯

  • 通过用户给出的打卡信息,结合用户自身信息,多维度记录和分析,让用户能更直观掌握自身健康变化

  • 用户可以通过询问集成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)项目架构图

  • 分层架构设计
  1. **用户界面层:**登录/注册、个人中心、健康打卡、AI咨询、健康报告、日程提醒
  2. **业务逻辑层:**用户认证、健康打卡处理、AI助手、套餐管理、收藏管理
  3. **数据访问层:**用户管理、打卡数据、AI服务、套餐订阅、外部API
  • 架构特点
  1. **高内聚低耦合:**模块职责清晰,易于维护
  2. **分层解耦:**界面层→业务层→数据层,层层传递
  3. **可扩展性:**新功能可独立添加,不影响现有系统

四、项目演示

(1)用户管理

用户注册

用户登录

退出登录以及个人信息管理

(2)打卡功能的增删改查

新增打卡

删除打卡记录

修改打卡记录内容

查询打卡记录(采用模糊查询)

(3)收藏功能的添加取消和查看

添加收藏

收藏记录界面

查看详情页

(4)套餐的订阅与取消

套餐订阅

我的套餐以及取消订阅

(5)AI健康咨询助手

dify平台接入

AI咨询界面

用户问题以及助手回复

五、关键技术讲解

(1)数据库的设计和AI的接入

  • ORM设计
  1. ORM设计是用对象操作数据库,不用写SQL语句,代码更直观;
  2. 自动处理表关联关系,不用手动JOIN;
  3. 模型定义就是表结构,代码和数据库自动同步,开发效率更高。
  • AI助手接入
  1. 通过dify平台接入AI大语言模型,实现智能化健康咨询;
  2. 系统自动汇聚 用户的健康档案数据,在用户发起咨询时,将其年龄、身高、体重、运动习惯及饮食记录等信息 作为上下文传递给 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

服务层:

python 复制代码
def 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

服务层:

python 复制代码
def 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"]}}

服务层:

python 复制代码
def 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的配置,使浏览器能正常携带登录信息

订阅套餐重复记录 + 无法二次取消问题

  • 问题:无法重复进行订阅套餐和去掉订阅,而且数据库还会有重复的记录
  • 解决:后端修改订阅函数使得能正常取消和订阅,当用户订阅时先找到之前的记录直接复用,不会新建数据;套餐界面在退出登录后会重置界面

Dify AI 集成系列问题

  • 问题:对接AI时出现无法回复,格式渲染报错
  • 解决:后续重新核对了路径以及API Key,将流式响应改成了简单的阻塞模式,提取回复内容,用Markdown语法转成正常的文字格式

(2)不足与改进

  • 性能优化
  1. 当前使用的SQLite在高并发场景下可能存在性能瓶颈 ,后续可考虑迁移到PostgreSQL等更强大的数据库以支撑业务增长
  2. 当前不存在缓存机制 ,后续开发可以使用集成Redis缓存热点数据
  • 安全性增强
  1. 需要进一步加强全链路安全防护体系,重点防御SQL注入、XSS跨站脚本攻击及CSRF跨站请求伪造,保障用户数据与系统安全。
  2. 现阶段没有进行Token认证 ,后续可以引入JWT/OAuth2认证体系
  • 扩展性提升
  1. 随着用户规模扩大,当前单体架构将面临维护和部署挑战,需逐步向微服务架构演进,实现系统模块解耦与弹性扩展。
  2. 当前阶段无自动化流程 ,后续可以搭建GitLab CI/CD流水线,实现自动化测试和部署
  • 用户体验优化
  1. 增加页面交互反馈与流畅的动画过渡效果。
  2. 同时完善功能矩阵:添加好友系统、支持离线打卡、增加数据导出、健康报告自动生成、多渠道消息推送功能。

(3)收获与展望

技术能力提升

  • 深入掌握了FastAPI框架的核心特性(异步处理、依赖注入、自动API文档),提升了后端接口开发的效率。
  • 清晰理解了前后端分离 开发模式下的完整协作流程,有效提升了跨端协同能力。
  • 熟练运用关系型数据库设计原则 (一对一、一对多关系),并掌握了SQLAlchemy ORM的简单应用。
  • 打通了 LLM的技术链路,实现了健康咨询AI功能,积累了实际项目经验

工程思维培养

  • 建立了完整的软件工程化思维 ,在代码编写过程中,开始有意识地注重代码结构的规范性(使用装饰器优化重复代码)、系统的可维护性以及模块的可测试性。
  • 学会了运用分层架构思想 拆解复杂业务,通过合理的模块化设计 降低系统耦合度,显著提升了系统的扩展性与未来迭代效率。遇到技术难题时,学会了通过文档阅读、社区搜索、AI运用等方式独立解决问题

感谢浏览

相关推荐
展示猪肝6 小时前
Vue2 + FastAPI + Dify 实现 AI 医疗预检分诊助手:从问诊追问到医生审核闭环
人工智能·vue·fastapi·dify
辞忧九千七8 小时前
前后端分离架构实战与项目落地:AI智能学习笔记管理系统
python·html·axios·css3·fastapi·dify
深兰科技8 小时前
深兰科技签约乌兹别克斯坦智慧城市项目,推动中国AI出海规模化
人工智能·beautifulsoup·numpy·智慧城市·fastapi·matplotlib·深兰科技
码界筑梦坊9 小时前
118-基于Python的游戏账号数据可视化分析系统
python·游戏·信息可视化·毕业设计·pandas·fastapi
rising start9 小时前
InsightEdu - 轻量智能学习平台
javascript·axios·css3·html5·fastapi·orm·dify
小李云雾11 小时前
慧校坊-二手校园交易平台-------项目总结
数据库·后端·程序人生·fastapi·项目
我叫张小白。12 小时前
劳动力招聘管理系统:全栈实战(Vue3+FastAPI+WebSocket+Dify)
websocket·vue·毕业设计·状态模式·fastapi·dify·智能体
csdn小瓯21 小时前
LangGraph自适应工作流路由机制:从关键词匹配到智能决策的完整实现
人工智能·fastapi·langgraph
PieroPc1 天前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控