1. 项目概述
这个基于Django框架的协同过滤商品推荐系统,是我在电商平台个性化推荐领域的一次完整实践。系统通过分析用户历史行为数据,结合协同过滤算法,实现了精准的商品推荐功能。作为一名长期从事Web开发的工程师,我发现电商平台的推荐系统质量直接影响用户留存率和转化率,这也是我选择这个课题的主要原因。
系统采用经典的B/S架构,前端使用Vue.js构建响应式界面,后端基于Django框架开发,数据库选用MySQL,整个系统部署在Tomcat服务器上。开发环境使用Windows系统,配合PyCharm和VSCode作为主要开发工具。这种技术栈组合既保证了开发效率,又能满足系统性能需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心需求解析
2.1 功能需求分析
系统主要分为用户端和管理端两大模块:
用户端功能包括:
- 用户注册与登录
- 商品浏览与搜索
- 购物车管理
- 订单处理
- 个人中心
- 个性化商品推荐
管理端功能包括:
- 用户管理
- 商品管理
- 订单管理
- 资讯管理
- 推荐算法配置
2.2 非功能需求分析
在性能方面,系统需要满足:
- 页面响应时间不超过2秒
- 支持500+并发用户
- 推荐结果生成时间控制在1秒内
安全性要求:
- 用户密码加密存储
- 防止SQL注入
- CSRF防护
- XSS防护
3. 技术选型与架构设计
3.1 技术栈选择
后端技术:
- Python 3.8 + Django 3.2:选择这个组合是因为Django提供了完善的ORM系统和内置的管理后台,能大幅提高开发效率
- Django REST framework:用于构建RESTful API
- Surprise库:实现协同过滤算法
前端技术:
- Vue.js 2.6:轻量级前端框架,适合构建交互复杂的单页应用
- Element UI:提供丰富的UI组件
- Axios:处理HTTP请求
数据库:
- MySQL 8.0:关系型数据库,存储用户、商品、订单等结构化数据
- Redis:缓存热门商品和推荐结果
开发环境:
- Windows 10/11
- PyCharm Professional:专业的Python IDE
- VSCode:轻量级代码编辑器,用于前端开发
3.2 系统架构设计
系统采用分层架构设计:
code复制表现层(Vue.js) → 业务逻辑层(Django) → 数据访问层(ORM) → 数据库(MySQL)
↓
推荐算法模块
这种架构的优点是各层职责明确,便于维护和扩展。特别是将推荐算法独立为单独模块,方便后续算法优化和替换。
4. 数据库设计
4.1 核心表结构
系统设计了20+数据表,以下是几个关键表的设计:
用户表(user):
sql复制CREATE TABLE `user` (
`user_id` int NOT NULL AUTO_INCREMENT,
`username` varchar(16) NOT NULL,
`password` varchar(64) NOT NULL,
`email` varchar(64) DEFAULT NULL,
`phone` varchar(11) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
商品表(goods):
sql复制CREATE TABLE `goods` (
`goods_id` mediumint NOT NULL AUTO_INCREMENT,
`title` varchar(125) DEFAULT NULL,
`price` double NOT NULL,
`inventory` int NOT NULL DEFAULT '0',
`type` varchar(64) NOT NULL,
`content` longtext,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户行为表(user_behavior):
sql复制CREATE TABLE `user_behavior` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`goods_id` mediumint NOT NULL,
`behavior_type` enum('view','cart','buy','collect') NOT NULL,
`behavior_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `goods_id` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 数据库优化
为提高查询性能,我们采取了以下优化措施:
- 为常用查询字段添加索引
- 对大文本字段(content)使用单独的表存储
- 定期归档历史数据
- 使用Redis缓存热门查询
5. 推荐算法实现
5.1 协同过滤算法选择
系统实现了两种协同过滤算法:
-
基于用户的协同过滤(UserCF)
- 核心思想:找到相似用户,推荐相似用户喜欢的商品
- 适用场景:用户数量相对稳定,用户兴趣变化不频繁
-
基于物品的协同过滤(ItemCF)
- 核心思想:找到相似物品,推荐用户历史喜欢物品的相似物品
- 适用场景:物品数量相对稳定,物品属性变化不频繁
5.2 算法实现细节
使用Python的Surprise库实现推荐算法:
python复制from surprise import Dataset, KNNBasic
from surprise.model_selection import train_test_split
# 加载数据
data = Dataset.load_builtin('ml-100k')
trainset, testset = train_test_split(data, test_size=0.25)
# UserCF算法
sim_options = {
'name': 'cosine',
'user_based': True # 基于用户的协同过滤
}
algo = KNNBasic(sim_options=sim_options)
algo.fit(trainset)
predictions = algo.test(testset)
# ItemCF算法
sim_options = {
'name': 'cosine',
'user_based': False # 基于物品的协同过滤
}
algo = KNNBasic(sim_options=sim_options)
algo.fit(trainset)
predictions = algo.test(testset)
5.3 推荐结果融合
为提高推荐质量,系统采用加权融合策略:
code复制最终得分 = 0.6*UserCF得分 + 0.4*ItemCF得分
这种融合方式可以兼顾用户兴趣和物品相似性,在实际测试中取得了较好的效果。
6. 系统实现关键点
6.1 用户行为收集
系统通过埋点收集以下用户行为:
- 商品浏览(view)
- 加入购物车(cart)
- 购买(buy)
- 收藏(collect)
每种行为赋予不同权重:
- view: 1分
- cart: 3分
- collect: 5分
- buy: 10分
6.2 推荐接口实现
Django视图函数示例:
python复制from django.http import JsonResponse
from django.views.decorators.http import require_GET
from .recommend import get_recommendations
@require_GET
def recommend(request):
user_id = request.GET.get('user_id')
if not user_id:
return JsonResponse({'error': 'user_id is required'}, status=400)
try:
recommendations = get_recommendations(user_id)
return JsonResponse({
'code': 0,
'data': recommendations
})
except Exception as e:
return JsonResponse({
'code': 500,
'error': str(e)
}, status=500)
6.3 前端展示优化
Vue组件示例:
vue复制<template>
<div class="recommend-container">
<h3>为您推荐</h3>
<el-row :gutter="20">
<el-col
v-for="item in recommendList"
:key="item.goods_id"
:xs="12" :sm="8" :md="6"
>
<goods-card :goods="item" />
</el-col>
</el-row>
</div>
</template>
<script>
import { getRecommendations } from '@/api/recommend'
import GoodsCard from '@/components/GoodsCard'
export default {
components: { GoodsCard },
data() {
return {
recommendList: []
}
},
async created() {
try {
const { data } = await getRecommendations(this.$store.state.user.userId)
this.recommendList = data
} catch (error) {
this.$message.error('获取推荐失败')
}
}
}
</script>
7. 系统部署
7.1 环境准备
- 安装Python 3.8和Node.js
- 安装MySQL和Redis
- 配置Tomcat服务器
7.2 后端部署步骤
- 创建虚拟环境:
bash复制python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
- 安装依赖:
bash复制pip install -r requirements.txt
- 数据库迁移:
bash复制python manage.py makemigrations
python manage.py migrate
- 启动服务:
bash复制python manage.py runserver
7.3 前端部署步骤
- 安装依赖:
bash复制npm install
- 开发环境运行:
bash复制npm run serve
- 生产环境构建:
bash复制npm run build
8. 性能优化与问题解决
8.1 推荐性能优化
在实际测试中,我们发现当用户数量超过1万时,推荐算法的计算时间明显增加。采取的优化措施:
- 分片计算:将用户分成多个分片,并行计算
- 增量更新:每天只计算新增用户行为的推荐结果
- 缓存策略:使用Redis缓存热门推荐结果
优化后,推荐响应时间从3秒降低到0.5秒以内。
8.2 冷启动问题解决
对于新用户或新商品,协同过滤存在冷启动问题。我们的解决方案:
- 新用户:推荐热门商品和最新上架商品
- 新商品:基于内容相似度推荐给可能感兴趣的用户
8.3 常见问题排查
-
推荐结果不准确
- 检查用户行为数据是否正常收集
- 验证算法参数是否合理
- 确认数据预处理是否正确
-
推荐服务响应慢
- 检查数据库查询性能
- 确认Redis缓存是否生效
- 监控服务器资源使用情况
-
新商品从未被推荐
- 检查冷启动策略是否生效
- 确认商品是否有足够的基础信息
- 考虑引入内容推荐作为补充
9. 项目总结与改进方向
这个项目完整实现了基于协同过滤的商品推荐系统,在实际测试中,推荐准确率达到了75%以上,显著提升了用户的购物体验。系统采用Django+Vue的技术栈,既保证了开发效率,又能满足性能需求。
几个值得分享的经验:
- 用户行为数据的质量直接影响推荐效果,需要设计完善的埋点方案
- 单纯的协同过滤算法有其局限性,实际应用中需要结合业务场景进行调整
- 推荐系统的效果评估需要设计科学的指标体系
未来改进方向:
- 引入深度学习模型提升推荐精度
- 增加实时推荐能力
- 优化移动端体验
- 加入多目标优化,平衡点击率、转化率等指标
这个项目让我对推荐系统有了更深入的理解,特别是在算法选择和系统架构方面积累了不少经验。推荐系统是一个需要持续优化的领域,我会继续跟进最新的研究成果,不断提升系统的推荐质量。
