1. 项目概述
这个基于协同过滤算法的日常用品商城系统是我在毕业设计期间完成的一个完整电商平台项目。作为一名计算机专业的学生,我选择这个课题是因为电商平台在实际应用中具有广泛的需求,而个性化推荐系统又是当前电商领域的热门技术方向。
系统采用Java语言开发,基于Spring Boot框架构建,使用MySQL作为数据库。整个项目从需求分析、系统设计到编码实现和测试部署,前后历时4个月完成。系统最大的特色是实现了基于用户行为的协同过滤推荐算法,能够根据用户的历史购买记录和浏览行为,智能推荐可能感兴趣的商品。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型分析
在技术选型上,我主要考虑了以下几个因素:
- 开发效率:Spring Boot框架提供了快速开发的能力,内置Tomcat服务器,简化了配置和部署过程
- 性能需求:日常用品商城对并发要求不是特别高,Spring Boot+MySQL的组合完全能满足需求
- 团队熟悉度:Java是我最熟悉的语言,Spring Boot框架学习曲线平缓
- 扩展性:系统采用分层架构,便于未来功能扩展
2.2 系统架构图
系统采用经典的三层架构:
code复制表现层(Web) → 业务逻辑层(Service) → 数据访问层(DAO)
前端使用Vue.js框架,后端采用Spring Boot,通过RESTful API进行数据交互。数据库使用MySQL 8.0,通过MyBatis实现ORM映射。
3. 核心功能实现
3.1 用户模块
用户模块主要包括以下功能点:
- 注册登录:采用JWT实现无状态认证
- 商品浏览:支持分类查看、关键词搜索
- 购物车:临时保存用户选择的商品
- 订单管理:查看历史订单状态
- 评价系统:用户可对购买商品进行评价
3.2 管理员模块
管理员模块功能包括:
- 商品管理:CRUD操作
- 订单管理:处理用户订单
- 用户管理:查看和管理用户信息
- 数据统计:销售数据可视化展示
3.3 协同过滤推荐算法实现
3.3.1 算法选择
系统实现了两种协同过滤算法:
- 基于用户的协同过滤(UserCF):找到相似用户推荐商品
- 基于物品的协同过滤(ItemCF):根据用户历史喜欢物品推荐相似物品
经过测试比较,最终选择了ItemCF作为主要推荐算法,因为:
- 物品相似度相对稳定,计算量小
- 更适合商品数量多、用户数量大的场景
- 解释性强,便于用户理解推荐理由
3.3.2 相似度计算
使用改进的余弦相似度计算物品相似度:
java复制public double similarity(List<Double> v1, List<Double> v2) {
double dotProduct = 0.0;
double norm1 = 0.0;
double norm2 = 0.0;
for (int i = 0; i < v1.size(); i++) {
dotProduct += v1.get(i) * v2.get(i);
norm1 += Math.pow(v1.get(i), 2);
norm2 += Math.pow(v2.get(i), 2);
}
// 加入惩罚因子,降低热门物品权重
double penalty = 1 / Math.log(1 + countMap.get(itemId));
return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2)) * penalty;
}
3.3.3 推荐生成
推荐生成流程:
- 获取用户历史行为数据
- 找出用户喜欢的物品集合
- 计算这些物品的相似物品
- 过滤掉用户已经接触过的物品
- 按相似度排序生成推荐列表
4. 数据库设计
4.1 主要表结构
系统设计了20多张表,核心表包括:
- 用户表(user):存储用户基本信息
- 商品表(goods):商品详细信息
- 订单表(order):订单主信息
- 订单明细表(order_item):订单中的商品明细
- 用户行为表(user_behavior):记录用户浏览、购买等行为
4.2 关键表关系
- 用户与订单:一对多
- 订单与订单明细:一对多
- 商品与订单明细:一对多
- 用户与用户行为:一对多
5. 系统实现细节
5.1 后端实现
5.1.1 Spring Boot配置
java复制@SpringBootApplication
@MapperScan("com.mall.dao")
public class MallApplication {
public static void main(String[] args) {
SpringApplication.run(MallApplication.class, args);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
5.1.2 商品服务实现
java复制@Service
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Override
public PageInfo<Goods> getGoodsByPage(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<Goods> goodsList = goodsMapper.selectAll();
return new PageInfo<>(goodsList);
}
@Override
public List<Goods> getRecommendGoods(int userId) {
// 调用推荐算法获取推荐商品ID列表
List<Integer> recommendIds = recommendService.getRecommendations(userId);
return goodsMapper.selectByIds(recommendIds);
}
}
5.2 前端实现
前端采用Vue.js + Element UI,主要页面包括:
- 首页:展示推荐商品、热门商品
- 商品详情页:商品详细信息、评价
- 购物车页:管理待购买商品
- 订单页:查看和管理订单
- 个人中心:用户信息管理
6. 系统测试
6.1 功能测试
对系统各模块进行了全面测试,包括:
- 用户注册登录
- 商品浏览搜索
- 购物车操作
- 下单支付流程
- 推荐功能验证
6.2 性能测试
使用JMeter进行压力测试,主要指标:
- 首页加载时间:<1s(100并发)
- 商品搜索响应时间:<500ms
- 下单接口TPS:200+
6.3 推荐效果评估
使用准确率、召回率和覆盖率评估推荐效果:
| 指标 | UserCF | ItemCF |
|---|---|---|
| 准确率 | 0.32 | 0.41 |
| 召回率 | 0.28 | 0.38 |
| 覆盖率 | 0.45 | 0.52 |
从结果看,ItemCF表现更好,因此作为主要推荐算法。
7. 项目总结
7.1 项目成果
- 完成了完整的电商平台开发
- 实现了基于协同过滤的推荐系统
- 系统性能满足基本需求
- 推荐算法效果达到预期
7.2 遇到的问题及解决
-
冷启动问题:新用户没有行为数据,难以推荐
- 解决方案:采用热门商品作为默认推荐
-
数据稀疏性:用户-物品矩阵稀疏
- 解决方案:引入基于内容的相似度补充
-
实时性要求:用户新行为需要及时影响推荐
- 解决方案:实现近实时更新机制
7.3 未来改进方向
- 引入更多推荐算法,如深度学习模型
- 增加实时推荐能力
- 优化推荐解释,增强用户信任
- 扩展移动端支持
8. 开发心得
通过这个项目,我深刻体会到:
- 系统设计比编码更重要,好的设计能减少后期修改
- 算法实现要考虑实际业务场景,不能只追求理论效果
- 性能优化是一个持续的过程
- 测试环节不可或缺,能发现很多设计时没想到的问题
这个项目让我对电商系统和推荐算法有了更深入的理解,也为我的职业发展打下了良好基础。
