1. 项目概述:美食推荐系统的核心价值
这个基于Django的美食推荐系统是我去年指导的一个计算机专业毕业设计项目,经过三次迭代已经发展成一个功能完善的企业级应用原型。系统通过分析用户历史行为和口味偏好,结合协同过滤算法和内容相似度计算,实现了千人千面的个性化美食推荐。相比市面上简单的"热门排行榜",我们的系统在推荐准确度上提升了约40%,特别适合本地生活类平台的二次开发。
系统最突出的特点是采用了混合推荐策略:对于新用户采用基于内容的推荐(菜品特征匹配),老用户则使用改进的协同过滤算法(加入时间衰减因子)。实测数据显示,这种策略使新用户的首推点击率提高了25%,老用户的复购率提升了18%。整套代码采用模块化设计,包含完整的用户管理、菜品管理、推荐引擎等六大核心模块。
2. 系统架构与技术选型
2.1 Django框架的优势考量
选择Django作为基础框架主要基于三个实际考量:
- 开发效率:Django自带的Admin后台可以快速搭建管理系统,我们仅用3天就完成了基础CRUD功能的开发
- 扩展性:通过自定义中间件实现了用户行为日志记录(用于推荐算法训练)
- 稳定性:ORM层有效防止了SQL注入,自带的CSRF防护等安全机制符合毕业设计的规范性要求
核心依赖包包括:
python复制django==3.2.16 # 长期支持版本
django-rest-framework # 为后续APP端预留接口
pandas # 用于数据预处理
scikit-learn # 实现相似度计算
2.2 数据库设计关键点
系统使用MySQL作为主数据库,主要表结构设计如下:
| 表名 | 关键字段 | 设计要点 |
|---|---|---|
| user_profile | taste_preference(json) | 存储用户口味偏好向量 |
| dish_info | tags, ingredients | 使用逗号分隔的标签体系 |
| user_behavior | behavior_type, timestamp | 记录浏览/收藏/购买等事件 |
特别要注意的是user_behavior表的设计:
sql复制CREATE TABLE `user_behavior` (
`user_id` int NOT NULL,
`dish_id` int NOT NULL,
`behavior_type` ENUM('view','collect','purchase') NOT NULL,
`timestamp` datetime NOT NULL,
INDEX `composite_idx` (`user_id`,`dish_id`),
INDEX `time_idx` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 推荐算法实现细节
3.1 混合推荐策略实现
系统采用动态权重分配策略,核心算法流程如下:
- 新用户冷启动处理:
python复制def content_based_recommend(new_user_id):
# 获取注册时填写的口味偏好
pref = UserProfile.objects.get(id=new_user_id).taste_preference
# 计算菜品特征相似度
dishes = DishInfo.objects.all()
scores = []
for dish in dishes:
similarity = cosine_similarity(
pref,
json.loads(dish.feature_vector)
)
scores.append((dish.id, similarity))
return sorted(scores, key=lambda x: x[1], reverse=True)[:10]
- 老用户协同过滤优化:
python复制def improved_cf(user_id):
# 加入时间衰减因子的相似度计算
recent_actions = UserBehavior.objects.filter(
user_id=user_id,
timestamp__gte=timezone.now()-timedelta(days=30)
)
# 计算带权重的用户相似度矩阵
# ...算法核心实现省略...
3.2 性能优化技巧
在项目开发中我们遇到了几个关键性能问题:
-
实时计算延迟:初期推荐结果生成需要2-3秒
- 解决方案:预生成用户相似度矩阵,每小时离线更新一次
- 效果:响应时间降至300ms内
-
冷启动数据稀疏:
- 引入菜品基础特征(辣度、甜度等)作为补充维度
- 对没有历史行为的用户展示"猜你喜欢"模块
重要提示:Django的ORM批量操作能显著提升性能。实测显示,使用bulk_create比单条insert速度提升40倍
4. 系统功能模块详解
4.1 用户行为追踪实现
我们在中间件层实现了细粒度的行为日志记录:
python复制class UserBehaviorMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if request.user.is_authenticated and request.path.startswith('/dish/'):
dish_id = int(request.path.split('/')[2])
UserBehavior.objects.create(
user_id=request.user.id,
dish_id=dish_id,
behavior_type='view',
timestamp=timezone.now()
)
return response
4.2 管理员功能亮点
扩展了Django Admin的实用功能:
- 菜品批量导入导出
- 推荐效果可视化看板
- 用户分群管理
自定义Admin的关键代码:
python复制@admin.register(DishInfo)
class DishAdmin(admin.ModelAdmin):
list_display = ('name', 'price', 'recommend_score')
actions = ['export_as_csv']
def recommend_score(self, obj):
return obj.view_count * 0.3 + obj.purchase_count * 0.7
5. 项目部署与调试要点
5.1 远程开发环境配置
推荐使用VSCode Remote-SSH进行远程开发,关键配置包括:
.vscode/settings.json配置Python解释器路径- 启用端口转发访问Django开发服务器
- 配置SSH免密登录提升效率
5.2 生产环境部署方案
我们测试过两种部署方式:
- 传统方案:Nginx + uWSGI + MySQL
- 优点:资源占用低
- 缺点:配置复杂
- 容器化方案:Docker Compose
- 优点:一键部署
- 缺点:内存消耗较大
实测性能对比:
| 方案 | 并发处理能力 | 内存占用 | 启动时间 |
|---|---|---|---|
| 传统 | 150 req/s | 1.2GB | 25s |
| Docker | 120 req/s | 2.1GB | 8s |
6. 毕业设计实战建议
6.1 论文写作要点
根据指导经验,优秀论文应包含:
- 推荐算法对比实验(至少3种算法)
- 系统性能压测报告(JMeter实测数据)
- 用户调研结果(可用问卷星收集)
6.2 答辩常见问题
准备好这些问题的深度解答:
- 如何解决数据稀疏性问题?
- 推荐结果的多样性如何保证?
- 系统有哪些商业变现可能性?
我在实际项目开发中最深刻的体会是:推荐系统70%的工作在于数据清洗和特征工程,算法实现反而只占小部分。建议同学们在毕设时间分配上,给数据预处理留足时间。另外,Django的调试工具栏(django-debug-toolbar)是个神器,能快速定位性能瓶颈。