98-基于Python的网上厨房美食推荐系统

基于Python的网上厨房美食推荐系统 - 技术分享博客

📋 目录

  • 项目概述
  • 技术栈
  • 系统架构
  • 核心功能实现
  • 数据库设计
  • 推荐算法
  • 数据可视化
  • 部署与优化
  • 项目特色
  • 总结与展望

🎯 项目概述

项目背景

随着生活节奏的加快,越来越多的人开始关注美食制作,但面对海量的菜谱信息,用户往往难以找到适合自己的菜谱。本项目旨在构建一个智能的美食推荐系统,通过个性化推荐算法,帮助用户快速找到心仪的菜谱。

项目目标

  • 构建完整的菜谱管理和推荐系统
  • 实现基于用户行为的个性化推荐
  • 提供丰富的数据统计和可视化功能
  • 支持用户社交互动功能

主要功能

  • 🍳 菜谱管理:支持按类型和食材分类浏览菜谱
  • 智能推荐:基于协同过滤算法的个性化推荐
  • 👥 用户系统:完整的用户注册、登录、个人中心功能
  • 💬 社交互动:评论、收藏、关注等社交功能
  • 📊 数据统计:丰富的统计分析和可视化展示
  • 🔧 后台管理:完善的后台管理系统

项目源码

码界筑梦坊各大平台同名 欢迎咨询~


🛠️ 技术栈

后端技术

  • Flask 2.3.3 - 轻量级Web框架
  • SQLAlchemy 2.0.21 - ORM数据库操作
  • Flask-SQLAlchemy 3.0.5 - Flask ORM扩展
  • Flask-Login 0.6.3 - 用户认证管理
  • Flask-Migrate 4.0.5 - 数据库迁移
  • Flask-WTF 1.1.1 - 表单处理
  • WTForms 3.0.1 - 表单验证

数据库

  • MySQL - 主数据库
  • SQLAlchemy - ORM框架

数据分析与机器学习

  • NumPy 1.24.3 - 数值计算
  • Pandas 2.0.3 - 数据分析
  • Scikit-learn 1.3.0 - 机器学习算法

数据可视化

  • Matplotlib 3.7.2 - 基础绘图
  • Seaborn 0.12.2 - 统计图表

其他工具

  • Pillow 10.0.0 - 图像处理
  • Requests 2.31.0 - HTTP请求
  • Python-dotenv 1.0.0 - 环境变量管理

💻 项目展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🏗️ 系统架构

目录结构

网上厨房美食推荐系统/
├── app/                          # 应用主目录
│   ├── __init__.py              # 应用初始化
│   ├── models/                   # 数据模型
│   │   ├── user.py              # 用户模型
│   │   ├── recipe.py            # 菜谱模型
│   │   ├── food.py              # 食材模型
│   │   ├── category.py          # 分类模型
│   │   ├── comment.py           # 评论模型
│   │   ├── favorite.py          # 收藏模型
│   │   └── ...
│   ├── routes/                   # 路由控制器
│   │   ├── main.py              # 主页路由
│   │   ├── auth.py              # 认证路由
│   │   ├── user.py              # 用户路由
│   │   ├── food.py              # 食材路由
│   │   ├── recipe.py            # 菜谱路由
│   │   ├── recommend.py         # 推荐路由
│   │   ├── stats.py             # 统计路由
│   │   └── admin.py             # 管理路由
│   ├── templates/                # 模板文件
│   │   ├── base.html            # 基础模板
│   │   ├── main/                # 主页模板
│   │   ├── auth/                # 认证模板
│   │   ├── user/                # 用户模板
│   │   ├── food/                # 食材模板
│   │   ├── recipe/              # 菜谱模板
│   │   ├── stats/               # 统计模板
│   │   └── admin/               # 管理模板
│   ├── static/                   # 静态资源
│   │   ├── css/                 # 样式文件
│   │   ├── js/                  # JavaScript文件
│   │   └── images/              # 图片资源
│   ├── forms/                    # 表单类
│   ├── services/                 # 业务逻辑
│   ├── utils/                    # 工具函数
│   └── config/                   # 配置文件
├── data/                         # 数据文件
├── migrations/                   # 数据库迁移
├── uploads/                      # 上传文件
├── requirements.txt              # 依赖包
├── config.py                     # 配置文件
├── run.py                        # 启动文件
└── README.md                     # 项目说明

