Skip to content

cxdmnls/calorie-tracker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

卡路里记录与追踪应用

这是一个面向中文用户的 B/S 卡路里记录与追踪系统,包含 MySQL 数据库脚本、Python Flask 后端和 Vue 3 + Element Plus 前端。项目当前使用 MySQL 8.0.19,并在数据库层实现了事务、触发器、存储过程和视图。

系统目前支持饮食记录、运动记录、每日热量汇总、用户登录注册、个人资料、默认热量目标推荐,以及用户个人食物/运动字典。系统内置字典不可修改,用户自己添加的食物和运动可以修改。

项目结构

.
├─ sql/
│  └─ calorie_app.sql              # 完整建库脚本:表、外键、触发器、存储过程、视图、初始化数据
├─ backend/
│  ├─ app.py                       # Flask API 服务
│  ├─ db.py                        # MySQL 连接配置,读取 backend/.env
│  ├─ db_operations.py             # 数据库操作、自动补齐升级字段和业务逻辑
│  └─ requirements.txt             # Python 依赖
└─ frontend/
   ├─ index.html                   # Vite/Vue 入口文件,不能删除
   ├─ main.js                      # Vue 挂载入口
   ├─ CalorieDashboard.vue         # 主仪表盘页面
   ├─ theme.css                    # 全局主题样式
   ├─ package.json                 # 前端依赖和脚本
   └─ vite.config.js               # Vite 开发服务配置,默认 127.0.0.1:5173

数据库设计

核心表:

  • Users:用户表,包含用户名、密码哈希、性别、年龄、身高、体重、活动系数、摄入目标、运动目标。
  • FoodDictionary:食物字典表,包含食物分类、每 100 克热量、每 100 克蛋白质/碳水/脂肪、是否系统内置、所属用户。
  • ExerciseDictionary:运动字典表,包含每分钟消耗热量、是否系统内置、所属用户。
  • DietLog:饮食记录表,关联用户和食物,记录克数、总热量、日期。
  • ExerciseLog:运动记录表,关联用户和运动,记录时长、总消耗、日期。
  • DailySummary:每日汇总表,记录每日总摄入和总运动消耗。

字典规则:

  • 系统内置食物和运动:IsSystem = 1OwnerUserID = NULL,前端不允许用户修改。
  • 用户自定义食物和运动:IsSystem = 0OwnerUserID = 当前用户ID,只能由创建者查看和修改。
  • 细分健身动作如高位下拉、坐姿划船、卧推、深蹲、硬拉不作为系统内置数据,用户可按自己的消耗估算自行添加。

数据库工程能力

  1. 含事务的删除操作

位置:backend/db_operations.py

功能:删除指定 DietLog,并通过 DietLog.UserID = DailySummary.UserIDDietLog.LogDate = DailySummary.LogDate 同步扣减 DailySummary.TotalIntakeCalories。Python 后端使用显式事务,失败时回滚。

  1. 触发器控制下的添加操作

位置:sql/calorie_app.sqltrg_dietlog_before_insert

功能:插入饮食记录前校验 WeightGrams,必须大于 0 且小于 5000。MySQL 8 触发器使用 SIGNAL SQLSTATE '45000' 抛出明确错误并阻止非法插入。

  1. 存储过程控制下的更新操作

位置:sql/calorie_app.sqlUpdateDietLogWeight

功能:接收 LogIDNewWeightGrams,关联 DietLogFoodDictionary 重新计算单项总热量,并同步更新 DailySummary

  1. 含视图的查询操作

位置:sql/calorie_app.sqlUserDailyDietView

功能:关联 UsersDietLogFoodDictionary,查询用户名、日期、食物分类、食物名称、重量和单项总热量。

运行步骤

  1. 在 MySQL Workbench 中执行完整建库脚本:
SOURCE ./sql/calorie_app.sql;

也可以直接打开 sql/calorie_app.sql,全选执行。该脚本会重建 calorie_tracker 数据库。

  1. 配置后端数据库连接。

可以参考 backend/.env.example 新建 backend/.env,并写入你自己的 MySQL 配置:

DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=你的MySQL密码
DB_NAME=calorie_tracker
FLASK_SECRET_KEY=请改成自己的随机密钥
AI_API_BASE=https://api.openai.com/v1
AI_API_KEY=你的OpenAI兼容接口Key
AI_MODEL=gpt-4o-mini
RELAY_BASE_URL=https://api.zhizengzeng.com/v1
RELAY_API_KEY=你的智增增Relay接口Key
RELAY_MODEL=gpt-4o-mini

其中 AI 配置为可选项,后端优先读取 AI_API_KEY / AI_API_BASE,如果没有则读取 RELAY_API_KEY / RELAY_BASE_URL。不填写时,饮食和运动记录功能仍可正常使用,AI 助手会提示需要先配置接口 Key。

  1. 创建并进入 Python 环境:
conda create -y -n calorie_tracker_py310 python=3.10
conda activate calorie_tracker_py310
cd <项目根目录>\backend
pip install -r requirements.txt
python app.py

后端默认地址:

http://127.0.0.1:5000
  1. 安装并启动前端:
cd <项目根目录>\frontend
npm install
npm run dev

前端默认地址:

http://127.0.0.1:5173

注意:frontend/index.html 是 Vite 入口文件,不是废弃静态页,不能删除。

登录说明

系统现在使用用户名和密码登录。

初始化脚本中的演示用户:

  • 用户名:小明,默认密码:123456
  • 用户名:小红,默认密码:123456

也可以在前端登录页直接注册新用户。后端会把密码保存为哈希值,不保存明文密码。

现有功能

  • 用户注册、登录、退出。
  • 用户只能查看自己的饮食、运动和每日汇总数据。
  • 根据性别、年龄、身高、体重和活动输入计算推荐热量目标。
  • 支持用户手动设置每日摄入目标和运动消耗目标。
  • 添加饮食记录,触发器自动校验重量并计算热量。
  • 添加运动记录,触发器自动校验时长并计算消耗。
  • 查看今日饮食日记和历史饮食记录。
  • 查看近七天热量趋势。
  • 新增、编辑和删除个人食物字典,个人食物可选填写蛋白质、碳水、脂肪。
  • 新增、编辑和删除个人运动字典。
  • 使用 OpenAI 兼容接口生成中文饮食建议、宏量营养目标和可勾选计划任务。
  • 根据今日饮食记录动态计算蛋白质、碳水、脂肪摄入进度,达标的 AI 宏量目标会从当前待办中自动隐藏。
  • 系统内置食物和运动只读,防止用户误改底层公共数据。

常用接口

  • POST /api/register:注册用户。
  • POST /api/login:登录用户。
  • POST /api/logout:退出登录。
  • GET /api/me:获取当前用户资料。
  • PUT /api/me:更新当前用户资料和目标。
  • GET /api/foods:获取系统食物和当前用户个人食物。
  • POST /api/foods:新增个人食物。
  • PUT /api/foods/<food_id>:修改自己的个人食物。
  • DELETE /api/foods/<food_id>:删除自己的个人食物。
  • GET /api/exercises:获取系统运动和当前用户个人运动。
  • POST /api/exercises:新增个人运动。
  • PUT /api/exercises/<exercise_id>:修改自己的个人运动。
  • DELETE /api/exercises/<exercise_id>:删除自己的个人运动。
  • POST /api/diet-logs:新增饮食记录。
  • PUT /api/diet-logs/<log_id>:更新自己的饮食记录重量。
  • DELETE /api/diet-logs/<log_id>:删除自己的饮食记录。
  • GET /api/user-daily-diet:查询当前用户饮食记录,包含单条记录的蛋白质、碳水、脂肪估算。
  • GET /api/daily-summary:查询当前用户每日汇总,包含当天蛋白质、碳水、脂肪汇总。
  • GET /api/exercise-logs:查询当前用户运动记录。
  • POST /api/exercise-logs:新增运动记录。
  • POST /api/ai/advice:向 AI 助手提问并生成宏量营养目标和计划任务。
  • GET /api/ai/plans:查询当前用户历史 AI 计划,并返回宏量目标今日完成状态。
  • PATCH /api/ai/tasks/<task_id>:切换 AI 计划任务完成状态。

验证命令

后端语法检查:

python -m py_compile backend\app.py backend\db_operations.py

前端构建检查:

cd <项目根目录>\frontend
npm run build

Repository Hygienernrn建议提交到仓库的内容:rnrn- README.md``rn- sql/calorie_app.sql``rn- backend/app.py``rn- backend/db.py``rn- backend/db_operations.py``rn- backend/requirements.txt``rn- backend/.env.example``rn- frontend 目录中的源码文件,例如 CalorieDashboard.vuemain.jstheme.csspackage.jsonvite.config.jsindex.html``rnrn不建议提交的内容:rnrn- backend/.env,里面可能包含数据库密码和 API Key。rn- frontend/node_modules,这是依赖安装目录,可以通过 npm install 重新生成。rn- frontend/dist,这是前端构建产物,通常可以通过 npm run build 重新生成。rn- backend/__pycache__backend/*.logbackend/*.err,这些是运行缓存和日志。rn- ui-ux-pro-max.download,这是本地下载过程文件,不属于项目源码。rn

About

本项目旨在为有自己api并且想要控制饮食的用户提供便利。同时,想要商业化实现热量记录软件的工作者可以参考本项目中的实现方法。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages