计算机毕设选题:基于Python+Django的健康饮食管理系统设计【源码+文档+调试】

精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖

文章目录

一、项目介绍

基于Python+MySQL的健康饮食管理系统是一个集营养分析、个性化推荐、社区交流为一体的Web应用平台。系统采用Django框架构建后端服务,配合Vue+ElementUI实现用户友好的前端交互界面,通过B/S架构为用户提供便捷的饮食健康管理服务。管理员可以通过后台管理界面维护营养成份信息、菜品类型分类、菜品详细信息,管理用户的饮食记录数据,维护论坛分类体系,处理用户反馈建议和举报记录,确保平台内容的质量和用户体验。普通用户注册登录后可以浏览丰富的营养成份知识库,查询各类菜品的营养信息和制作方法,在社区交流板块与其他用户分享饮食心得,接收系统推送的个性化健康提醒消息,通过弹窗提醒功能及时获取重要通知,并可随时向平台反馈使用建议。整个系统通过MySQL数据库存储用户信息、菜品数据、营养成份数据等核心业务数据,为用户构建了一个全面的健康饮食管理生态圈。

选题背景:

随着现代生活节奏的加快和工作压力的增大,人们的饮食习惯发生了显著变化,不规律饮食、营养搭配不均衡等问题日益突出。很多人由于缺乏专业的营养知识,难以制定科学合理的饮食计划,导致亚健康状态普遍存在。传统的饮食管理方式主要依赖个人经验或简单的纸质记录,缺乏系统性和科学性指导。同时,市面上虽然存在一些健康管理类应用,但大多功能单一,缺乏个性化推荐机制,用户粘性不高。在这样的背景下,开发一个集营养知识普及、个性化饮食推荐、用户互动交流于一体的综合性健康饮食管理系统显得尤为重要。该系统能够帮助用户建立科学的饮食观念,养成良好的饮食习惯,提升生活质量。

选题意义:

本课题的研究具有一定的理论价值和实践意义。从技术层面来看,通过运用Python、Django、Vue等主流Web开发技术,能够验证这些技术栈在健康管理领域的应用效果,为相关系统开发提供技术参考。从实际应用角度分析,该系统能够为用户提供便捷的营养查询服务,帮助用户了解食物的营养成分和热量信息,制定更加科学的饮食方案。社区交流功能的设置能够促进用户之间的经验分享,形成良好的健康饮食氛围。对于管理者而言,系统提供的数据管理和用户反馈功能有助于及时了解用户需求,不断优化服务质量。虽然作为一个毕业设计项目,系统的规模和复杂度相对有限,但其体现的设计思路和实现方法对于健康管理类应用的开发具有借鉴价值,同时也为后续的功能扩展和性能优化奠定了基础。

二、开发环境

  • 大数据技术:Hadoop、Spark、Hive
  • 开发技术:Python、Django框架、Vue、Echarts
  • 软件工具:Pycharm、DataGrip、Anaconda
  • 可视化 工具 Echarts

三、视频展示

计算机毕设选题:基于Python+Django的健康饮食管理系统设计【源码+文档+调试】

四、项目展示

登录模块:

首页模块:






管理模块:



五、代码展示

bash 复制代码
from pyspark.sql import SparkSession
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
import json
from datetime import datetime, timedelta
from .models import NutritionComponent, DishInfo, DietRecord, User
from django.db.models import Q, Sum, Avg
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
@csrf_exempt
@login_required
def nutrition_analysis_system(request):
    if request.method == 'POST':
        user_id = request.user.id
        dish_ids = json.loads(request.POST.get('dish_ids', '[]'))
        analysis_date = request.POST.get('analysis_date', datetime.now().date())
        spark = SparkSession.builder.appName("NutritionAnalysis").getOrCreate()
        total_calories = 0
        total_protein = 0
        total_fat = 0
        total_carbs = 0
        total_fiber = 0
        nutrition_details = []
        for dish_id in dish_ids:
            dish = DishInfo.objects.get(id=dish_id)
            nutrition_data = NutritionComponent.objects.filter(dish=dish).first()
            if nutrition_data:
                dish_calories = float(nutrition_data.calories) if nutrition_data.calories else 0
                dish_protein = float(nutrition_data.protein) if nutrition_data.protein else 0
                dish_fat = float(nutrition_data.fat) if nutrition_data.fat else 0
                dish_carbs = float(nutrition_data.carbohydrates) if nutrition_data.carbohydrates else 0
                dish_fiber = float(nutrition_data.fiber) if nutrition_data.fiber else 0
                total_calories += dish_calories
                total_protein += dish_protein
                total_fat += dish_fat
                total_carbs += dish_carbs
                total_fiber += dish_fiber
                nutrition_details.append({
                    'dish_name': dish.name,
                    'calories': dish_calories,
                    'protein': dish_protein,
                    'fat': dish_fat,
                    'carbohydrates': dish_carbs,
                    'fiber': dish_fiber
                })
        user_profile = User.objects.get(id=user_id)
        recommended_calories = calculate_daily_calories(user_profile.weight, user_profile.height, user_profile.age, user_profile.gender)
        calorie_status = "正常" if abs(total_calories - recommended_calories) < 200 else ("偏高" if total_calories > recommended_calories else "偏低")
        protein_ratio = (total_protein * 4 / total_calories * 100) if total_calories > 0 else 0
        fat_ratio = (total_fat * 9 / total_calories * 100) if total_calories > 0 else 0
        carbs_ratio = (total_carbs * 4 / total_calories * 100) if total_calories > 0 else 0
        nutrition_balance_score = calculate_balance_score(protein_ratio, fat_ratio, carbs_ratio)
        diet_record = DietRecord.objects.create(
            user=user_profile,
            record_date=analysis_date,
            total_calories=total_calories,
            total_protein=total_protein,
            total_fat=total_fat,
            total_carbohydrates=total_carbs,
            total_fiber=total_fiber,
            balance_score=nutrition_balance_score
        )
        spark.stop()
        return JsonResponse({
            'success': True,
            'analysis_result': {
                'total_calories': round(total_calories, 2),
                'total_protein': round(total_protein, 2),
                'total_fat': round(total_fat, 2),
                'total_carbohydrates': round(total_carbs, 2),
                'total_fiber': round(total_fiber, 2),
                'calorie_status': calorie_status,
                'nutrition_balance_score': round(nutrition_balance_score, 2),
                'protein_ratio': round(protein_ratio, 2),
                'fat_ratio': round(fat_ratio, 2),
                'carbs_ratio': round(carbs_ratio, 2),
                'nutrition_details': nutrition_details,
                'recommended_calories': recommended_calories
            }
        })
@csrf_exempt
@login_required
def intelligent_dish_recommendation(request):
    if request.method == 'POST':
        user_id = request.user.id
        preference_tags = json.loads(request.POST.get('preference_tags', '[]'))
        dietary_restrictions = json.loads(request.POST.get('dietary_restrictions', '[]'))
        target_calories = int(request.POST.get('target_calories', 2000))
        recommendation_count = int(request.POST.get('recommendation_count', 10))
        spark = SparkSession.builder.appName("DishRecommendation").getOrCreate()
        user_history = DietRecord.objects.filter(user_id=user_id).order_by('-record_date')[:30]
        preferred_dish_types = []
        for record in user_history:
            record_dishes = json.loads(record.dish_list) if hasattr(record, 'dish_list') else []
            for dish_id in record_dishes:
                dish = DishInfo.objects.filter(id=dish_id).first()
                if dish:
                    preferred_dish_types.append(dish.dish_type.name if dish.dish_type else '其他')
        all_dishes = DishInfo.objects.all()
        candidate_dishes = []
        for dish in all_dishes:
            is_suitable = True
            for restriction in dietary_restrictions:
                if restriction.lower() in dish.name.lower() or restriction.lower() in dish.description.lower():
                    is_suitable = False
                    break
            if is_suitable:
                nutrition = NutritionComponent.objects.filter(dish=dish).first()
                if nutrition and nutrition.calories:
                    if float(nutrition.calories) <= target_calories * 0.4:
                        candidate_dishes.append({
                            'dish_id': dish.id,
                            'name': dish.name,
                            'description': dish.description,
                            'dish_type': dish.dish_type.name if dish.dish_type else '其他',
                            'calories': float(nutrition.calories),
                            'protein': float(nutrition.protein) if nutrition.protein else 0,
                            'fat': float(nutrition.fat) if nutrition.fat else 0,
                            'carbohydrates': float(nutrition.carbohydrates) if nutrition.carbohydrates else 0
                        })
        if len(candidate_dishes) > 0:
            dish_descriptions = [dish['description'] + ' ' + dish['dish_type'] for dish in candidate_dishes]
            user_preference_text = ' '.join(preference_tags + preferred_dish_types)
            vectorizer = TfidfVectorizer(max_features=1000, stop_words=None)
            tfidf_matrix = vectorizer.fit_transform(dish_descriptions + [user_preference_text])
            user_vector = tfidf_matrix[-1]
            dish_vectors = tfidf_matrix[:-1]
            similarity_scores = cosine_similarity(user_vector, dish_vectors).flatten()
            for i, score in enumerate(similarity_scores):
                candidate_dishes[i]['similarity_score'] = score
            recommended_dishes = sorted(candidate_dishes, key=lambda x: x['similarity_score'], reverse=True)[:recommendation_count]
            total_recommended_calories = sum([dish['calories'] for dish in recommended_dishes])
            calorie_match_score = 100 - abs(total_recommended_calories - target_calories) / target_calories * 100
            spark.stop()
            return JsonResponse({
                'success': True,
                'recommended_dishes': recommended_dishes,
                'total_calories': round(total_recommended_calories, 2),
                'calorie_match_score': round(max(calorie_match_score, 0), 2),
                'recommendation_reason': f"基于您的饮食偏好和历史记录,为您推荐了{len(recommended_dishes)}道菜品"
            })
        else:
            spark.stop()
            return JsonResponse({
                'success': False,
                'message': '暂未找到符合您要求的菜品推荐'
            })
@csrf_exempt
@login_required
def diet_record_management(request):
    if request.method == 'POST':
        user_id = request.user.id
        action = request.POST.get('action', 'create')
        spark = SparkSession.builder.appName("DietRecordManagement").getOrCreate()
        if action == 'create':
            record_date = request.POST.get('record_date', datetime.now().date())
            meal_type = request.POST.get('meal_type', '早餐')
            dish_ids = json.loads(request.POST.get('dish_ids', '[]'))
            meal_note = request.POST.get('meal_note', '')
            total_calories = 0
            total_protein = 0
            total_fat = 0
            total_carbs = 0
            dish_details = []
            for dish_id in dish_ids:
                dish = DishInfo.objects.get(id=dish_id)
                nutrition = NutritionComponent.objects.filter(dish=dish).first()
                if nutrition:
                    calories = float(nutrition.calories) if nutrition.calories else 0
                    protein = float(nutrition.protein) if nutrition.protein else 0
                    fat = float(nutrition.fat) if nutrition.fat else 0
                    carbs = float(nutrition.carbohydrates) if nutrition.carbohydrates else 0
                    total_calories += calories
                    total_protein += protein
                    total_fat += fat
                    total_carbs += carbs
                    dish_details.append({
                        'dish_id': dish_id,
                        'dish_name': dish.name,
                        'calories': calories,
                        'protein': protein,
                        'fat': fat,
                        'carbohydrates': carbs
                    })
            existing_record = DietRecord.objects.filter(
                user_id=user_id,
                record_date=record_date,
                meal_type=meal_type
            ).first()
            if existing_record:
                existing_record.total_calories = total_calories
                existing_record.total_protein = total_protein
                existing_record.total_fat = total_fat
                existing_record.total_carbohydrates = total_carbs
                existing_record.dish_details = json.dumps(dish_details)
                existing_record.meal_note = meal_note
                existing_record.save()
                record_id = existing_record.id
            else:
                new_record = DietRecord.objects.create(
                    user_id=user_id,
                    record_date=record_date,
                    meal_type=meal_type,
                    total_calories=total_calories,
                    total_protein=total_protein,
                    total_fat=total_fat,
                    total_carbohydrates=total_carbs,
                    dish_details=json.dumps(dish_details),
                    meal_note=meal_note
                )
                record_id = new_record.id
            daily_records = DietRecord.objects.filter(user_id=user_id, record_date=record_date)
            daily_total_calories = sum([record.total_calories for record in daily_records])
            daily_total_protein = sum([record.total_protein for record in daily_records])
            daily_total_fat = sum([record.total_fat for record in daily_records])
            daily_total_carbs = sum([record.total_carbohydrates for record in daily_records])
            user_profile = User.objects.get(id=user_id)
            recommended_daily_calories = calculate_daily_calories(user_profile.weight, user_profile.height, user_profile.age, user_profile.gender)
            calorie_completion_rate = (daily_total_calories / recommended_daily_calories * 100) if recommended_daily_calories > 0 else 0
            spark.stop()
            return JsonResponse({
                'success': True,
                'record_id': record_id,
                'meal_summary': {
                    'meal_calories': round(total_calories, 2),
                    'meal_protein': round(total_protein, 2),
                    'meal_fat': round(total_fat, 2),
                    'meal_carbohydrates': round(total_carbs, 2),
                    'dish_count': len(dish_details)
                },
                'daily_summary': {
                    'daily_calories': round(daily_total_calories, 2),
                    'daily_protein': round(daily_total_protein, 2),
                    'daily_fat': round(daily_total_fat, 2),
                    'daily_carbohydrates': round(daily_total_carbs, 2),
                    'calorie_completion_rate': round(calorie_completion_rate, 2),
                    'recommended_calories': recommended_daily_calories
                }
            })
def calculate_daily_calories(weight, height, age, gender):
    if gender == '男':
        bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
    else:
        bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
    return int(bmr * 1.5)
def calculate_balance_score(protein_ratio, fat_ratio, carbs_ratio):
    ideal_protein = 15
    ideal_fat = 25
    ideal_carbs = 60
    protein_score = max(0, 100 - abs(protein_ratio - ideal_protein) * 2)
    fat_score = max(0, 100 - abs(fat_ratio - ideal_fat) * 2)
    carbs_score = max(0, 100 - abs(carbs_ratio - ideal_carbs) * 1.5)
    return (protein_score + fat_score + carbs_score) / 3

六、项目文档展示

七、总结

基于Python+MySQL的健康饮食管理系统作为一个综合性的Web应用平台,成功整合了营养分析、智能推荐和饮食记录管理等核心功能模块。系统采用Django后端框架配合Vue前端技术栈,构建了稳定可靠的B/S架构应用,为用户提供了直观便捷的健康饮食管理服务。通过营养成分数据库和菜品信息管理,用户能够获取准确的营养知识和科学的饮食指导。智能推荐算法的应用使得系统能够根据用户的饮食偏好和历史记录,提供个性化的菜品推荐方案,提升了用户体验的针对性和实用性。饮食记录管理功能帮助用户建立良好的饮食习惯追踪机制,通过数据统计和分析为用户的健康管理提供量化支持。社区交流模块的设置增强了平台的互动性,用户可以分享饮食心得和健康经验,形成了良好的学习交流氛围。虽然作为毕业设计项目,系统在功能复杂度和技术深度方面存在一定局限,但其体现的技术架构设计思路和业务逻辑处理方式为健康管理类应用的开发提供了有价值的参考。整个项目的实施过程也验证了Python Web开发技术栈在实际应用中的可行性和有效性。

大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖

相关推荐
阿里云大数据AI技术7 小时前
【跨国数仓迁移最佳实践8】MaxCompute Streaming Insert: 大数据数据流写业务迁移的实践与突破
大数据·数据库
Joy-鬼魅7 小时前
在 Qt 中加载 .qm 翻译文件
开发语言·qt
半梦半醒*7 小时前
ansible变量
linux·运维·开发语言·ansible·运维开发
CodeCraft Studio8 小时前
国产化PDF处理控件Spire.PDF教程:在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)
java·python·pdf·csv·spire·pdf转csv
大翻哥哥8 小时前
Python云原生与Serverless架构:2025年的开发新范式
python·云原生·架构·serverless
max5006008 小时前
期货交易策略自动化实现
运维·开发语言·人工智能·算法·自动化·线性回归
数据智研8 小时前
【数据分享】多份土地利用矢量shp数据分享-澳门
大数据·数据分析
StarPrayers.8 小时前
PyCharm 2025版本中新建python工程文件自动创建.venv的意义和作用
ide·python·pycharm
二闹8 小时前
Python中那个看似神秘的if __name__ == __main__,一次给你讲明白
后端·python