基于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]})
可視化圖表類型
- 餅圖:食材類型分布、菜譜分類分布
- 柱狀圖:熱門菜譜排行、用戶活躍度
- 折線圖:收藏趨勢、用戶注冊趨勢
- 散點圖:菜譜熱度分布
🚀 部署與優化
性能優化
-
數據庫優化
- 建立合適的索引
- 使用連接查詢減少查詢次數
- 實現分頁查詢
-
緩存策略
- 熱門菜譜緩存
- 用戶推薦結果緩存
- 統計數據緩存
-
前端優化
- 圖片懶加載
- 靜態資源壓縮
- 異步加載數據
部署方案
# 安裝依賴
pip install -r requirements.txt# 初始化數據庫
flask db init
flask db migrate
flask db upgrade# 啟動應用
python run.py
? 項目特色
1. 智能推薦
- 基于協同過濾的個性化推薦
- 支持冷啟動處理
- 實時更新推薦結果
2. 豐富的數據分析
- 多維度數據統計
- 實時數據可視化
- 用戶行為分析
3. 完整的用戶系統
- 用戶注冊登錄
- 個人中心管理
- 社交互動功能
4. 響應式設計
- 適配多種設備
- 現代化UI設計
- 良好的用戶體驗
📈 總結與展望
項目成果
- 完整的菜譜推薦系統:實現了從數據采集到推薦展示的完整流程
- 智能推薦算法:基于協同過濾的個性化推薦,提高了用戶滿意度
- 豐富的數據分析:多維度統計和可視化,為運營決策提供支持
- 良好的用戶體驗:響應式設計和現代化UI,提升了用戶粘性
技術亮點
- Flask + SQLAlchemy:輕量級但功能強大的Web框架
- NumPy + Pandas:高效的數據處理和分析
- Scikit-learn:機器學習算法的應用
- 協同過濾算法:個性化推薦的核心技術
未來展望
- 算法優化:引入深度學習模型,提升推薦精度
- 功能擴展:增加菜譜評分、營養分析等功能
- 性能提升:引入Redis緩存,提升系統響應速度
- 移動端適配:開發移動端應用,提升用戶體驗
技術收獲
通過本項目的開發,深入學習了:
- Flask Web開發框架的使用
- 數據庫設計和ORM操作
- 機器學習算法在實際項目中的應用
- 數據可視化和統計分析
- 前后端分離開發模式
這個項目不僅是一個功能完整的美食推薦系統,更是對現代Web開發技術棧的全面實踐,為后續的技術學習和項目開發奠定了堅實的基礎。
本文檔詳細介紹了基于Python的網上廚房美食推薦系統的技術實現,包括系統架構、核心功能、推薦算法、數據可視化等各個方面。項目采用Flask + SQLAlchemy + NumPy + Pandas等技術棧,實現了完整的菜譜推薦和管理功能。
源碼獲取:[碼界筑夢坊各平臺同名]