架构设计

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   前端界面      │    │   Flask应用     │    │   数据库        │
│  (Templates)    │◄──►│   (Routes)      │◄──►│   (MySQL)       │
└─────────────────┘    └─────────────────┘    └─────────────────┘│▼┌─────────────────┐│   业务逻辑      ││  (Services)     │└─────────────────┘│▼┌─────────────────┐│   推荐算法      ││  (ML/Numpy)     │└─────────────────┘

🔧 核心功能实现

1. 用户系统

# app/models/user.py
class User(UserMixin, db.Model):"""用户模型"""__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(255), unique=True, nullable=False)password = db.Column(db.String(255), nullable=False)email = db.Column(db.String(255), unique=True, nullable=False)avatar = db.Column(db.String(255), default='/static/images/default-avatar.png')description = db.Column(db.Text)is_admin = db.Column(db.Boolean, default=False)last_login = db.Column(db.DateTime)created_at = db.Column(db.DateTime, default=datetime.utcnow)# 关系定义food_favorites = db.relationship('FoodFavorite', back_populates='user', lazy='dynamic')recipe_favorites = db.relationship('RecipeFavorite', back_populates='user', lazy='dynamic')def set_password(self, password):"""设置密码"""self.password = generate_password_hash(password)def check_password(self, password):"""验证密码"""return check_password_hash(self.password, password)

2. 菜谱模型

# app/models/recipe.py
class Recipe(db.Model):"""菜谱模型"""__tablename__ = 'recipes'id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(200), nullable=False, comment='菜谱标题')description = db.Column(db.Text, comment='菜谱描述')main_image = db.Column(db.String(500), comment='主图URL')category_id = db.Column(db.Integer, db.ForeignKey('ingredient_categories.id'), nullable=False)ingredients = db.Column(db.JSON, comment='食材列表')steps = db.Column(db.JSON, comment='步骤列表')collect_count = db.Column(db.Integer, default=0, comment='收藏数')comment_count = db.Column(db.Integer, default=0, comment='评论数')# 关联关系category = db.relationship('IngredientCategory', back_populates='recipes', lazy='joined')comments = db.relationship('RecipeComment', back_populates='recipe', lazy='dynamic')favorites = db.relationship('RecipeFavorite', back_populates='recipe', lazy='dynamic')

3. 应用初始化

# app/__init__.py
def create_app(config_name='default'):"""创建Flask应用"""app = Flask(__name__)# 加载配置app.config.from_object(config[config_name])config[config_name].init_app(app)# 初始化扩展db.init_app(app)migrate.init_app(app, db)login_manager.init_app(app)# 注册蓝图from app.routes import main, auth, user, food, recipe, recommend, stats, adminapp.register_blueprint(main.bp)app.register_blueprint(auth.bp)app.register_blueprint(user.bp)app.register_blueprint(food.bp)app.register_blueprint(recipe.bp)app.register_blueprint(recommend.bp, url_prefix='/recommend')app.register_blueprint(stats.bp)app.register_blueprint(admin.bp)return app

🗄️ 数据库设计

核心表结构

用户表 (users)
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(255) UNIQUE NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255) UNIQUE NOT NULL,avatar VARCHAR(255) DEFAULT '/static/images/default-avatar.png',description TEXT,is_admin BOOLEAN DEFAULT FALSE,last_login DATETIME,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
菜谱表 (recipes)
CREATE TABLE recipes (id INT PRIMARY KEY AUTO_INCREMENT,url VARCHAR(500) NOT NULL,title VARCHAR(200) NOT NULL,description TEXT,main_image VARCHAR(500),category_id INT NOT NULL,author_name VARCHAR(100),author_avatar VARCHAR(500),ingredients JSON,steps JSON,collect_count INT DEFAULT 0,comment_count INT DEFAULT 0,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (category_id) REFERENCES ingredient_categories(id)
);
收藏表 (recipe_favorites)
CREATE TABLE recipe_favorites (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,recipe_id INT NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id),FOREIGN KEY (recipe_id) REFERENCES recipes(id),UNIQUE KEY unique_user_recipe (user_id, recipe_id)
);

数据库关系图

