温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着互联网和移动支付的普及,餐饮行业的信息化程度不断提高,用户面对海量美食信息时往往难以快速做出选择。传统的餐饮平台虽然提供了丰富的商家和菜品数据,但缺乏针对用户口味的个性化推荐能力,导致用户需要花费大量时间筛选,体验不佳。
本项目基于 Python 和 Django 框架,构建一个餐饮美食推荐系统。系统通过采集用户的历史行为数据(如浏览、收藏、评分、下单记录),结合菜品和商家的属性特征,利用协同过滤与基于内容的推荐算法,为用户提供个性化的美食推荐服务,帮助用户更快发现符合口味的餐厅和菜品,同时为商家带来更精准的流量转化。
2. 系统需求分析
2.1 功能需求
- 用户模块:支持用户注册、登录、个人信息管理、口味偏好设置。
- 美食浏览模块:展示餐厅、菜品信息,支持按分类、价格、评分等条件筛选。
- 推荐模块:基于用户行为数据生成个性化推荐列表,包括猜你喜欢、热门推荐、相似菜品推荐。
- 评价互动模块:用户可对菜品和餐厅进行评分、评论、收藏。
- 后台管理模块:管理员可管理用户、餐厅、菜品、分类及推荐策略参数。
2.2 非功能需求
- 性能:推荐接口响应时间控制在 2 秒以内,支持一定规模的并发访问。
- 可扩展性:推荐算法模块采用策略模式设计,便于后续接入新的算法。
- 安全性:用户密码加密存储,接口进行权限校验,防止越权访问。
3. 系统架构设计
系统采用 Django MTV 架构模式,整体分为表现层、业务逻辑层和数据访问层。前端页面通过 Django 模板引擎渲染,业务逻辑集中在视图和推荐服务中,数据访问通过 Django ORM 完成。
flowchart TD A[用户浏览器] --> B[Django 视图层] B --> C[推荐服务层] C --> D[协同过滤算法] C --> E[基于内容算法] C --> F[热门推荐策略] B --> G[用户/餐厅/菜品管理模块] G --> H[(MySQL 数据库)] D --> H E --> H F --> H4. 数据库设计
系统核心数据表包括用户表、餐厅表、菜品表、分类表、评分表、收藏表和用户行为日志表。以下为主要表结构说明:
| 表名 | 主要字段 | 说明 |
|---|---|---|
| User | id, username, password, taste_pref | 用户信息及口味偏好 |
| Restaurant | id, name, address, category, rating | 餐厅基础信息 |
| Dish | id, name, restaurant_id, price, category | 菜品信息,关联餐厅 |
| Rating | id, user_id, dish_id, score, comment | 用户对菜品的评分与评论 |
| Favorite | id, user_id, dish_id, created_at | 用户收藏记录 |
| BehaviorLog | id, user_id, dish_id, action, time | 用户浏览、点击等行为日志 |
5. 推荐算法设计
5.1 基于协同过滤的推荐
协同过滤算法通过分析用户之间的相似性或物品之间的相似性进行推荐。本系统采用基于用户的协同过滤:首先构建用户-菜品评分矩阵,计算用户之间的余弦相似度,找到目标用户的近邻集合,再根据近邻的评分预测目标用户对未评分菜品的偏好程度,生成 Top-N 推荐列表。
import numpy as np from sklearn.metrics.pairwise import cosine_similarity def user_cf_recommend(user_id, rating_matrix, top_n=10): # 计算用户相似度矩阵 sim_matrix = cosine_similarity(rating_matrix) user_idx = user_id - 1 sim_scores = list(enumerate(sim_matrix[user_idx])) # 排除自身,取相似度最高的前 K 个用户 sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)[1:6] # 聚合近邻的评分,预测目标用户对未评分菜品的得分 scores = {} for idx, sim in sim_scores: for dish_idx, rating in enumerate(rating_matrix[idx]): if rating > 0 and rating_matrix[user_idx][dish_idx] == 0: scores.setdefault(dish_idx, 0) scores[dish_idx] += sim * rating # 按预测得分排序,返回 Top-N 菜品 ranked = sorted(scores.items(), key=lambda x: x[1], reverse=True)[:top_n] return [dish_id + 1 for dish_id, _ in ranked]5.2 基于内容的推荐
基于内容的推荐根据菜品的属性特征(如分类、口味标签、价格区间)计算菜品之间的相似度,向用户推荐与其历史偏好相似但未消费过的菜品。该方案不依赖其他用户的数据,冷启动问题较轻。
def content_based_recommend(user_pref_vector, dish_features, top_n=10): # 计算用户偏好向量与所有菜品特征向量的余弦相似度 sims = cosine_similarity([user_pref_vector], dish_features)[0] # 排除已消费菜品,取相似度最高的 Top-N ranked = sorted(enumerate(sims), key=lambda x: x[1], reverse=True) return [dish_id + 1 for dish_id, _ in ranked[:top_n]]5.3 混合推荐策略
为兼顾推荐效果和冷启动问题,系统采用加权混合策略:对老用户以协同过滤结果为主,对行为数据较少的新用户以基于内容的推荐和热门榜单为主,最终按权重融合生成综合推荐列表。
6. 核心功能实现
6.1 用户注册与登录
使用 Django 内置的认证系统,配合表单校验实现注册和登录功能。密码通过 PBKDF2 算法加密存储,登录后使用 Session 维持用户状态。
from django.contrib.auth.models import User from django.contrib.auth import login, authenticate from django.shortcuts import render, redirect def register(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] if User.objects.filter(username=username).exists(): return render(request, 'register.html', {'error': '用户名已存在'}) user = User.objects.create_user(username=username, password=password) login(request, user) return redirect('home') return render(request, 'register.html')6.2 推荐接口实现
推荐接口接收当前用户 ID,调用推荐服务层获取个性化菜品列表,并渲染到首页。
from django.shortcuts import render from .services.recommender import get_recommendations def home(request): user = request.user if user.is_authenticated: recommend_dishes = get_recommendations(user.id) else: recommend_dishes = get_hot_dishes() return render(request, 'home.html', {'dishes': recommend_dishes})6.3 评分与收藏
用户可以对菜品进行评分和收藏,这些行为数据会写入数据库,作为推荐算法的重要输入特征。
from django.http import JsonResponse from .models import Rating, Favorite def rate_dish(request): if not request.user.is_authenticated: return JsonResponse({'code': 401, 'msg': '请先登录'}) dish_id = request.POST.get('dish_id') score = request.POST.get('score') Rating.objects.update_or_create( user=request.user, dish_id=dish_id, defaults={'score': score} ) return JsonResponse({'code': 200, 'msg': '评分成功'})7. 系统测试
系统测试分为功能测试和性能测试两部分。功能测试覆盖注册登录、美食浏览、推荐展示、评分收藏等核心流程,确保各模块交互正常;性能测试使用模拟并发请求验证推荐接口的响应时间,确保在预期负载下系统稳定运行。
测试结果表明,系统核心功能均能正确执行,推荐接口在 200 并发请求下平均响应时间约为 1.2 秒,满足设计指标要求。
8. 总结与展望
本项目基于 Python 和 Django 实现了一个餐饮美食推荐系统,完成了用户管理、美食展示、个性化推荐、评价互动和后台管理等核心功能。系统采用协同过滤与基于内容相结合的混合推荐策略,在推荐准确性和冷启动处理上取得了较好的平衡。
后续可以从以下方向继续优化:引入实时行为流处理以提升推荐的时效性;接入深度学习模型(如 Wide & Deep)进一步提升推荐精度;增加基于地理位置和时段特征的场景化推荐,让推荐结果更贴合用户当下的用餐需求。