温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着人们生活水平的不断提高,化妆品已成为日常消费的重要组成部分。面对市场上琳琅满目的化妆品品牌和种类,消费者往往难以快速准确地选择适合自己的产品。与此同时,电商平台的快速发展使得化妆品在线销售规模持续扩大,个性化推荐成为提升用户体验和平台转化率的关键手段。
本课题基于 Java Spring Boot 框架设计并实现一个化妆品推荐系统,旨在通过用户行为数据分析和推荐算法,为用户提供个性化的化妆品推荐服务,帮助用户在海量商品中快速找到心仪产品,同时为平台运营提供数据支撑。
2. 系统需求分析
2.1 功能需求
本系统面向普通用户和管理员两类角色,主要功能模块划分如下:
- 用户模块:用户注册、登录、个人信息管理、浏览历史记录。
- 商品模块:化妆品分类展示、商品详情查看、关键词搜索、按品牌/肤质/价格筛选。
- 推荐模块:基于用户行为的协同过滤推荐、基于商品属性的内容推荐、热门商品推荐。
- 评价模块:用户对已购商品进行评分和评论,为推荐算法提供数据基础。
- 管理模块:管理员对商品、分类、用户、评论进行后台管理。
2.2 非功能需求
- 性能:系统响应时间在常规操作下不超过 2 秒,推荐接口在数据量较大时具备缓存机制。
- 安全性:用户密码加密存储,接口权限校验,防止 SQL 注入和越权访问。
- 可扩展性:推荐算法模块采用策略模式设计,便于后续扩展新的推荐策略。
- 易用性:前端界面简洁友好,操作流程清晰。
3. 系统总体设计
3.1 系统架构设计
系统采用前后端分离的 B/S 架构,整体分为表现层、业务逻辑层、数据访问层三层结构:
- 表现层:使用 Vue.js 或 Thymeleaf 构建用户界面,通过 RESTful API 与后端交互。
- 业务逻辑层:Spring Boot 负责业务处理,包括用户管理、商品管理、推荐引擎等核心逻辑。
- 数据访问层:使用 MyBatis-Plus 或 Spring Data JPA 操作 MySQL 数据库,Redis 用于缓存热点数据和推荐结果。
3.2 技术选型
| 层次 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7 | 快速构建独立运行的微服务应用 |
| 持久层 | MyBatis-Plus | 简化数据库操作,内置分页和条件构造器 |
| 数据库 | MySQL 8.0 | 存储用户、商品、订单、评价等业务数据 |
| 缓存 | Redis | 缓存热门商品和推荐结果,提升响应速度 |
| 前端 | Vue.js + Element UI | 构建响应式管理后台和用户端页面 |
| 推荐算法 | 协同过滤 + 内容推荐 | 基于用户评分和商品属性实现个性化推荐 |
3.3 数据库设计
系统核心数据表包括用户表、商品表、商品分类表、评分表、评论表和浏览记录表。以下为关键表结构设计:
-- 用户表 CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, nickname VARCHAR(50), skin_type VARCHAR(20) COMMENT '肤质类型', avatar VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 商品表 CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, category_id BIGINT NOT NULL, brand VARCHAR(50), price DECIMAL(10,2), skin_type VARCHAR(20) COMMENT '适用肤质', description TEXT, image_url VARCHAR(255), sales_count INT DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 评分表 CREATE TABLE rating ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, product_id BIGINT NOT NULL, score INT NOT NULL COMMENT '1-5分', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_product (user_id, product_id) );4. 推荐算法设计
4.1 基于用户的协同过滤
基于用户的协同过滤算法核心思想是:找到与当前用户兴趣相似的其他用户,将这些相似用户喜欢的商品推荐给当前用户。算法实现步骤如下:
- 构建用户-商品评分矩阵,评分数据来源于用户对商品的打分和购买行为。
- 使用皮尔逊相关系数或余弦相似度计算用户之间的相似度。
- 选取与目标用户相似度最高的 K 个用户作为最近邻集合。
- 对目标用户未评分的商品进行预测评分,按预测分值降序生成推荐列表。
4.2 基于商品属性的内容推荐
内容推荐算法根据商品的属性特征(品牌、分类、适用肤质、价格区间等)计算商品之间的相似度,为用户推荐与其历史偏好商品相似的其他商品。该算法不依赖其他用户的行为数据,适合冷启动场景。
4.3 混合推荐策略
为弥补单一算法的不足,系统采用加权融合的混合推荐策略:
public class HybridRecommender { private final UserCFRecommender userCF; private final ContentRecommender content; public List<Product> recommend(Long userId, int topN) { // 用户协同过滤推荐结果 List<Product> cfList = userCF.recommend(userId, topN); // 内容推荐结果 List<Product> contentList = content.recommend(userId, topN); // 加权融合,协同过滤权重 0.6,内容推荐权重 0.4 return mergeAndRank(cfList, contentList, 0.6, 0.4); } }5. 系统核心功能实现
5.1 用户注册与登录
用户注册时对密码进行 BCrypt 加密存储,登录成功后签发 JWT Token,前端在后续请求中携带 Token 完成身份认证。Spring Security 负责接口权限控制。
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private PasswordEncoder passwordEncoder; @Override public User register(RegisterDTO dto) { // 校验用户名是否已存在 if (userMapper.selectByUsername(dto.getUsername()) != null) { throw new BusinessException("用户名已存在"); } User user = new User(); user.setUsername(dto.getUsername()); user.setPassword(passwordEncoder.encode(dto.getPassword())); user.setNickname(dto.getNickname()); user.setSkinType(dto.getSkinType()); userMapper.insert(user); return user; } }5.2 商品推荐接口
推荐接口优先从 Redis 缓存读取推荐结果,缓存未命中时调用推荐引擎计算并回填缓存,以降低算法计算对数据库的压力。
@RestController @RequestMapping("/api/recommend") public class RecommendController { @Autowired private RecommendService recommendService; @GetMapping("/products") public Result<List<ProductVO>> getRecommendProducts( @RequestParam Long userId, @RequestParam(defaultValue = "10") int topN) { List<ProductVO> list = recommendService.getRecommendProducts(userId, topN); return Result.success(list); } }5.3 商品搜索与筛选
商品搜索支持按名称模糊查询,同时支持按品牌、分类、肤质和价格区间进行组合筛选,使用 MyBatis-Plus 条件构造器动态拼接查询条件。
public Page<Product> searchProducts(ProductQuery query) { LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasText(query.getKeyword())) { wrapper.like(Product::getName, query.getKeyword()); } if (query.getCategoryId() != null) { wrapper.eq(Product::getCategoryId, query.getCategoryId()); } if (StringUtils.hasText(query.getBrand())) { wrapper.eq(Product::getBrand, query.getBrand()); } if (query.getMinPrice() != null) { wrapper.ge(Product::getPrice, query.getMinPrice()); } if (query.getMaxPrice() != null) { wrapper.le(Product::getPrice, query.getMaxPrice()); } return productMapper.selectPage(new Page<>(query.getPageNum(), query.getPageSize()), wrapper); }6. 系统测试
6.1 功能测试
对用户注册登录、商品浏览、搜索筛选、评分评论、推荐展示等核心功能进行测试,验证各模块功能是否符合需求规格说明。测试结果表明各功能模块运行正常,接口返回数据准确。
6.2 推荐效果评估
采用准确率和召回率两个指标对推荐算法进行评估。在测试数据集上,混合推荐策略相比单一协同过滤算法,准确率提升了约 12%,召回率提升了约 9%,验证了混合策略的有效性。
7. 总结与展望
本文设计并实现了一个基于 Java Spring Boot 的化妆品推荐系统,系统采用前后端分离架构,实现了用户管理、商品管理、个性化推荐和后台管理等核心功能。推荐模块融合了协同过滤和内容推荐两种算法,有效提升了推荐的准确性和多样性。
后续可以从以下方向继续优化:引入深度学习推荐模型提升推荐精度;增加实时行为流处理能力,实现秒级反馈的实时推荐;完善系统监控和日志分析,为运营决策提供更丰富的数据支持。