users (用户表)
├── recipe_favorites (菜谱收藏)
├── food_favorites (食材收藏)
├── recipe_comments (菜谱评论)
├── food_comments (食材评论)
└── logs (用户日志)recipes (菜谱表)
├── recipe_favorites (收藏关系)
├── recipe_comments (评论关系)
└── logs (浏览日志)foods (食材表)
├── food_favorites (收藏关系)
└── food_comments (评论关系)ingredient_categories (分类表)
└── recipes (菜谱分类)

🤖 推荐算法

协同过滤算法实现

# app/routes/recommend.py
def get_recipe_recommendations(user_id, limit=10):"""获取菜谱推荐 - 基于协同过滤"""try:# 获取所有用户收藏favorites = RecipeFavorite.query.all()# 构建用户-菜谱矩阵user_recipe_dict = defaultdict(set)for fav in favorites:user_recipe_dict[fav.user_id].add(fav.recipe_id)# 获取当前用户的收藏user_favorites = user_recipe_dict.get(user_id, set())if not user_favorites:return []# 计算用户相似度 (Jaccard相似度)user_similarities = {}for other_user_id, other_favorites in user_recipe_dict.items():if other_user_id == user_id:continueintersection = len(user_favorites & other_favorites)union = len(user_favorites | other_favorites)if union > 0:similarity = intersection / unionuser_similarities[other_user_id] = similarity# 获取最相似的用户similar_users = sorted(user_similarities.items(), key=lambda x: x[1], reverse=True)[:5]# 获取推荐菜谱recommended_recipes = set()for similar_user_id, _ in similar_users:similar_user_favorites = user_recipe_dict[similar_user_id]# 只推荐当前用户未收藏的菜谱new_recipes = similar_user_favorites - user_favoritesrecommended_recipes.update(new_recipes)# 获取菜谱详情recipes = Recipe.query.filter(Recipe.id.in_(recommended_recipes))\.order_by(desc(Recipe.collect_count))\.limit(limit)\.all()return recipesexcept Exception as e:logger.error(f"获取菜谱推荐失败: {str(e)}", exc_info=True)return []

算法特点

  • 协同过滤:基于用户行为的相似性推荐
  • Jaccard相似度:计算用户收藏菜谱的相似度
  • 冷启动处理:新用户无收藏时返回热门菜谱
  • 实时更新:用户行为变化时推荐结果实时更新

📊 数据可视化

统计功能实现

# app/routes/stats.py
@bp.route('/api/stats/foods')
def food_stats():"""食材统计数据"""# 食材类型统计food_types = db.session.query(Food.food_type,func.count(Food.id).label('count')).group_by(Food.food_type).all()# 收藏数TOP10食材top_favorites = Food.query.order_by(Food.favorite_count.desc()).limit(10).all()# 食材收藏趋势(最近7天)seven_days_ago = datetime.now() - timedelta(days=7)daily_favorites = db.session.query(func.date(FoodFavorite.created_at).label('date'),func.count(FoodFavorite.id).label('count')).filter(FoodFavorite.created_at >= seven_days_ago)\.group_by('date').order_by('date').all()return jsonify({'food_types': [{'type': t[0], 'count': t[1]} for t in food_types if t[0]],'top_favorites': [{'title': f.title, 'count': f.favorite_count} for f in top_favorites],'daily_favorites': [{'date': d[0].strftime('%m-%d'), 'count': d[1]} for d in daily_favorites]})

可视化图表类型

  • 饼图:食材类型分布、菜谱分类分布
  • 柱状图:热门菜谱排行、用户活跃度
  • 折线图:收藏趋势、用户注册趋势
  • 散点图:菜谱热度分布

🚀 部署与优化

性能优化

  1. 数据库优化

    • 建立合适的索引
    • 使用连接查询减少查询次数
    • 实现分页查询
  2. 缓存策略

    • 热门菜谱缓存
    • 用户推荐结果缓存
    • 统计数据缓存
  3. 前端优化

    • 图片懒加载
    • 静态资源压缩
    • 异步加载数据

部署方案

# 安装依赖
pip install -r requirements.txt# 初始化数据库
flask db init
flask db migrate
flask db upgrade# 启动应用
python run.py

✨ 项目特色

1. 智能推荐

  • 基于协同过滤的个性化推荐
  • 支持冷启动处理
  • 实时更新推荐结果

2. 丰富的数据分析

  • 多维度数据统计
  • 实时数据可视化
  • 用户行为分析

3. 完整的用户系统

  • 用户注册登录
  • 个人中心管理
  • 社交互动功能

