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
英文地址,請注明出處:http://en.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年以來&…