又是一年毕设季后台收到不少同学在问“大数据方向的Java毕设怎么选题”“推荐系统能不能用SpringBoot做”。说实话每年看到大量选题要么烂大街的图书管理、要么纯理论没有落地场景我就替他们着急。今天分享的这个项目——基于SpringBoot大数据的男装类商品购物网站推荐系统算是我认为性价比非常高、技术栈覆盖又全面、答辩还特别有讲头的选题之一。这个项目不是简单的CRUD增删改查而是把SpringBoot后端框架和大数据处理链路日志采集、离线分析、推荐算法结合在了一起既有传统的电商业务闭环商品、订单、购物车、用户中心又有数据采集与推荐引擎的完整落地。对于想冲刺“优秀毕设”、或者想在简历上写点实在项目的同学来说这个题目能拿得出手也能讲清楚还能演示出效果。下面我就把整个项目的技术架构、核心模块、算法实现思路、以及我调试过程中趟过的一些坑从头到尾给你拆开揉碎讲一遍。1. 项目定位与需求拆解1.1 为什么选“男装购物推荐”这个场景先说说选题逻辑。很多同学一提到推荐系统第一反应就是“电影推荐”“音乐推荐”——这两个方向确实经典但正因为太经典做的人太多了开题报告千篇一律答辩老师一眼就看腻了。而垂直领域的商品推荐尤其是男装类目有几个天然优势第一数据特征更聚焦。男装的类目维度T恤、外套、裤装、鞋靴、风格维度商务、休闲、运动、价格带维度百元以下、百到三百、三百以上都很清晰做用户画像和物品画像的时候特征提取容易落地不会像全品类电商那样特征稀疏、模型难收敛。第二推荐效果可解释性强。男装消费决策相对理性用户对“相似风格”“同类价位”“浏览过的类似款”有明显的接受度基于物品的协同过滤ItemCF就能产生挺不错的推荐效果演示起来说服力强。第三业务闭环完整。购物网站天然自带注册登录、商品浏览、加入购物车、下单支付模拟、收藏评价等完整链路这些用户行为数据本身就是推荐系统的“燃料”整个项目能形成一个自洽的故事系统产生数据 → 数据被采集 → 数据被清洗分析 → 推荐引擎消费数据 → 推荐结果改善用户体验。1.2 核心需求与功能模块拆解我习惯在动手写代码之前先把系统拆成几个关键模块每个模块回答清楚“它解决什么问题”。这个项目我拆成了六个核心模块用户端商城模块注册登录、商品列表与详情、购物车、订单管理、收货地址、个人中心。后台管理模块管理员登录、商品上架下架、库存管理、订单处理、用户管理、数据统计看板。用户行为采集模块埋点记录用户的浏览、搜索、收藏、加购、购买行为生成行为日志。推荐引擎模块基于用户历史行为通过协同过滤/贝叶斯等算法生成“猜你喜欢”“相似商品”推荐列表。大数据分析模块对用户行为日志进行清洗、统计、分析输出热销商品榜、用户活跃时段、类目偏好分布等。数据可视化模块用图表展示分析结果支撑后台看板方便答辩演示。从技术实现角度看前两个模块是“传统JavaWeb”的活儿用SpringBootMyBatis-PlusVue就能搞定后三个模块才是“大数据”味道所在需要引入日志采集、Hadoop HDFS存储、Spark或Hive离线分析、推荐算法计算。所以这个项目的核心价值就是把Java后端开发和大数据处理两条技术线拧成了一股绳。2. 技术选型与架构设计2.1 后端框架为什么一定用SpringBoot现在很多学校课程还在教SSHStrutsSpringHibernate或者SSMSpringSpringMVCMyBatis但行业里新项目基本已经全面转向SpringBoot了。对于毕设而言用SpringBoot有三个直接好处零配置起步内置Tomcatjava -jar就能跑不用再折腾繁琐的XML配置省下来的时间足够你多调两个推荐算法参数。生态整合方便SpringBoot整合MyBatis-Plus、Redis、RabbitMQ、Spring Security都极其顺滑而且网上资料多踩了坑能快速搜到解决方案。简历加分SpringBoot是当前Java后端岗位的标配技能写在简历上“熟练使用SpringBoot框架”是基本盘比写“熟悉SSM”更有说服力。具体到项目里我建议这样搭SpringBoot的基础设施用SpringBoot 2.5.x不要用太新的3.x有些国产中间件兼容性还跟不上整合MyBatis-Plus做数据访问整合Spring MVC提供RESTful接口用JWT或Session做登录态管理。数据库用MySQL 8.0连接池用Druid或者HikariCP都行。2.2 大数据技术栈够用就好别贪多大数据方向的技术栈实在太多了Hadoop、Spark、Flink、Hive、HBase、Kafka、Zookeeper……如果全都堆进毕设先不说机器跑不跑得动光是环境配置就能耗掉你半个月。我建议紧扣“能跑通、能讲清、能演示”三原则来做技术选型数据存储用户行为日志先落地到本地文件系统再用脚本上传到Hadoop HDFS。MySQL存业务数据商品、用户、订单HDFS存日志数据各司其职。离线计算用SparkScala或Java版本均可或者Hive做日志的清洗和统计分析。这两个二选一即可。我更推荐Spark因为后期写推荐算法可以直接用Spark MLlib一鱼两吃。推荐算法优先实现基于物品的协同过滤ItemCF和基于用户行为偏好的贝叶斯分类两种算法前者负责“猜你喜欢”后者负责“为你推荐男装风格偏好商品”。贝叶斯算法在热词里也出现了答辩老师问到的时候你可以讲得很深入。可视化后端提供统计数据接口前端用ECharts绘制图表做成交额趋势、类目占比、用户活跃时段等大屏看板。不需要额外引入太重的大屏框架ECharts加几张图表就够惊艳了。这里要提醒一句千万不要为了显得“高级”硬上FlinkKafkaDoris那一套实时数仓。毕设的周期、机器资源、答辩深度都有限实时流处理意味着要处理数据延迟性、状态管理、checkpoint等一系列复杂问题讲不好反而成减分项。离线链路做扎实已经能覆盖“大数据”的知识点了。2.3 整体架构一图看懂数据流转我在设计架构时遵循了一条非常清晰的数据流主线用户在前端商城操作 → Nginx/AOP埋点采集行为日志 → 日志落盘 → 定时任务上传HDFS → Spark离线清洗分析 → 统计结果回写MySQL → 推荐算法读取用户行为数据与商品特征 → 生成推荐列表 → 前端展示这条链路把“业务系统”和“大数据系统”完美串了起来。前端商城不只是展示页面它同时也是数据生产源大数据分析的结果又反哺了商城业务热销排行、个性化推荐。这个“闭环”正是答辩时最能体现你“系统设计能力”的地方。3. 核心模块实现细节3.1 用户行为日志采集没有数据推荐就是空谈推荐系统最怕的就是“冷启动”——没有行为数据算法再牛也白搭。所以项目里必须把采集端做好。我采用的方案是SpringBoot AOP 自定义注解的方式来埋点代码侵入性小采集逻辑统一。我先定义一个行为枚举public enum BehaviorType { VIEW(view), // 浏览 SEARCH(search), // 搜索 FAVORITE(fav), // 收藏 CART(cart), // 加购 PURCHASE(buy); // 购买 }然后在Controller的方法上加上自定义注解比如浏览商品详情时LogBehavior(type BehaviorType.VIEW) GetMapping(/product/{id}) public Result productDetail(PathVariable Long id) { // 商品详情逻辑 }通过AOP切面在方法执行后异步记录日志用户ID、商品ID、行为类型、时间戳、停留时长等写入本地日志文件。这里强烈建议用异步线程池来写日志否则每次点击都同步写文件会拖慢接口响应。采集到日志之后格式类似user_1001|product_2088|view|1705123456789|12.3 user_1001|product_3129|cart|1705123481234|1每条记录之间用管道符分隔后续Spark清洗时解析非常方便。3.2 商品与用户画像让算法“认识”商品和用户推荐算法要起作用光有行为数据还不够还需要结构化的画像数据。商品画像我建了这么一张表CREATE TABLE product_profile ( product_id bigint PRIMARY KEY, category varchar(32) COMMENT 类目外套/卫衣/裤装/鞋靴, style varchar(32) COMMENT 风格商务/休闲/运动, price_band varchar(16) COMMENT 价格带0-100/100-300/300, fabric varchar(32) COMMENT 面料棉/麻/涤纶/混纺, season varchar(16) COMMENT 季节春夏/秋冬 );类目、风格、价格带这几个字段是后面做协同过滤相似度计算和贝叶斯分类的关键特征。用户画像则根据行为日志动态更新比如某个用户最近浏览了5次商务风格外套、收藏了2条休闲裤装那他的风格偏好向量就是商务0.6、休闲0.4。这些画像数据不用做得太复杂能支撑算法演示就够了关键是让答辩老师看到你有“特征工程”的意识。3.3 推荐引擎的两种算法实现3.3.1 基于物品的协同过滤ItemCF这是整个推荐系统最核心的算法逻辑也最好讲清楚。它基于一个朴素的假设喜欢商品A的用户也喜欢与A相似的商品B。实现分为三步第一步构建用户-物品行为矩阵。从行为日志中提取每个用户对每个商品的“兴趣得分”。不同行为类型权重不同我用的权重是购买5加购3收藏2浏览1。第二步计算物品间的相似度。有了用户对物品的打分向量就可以用余弦相似度计算两个商品之间的相似度$$\text{sim}(A,B)\frac{\sum_{u\in U} r_{uA} \times r_{uB}}{\sqrt{\sum_{u\in U} r_{uA}^2} \times \sqrt{\sum_{u\in U} r_{uB}^2}}$$这里要注意计算相似度时最好只保留行为得分大于0的“正反馈”项原始的打分矩阵往往非常稀疏如果全量计算绝大多数商品对相似度都是0会影响推荐效果。第三步生成推荐列表。对用户u而言他喜欢的商品集合为 $S_u$那么他对候选商品 $p$ 的兴趣度可以这样算$$\text{pref}(u,p)\sum_{i \in S_u} \text{sim}(i,p) \times r_{ui}$$把所有候选商品按兴趣度降序排列取Top-N一般取20个输出到“猜你喜欢”栏目即可。代码层面物品相似度矩阵可以提前离线计算好、存到Redis里推荐时实时读取用户最近行为然后加权求和这样接口响应时间能压到100ms以内。3.3.2 基于贝叶斯算法的风格偏好预测热词里出现了“基于贝叶斯算法的建模”这个在答辩里是个很好的延伸点。我在项目中用朴素贝叶斯做了一件事根据用户的浏览/购买历史预测用户最可能喜欢的商品子类。贝叶斯公式长这样$$P(C_k | X) \frac{P(X | C_k) \times P(C_k)}{P(X)}$$拆开解释$X$ 是“用户特征向量”比如历史浏览的商品类目分布、价格带分布$C_k$ 是“预测的偏好类目”比如休闲卫衣。$P(C_k)$ 是类目的先验概率可以直接从全量用户的历史行为统计得到$P(X|C_k)$ 是类目 $C_k$ 下出现特征 $X$ 的条件概率用历史数据里“喜欢类目 $C_k$ 的用户中特征分布也为 $X$”的频率来估计。实际建模时我会为每个商品子类训练一个简单模型保存各特征的条件概率表。等线上来了新用户或者历史行为较多的老用户把他的特征向量代入计算每个子类的后验概率取最大值对应的子类作为“偏好预测结果”。这里有个小技巧处理概率为0的情况。如果某个特征组合在训练集中从未出现直接套公式算出来就是0整个结果就废了。解决方案是加平滑项拉普拉斯平滑给每个计数加一个很小的常数 $\alpha$避免零概率问题。这个细节答辩论道老师会认为你确实实操过不是背概念。3.3.3 冷启动兜底方案冷启动在每个推荐系统里都绕不开。我的方案是分情况处理新用户无行为数据推荐全局热销Top20商品用“热门榜”兜底。老用户新商品商品刚上架没有行为数据用“同风格价位热门款”代替。实现上也不难写一个策略路由先看用户行为记录是否存在存在走个性化推荐不存在走热门兜底。这样即使演示时换个新账号登录页面也不会空空如也体验上就赢了。3.4 Spark离线分析任务Spark这块是整个项目“大数据”属性的门面我设计了三个离线分析任务用户活跃度分析统计每天各时段的活跃用户数画出24小时曲线发现访问高峰。商品热度排行统计各商品的浏览、加购、购买转化漏斗输出热销榜。用户画像统计按年龄、性别维度统计偏好类目分布辅助运营决策。用Spark实现时核心逻辑其实就是map、filter、reduceByKey三个算子例如统计每个类目的浏览量JavaRDDString lines sc.textFile(hdfs:///user/logs/2025-01-*.log); JavaPairRDDString, Integer categoryViews lines .mapToPair(line - { String[] fields line.split(\\|); // 假设通过商品ID关联出类目 return new Tuple2(getCategoryByProductId(fields[1]), 1); }) .reduceByKey(Integer::sum);跑完之后把结果写入MySQL前端后台管理页面的ECharts图表从MySQL读数据展示。整个链路日志 → HDFS → Spark → MySQL → 可视化一气呵成。这里多说一句。很多同学对Spark有畏难情绪觉得要搭集群很麻烦。实际上毕设场景完全可以用Spark Local 模式本地模式跑不用搭建集群也能正确处理业务数据。等你把逻辑写顺了再考虑要不要提交到集群上跑。先把功能跑出来比什么都重要。4. 常见问题与排查技巧实录这个项目我在帮同学调试过程中遇到过不少问题整理几个高频的、你有大概率也会碰到的提前给你排雷。4.1 环境与依赖问题问题1Hadoop/Spark版本和SpringBoot版本冲突表现启动SpringBoot时报SLF4J绑定冲突或者Spark任务运行时NoSuchMethodError。原因Spark自带的日志框架和SpringBoot的Logback冲突了。解决方案在引入Spark依赖时排除掉它自带的日志组件dependency groupIdorg.apache.spark/groupId artifactIdspark-core_2.12/artifactId version3.2.0/version exclusions exclusion groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId /exclusion /exclusions /dependency问题2MySQL连接数被耗尽表现系统跑一段时间后后台报“Too many connections”。原因HikariCP默认最大连接数是10但推荐算法计算时的多线程并发可能会占用大量连接加上日志采集线程池也在访问数据库连接池就被打满了。解决方案调大连接池上限并配置等待超时时间同时给日志采集线程池限定核心线程数避免无限创建线程spring: datasource: hikari: maximum-pool-size: 50 connection-timeout: 30000个人经验日志采集线程池的核心线程数设置为CPU核数1就够了不要贪多。4.2 推荐效果类问题问题3相似商品推荐结果太粗糙表现“猜你喜欢”推荐出来的商品和你刚看的那件衣服完全不是一个风格。原因物品相似度计算的维度太少只用了用户行为向量没结合商品本身的属性特征。解决方案在计算相似度时融合属性特征。先用商品属性类目、风格、价格带算一个属性相似度 $\text{sim}{\text{attr}}$再用用户行为算行为相似度 $\text{sim}{\text{behavior}}$最后加权融合$$\text{sim}(A,B)0.6 \times \text{sim}{\text{behavior}}(A,B) 0.4 \times \text{sim}{\text{attr}}(A,B)$$我调参时发现行为相似度权重在0.5-0.7之间效果都还说得过去低于0.5就直接退化成纯属性推荐了。问题4新用户推荐全是热门款个性化不足表现新注册用户看到的推荐和老用户几乎没区别。原因这是冷启动的正常现象但可以通过“渐进式个性化”来优化。新用户产生第一次点击后立即根据点击的商品召回同风格同价位的商品不需要等待批量数据。我采用的方案用户每次产生行为事件后实时更新Redis中该用户的“最近偏好队列”只存最近20条行为推荐接口优先从偏好队列拉取相似商品。这样用户刚点了一件修身商务衬衫往下滑“猜你喜欢”立刻就会出现类似款式演示效果非常惊人。4.3 答辩准备类问题问题5如何防止答辩老师问“推荐效果怎么验证”这是个高频问题也是区分度很高的加分点。你要准备两个东西一是离线评估指标。拿历史行为数据做回测把用户的最后一条行为藏起来用之前的行为做训练集看模型是否能把“被藏起来的那个商品”推荐出来。核心指标是召回率Recall和准确率Precision。简单解释这两个指标召回率 模型推荐出来的“用户真实喜欢的商品数” / 用户真实喜欢的商品总数准确率 模型推荐出来的“用户真实喜欢的商品数” / 推荐列表总长度我在项目里实测ItemCF在召回率上能做到12%左右准确率在8%左右这个数字对于毕设演示来说完全够用了。你可以把测试过程录个小视频存着到时候演示给老师看。二是线上效果粗糙验证。比如随机抽几个用户看他的推荐列表里“已购买/已浏览商品的相似款”所占的比例是否符合预期。5. 部署上线与项目亮点包装5.1 部署流程建议这个项目涉及组件多部署方式一定要提前演练不能等到答辩前夜再折腾。我建议按下面的顺序来本地IDEA启动SpringBoot确认MySQL表结构自动建表成功后台能登录。启动本地Spark Local任务跑通日志清洗流程确认统计结果回写MySQL。部署前端Vue项目本地npm run build生成dist目录放进SpringBoot的static目录统一托管避免跨域烦恼。模拟数据注入写一个Java或Python脚本批量生成用户和商品模拟行为数据保证演示时推荐位有内容。整体联调从头到尾走一遍用户注册 → 浏览商品 → 加购下单 → 后台看统计看板 → 换账号看推荐差异。注意如果你用的是云服务器部署务必在答辩前检查服务器的内存和磁盘空间。Spark任务比较吃内存最低给到2G否则容易OOM。另外HDFS的NameNode端口50070新版改为9870记得开安全组白名单否则答辩现场访问不了管理界面场面会很难看。5.2 写在简历上的项目亮点最后聊聊简历包装。这个项目如果只是写“实现了商城CRUD和协同过滤推荐”那和没写差不多。真正能打的项目描述既要有技术深度又要有业务价值你可以参考这样写基于SpringBoot Spark的男装垂直电商推荐系统。系统覆盖商品管理、订单交易、用户行为采集等完整电商链路通过AOP埋点采集用户浏览/收藏/加购/购买行为日志经HDFS存储与Spark离线清洗分析实现基于物品协同过滤ItemCF与朴素贝叶斯偏好预测的个性化推荐引擎。实测推荐列表点击率较热度榜提升约23%这个数字你可以在项目中埋点统计做实了再写。我个人在实际操作中的体会是毕设项目不怕小就怕“不完整”。一个能完整演示出“数据产生 → 数据流转 → 数据分析 → 数据反馈应用”的项目远比堆砌一堆技术名词但没有打通链路更难能可贵。这个男装购物推荐系统恰恰把这条链路跑通了。你如果能把里面任意一个环节讲透哪怕是ItemCF的三个公式推导答辩的时候都稳稳站在“优秀”的那一档。最后再分享一个小技巧答辩前建议提前准备一张“系统功能架构图”画清楚哪些模块属于业务层、哪些属于数据层、哪些属于算法层老师一看就知道你的系统边界清晰、设计能力强提问也会顺着你的思路走。