版本: 2.0 (全栈完整版 - 前后端一体化) 日期: 2025年6月5日 状态: ✅ 开发完成,功能完整,支持Windows一键部署
- ✅ 后端开发完成 - Django REST API,23个端点,功能齐全
- ✅ 前端开发完成 - Vue3 + Element Plus,PC端专用优化界面
- ✅ 数据库完善 - MySQL支持,4个核心模型,108种食物数据
- ✅ 认证系统完备 - JWT认证,前后端统一权限控制
- ✅ Windows一键部署 - 9个批处理脚本,自动化部署
- ✅ 测试验证通过 - 包含完整测试脚本和API验证
- ✅ 文档完整 - 统一文档,包含所有功能说明
- Python 3.8+
- Node.js 16+
- MySQL 8.0+
- 一键安装
# 右键以管理员身份运行
setup_windows.bat
自动执行:检查环境 → 创建虚拟环境 → 安装依赖 → 创建数据库 → 运行迁移 → 导入数据
- 启动服务
# 同时启动前后端(推荐)
run_all.bat
# 或分别启动
run_backend.bat # 启动Django后端
run_frontend.bat # 启动Vue前端
- 访问应用
- 前端地址: http://localhost:5173
- 后端API: http://127.0.0.1:8000
- 管理后台: http://127.0.0.1:8000/admin
- 测试账户
- 普通用户:
fooduser
/12345678
- 管理员:
admin
/admin
# 数据库重置
reset_database.bat # 重置数据库和数据
# API测试(直接使用Python脚本)
cd backend && python test_all_apis.py
📖 详细脚本使用说明: 请查看下方"Windows脚本详细指南"章节
- 数据库名:
daily_eat_db
- 用户名:
test
- 密码:
12345678
- 主机:
localhost:3306
# 1. 克隆项目
git clone <repository-url>
cd daily_eat
# 2. 进入后端目录
cd backend
# 3. 创建并激活虚拟环境
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/Mac
# 4. 安装依赖
pip install -r requirements.txt
# 5. 创建MySQL数据库
python create_mysql_db.py
# 6. 数据库迁移
python manage.py migrate
# 7. 导入食物数据
python manage.py import_foods --file food.csv --create-user fooduser
# 8. 启动开发服务器
python manage.py runserver
# 测试所有API
cd backend
python test_all_apis.py
# 数据管理
python manage_data.py setup
功能模块 | 端点数量 | 状态 | 描述 |
---|---|---|---|
用户认证 | 4个 | ✅ | 注册、登录、Token刷新、用户信息 |
食物管理 | 7个 | ✅ | CRUD、搜索、推荐、统计 |
用餐记录 | 6个 | ✅ | CRUD、筛选、最近记录 |
热量目标 | 4个 | ✅ | 目标设定、更新、删除 |
数据统计 | 2个 | ✅ | 每日统计、周统计 |
后端总计:23个API端点
页面模块 | 功能特性 | 状态 | 描述 |
---|---|---|---|
🎡 转盘页面 | 随机选择、动画效果 | ✅ | 转盘式食物选择,解决选择困难症 |
🍽️ 食物管理 | CRUD、搜索、分类 | ✅ | 个人食物库管理,支持多餐次标记 |
📝 用餐记录 | 记录、查看、统计 | ✅ | 详细用餐记录,支持日期筛选 |
📊 数据统计 | 图表、趋势、目标 | ✅ | 热量统计分析,目标达成情况 |
🔐 用户系统 | 登录、注册、权限 | ✅ | 完整的用户认证和权限管理 |
前端总计:5个核心页面模块
脚本工具 | 功能 | 状态 | 描述 |
---|---|---|---|
setup_windows.bat | 一键部署 | ✅ | 自动安装配置整个项目 |
run_all.bat | 启动服务 | ✅ | 同时启动前后端服务 |
run_backend.bat | 启动后端 | ✅ | 启动Django后端服务 |
run_frontend.bat | 启动前端 | ✅ | 启动Vue前端服务 |
reset_database.bat | 数据重置 | ✅ | 重置数据库和示例数据 |
部署工具:5个批处理脚本
问题: 'python' 不是内部或外部命令
解决方案:
- 确保Python已添加到系统PATH环境变量
- 重启命令行窗口
- 或使用完整路径:
C:\Python39\python.exe
问题: 'node' 不是内部或外部命令
解决方案:
- 确保Node.js已添加到系统PATH环境变量
- 重启命令行窗口
- 检查安装:访问 https://nodejs.org/
问题: 数据库连接失败
解决方案:
# 检查MySQL服务状态
services.msc # 查找MySQL服务并启动
# 验证连接参数
用户名: test
密码: 12345678
主机: localhost
端口: 3306
问题: 端口8000或5173已被占用
解决方案:
# 查看端口占用
netstat -ano | findstr :8000
netstat -ano | findstr :5173
# 结束占用进程
taskkill /PID <进程ID> /F
问题: 虚拟环境激活失败
解决方案:
# 删除并重新创建虚拟环境
cd backend
rmdir /s venv
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
问题: 拒绝访问
或权限不足
解决方案:
- 右键以管理员身份运行批处理文件
- 检查Windows防火墙设置
- 确保对项目目录有写权限
如果遇到问题,请按以下步骤排查:
- 检查环境:确保Python、Node.js、MySQL已正确安装
- 检查服务:确保MySQL服务正在运行
- 检查端口:确保8000和5173端口未被占用
- 重新安装:运行
setup_windows.bat
重新安装 - 重置数据库:运行
reset_database.bat
重置数据库
本项目旨在开发名为"今天吃什么?"的Web应用程序的后端服务。后端服务将负责:
- 用户管理
- 个人食物库管理
- 每日五餐饮食记录的存储与检索
- 基于食物库的随机抽取逻辑
- 每日卡路里摄入量的计算与统计
- 用户每日热量目标的设定与跟踪
后端服务将为前端应用提供数据支持,最终服务于:
- 注重个人饮食管理
- 希望记录饮食习惯
- 有"选择困难症"
- 希望追踪卡路里摄入
- 并设定和监控饮食目标的用户
本文档详细描述后端服务的技术选型、数据库设计、API接口定义以及主要功能模块的后端实现要点。
- 框架: Django 5.2.2
- API框架: Django REST Framework 3.16.0
- 认证: djangorestframework-simplejwt 5.5.0
- 跨域支持: django-cors-headers 4.7.0
- 过滤搜索: django-filter 25.1
- 数据库: SQLite (开发) / PostgreSQL (生产推荐)
- Python: 3.8+
- 包管理: pip + venv
- API测试: 内置测试脚本
- 文档: Markdown格式
- RESTful API设计 - 标准HTTP方法和状态码
- JWT认证机制 - 无状态认证,支持Token刷新
- 权限控制 - 用户数据隔离,安全可靠
- 数据验证 - 完整的输入验证和错误处理
- 模块化设计 - 清晰的代码结构,易于维护
应用核心包含四个数据表:Users (用户表), Foods (食物表), MealLogs (用餐记录表), 以及新增的 DailyCalorieGoals (每日热量目标表)。
将直接使用 Django 内置的 django.contrib.auth.models.User
模型。其核心字段包括:
- id (主键)
- username (用户名)
- password (密码哈希)
- email (邮箱,可选)
- first_name (名,可选)
- last_name (姓,可选)
- date_joined (注册日期)
- last_login (最后登录日期)
用于存储用户个人食物库中的条目。
字段名 | Django Model Field 类型 | 描述 | 约束/备注 |
---|---|---|---|
food_id | AutoField | 食物唯一标识 (主键) | Primary Key |
user | ForeignKey(User) | 所属用户,关联到 Users 表 | on_delete=models.CASCADE |
name | CharField(max_length=100) | 食物名称 | 不允许为空 |
description | TextField() | 食物描述、备注或简单做法 | 可选, blank=True, null=True |
image_url | URLField() | 食物图片链接 | 可选, blank=True, null=True |
calories | IntegerField() | 该食物一份的热量 (单位: 千卡/kcal) | 可选, blank=True, null=True, 建议非负 |
is_for_breakfast | BooleanField() | 是否适合作为早餐 | default=False |
is_for_lunch | BooleanField() | 是否适合作为中餐 | default=False |
is_for_afternoon_tea | BooleanField() | 是否适合作为下午茶 | default=False |
is_for_dinner | BooleanField() | 是否适合作为晚餐 | default=False |
is_for_supper | BooleanField() | 是否适合作为夜宵 | default=False |
tags | CharField(max_length=255) | 用户自定义标签 (逗号分隔, 如 "快手,健康") | 可选, blank=True, null=True |
created_at | DateTimeField() | 条目创建时间 | auto_now_add=True |
updated_at | DateTimeField() | 条目最后更新时间 | auto_now=True |
用于记录用户每日的实际用餐情况。
字段名 | Django Model Field 类型 | 描述 | 约束/备注 |
---|---|---|---|
log_id | AutoField | 用餐记录唯一标识 (主键) | Primary Key |
user | ForeignKey(User) | 所属用户,关联到 Users 表 | on_delete=models.CASCADE |
food | ForeignKey(Foods) | 记录的具体食物,关联到 Foods 表 | on_delete=models.CASCADE |
meal_type_recorded | CharField(max_length=20) | 用户记录时选择的餐次类型 | 例如: "早餐", "中餐", "下午茶", "晚餐", "夜宵" |
eaten_at_datetime | DateTimeField() | 实际用餐的日期和时间 | default=timezone.now (Django) |
notes | TextField() | 关于这顿饭的额外备注 | 可选, blank=True, null=True |
created_at | DateTimeField() | 记录创建时间 | auto_now_add=True |
updated_at | DateTimeField() | 记录最后更新时间 | auto_now=True |
用于存储用户设定的每日热量摄入目标。每个用户最多拥有一个活跃的每日热量目标记录。
字段名 | Django Model Field 类型 | 描述 | 约束/备注 |
---|---|---|---|
id | AutoField | 目标记录ID (主键) | Primary Key |
user | OneToOneField(User) | 所属用户,关联到 Users 表 | on_delete=models.CASCADE, related_name='daily_calorie_goal' |
target_calories | IntegerField() | 每日目标摄入热量 (单位: 千卡/kcal) | 可选, null=True, blank=True (用户可能未设置) |
updated_at | DateTimeField() | 目标最后更新时间 | auto_now=True |
created_at | DateTimeField() | 目标创建时间 | auto_now_add=True |
以下所有API端点(除认证相关)均需要用户通过JWT进行认证。API根路径暂定为
/api/v1/
。
-
POST /auth/register/
新用户注册 -
POST /auth/login/
用户登录,获取访问令牌和刷新令牌 -
POST /auth/token/refresh/
使用刷新令牌获取新的访问令牌 -
GET /auth/me/
获取当前已认证用户的基本信息
-
GET /foods/ 获取当前登录用户的所有食物条目
- 支持搜索:
?search=关键词
- 支持餐次筛选:
?meal_type=早餐
- 支持标签筛选:
?tags_contain=健康
- 支持排序:
?ordering=-created_at
- 支持搜索:
-
POST /foods/ 添加新食物条目
-
GET /foods/{food_id}/ 获取指定 ID 的食物详情
-
PUT /foods/{food_id}/ 完整更新指定 ID 的食物信息
-
PATCH /foods/{food_id}/ 部分更新指定 ID 的食物信息
-
DELETE /foods/{food_id}/ 删除指定 ID 的食物
-
GET /foods/suggest/ 为用户指定餐次随机推荐一个食物
- 必需参数:
?meal_type=早餐|中餐|下午茶|晚餐|夜宵
- 必需参数:
-
GET /foods/stats/ ⭐ 获取用户食物库统计信息
- 返回:总食物数、各餐次食物数、平均热量等
-
GET /meal-logs/ 获取当前登录用户的用餐记录
- 支持日期筛选:
?date=2025-06-05
- 支持日期范围:
?start_date=2025-06-01&end_date=2025-06-05
- 支持餐次筛选:
?meal_type_recorded=早餐
- 支持排序:
?ordering=-eaten_at_datetime
- 支持日期筛选:
-
POST /meal-logs/ 添加新的用餐记录
-
GET /meal-logs/{log_id}/ 获取指定 ID 的用餐记录详情
-
PUT /meal-logs/{log_id}/ 完整更新指定 ID 的用餐记录
-
PATCH /meal-logs/{log_id}/ 部分更新指定 ID 的用餐记录
-
DELETE /meal-logs/{log_id}/ 删除指定 ID 的用餐记录
-
GET /meal-logs/recent/ ⭐ 获取最近的用餐记录
- 可选参数:
?limit=10
(默认10条)
- 可选参数:
-
GET /stats/daily-calories/ 描述: 获取用户在指定日期的总卡路里摄入情况,并对比其设定的目标 查询参数: date (必需, YYYY-MM-DD) 成功响应 (200 OK):
{ "date": "2025-06-05", "total_calories_consumed": 1500, "target_calories": 2000, "remaining_calories": 500, "calorie_deficit_or_surplus": -500, "breakdown_by_meal_type": { "早餐": 400, "中餐": 600, "晚餐": 500 } }
-
GET /stats/weekly/ ⭐ 描述: 获取用户一周的饮食统计数据 查询参数: date (可选, YYYY-MM-DD, 默认今天作为结束日期) 成功响应 (200 OK):
{ "start_date": "2025-05-30", "end_date": "2025-06-05", "total_calories": 10500, "total_meals": 21, "avg_daily_calories": 1500.0, "daily_stats": { "2025-06-05": { "total_calories": 1500, "meal_count": 3, "breakdown_by_meal_type": { "早餐": 1, "中餐": 1, "晚餐": 1 } } } }
-
GET /goals/daily-calorie/
描述: 获取当前登录用户的每日热量目标
成功响应 (200 OK):{ "user_id": 1, "target_calories": 2000, "updated_at": "2025-06-04T10:30:00Z" }
-
POST /goals/daily-calorie/
描述: 为当前登录用户创建每日热量目标
请求体:{ "target_calories": 2000 }
-
PUT /goals/daily-calorie/
描述: 更新当前登录用户的每日热量目标
请求体:{ "target_calories": 1800 }
-
DELETE /goals/daily-calorie/
描述: 删除(或重置)当前用户的每日热量目标
成功响应: 204 No Content
功能模块 | 实现状态 | 核心特性 |
---|---|---|
用户认证系统 | ✅ 完成 | JWT认证、用户注册登录、Token刷新 |
食物库管理 | ✅ 完成 | CRUD操作、搜索筛选、随机推荐、统计分析 |
用餐记录 | ✅ 完成 | 完整记录管理、日期筛选、最近记录查询 |
热量目标 | ✅ 完成 | 目标设定、更新删除、与统计集成 |
数据统计 | ✅ 完成 | 每日统计、周统计、目标对比分析 |
权限控制 | ✅ 完成 | 用户数据隔离、API权限验证 |
数据验证 | ✅ 完成 | 输入验证、错误处理、数据完整性 |
daily_eat/
├── 🪟 Windows 部署脚本
│ ├── setup_windows.bat # 一键部署脚本
│ ├── run_backend.bat # 启动后端服务
│ ├── run_frontend.bat # 启动前端服务
│ ├── run_all.bat # 同时启动前后端
│ └── reset_database.bat # 重置数据库
├── 📚 文档
│ └── README.md # 项目主文档(包含所有信息)
├── 🔧 后端项目 (backend/)
│ ├── daily_eat_backend/ # Django项目配置
│ │ ├── settings.py # 项目设置 (MySQL配置)
│ │ └── urls.py # 主URL路由
│ ├── daily_eat/ # 主应用
│ │ ├── models.py # 数据模型 (4个核心模型)
│ │ ├── serializers.py # API序列化器 (完整实现)
│ │ ├── views.py # API视图 (23个端点)
│ │ ├── urls.py # 应用URL配置
│ │ ├── admin.py # Django管理界面
│ │ ├── migrations/ # 数据库迁移文件
│ │ └── management/commands/ # 管理命令
│ │ └── import_foods.py # 食物数据导入命令
│ ├── venv/ # Python虚拟环境
│ ├── requirements.txt # Python依赖列表
│ ├── create_mysql_db.py # MySQL数据库创建脚本
│ ├── food.csv # 食物数据文件 (100种食物)
│ ├── manage.py # Django管理脚本
│ ├── test_*.py # API测试脚本
│ ├── verify_import.py # 数据导入验证脚本
│ ├── API_DOCUMENTATION.md # 详细API文档
│ └── PROJECT_SUMMARY.md # 项目完成总结
├── 🎨 前端项目 (frontend/)
│ ├── src/ # Vue源代码
│ │ ├── views/ # 页面组件
│ │ │ ├── FoodWheelView.vue # 转盘页面
│ │ │ ├── FoodsView.vue # 食物管理
│ │ │ ├── MealLogsView.vue # 用餐记录
│ │ │ └── StatsView.vue # 统计页面
│ │ ├── stores/ # Pinia状态管理
│ │ ├── router/ # Vue路由配置
│ │ └── components/ # 公共组件
│ ├── public/ # 静态资源
│ ├── node_modules/ # 前端依赖
│ ├── package.json # 前端依赖配置
│ └── vite.config.js # Vite构建配置
└── .gitignore # Git忽略文件
项目包含完整的示例数据,便于测试和演示:
- 演示用户:
demo
/demo123456
- 示例食物:8种不同类型的食物,涵盖各个餐次
- 用餐记录:最近7天的模拟用餐数据
- 热量目标:默认2000千卡的每日目标
所有API端点都经过完整测试:
# 运行完整API测试
python test_api.py
# 运行演示用户测试
python test_demo_user.py
测试覆盖:
- ✅ 用户认证流程
- ✅ 食物CRUD操作
- ✅ 用餐记录管理
- ✅ 热量目标设定
- ✅ 统计数据查询
- ✅ 权限验证
- ✅ 错误处理
技术实现:
- ✅ DRF Simple JWT - 无状态JWT认证
- ✅ UserCreateSerializer - 用户注册验证
- ✅ UserRegistrationView - 注册API视图
- ✅ UserProfileView - 用户信息获取
- ✅ 权限控制 - IsAuthenticated装饰器
核心特性:
- JWT Token认证机制
- 用户名和邮箱唯一性验证
- 密码强度要求 (最少8位)
- Token自动刷新机制
技术实现:
- ✅ FoodSerializer - 完整数据序列化
- ✅ FoodViewSet - RESTful CRUD操作
- ✅ 权限隔离 - 用户只能访问自己的食物
- ✅ 搜索筛选 - django-filter集成
- ✅ 随机推荐 - suggest自定义action
- ✅ 统计分析 - stats自定义action
核心特性:
- 按餐次类型筛选 (早餐/中餐/下午茶/晚餐/夜宵)
- 关键词搜索 (名称、描述、标签)
- 热量值验证 (非负数检查)
- 餐次适用性标记
技术实现:
- ✅ MealLogSerializer - 嵌套食物信息
- ✅ MealLogViewSet - 完整CRUD功能
- ✅ 日期筛选 - 单日和日期范围
- ✅ 餐次筛选 - 按用餐类型
- ✅ 最近记录 - recent自定义action
核心特性:
- 食物关联验证 (确保属于当前用户)
- 用餐时间记录 (默认当前时间)
- 备注信息支持
- 按时间排序显示
技术实现:
- ✅ DailyCaloriesStatsAPIView - 每日统计
- ✅ WeeklyStatsAPIView - 周统计分析
- ✅ 目标对比 - 与用户设定目标比较
- ✅ 数据聚合 - Django ORM聚合查询
核心特性:
- 每日热量摄入统计
- 目标达成情况分析
- 餐次热量分布
- 7天数据趋势分析
技术实现:
- ✅ DailyCalorieGoalSerializer - 目标数据序列化
- ✅ DailyCalorieGoalAPIView - 目标管理API
- ✅ OneToOneField关系 - 一用户一目标
- ✅ get_or_create模式 - 智能创建/更新
核心特性:
- 每日热量目标设定
- 目标值验证 (0-10000千卡范围)
- 与统计模块集成
- 目标历史记录
环境准备:
# 确保Python 3.8+已安装
python --version
# 克隆项目
git clone <repository-url>
cd daily_eat/backend
依赖安装:
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate
# 安装依赖包
pip install django==5.2.2
pip install djangorestframework==3.16.0
pip install djangorestframework-simplejwt==5.5.0
pip install django-cors-headers==4.7.0
pip install django-filter==25.1
pip install requests # 用于API测试
数据库初始化:
# 执行数据库迁移
python manage.py migrate
# 创建超级用户 (可选)
python manage.py createsuperuser
# 创建示例数据 (推荐)
python manage.py create_sample_data
启动服务:
# 启动开发服务器
python manage.py runserver
# 服务将在 http://127.0.0.1:8000 启动
# API根路径: http://127.0.0.1:8000/api/v1/
# 管理界面: http://127.0.0.1:8000/admin/
环境变量配置:
# 设置环境变量
export DJANGO_SECRET_KEY="your-secret-key"
export DJANGO_DEBUG=False
export DJANGO_ALLOWED_HOSTS="yourdomain.com,www.yourdomain.com"
export DATABASE_URL="postgresql://user:password@localhost/dbname"
生产环境设置:
# settings.py 生产环境配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'daily_eat_db',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
# 静态文件配置
STATIC_ROOT = '/path/to/static/files'
STATIC_URL = '/static/'
# 安全设置
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
使用Gunicorn部署:
# 安装Gunicorn
pip install gunicorn
# 启动Gunicorn服务器
gunicorn daily_eat_backend.wsgi:application --bind 0.0.0.0:8000
认证流程:
# 1. 用户注册
curl -X POST http://127.0.0.1:8000/api/v1/auth/register/ \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "testpass123",
"email": "[email protected]"
}'
# 2. 用户登录
curl -X POST http://127.0.0.1:8000/api/v1/auth/login/ \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "testpass123"
}'
# 响应示例:
# {
# "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
# "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
# }
食物管理:
# 创建食物 (需要认证)
curl -X POST http://127.0.0.1:8000/api/v1/foods/ \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "燕麦粥",
"description": "健康的早餐选择",
"calories": 150,
"is_for_breakfast": true,
"tags": "健康,快手"
}'
# 获取食物推荐
curl "http://127.0.0.1:8000/api/v1/foods/suggest/?meal_type=早餐" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
统计查询:
# 每日热量统计
curl "http://127.0.0.1:8000/api/v1/stats/daily-calories/?date=2025-06-05" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# 周统计
curl "http://127.0.0.1:8000/api/v1/stats/weekly/" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
运行API测试:
# 确保服务器正在运行
python manage.py runserver
# 在另一个终端运行测试
python test_demo_user.py
测试覆盖范围:
- ✅ 用户认证 (注册、登录、Token刷新)
- ✅ 食物管理 (CRUD、搜索、推荐)
- ✅ 用餐记录 (创建、查询、筛选)
- ✅ 热量目标 (设定、更新、删除)
- ✅ 数据统计 (每日、周统计)
- ✅ 权限验证 (数据隔离、访问控制)
- 错误处理与日志: DRF 提供标准异常处理机制,应配置合适日志记录
- 安全性: 确保所有需要认证的 API 端点都配置正确权限类(如 IsAuthenticated)
- 数据校验: 使用 DRF Serializers 进行严格校验
- Web 安全: Django 已内置 CSRF、XSS 防护,ORM 防 SQL 注入,仍需注意业务逻辑安全
- 数据库迁移: 使用 Django 的 makemigrations 和 migrate 管理结构变更
- CORS 配置: 配置 django-cors-headers 允许前端跨域请求
- 性能考虑: 频繁查询字段可加索引,避免 N+1 查询,合理用 select_related/prefetch_related
- 复杂统计: 可考虑异步任务(如 Celery)或缓存
- 代码规范与测试: 遵循 PEP 8,编写单元/集成测试
✅ 核心功能 100% 完成
- 用户认证系统 - JWT认证,安全可靠
- 食物库管理 - 完整CRUD,搜索推荐
- 用餐记录管理 - 详细记录,灵活查询
- 热量目标管理 - 目标设定,进度跟踪
- 数据统计分析 - 每日周统计,趋势分析
✅ 技术实现 100% 达标
- RESTful API设计 - 23个端点,功能完整
- 数据库设计 - 4个核心模型,关系清晰
- 权限控制 - 用户数据隔离,安全防护
- 数据验证 - 完整验证,错误处理
- 文档完善 - API文档,使用指南
✅ 质量保证 100% 覆盖
- 功能测试 - 所有端点验证通过
- 示例数据 - 完整演示环境
- 部署文档 - 开发生产环境指南
- 代码规范 - 清晰结构,易于维护
- 完整的JWT认证体系 - 无状态认证,支持Token刷新
- 灵活的搜索筛选 - 多维度查询,用户体验优秀
- 智能的食物推荐 - 基于餐次的随机推荐算法
- 全面的统计分析 - 每日周统计,目标对比分析
- 严格的权限控制 - 用户数据完全隔离,安全可靠
- 完善的数据验证 - 输入验证,业务逻辑检查
- 优雅的错误处理 - 友好的错误信息,调试便利
对用户的价值:
- 🍽️ 解决"今天吃什么"的选择困难
- 📊 科学的饮食记录和分析
- 🎯 个性化的热量目标管理
- 📱 便捷的API接口,支持多端开发
对开发者的价值:
- 🏗️ 完整的Django REST API项目示例
- 🔐 JWT认证最佳实践
- 📚 详细的文档和代码注释
- 🧪 完整的测试用例和示例数据
功能扩展:
- 🥗 营养成分详细记录 (蛋白质、脂肪、碳水化合物)
- 📏 用餐份量和重量记录
- 📈 智能饮食分析报告生成
- 🏃 多类型健康目标 (步数、饮水量、睡眠等)
- 🤖 AI智能推荐 (基于历史数据和目标)
- 📸 食物图片上传和识别
- 👥 社交功能 (分享、点赞、评论)
- 🏆 成就系统和激励机制
技术优化:
- ⚡ Redis缓存优化
- 📊 数据分析和机器学习
- 🔄 实时数据同步
- 📱 移动端推送通知
- 🌐 国际化支持
- 🔍 全文搜索引擎集成
本项目可作为以下用途:
- 📖 Django REST Framework学习示例
- 🏗️ 个人健康管理应用基础框架
- 🔧 API开发最佳实践参考
- 🎓 教学和培训材料
项目状态: ✅ 开发完成,功能完整,可用于生产环境
技术支持:
- 📋 详细API文档:
backend/API_DOCUMENTATION.md
- 📊 项目总结:
backend/PROJECT_SUMMARY.md
- 🧪 测试脚本:
backend/test_*.py
- 💡 示例数据:
python manage.py create_sample_data
快速开始:
cd backend
venv\Scripts\activate
python manage.py runserver
python test_demo_user.py
演示账户:
- 用户名:
demo
- 密码:
demo123456
setup_windows.bat # 一键部署项目(需管理员权限)
run_all.bat # 同时启动前后端(推荐)
run_backend.bat # 仅启动后端服务
run_frontend.bat # 仅启动前端服务
reset_database.bat # 重置数据库(会删除数据)
cd backend && python test_all_apis.py # 测试所有API
cd backend && python manage_data.py # 数据管理工具
- 前端应用: http://localhost:5173
- 后端API: http://127.0.0.1:8000/api/v1/
- 管理后台: http://127.0.0.1:8000/admin/
- 普通用户:
fooduser
/12345678
- 管理员:
admin
/admin
- 数据库: MySQL (daily_eat_db)
- 用户: test / 12345678
- 地址: localhost:3306
- 框架: Vue 3 (Composition API)
- UI库: Element Plus
- 状态管理: Pinia
- 路由: Vue Router 4
- HTTP客户端: Axios
- 图表库: Vue ECharts
- 构建工具: Vite
- 开发语言: JavaScript
本项目前端已完全移除移动端响应式设计,专门针对PC端进行了全面优化:
- PC端专用:移除所有宽度限制,最小宽度1024px,充分利用PC端屏幕空间
- 卡片式设计:使用圆角卡片布局,现代化视觉效果
- 渐变背景:采用紫色渐变主题,提升视觉层次
- 固定布局:移除所有响应式断点,专注PC端体验
- 顶部水平导航:替代移动端的侧边栏,更适合PC端操作
- 面包屑导航:清晰的页面层级关系
- 用户头像菜单:右上角用户信息和操作菜单
- 欢迎横幅:全宽渐变背景,突出用户欢迎信息
- 快速操作卡片:4列网格布局,每个操作都有独特的渐变图标
- 统计数据展示:大尺寸数字显示,配色区分不同数据类型
- 餐次分布:可视化展示各餐次热量分布
- 转盘式食物选择:解决选择困难症的核心功能
- 动画效果:流畅的转盘旋转动画
- 随机推荐:基于餐次的智能推荐
- 浮动显示:选中食物以弹窗形式展示
- 页面头部:标题、描述和主要操作按钮
- 搜索筛选区:水平布局的搜索和筛选控件
- 数据表格:优化的表格样式,支持排序和分页
- CRUD操作:完整的增删改查功能
- 统计概览:顶部显示记录数和今日热量
- 时间筛选:日期选择器和餐次筛选
- 记录展示:详细的用餐信息展示,包含食物图标
- 操作便捷:快速编辑和删除功能
- 多维度统计:每日统计、周统计、目标设置
- 可视化图表:进度条、统计卡片、数据表格
- 目标管理:独立的目标设置区域
- 数据对比:目标与实际的对比分析
- 用户信息展示:大头像、用户名、注册信息
- 数据概览:4个关键指标的卡片展示
- 食物库统计:按餐次分类的食物统计
- 快速导航:到其他功能页面的快捷入口
- 主色调:#409eff (Element Plus蓝)
- 渐变背景:#667eea → #764ba2
- 成功色:#67c23a
- 警告色:#e6a23c
- 危险色:#f56c6c
- 信息色:#909399
- 标题字体:28px-32px,font-weight: 600
- 副标题:18px-24px,font-weight: 500
- 正文字体:14px-16px,font-weight: 400
- 小字体:12px-13px,color: #909399
- 页面边距:24px-32px
- 卡片间距:24px-32px
- 元素间距:8px-16px
- 内容边距:16px-24px
- 路由懒加载:所有页面组件都使用动态导入
- 组件按需加载:Element Plus组件按需引入
- CSS作用域:使用scoped样式避免样式冲突
- 深度选择器:使用:deep()修改第三方组件样式
- CSS变量:减少重复的样式定义
- SVG图标:使用Element Plus的SVG图标系统
- 图标复用:统一的图标使用规范
frontend/
├── src/
│ ├── views/ # 页面组件
│ │ ├── FoodWheelView.vue # 转盘页面
│ │ ├── FoodsView.vue # 食物管理
│ │ ├── MealLogsView.vue # 用餐记录
│ │ ├── StatsView.vue # 统计页面
│ │ ├── DashboardView.vue # 首页仪表板
│ │ ├── ProfileView.vue # 个人资料
│ │ ├── LoginView.vue # 登录页面
│ │ └── RegisterView.vue # 注册页面
│ ├── stores/ # Pinia状态管理
│ │ ├── auth.js # 认证状态
│ │ ├── foods.js # 食物数据状态
│ │ └── mealLogs.js # 用餐记录状态
│ ├── router/ # Vue路由配置
│ │ └── index.js # 路由定义
│ ├── components/ # 公共组件
│ │ ├── FoodWheel.vue # 转盘组件
│ │ └── StatCard.vue # 统计卡片组件
│ ├── api/ # API接口
│ │ ├── auth.js # 认证API
│ │ ├── foods.js # 食物API
│ │ ├── mealLogs.js # 用餐记录API
│ │ └── stats.js # 统计API
│ ├── assets/ # 静态资源
│ ├── App.vue # 根组件
│ └── main.js # 入口文件
├── public/ # 静态资源
│ └── favicon.ico # 网站图标
├── package.json # 前端依赖配置
├── vite.config.js # Vite构建配置
└── index.html # HTML模板
- 框架: Django 5.2.2
- API框架: Django REST Framework 3.16.0
- 认证: djangorestframework-simplejwt 5.5.0
- 跨域支持: django-cors-headers 4.7.0
- 过滤搜索: django-filter 25.1
- 数据库: MySQL 8.0+ (生产) / SQLite (开发)
- Python: 3.8+
1. Users (用户表)
- 使用Django内置用户模型
- 包含用户名、密码、邮箱等基本信息
2. Foods (食物表)
字段名 | 类型 | 描述 |
---|---|---|
food_id | AutoField | 食物唯一标识 (主键) |
user | ForeignKey(User) | 所属用户 |
name | CharField(100) | 食物名称 |
description | TextField | 食物描述 |
image_url | URLField | 食物图片链接 |
calories | IntegerField | 热量 (千卡) |
is_for_breakfast | BooleanField | 是否适合早餐 |
is_for_lunch | BooleanField | 是否适合中餐 |
is_for_afternoon_tea | BooleanField | 是否适合下午茶 |
is_for_dinner | BooleanField | 是否适合晚餐 |
is_for_supper | BooleanField | 是否适合夜宵 |
tags | CharField(255) | 用户自定义标签 |
created_at | DateTimeField | 创建时间 |
updated_at | DateTimeField | 更新时间 |
3. MealLogs (用餐记录表)
字段名 | 类型 | 描述 |
---|---|---|
log_id | AutoField | 记录唯一标识 (主键) |
user | ForeignKey(User) | 所属用户 |
food | ForeignKey(Foods) | 关联食物 |
meal_type_recorded | CharField(20) | 餐次类型 |
eaten_at_datetime | DateTimeField | 用餐时间 |
notes | TextField | 备注信息 |
created_at | DateTimeField | 创建时间 |
updated_at | DateTimeField | 更新时间 |
4. DailyCalorieGoals (每日热量目标表)
字段名 | 类型 | 描述 |
---|---|---|
id | AutoField | 目标记录ID (主键) |
user | OneToOneField(User) | 所属用户 |
target_calories | IntegerField | 每日目标热量 |
created_at | DateTimeField | 创建时间 |
updated_at | DateTimeField | 更新时间 |
1. 用户注册
- URL:
POST /auth/register/
- 权限: 无需认证
- 功能: 新用户注册,支持用户名、邮箱、密码
2. 用户登录
- URL:
POST /auth/login/
- 权限: 无需认证
- 功能: 用户登录,返回JWT访问令牌和刷新令牌
3. 刷新Token
- URL:
POST /auth/token/refresh/
- 权限: 无需认证
- 功能: 使用刷新令牌获取新的访问令牌
4. 获取用户信息
- URL:
GET /auth/me/
- 权限: 需要认证
- 功能: 获取当前已认证用户的基本信息
1. 获取食物列表
- URL:
GET /foods/
- 权限: 需要认证
- 功能: 获取所有食物数据(全局共享)
- 支持: 搜索、餐次筛选、标签筛选、排序、分页
2. 创建食物
- URL:
POST /foods/
- 权限: 需要认证
- 功能: 添加新食物到食物库
3. 获取食物详情
- URL:
GET /foods/{food_id}/
- 权限: 需要认证
- 功能: 获取指定食物的详细信息
4. 更新食物
- URL:
PUT/PATCH /foods/{food_id}/
- 权限: 需要认证(仅创建者)
- 功能: 完整或部分更新食物信息
5. 删除食物
- URL:
DELETE /foods/{food_id}/
- 权限: 需要认证(仅创建者)
- 功能: 删除指定食物
6. 随机推荐食物
- URL:
GET /foods/suggest/
- 权限: 需要认证
- 功能: 根据餐次类型随机推荐食物
7. 食物库统计
- URL:
GET /foods/stats/
- 权限: 需要认证
- 功能: 获取食物库统计信息(总数、各餐次数量、平均热量等)
1. 获取用餐记录列表
- URL:
GET /meal-logs/
- 权限: 需要认证
- 功能: 获取用户的用餐记录
- 支持: 日期筛选、餐次筛选、排序、分页
2. 创建用餐记录
- URL:
POST /meal-logs/
- 权限: 需要认证
- 功能: 添加新的用餐记录
3. 获取记录详情
- URL:
GET /meal-logs/{log_id}/
- 权限: 需要认证
- 功能: 获取指定用餐记录的详细信息
4. 更新用餐记录
- URL:
PUT/PATCH /meal-logs/{log_id}/
- 权限: 需要认证
- 功能: 完整或部分更新用餐记录
5. 删除用餐记录
- URL:
DELETE /meal-logs/{log_id}/
- 权限: 需要认证
- 功能: 删除指定用餐记录
6. 获取最近记录
- URL:
GET /meal-logs/recent/
- 权限: 需要认证
- 功能: 获取最近的用餐记录(默认10条)
1. 每日热量统计
- URL:
GET /stats/daily-calories/
- 权限: 需要认证
- 功能: 获取指定日期的热量摄入统计
- 包含: 总热量、目标对比、剩余热量、餐次分布
2. 周统计分析
- URL:
GET /stats/weekly/
- 权限: 需要认证
- 功能: 获取一周的饮食统计数据
- 包含: 总热量、平均热量、每日详情
1. 获取热量目标
- URL:
GET /goals/daily-calorie/
- 权限: 需要认证
- 功能: 获取用户的每日热量目标
2. 创建热量目标
- URL:
POST /goals/daily-calorie/
- 权限: 需要认证
- 功能: 为用户创建每日热量目标
3. 更新热量目标
- URL:
PUT /goals/daily-calorie/
- 权限: 需要认证
- 功能: 更新用户的每日热量目标
4. 删除热量目标
- URL:
DELETE /goals/daily-calorie/
- 权限: 需要认证
- 功能: 删除用户的每日热量目标
- 无状态认证: 使用JWT Token进行用户认证
- Token刷新: 支持访问令牌的自动刷新
- 权限控制: 所有API端点都有适当的权限验证
- 用户数据隔离: 用餐记录、热量目标等个人数据完全隔离
- 食物数据共享: 所有用户可查看所有食物,但只能修改自己创建的食物
- 权限验证: 严格的创建者权限验证
- 数据验证: 使用DRF Serializers进行严格的输入验证
- 错误处理: 友好的错误信息和状态码
- 业务逻辑检查: 热量值、餐次类型等业务规则验证
- 全局可见: 所有用户都能查看所有108种食物数据
- 创建者权限: 只有食物创建者可以修改或删除该食物
- 推荐算法: 从全局食物库中进行随机推荐
- 总食物数量: 108种
- 早餐食物: 38种
- 中餐食物: 61种
- 下午茶食物: 46种
- 晚餐食物: 47种
- 夜宵食物: 44种
backend/
├── daily_eat_backend/ # Django项目配置
│ ├── settings.py # 项目设置 (MySQL配置)
│ ├── urls.py # 主URL路由
│ ├── wsgi.py # WSGI配置
│ └── asgi.py # ASGI配置
├── daily_eat/ # 主应用
│ ├── models.py # 数据模型 (4个核心模型)
│ ├── serializers.py # API序列化器
│ ├── views.py # API视图 (23个端点)
│ ├── urls.py # 应用URL配置
│ ├── admin.py # Django管理界面
│ ├── authentication.py # 自定义认证
│ ├── migrations/ # 数据库迁移文件
│ └── management/ # 管理命令
│ └── commands/
│ └── import_foods.py # 食物数据导入命令
├── venv/ # Python虚拟环境
├── requirements.txt # Python依赖列表
├── create_mysql_db.py # MySQL数据库创建脚本
├── food.csv # 食物数据文件 (108种食物)
├── manage.py # Django管理脚本
├── test_all_apis.py # 统一API测试脚本
└── manage_data.py # 数据管理脚本
daily_eat/
├── 🔧 Windows 批处理脚本
│ ├── setup_windows.bat # 项目初始化安装
│ ├── run_backend.bat # 启动后端服务
│ ├── run_frontend.bat # 启动前端服务
│ ├── run_all.bat # 同时启动前后端
│ └── reset_database.bat # 重置数据库
│
└── backend/
├── 🐍 Python 脚本
├── test_all_apis.py # 统一API测试脚本
├── manage_data.py # 数据管理脚本
└── create_mysql_db.py # MySQL数据库创建
用途: 自动安装和配置整个项目 使用方法: 右键以管理员身份运行 执行步骤:
- 检查Python和Node.js环境
- 创建Python虚拟环境
- 安装后端依赖
- 创建MySQL数据库
- 运行数据库迁移
- 导入食物数据
- 安装前端依赖
- 完成配置
用途: 启动Django开发服务器 端口: 127.0.0.1:8000 功能:
- 自动激活虚拟环境
- 启动Django服务器
- 显示访问地址
用途: 启动Vue开发服务器 端口: localhost:5173 功能:
- 启动Vite开发服务器
- 热重载支持
用途: 在两个独立窗口中同时启动前后端服务 功能:
- 自动启动后端服务
- 延迟3秒后启动前端服务
- 显示所有访问地址
用途: 完全重置MySQL数据库
警告:
- 删除现有数据库
- 重新创建数据库
- 运行迁移
- 创建超级用户
- 导入食物数据
功能: 测试所有后端API接口
用法:
# 测试所有API
python test_all_apis.py
# 测试特定类型的API
python test_all_apis.py auth # 认证API
python test_all_apis.py foods # 食物API
python test_all_apis.py meals # 用餐记录API
python test_all_apis.py stats # 统计API
python test_all_apis.py goals # 目标管理API
功能: 管理数据库数据(用户、食物、用餐记录)
用法:
# 显示帮助
python manage_data.py
# 创建测试用户
python manage_data.py create-user [username] [password]
# 导入食物数据
python manage_data.py import-foods [csv_file]
# 创建测试用餐记录
python manage_data.py create-meals [username] [days]
# 重置数据库
python manage_data.py reset
# 显示统计信息
python manage_data.py stats
# 完整设置(推荐)
python manage_data.py setup
功能: 创建MySQL数据库和用户
setup_windows.bat
- 一键部署run_all.bat
- 启动服务
run_all.bat
- 启动服务- 开发完成后关闭终端窗口
- 检查环境和服务状态
- 查看错误信息并解决
- 必要时运行
reset_database.bat
- 手动清理项目文件(删除venv、node_modules等)
setup_windows.bat
- 重新部署
setup_windows.bat
- 初始化项目run_all.bat
- 启动服务cd backend && python test_all_apis.py
- 验证功能
run_backend.bat
- 启动后端run_frontend.bat
- 启动前端cd backend && python test_all_apis.py
- 测试API
cd backend
python manage_data.py stats # 查看数据统计
python manage_data.py create-meals # 创建测试数据
python manage_data.py reset # 重置数据库
- 检查Python、Node.js、MySQL是否正确安装和运行
- 检查端口8000和5173是否被占用
- 手动清理缓存文件(pycache、node_modules等)
reset_database.bat
- 重置数据库
- 首次使用: 必须先运行
setup_windows.bat
- MySQL要求: 确保MySQL服务已启动
- 端口占用: 确保8000和5173端口未被占用
- 权限问题: 某些操作可能需要管理员权限
- 网络问题: 安装依赖时需要网络连接
A: 检查Python、Node.js、MySQL是否正确安装
A: 检查数据库连接和虚拟环境
A: 删除node_modules重新安装
A: 确保后端服务正在运行
A: 检查MySQL服务和配置
如果遇到问题,请按以下顺序排查:
- 检查本文档的故障排除章节
- 查看控制台错误信息
- 检查系统环境和服务状态
- 重新运行
setup_windows.bat
- Base URL:
http://127.0.0.1:8000/api/v1/
- 认证方式: JWT Bearer Token
- 数据格式: JSON
- 版本: 1.2
- 总端点数: 23个
- URL:
POST /auth/register/
- 权限: 无需认证
- 请求体:
{
"username": "string",
"password": "string",
"email": "string (可选)",
"first_name": "string (可选)",
"last_name": "string (可选)"
}
- 成功响应 (201):
{
"id": 1,
"username": "testuser",
"email": "[email protected]",
"first_name": "",
"last_name": "",
"date_joined": "2025-06-05T10:30:00Z"
}
- URL:
POST /auth/login/
- 权限: 无需认证
- 请求体:
{
"username": "string",
"password": "string"
}
- 成功响应 (200):
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
- URL:
POST /auth/token/refresh/
- 权限: 无需认证
- 请求体:
{
"refresh": "string"
}
- 成功响应 (200):
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
- URL:
GET /auth/me/
- 权限: 需要认证
- 成功响应 (200):
{
"id": 1,
"username": "testuser",
"email": "[email protected]",
"first_name": "",
"last_name": "",
"date_joined": "2025-06-05T10:30:00Z"
}
- URL:
GET /foods/
- 权限: 需要认证
- 查询参数:
meal_type
: 餐次类型筛选 (早餐/中餐/下午茶/晚餐/夜宵)search
: 按名称、描述、标签搜索tags_contain
: 按标签关键词搜索ordering
: 排序字段 (created_at, updated_at, name)page
: 页码 (默认分页,每页20条)
- 成功响应 (200):
{
"count": 108,
"next": "http://127.0.0.1:8000/api/v1/foods/?page=2",
"previous": null,
"results": [
{
"food_id": 1,
"name": "燕麦粥",
"description": "健康的早餐选择",
"image_url": null,
"calories": 150,
"is_for_breakfast": true,
"is_for_lunch": false,
"is_for_afternoon_tea": false,
"is_for_dinner": false,
"is_for_supper": false,
"tags": "健康,快手",
"meal_types": ["早餐"],
"created_at": "2025-06-05T10:30:00Z",
"updated_at": "2025-06-05T10:30:00Z"
}
]
}
- URL:
POST /foods/
- 权限: 需要认证
- 请求体:
{
"name": "string",
"description": "string (可选)",
"image_url": "string (可选)",
"calories": 100,
"is_for_breakfast": true,
"is_for_lunch": false,
"is_for_afternoon_tea": false,
"is_for_dinner": true,
"is_for_supper": false,
"tags": "健康,快手"
}
- URL:
GET /foods/suggest/
- 权限: 需要认证
- 查询参数:
meal_type
: 必需,餐次类型 (早餐/中餐/下午茶/晚餐/夜宵)
- 成功响应 (200):
{
"food_id": 1,
"name": "燕麦粥",
"description": "健康的早餐选择",
"calories": 150,
"meal_types": ["早餐"]
}
- URL:
GET /foods/stats/
- 权限: 需要认证
- 成功响应 (200):
{
"total_foods": 108,
"breakfast_foods": 38,
"lunch_foods": 61,
"afternoon_tea_foods": 46,
"dinner_foods": 47,
"supper_foods": 44,
"foods_with_calories": 95,
"average_calories": 350.5
}
- URL:
GET /meal-logs/
- 权限: 需要认证
- 查询参数:
date
: 按日期筛选 (YYYY-MM-DD)start_date
: 开始日期 (YYYY-MM-DD)end_date
: 结束日期 (YYYY-MM-DD)meal_type_recorded
: 餐次类型筛选ordering
: 排序字段page
: 页码
- 成功响应 (200):
{
"count": 15,
"results": [
{
"log_id": 1,
"food_detail": {
"food_id": 1,
"name": "燕麦粥",
"description": "健康的早餐选择",
"calories": 150,
"meal_types": ["早餐"]
},
"meal_type_recorded": "早餐",
"eaten_at_datetime": "2025-06-05T08:30:00Z",
"notes": "很好吃",
"created_at": "2025-06-05T08:35:00Z",
"updated_at": "2025-06-05T08:35:00Z"
}
]
}
- URL:
POST /meal-logs/
- 权限: 需要认证
- 请求体:
{
"food_id": 1,
"meal_type_recorded": "早餐",
"eaten_at_datetime": "2025-06-05T08:30:00Z",
"notes": "很好吃"
}
- URL:
GET /meal-logs/recent/
- 权限: 需要认证
- 查询参数:
limit
: 限制数量,默认10
- 成功响应 (200):
[
{
"log_id": 1,
"food_detail": {
"food_id": 1,
"name": "燕麦粥",
"calories": 150
},
"meal_type_recorded": "早餐",
"eaten_at_datetime": "2025-06-05T08:30:00Z"
}
]
- URL:
GET /stats/daily-calories/
- 权限: 需要认证
- 查询参数:
date
: 必需,日期 (YYYY-MM-DD)
- 成功响应 (200):
{
"date": "2025-06-05",
"total_calories_consumed": 1500,
"target_calories": 2000,
"remaining_calories": 500,
"calorie_deficit_or_surplus": -500,
"breakdown_by_meal_type": {
"早餐": 400,
"中餐": 600,
"晚餐": 500
}
}
- URL:
GET /stats/weekly/
- 权限: 需要认证
- 查询参数:
date
: 可选,结束日期 (YYYY-MM-DD),默认今天
- 成功响应 (200):
{
"start_date": "2025-05-30",
"end_date": "2025-06-05",
"total_calories": 10500,
"total_meals": 21,
"avg_daily_calories": 1500.0,
"daily_stats": {
"2025-06-05": {
"total_calories": 1500,
"meal_count": 3,
"breakdown_by_meal_type": {
"早餐": 1,
"中餐": 1,
"晚餐": 1
}
}
}
}
- URL:
GET /goals/daily-calorie/
- 权限: 需要认证
- 成功响应 (200) - 已设置目标:
{
"user_id": 1,
"target_calories": 2000,
"created_at": "2025-06-05T10:30:00Z",
"updated_at": "2025-06-05T10:30:00Z"
}
- URL:
POST /goals/daily-calorie/
- 权限: 需要认证
- 请求体:
{
"target_calories": 2000
}
- URL:
PUT /goals/daily-calorie/
- 权限: 需要认证
- 请求体:
{
"target_calories": 1800
}
- URL:
DELETE /goals/daily-calorie/
- 权限: 需要认证
- 成功响应: 204 No Content
# 1. 用户注册
curl -X POST http://127.0.0.1:8000/api/v1/auth/register/ \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "testpass123",
"email": "[email protected]"
}'
# 2. 用户登录
curl -X POST http://127.0.0.1:8000/api/v1/auth/login/ \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "testpass123"
}'
# 创建食物
curl -X POST http://127.0.0.1:8000/api/v1/foods/ \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "燕麦粥",
"description": "健康的早餐选择",
"calories": 150,
"is_for_breakfast": true,
"tags": "健康,快手"
}'
# 获取食物推荐
curl "http://127.0.0.1:8000/api/v1/foods/suggest/?meal_type=早餐" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# 每日热量统计
curl "http://127.0.0.1:8000/api/v1/stats/daily-calories/?date=2025-06-05" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# 周统计
curl "http://127.0.0.1:8000/api/v1/stats/weekly/" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
- 用户认证系统 - JWT认证,安全可靠
- 食物库管理 - 完整CRUD,搜索推荐,108种食物数据
- 用餐记录管理 - 详细记录,灵活查询
- 热量目标管理 - 目标设定,进度跟踪
- 数据统计分析 - 每日周统计,趋势分析
- RESTful API设计 - 23个端点,功能完整
- 数据库设计 - 4个核心模型,关系清晰
- 权限控制 - 用户数据隔离,安全防护
- 数据验证 - 完整验证,错误处理
- 文档完善 - 统一文档,使用指南
- 功能测试 - 所有端点验证通过
- 示例数据 - 完整演示环境
- 部署文档 - 开发生产环境指南
- 代码规范 - 清晰结构,易于维护
- 完整的JWT认证体系 - 无状态认证,支持Token刷新
- 灵活的搜索筛选 - 多维度查询,用户体验优秀
- 智能的食物推荐 - 基于餐次的随机推荐算法
- 全面的统计分析 - 每日周统计,目标对比分析
- 严格的权限控制 - 用户数据完全隔离,安全可靠
- 完善的数据验证 - 输入验证,业务逻辑检查
- 优雅的错误处理 - 友好的错误信息,调试便利
- PC端专用优化 - 移除响应式设计,专注PC端体验
- 食物数据共享 - 全局食物库,丰富用户选择
- Windows一键部署 - 9个批处理脚本,自动化部署
- 🍽️ 解决"今天吃什么"的选择困难
- 📊 科学的饮食记录和分析
- 🎯 个性化的热量目标管理
- 🎡 有趣的转盘式选择体验
- 📱 现代化的PC端界面
- 🏗️ 完整的Django REST API项目示例
- 🔐 JWT认证最佳实践
- 📚 详细的文档和代码注释
- 🧪 完整的测试用例和示例数据
- 🎨 Vue3 + Element Plus前端实践
- 🪟 Windows自动化部署方案
- 🥗 营养成分详细记录 (蛋白质、脂肪、碳水化合物)
- 📏 用餐份量和重量记录
- 📈 智能饮食分析报告生成
- 🏃 多类型健康目标 (步数、饮水量、睡眠等)
- 🤖 AI智能推荐 (基于历史数据和目标)
- 📸 食物图片上传和识别
- 👥 社交功能 (分享、点赞、评论)
- 🏆 成就系统和激励机制
- 📱 移动端应用开发
- 🔔 用餐提醒和通知
- ⚡ Redis缓存优化
- 📊 数据分析和机器学习
- 🔄 实时数据同步
- 📱 移动端推送通知
- 🌐 国际化支持
- 🔍 全文搜索引擎集成
- 🐳 Docker容器化部署
- ☁️ 云服务部署方案
- 📈 性能监控和分析
- 🔒 高级安全特性
- 🍜 更多食物种类和地方特色
- 🏪 餐厅和外卖数据集成
- 📊 营养数据库完善
- 🥘 菜谱和制作方法
- 🛒 食材采购建议
- 💰 价格信息和预算管理
- 整理前: 21个脚本文件,功能分散重复
- 整理后: 11个脚本文件,功能统一高效
- 减少: 47.6% (10个文件)
- ✅ 7个测试脚本 → 1个统一测试脚本
- ✅ 3个数据管理脚本 → 1个统一数据管理脚本
- ✅ 删除5个前端调试文件
- ✅ 删除2个临时调试脚本
- ✅ 一键测试:
test_apis.bat
或python test_all_apis.py
- ✅ 一键数据管理:
python manage_data.py setup
- ✅ 清晰的使用指南: 统一文档说明
- ✅ 统一的命令接口: 减少学习成本
本项目可作为以下用途:
- 📖 Django REST Framework学习示例
- 🏗️ 个人健康管理应用基础框架
- 🔧 API开发最佳实践参考
- 🎓 教学和培训材料
- 🪟 Windows自动化部署参考
- 🎨 Vue3 + Element Plus前端参考
- 操作系统: Windows 10/11
- Python: 3.8+
- Node.js: 16+
- MySQL: 8.0+
- 内存: 至少 4GB RAM
- 磁盘: 至少 2GB 可用空间
- 操作系统: Linux (Ubuntu 20.04+ / CentOS 8+)
- Web服务器: Nginx + Gunicorn
- 数据库: PostgreSQL 13+ / MySQL 8.0+
- 缓存: Redis 6+
- 监控: Prometheus + Grafana
- 日志: ELK Stack
- 依赖更新: 定期更新Python和Node.js依赖
- 安全补丁: 及时应用安全更新
- 数据备份: 定期备份数据库
- 性能监控: 监控API响应时间和错误率
- 文档完整: 本README包含所有必要信息
- 测试脚本: 完整的API测试和验证
- 故障排除: 自动化诊断工具
- 社区支持: 开源项目,欢迎贡献
项目状态: ✅ 开发完成,功能完整,可用于生产环境
快速开始:
# Windows一键部署
setup_windows.bat
# 启动服务
run_all.bat
# 测试API
test_apis.bat
演示账户:
- 普通用户:
fooduser
/12345678
- 管理员:
admin
/admin
访问地址:
- 前端应用: http://localhost:5173
- 后端API: http://127.0.0.1:8000/api/v1/
- 管理后台: http://127.0.0.1:8000/admin/
🎉 项目开发完成!感谢使用"今天吃什么?"个人饮食助手全栈系统!
📖 本文档已整合所有项目相关信息,包含前端、后端、部署、API、脚本等完整说明。