4. 响应式设计

  • 适配多种设备
  • 现代化UI设计
  • 良好的用户体验

📈 总结与展望

项目成果

  1. 完整的菜谱推荐系统:实现了从数据采集到推荐展示的完整流程
  2. 智能推荐算法:基于协同过滤的个性化推荐,提高了用户满意度
  3. 丰富的数据分析:多维度统计和可视化,为运营决策提供支持
  4. 良好的用户体验:响应式设计和现代化UI,提升了用户粘性

技术亮点

  • Flask + SQLAlchemy:轻量级但功能强大的Web框架
  • NumPy + Pandas:高效的数据处理和分析
  • Scikit-learn:机器学习算法的应用
  • 协同过滤算法:个性化推荐的核心技术

未来展望

  1. 算法优化:引入深度学习模型,提升推荐精度
  2. 功能扩展:增加菜谱评分、营养分析等功能
  3. 性能提升:引入Redis缓存,提升系统响应速度
  4. 移动端适配:开发移动端应用,提升用户体验

技术收获

通过本项目的开发,深入学习了:

  • Flask Web开发框架的使用
  • 数据库设计和ORM操作
  • 机器学习算法在实际项目中的应用
  • 数据可视化和统计分析
  • 前后端分离开发模式

这个项目不仅是一个功能完整的美食推荐系统,更是对现代Web开发技术栈的全面实践,为后续的技术学习和项目开发奠定了坚实的基础。


本文档详细介绍了基于Python的网上厨房美食推荐系统的技术实现,包括系统架构、核心功能、推荐算法、数据可视化等各个方面。项目采用Flask + SQLAlchemy + NumPy + Pandas等技术栈,实现了完整的菜谱推荐和管理功能。

源码获取:[码界筑梦坊各平台同名]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92381.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建MyBatis-Plus版的后端查询项目

记得编码和maven库的检测&#xff01;&#xff01;&#xff01; 1、maven库导入包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…

开发板RK3568和stm32的异同:

RK3568 和 STM32 是两类不同定位的处理器 / 微控制器&#xff0c;在架构、性能、应用场景等方面差异显著&#xff0c;但也存在部分共性。以下从核心特性、异同点及典型场景进行对比&#xff1a;一、核心差异维度RK3568&#xff08;瑞芯微&#xff09;STM32&#xff08;意法半导…

C# 使用iText获取PDF的trailer数据

文章目录C# 使用iText获取PDF的trailer数据iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程序运行效果解读 Trailer 的输出总结C# 使用iText获取PDF的trailer数据 开发程序debug的时候&#xff0c;看到了PDF有个trailer数据&#xff0c;挺有意思&#xf…

京东流量资产基于湖仓架构的落地实践

在当今数字化商业浪潮中&#xff0c;数据无疑是企业的核心资产&#xff0c;而流量数据更是电商巨头京东业务运转的关键驱动力。它广泛应用于搜索推荐、广告投放等多个核心业务场景&#xff0c;直接影响着用户体验和商业效益。但随着业务规模的不断膨胀&#xff0c;传统架构在处…

​​​​​​​【Datawhale AI夏令营】多模态RAG财报问答挑战赛:学习笔记与上分思考

一、 初识赛题——从迷茫到清晰刚看到赛题时&#xff0c;坦白说有些不知所措。“多模态”、“RAG”、“图文混排PDF”&#xff0c;这些词汇组合在一起&#xff0c;听起来就像一个庞大而复杂的工程。但当我强迫自己静下心来&#xff0c;从“终点”&#xff08;提交格式和评审规则…

数据挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 线性判别式Loss Function 损失函数misclassification 误分类0-1 Loss/Error function 0-1损失函数Hinge Loss Function 铰链损失函数Optimization 优化算法Linear Discriminants 线性判别式 线性判别式公式 f(x;w)w1x(1)w…

使用qemu运行与GDB调试内核

目录 一、前期准备 二、内核编译 三、QEMU与GDB 1、QEMU调试参数 2、gdb vmlinux 一、前期准备 内核镜像&#xff1a;bzimage gdb&#xff1a;x86_64 QEMU&#xff1a;qemu-system-x86_64 前置知识&#xff1a; &#xff08;1&#xff09;内核编译 &#xff08;2&#x…

欧盟 Radio Equipment Directive (RED)

