这是一个面向中文用户的 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 = 1,OwnerUserID = NULL,前端不允许用户修改。 - 用户自定义食物和运动:
IsSystem = 0,OwnerUserID = 当前用户ID,只能由创建者查看和修改。 - 细分健身动作如高位下拉、坐姿划船、卧推、深蹲、硬拉不作为系统内置数据,用户可按自己的消耗估算自行添加。
- 含事务的删除操作
位置:backend/db_operations.py
功能:删除指定 DietLog,并通过 DietLog.UserID = DailySummary.UserID 与 DietLog.LogDate = DailySummary.LogDate 同步扣减 DailySummary.TotalIntakeCalories。Python 后端使用显式事务,失败时回滚。
- 触发器控制下的添加操作
位置:sql/calorie_app.sql 的 trg_dietlog_before_insert
功能:插入饮食记录前校验 WeightGrams,必须大于 0 且小于 5000。MySQL 8 触发器使用 SIGNAL SQLSTATE '45000' 抛出明确错误并阻止非法插入。
- 存储过程控制下的更新操作
位置:sql/calorie_app.sql 的 UpdateDietLogWeight
功能:接收 LogID 和 NewWeightGrams,关联 DietLog 与 FoodDictionary 重新计算单项总热量,并同步更新 DailySummary。
- 含视图的查询操作
位置:sql/calorie_app.sql 的 UserDailyDietView
功能:关联 Users、DietLog、FoodDictionary,查询用户名、日期、食物分类、食物名称、重量和单项总热量。
- 在 MySQL Workbench 中执行完整建库脚本:
SOURCE ./sql/calorie_app.sql;也可以直接打开 sql/calorie_app.sql,全选执行。该脚本会重建 calorie_tracker 数据库。
- 配置后端数据库连接。
可以参考 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。
- 创建并进入 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
- 安装并启动前端:
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