欧盟 Radio Equipment Directive (RED) ——从 2014/53/EU 原文到 2025-08-01 强制生效的网络安全新规&#xff0c;一次看懂全部关键点。1. 法规身份与适用范围要素内容指令全称Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)适用产品所有“有意发射/接…

【FastExcel】解决ReadSheet在Map中获取对象不准确问题(已提交PR并合并到开源社区)

解决问题&#xff1a;源码ReadSheet在同一个Map中获取对象不准确问题 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;问题场景 ReadSheet在同一个Map中获取对象不准确(如Map<…

【网络安全入门基础教程】TCP/IP协议深入解析(非常详细)零基础入门到精通,收藏这一篇就够了

前言 这是小编给粉丝盆友们整理的网络安全入门到精通系列第三章计算机网络中TCP/IP协议的解析&#xff0c;喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&…

Latex中公式部分输入正体的字母\mathrm{c}

Latex中公式部分输入正体的字母\mathrm{c}“\mathrm{c}”如何在Word中输入\mathrm{c}“\mathrm{c}” 在 LaTeX 中&#xff0c;“\mathrm{c}” 用于在数学模式中排版“c”这个字母为罗马体&#xff08;正体&#xff09;。“\mathrm” 是罗马字体命令&#xff0c;它告诉LaTeX以罗…

Document Picture-in-Picture API拥抱全新浮窗体验[参考:window.open]

在前端开发中&#xff0c;我们经常会遇到这样的需求&#xff1a;弹出一个浮动窗口来显示一些实时信息、工具栏或视频内容。过去我们会用 window.open()&#xff0c;后来越来越多的开发者倾向于使用 Modal。但现在&#xff0c;一个更现代的 API 出现了——Document Picture-in-P…

【指南版】网络与信息安全岗位系列(三):安全运维工程师

一、安全运维工程师到底做什么&#xff1f;—— 用校园场景帮你理解简单说&#xff0c;安全运维工程师就像 “网络世界的安保队长 系统管家”&#xff1a;既要实时监控网络和系统的 “异常动静”&#xff08;类似学校保安巡逻查隐患&#xff09;&#xff0c;又要负责日常的安全…

matlab——simulink学习(5向NXP库中添加新模块)

向NXP库中添加新的函数模块一、环境二、库添加模块1.打开文件夹2.创建文件3.添加S-Function三、浏览器添加模块一、环境 Windows10、MATLAB R2022b、安装NXP的S32K1XX系列工具包 二、库添加模块 1.打开文件夹 在文件系统中找到安装工具包的位置&#xff0c;用文件资源管理器…

使用ProxySql实现MySQL的读写分离

ProxySQL简介1、ProxySQL是一款开源的使用C编写的MySQL集群代理中间件&#xff1b;2、用于在MySQL数据库和客户端之间进行负载均衡、查询缓存、故障转移和查询分发&#xff1b;3、它可以作为中间层插入到应用程序和数据库之间&#xff1b;4、特点是高效灵活&#xff0c;使用简单…

WiFi 核心概念与实战用例全解

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 1. WiFi基础与协议 WiFi&#xff08;Wireless Fidelity&#xff09;是基于IEEE 802.11协议族的无线局域网&#xff08;WLAN…

面向远程智能终端的超低延迟RTSP|RTMP视频SDK架构与实践指南

引言&#xff1a;遥操作时代&#xff0c;视觉链路已成“主控神经元” 从工业巡检到应急救援&#xff0c;从城市安防到边境监控&#xff0c;远程操控正成为智能终端与人机协同的重要落点。而在这些场景中&#xff0c;“视觉”不再只是用来观看的工具&#xff0c;而是贯穿感知、…

C++中的继承:从基础到复杂

目录 前言 1. 继承的基本概念 2. 继承方式与访问控制 3. 派生类与基类的对象转换 4. 继承中的作用域 5. 派生类的默认成员函数 6. 继承中的特殊关系 6.1 继承与友元 6.2 继承与静态成员 7. 复杂的菱形继承问题 8. 继承与组合的选择 9. 常见面试题 总结 前言 继承…

Eyevinn 彻底改变开源部署模式

该咨询公司借助Akamai云平台&#xff0c;为其创新的开源平台和可持续收益分成模式提供强大支持。 "时间就是金钱&#xff0c;我们通过Akamai云平台快速将开源云平台投入生产。" ——Eyevinn Technology研发副总裁 Jonas Birm实现可持续视频流媒体服务 自2013年以来&…