如果你今年也在为毕业设计选题目发愁看到“基于SpringBoot的新能源汽车个性化推荐系统”这种标题第一反应估计跟我当时一样这不就是做个网站然后把数据库里的汽车列表随便查出来展示吗真动手之后才发现这个题目比想象中复杂得多也远比普通的增删改查项目有意思。它既要你掌握Java和SpringBoot的常规开发流程又要把推荐算法那一套逻辑落到实际业务里最后还得能讲清楚“为什么这么设计”这正好是答辩时老师们最爱追问的地方。这篇文章我打算把自己从零做完一整套的完整经验整理出来从选题拆解、技术选型、数据库设计、推荐算法实现到远程调试、文档组织和答辩准备完整过一遍。适合三类人看正在做这个题目的同学、想用推荐系统当毕设题目的同学、以及工作中想快速了解推荐系统怎么落地的Java开发。我会尽量写实操层面的内容包括我踩过的坑和最后采用的方案希望能帮你们少走弯路。1. 选题拆解这个推荐系统到底在解决什么问题1.1 新能源车和个性化推荐怎么结合很多人看到“新能源汽车个性化推荐”这个组合第一反应是“新能源”三个字很唬人感觉要懂电池、电机、自动驾驶这些东西。但实际上这个题目本质上依然是信息过滤问题。新能源汽车市场有一个很典型的特点参数维度多、车型更新快、用户决策成本高。同样二十万的预算纯电、混动、增程是三种完全不同的用车体验同样号称续航六百公里实际城市通勤和高速跑下来差异也很大再加上充电条件、品牌偏好、辅助驾驶需求这些因素一个普通用户想在几十款车里选出适合自己的那台其实挺困难的。所以这个系统的核心价值就出来了根据用户的历史行为分析他关注什么、偏好什么然后从车型库里把可能感兴趣的车主动推荐给他。换句话说这跟电商“猜你喜欢”是一样的业务逻辑只不过物品换成了汽车。1.2 核心链路从行为采集到推荐结果做之前一定要先把推荐链路画清楚不然写着写着就会变成“假推荐”——比如直接在SQL里按价格排序然后说是推荐。我这个项目的核心链路是四步数据采集用户浏览车型详情、收藏、评分、预约试驾这些行为全部落到行为表里。用户画像根据行为数据给用户打上偏好标签比如“预算15-20万”“关注纯电”“偏爱国产”。推荐匹配把用户画像和车型特征进行匹配结合协同过滤找相似用户形成候选集。结果调整候选集合并、去重、加权排序最后输出带推荐理由的结果。这里每一步都有对应的表和代码是真正能展示工作量、也能在论文里写清楚的部分。如果只说“我用协同过滤实现了推荐”但连用户画像都没有后面老师一问就露馅了。1.3 毕设项目的合理边界别一上来就搞深度学习我见过不少同学选了这个题目就开始研究神经网络、图神经网络甚至想在毕设里用Flink做实时计算。我的建议是除非你有非常好的数据源和指导老师支持否则别碰。原因很实际毕设数据量撑不起深度模型本地造几百条数据塞给神经网络结果还不如简单的协同过滤稳定推荐结果解释性差答辩时“为什么推荐这辆车”很难讲清楚开发周期不可控代码量一旦上去文档和工作量把控不住。**一个由“基于用户的协同过滤 基于内容的推荐 热门榜兜底”组成的混合推荐策略已经足够支撑一篇质量不错的毕设论文。**先把这套逻辑做扎实再去谈进阶。2. 技术栈选型SpringBoot版本、数据访问与工程结构2.1 SpringBoot版本为什么我推荐2.x而不是3.x这个选题的主干框架是SpringBoot现在网上相关的教程绝大多数是基于SpringBoot 2.x的。很多同学一查SpringBoot都到3.x了觉得新版本一定更好。这个思路放在真实项目中也许对但在毕设场景下我强烈建议用SpringBoot 2.7.x配JDK 8。原因很简单SpringBoot 3.0强制要求JDK 17很多学校机房或者你自己电脑上装的还是JDK 8另外部分MyBatis Plus、某些第三方工具包的旧版本和SpringBoot 3存在兼容问题等你踩到坑再回头换版本一天时间就没了。我最后用的是 SpringBoot 2.7.18 JDK 8 MyBatis Plus 3.5.3这套组合非常稳任何教程里的报错都能搜到现成答案。如果你的指导老师明确要求用SpringBoot 3或更高版本那就确认好JDK版本并且把所有依赖都升级到兼容版本最好先拿一个空项目把数据库连接跑通再开始写业务。2.2 MyBatis Plus做数据访问层是真的省事数据访问层我选了MyBatis Plus理由很直接单表CRUD不用写SQL一个BaseMapper接口全搞定LambdaQueryWrapper写条件查询非常直观比如“查价格在10到20万之间的纯电车”这种条件链式调用几行就出来了不用维护一堆XML文件自带分页插件查推荐列表分页一行配置。有个小技巧是让实体类和建表SQL保持字段一致。MyBatis Plus默认开启驼峰映射也就是Java里的userId会自动对应数据库的user_id所以建表时统一用下划线命名。我习惯先用代码生成器生成实体类再根据实体类的字段反手写建表SQL这样两边永远不会冲突。下面是实体类的一部分Data TableName(t_vehicle) public class Vehicle { TableId(type IdType.AUTO) private Long id; private Long brandId; private String modelName; private Integer energyType; // 1纯电 2混动 3增程 private BigDecimal price; private Integer enduranceKm; // 续航里程单位km private Integer seatNum; private String imageUrl; }2.3 项目结构单模块分包还是Maven多模块很多“丰富项目”强调自己用了多模块但毕设项目我不建议为了多模块而多模块。如果你做的是单体系统老老实实用单模块包名分层就足够了com.example.vehicle-recommend ├── controller // 接口层 ├── service // 业务逻辑推荐算法单独放这里 ├── mapper // MyBatis Plus的Mapper接口 ├── entity // 数据库实体 ├── dto // 参数和返回对象 ├── config // 配置类 └── recommend // 推荐算法核心包把推荐算法单独放在recommend包里是后面答辩时很好用的一点。老师问你推荐逻辑在哪你直接打开这个包里面就是干净的算法类比在service里翻半天强得多。2.4 通用返回结构Result对象先做好不管前端是Thymeleaf还是Vue接口返回结构统一是最好的习惯。我写了这样一个简单的ResultTData public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }所有接口统一返回这个结构前端解析起来省心后端调试也方便。有了它后面写推荐接口、行为记录接口都是往data里塞东西的事。3. 数据库设计把用户、汽车、行为三张核心主线打通3.1 核心表结构的设计意图推荐系统的数据库设计和普通管理系统的区别在于除了业务表还要有专门支撑推荐算法的数据表。我最终落地了下面这几张核心表t_user用户表除了基本登录信息还保存了city城市、budget_min和budget_max预算区间、prefer_energy_type偏好能源类型这些字段直接在注册时让用户填写是推荐系统的重要冷启动信息。t_vehicle汽车表保存车型的完整参数品牌、能源类型、价格、续航、座位数、级别、图片。status字段控制上下架下架车辆必须从推荐结果里排除。t_brand品牌表车辆多对一关联品牌方便做“同品牌推荐”。t_behavior用户行为表这是推荐系统的核心数据来源记录浏览、收藏、评分、预约试驾四类行为。behavior_type区分行为类型rating字段只在评分时有效。t_vehicle_tag车辆标签表给每辆车打标签比如“家庭用车”“长续航”“国产”“智能驾驶”。t_user_tag用户偏好标签表根据用户行为计算出来的偏好标签及权重是用户画像的落表。这样设计的好处是每个推荐策略都能找到对应的数据来源协同过滤读行为表内容推荐读标签表热门榜直接统计行为表聚合。3.2 核心建表SQL实体类对应SQL怎么写得又快又对我再强调一遍先有实体类再有表或者先有表再有实体类都不重要重要的是两边字段严格一致。下面是我项目中几个核心表的实际建表语句CREATE TABLE t_user ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(100) NOT NULL, nickname varchar(50) DEFAULT NULL, city varchar(50) DEFAULT NULL, budget_min decimal(10,2) DEFAULT NULL, budget_max decimal(10,2) DEFAULT NULL, prefer_energy_type tinyint(4) DEFAULT NULL COMMENT 1纯电 2混动 3增程, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_vehicle ( id bigint(20) NOT NULL AUTO_INCREMENT, brand_id bigint(20) NOT NULL, model_name varchar(100) NOT NULL, energy_type tinyint(4) NOT NULL COMMENT 1纯电 2混动 3增程, price decimal(10,2) NOT NULL, endurance_km int(11) DEFAULT NULL, seat_num tinyint(4) DEFAULT NULL, image_url varchar(255) DEFAULT NULL, status tinyint(4) DEFAULT 1 COMMENT 1上架 0下架, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_behavior ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, vehicle_id bigint(20) NOT NULL, behavior_type tinyint(4) NOT NULL COMMENT 1浏览 2收藏 3评分 4试驾, rating int(11) DEFAULT NULL COMMENT 评分1-5, create_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_user_vehicle (user_id,vehicle_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;有个小点行为表一定要加联合索引(user_id, vehicle_id)因为推荐算法会频繁按用户查行为、按车辆查行为没有索引的话数据一多会明显变慢答辩演示时表里几万条数据就是灾难。3.3 造模拟数据推荐系统能不能跑起来就看这一步真实项目里行为数据都是从日志和埋点来的但毕设阶段没有真实用户必须自己构造模拟数据。这一步千万别随便插入几十条就完事数据分布要符合真实场景。我的做法是写一个数据生成工具类用循环和随机数生成数据但有几个约束热门车型要被大多数用户浏览形成“头部集中”的分布。每个用户的行为集中在少数几类车上比如喜欢纯电的用户很少去浏览增程车这样协同过滤才能算出有区分度的相似度。评分行为要比浏览行为少收藏和试驾更少符合用户真实操作习惯。大概造20个用户、30辆车、每个用户20到50条行为加起来几百上千条数据推荐结果就非常明显了。如果你为了展示大数据量可以额外生成几万条但核心推荐效果靠的还是这千条以内的“规律数据”。3.4 为冷启动预留的字段和查询冷启动是推荐系统里绕不开的问题也是答辩必问点。我在表结构设计上就提前留了后路用户表里保存了城市、预算、偏好能源类型新用户注册后即使一条行为都没有也能直接根据这三个字段做匹配车辆表里所有车的标签覆盖了“价格区间”“能源类型”“级别”等维度保证按标签查询一定有结果。另外热门榜不需要额外字段直接用行为表按车辆分组统计浏览和收藏数就能算出来这部分后面会细讲。4. 推荐核心逻辑从相似度计算到结果融合4.1 基于用户的协同过滤找跟我品味相似的人这一步是整个项目的灵魂。简单说就是系统找出和你品味最相近的一批用户看他们收藏了什么车而你没看过把那些车推荐给你。具体分三步走构建“用户-车辆”评分矩阵数据来自行为表。浏览行为计1分收藏计2分评分直接用评分值试驾计4分。计算用户之间的相似度我用的是余弦相似度。根据相似用户的行为生成候选集并按相似度加权预估当前用户可能给候选车辆的评分。下面是简化版的核心代码我用Map模拟了评分矩阵真实项目里可以先从数据库查出来再组装成这个结构public class UserCFFilter { // 用户-车辆评分矩阵key为userIdvalue为mapvehicleId, score private MapLong, MapLong, Double userItemScores; // 计算两个用户的余弦相似度 public double cosineSimilarity(MapLong, Double userA, MapLong, Double userB) { double dot 0.0; double normA 0.0; double normB 0.0; for (Map.EntryLong, Double entry : userA.entrySet()) { Long itemId entry.getKey(); Double scoreA entry.getValue(); Double scoreB userB.get(itemId); if (scoreB ! null) { dot scoreA * scoreB; } normA scoreA * scoreA; } for (Double score : userB.values()) { normB score * score; } if (normA 0.0 || normB 0.0) { return 0.0; } return dot / (Math.sqrt(normA) * Math.sqrt(normB)); } }我实际调的时候发现一个小坑如果用户彼此之间的共同浏览行为太少余弦相似度会计算出一个虚高的值。比如两个人只共同看过一辆车相似度可能就是1.0看起来“品味完全一致”其实没有说服力。所以我在实现里加了一个过滤条件共同行为数低于2的用户对直接忽略不参与后续计算。这个细节在论文里写出来是加分项。4.2 基于内容的推荐用标签把用户和车匹配起来协同过滤有个明显问题新用户没有行为数据时算不了冷启动阶段基本是瞎子。基于内容的推荐这时候顶上。我的做法分两步。第一步把用户有正向行为的车的标签全部拿出来统计每个标签出现的次数形成用户偏好向量。比如用户收藏了三辆车两辆带“长续航”一辆带“智能驾驶”那“长续航”权重就是2“智能驾驶”权重就是1。第二步遍历候选车辆计算这辆车的标签与用户偏好向量的重合程度重合越多得分越高。这一步不需要复杂的机器学习一个权重累加逻辑就够了。我建议把标签匹配的得分归一化到0到1之间否则和后面协同过滤的得分没法加权比较。实际代码就是两个Map的匹配public double contentScore(Vehicle vehicle, MapString, Integer userTagWeights) { ListString vehicleTags vehicleTagService.getTagsByVehicleId(vehicle.getId()); double score 0.0; for (String tag : vehicleTags) { score userTagWeights.getOrDefault(tag, 0); } // 简单归一化除以用户标签权重总和 double totalWeight userTagWeights.values().stream().mapToInt(Integer::intValue).sum(); return totalWeight 0 ? 0 : score / totalWeight; }这里要注意生产级的推荐肯定不是这么朴素的实现但毕设场景下这个逻辑足够清晰也好答辩解释。4.3 加权融合为什么单靠一个算法不靠谱我最后的推荐结果是三路召回的加权融合finalScore 0.4 * userCFScore 0.4 * contentScore 0.2 * hotScore参数不是随便拍的我是通过手动调节观察效果定的。最开始试过0.5/0.5/0.0发现没有热门兜底时冷启动用户的结果很差后来把热门权重提上来冷启动效果好了但老用户的结果又显得太大众化。最后定在0.4/0.4/0.2算是平衡了各种场景。三个权重分别对应三件事协同过滤负责“猜你喜欢”内容推荐负责“理解你关注的点”热门榜负责“保证下限”。三者缺一不可这个思想在答辩时一定要能讲出来。4.4 冷启动兜底新用户和新车怎么处理冷启动问题有两个方向新用户的冷启动和新车的冷启动。新用户注册时填了城市、预算区间、偏好能源类型那就可以直接查同城、同价位、同能源类型的车再用热门榜补足10条推荐结果。如果用户一个条件都没填就直接给全站热门榜。新车入库给这辆车打上标签基于内容的推荐会自动把它纳入候选池但因为没有行为记录它在协同过滤里永远出不来。这时候我额外加了一个“同品牌推荐”规则当新车与用户最近浏览/收藏车辆属于同一品牌时给这辆车加一个额外权重分数让它有机会被推荐出来。推荐结果最后还要做一遍业务过滤查出来的候选集去掉已下架的、已售罄的如果有该状态位、以及用户已经明确给过低分差评的车型再按finalScore倒序取前N条这一步千万别省。5. 前后端交互猜你喜欢接口与后台管理5.1 推荐接口的设计与实现推荐服务最终要暴露成接口给前端调用。我设计了两个核心接口RestController RequestMapping(/api/recommend) public class RecommendController { GetMapping(/list) public ResultListVehicleRecommendVO recommend(RequestParam Long userId, RequestParam(defaultValue 10) Integer limit) { ListVehicleRecommendVO result recommendService.recommendForUser(userId, limit); return Result.success(result); } GetMapping(/hot) public ResultListVehicleRecommendVO hot(RequestParam(defaultValue 10) Integer limit) { ListVehicleRecommendVO result recommendService.getHotVehicles(limit); return Result.success(result); } }返回对象VehicleRecommendVO里除了车辆基本信息我还塞了两个字段score和reason。reason是给前端展示“推荐理由”用的比如“因为你收藏了比亚迪汉EV”“和你偏好相符的热门车型”。这个设计是亮点能让推荐结果看起来更智能也是可以写进论文的功能点。5.2 行为采集接口没有它推荐系统就是无源之水有了推荐接口还不够必须要有行为采集的能力。前端页面每次浏览车型详情、点击收藏、提交评分都会调这个接口PostMapping(/behavior) public ResultVoid saveBehavior(RequestBody BehaviorDTO behaviorDTO) { behaviorService.save(behaviorDTO); return Result.success(null); }BehaviorDTO包含userId、vehicleId、behaviorType和可选评分。这个接口很朴素但它是推荐系统的数据源泉。我在项目里做了一个拦截器记录每个用户的浏览行为时自动判断当天是否已经浏览过同一辆车防止重复数据把算法权重搞歪。5.3 后台管理车辆信息管理与推荐策略开关后台管理模块是体现“管理系统”属性的标配包含登录、车辆信息维护、用户管理、行为数据统计这些基础功能。做这一步时MyBatis Plus的IService直接提供save、updateById、list、page方法能省一多半工作量。有一个比较加分的功能是推荐策略开关。我在后台加了一个简单的配置表或者配置文件可以单独关闭协同过滤、内容推荐或热门榜然后刷新页面看推荐结果的变化。这个功能不复杂但演示效果极好答辩时直接现场切换推荐策略说明你对算法逻辑是真正掌握的。5.4 前端展示与登录态注意点毕设前端如果自己写我建议分两种情况你想尽快跑完用Bootstrap加Thymeleaf渲染服务端页面整套东西跑起来最省心你想体现前后端分离能力用Vue3加Element Plus后端只出接口。我采用的是轻量级前后端分离方案前端用Vue3后端接口全部走/api前缀。登录态我用JWT处理登录成功后在本地存Token每次请求通过拦截器解析用户身份。这里提前说明一点如果你是单模块工程用Session完全没有问题如果你硬要做成多个SpringBoot工程就会出现“一个项目登录了另一个项目还要再登录一次”的问题解决思路一般是把登录态放到Redis共享或者统一用JWT做无状态认证。毕设阶段别为了这个加分项给自己挖坑一个工程一套JWT就够了。6. 远程调试与在线演示的实战方案6.1 为什么毕设一定要考虑远程调试很多同学到现在还只在本地IDE里跑项目到了要给老师检查或者演示的时候才手忙脚乱。远程调试这个能力一方面让你在家里也能连上学校的服务器或者自己的云主机看日志、改代码另一方面线上部署好的项目老师在任何地方打开浏览器就能看到效果比开着视频会议录屏幕强多了。远程调试分三个场景我逐个说。6.2 场景一IDEA断点调试远程代码如果你项目已经部署到了云服务器但本地想看线上代码为什么报错可以使用Java远程调试。先在服务器上启动jar时加上调试参数java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 vehicle-recommend.jar注意JDK 9以上版本建议用address*:5005这种写法JDK 8直接写address5005就行。然后在本地IDEA里配置一个Remote JVM Debug运行配置Host填服务器IPPort填5005启动Debug模式就能把断点打到服务器上的代码里。这样线上用户调用某个接口走到断点时你本地能直接看到变量值。使用这个方案要注意云服务器安全组必须放行5005端口而且调试完一定要关掉否则等于把调试端口暴露在公网上有安全风险。如果服务器是CentOS还要检查防火墙firewall-cmd --list-ports firewall-cmd --zonepublic --add-port5005/tcp --permanent systemctl restart firewalld6.3 场景二VSCode远程开发与代码修改IDEA远程调试只能“看”如果想直接在服务器上改代码、看日志我推荐用VSCode的Remote-SSH扩展。服务器装好SSH服务后本地VSCode安装Remote-SSH插件连接上就能把服务器上的项目直接打开来编辑完全像操作本机文件一样。这个方案对配置一般的电脑特别友好因为编译、运行、部署全在服务器上进行本地只承担编辑器功能。唯一的坑是开远程项目时右下角会提示安装扩展Java相关的扩展包按提示装完就行装完记得重新加载一次窗口。6.4 场景三本地开发用内网穿透给老师做演示有时候项目还在本地电脑上跑着老师临时要看效果直接让对方连你内网IP是连不上的。这时候可以用内网穿透工具把本地端口映射成一个公网临时地址比如把你本地的8080端口映射出去老师挂上代理后就能在公网访问了。以我常用的工具为例大体流程是下载工具 → 拿到一个authtoken → 命令行执行映射命令 → 生成公网地址 → 把地址发给老师。第一次配置大概十分钟之后每次启动都很快。这个方案适合临时演示但缺点是不稳定且依赖工具的免费额度正式演示前一定要自己先测一遍。如果想让项目长期稳定访问标配做法是买一台云服务器装JDK、MySQL将项目打成jar包上传用nohup启动再用systemd守护进程让jar在崩溃后自动重启。我最后就是把项目部署到云服务器上配置了一个简单域名老师直接访问域名就能看到完整效果。6.5 远程调试常见排错清单远程调试最容易出的几个问题我先给结论保你少走弯路数据库连不上云服务器MySQL不要绑定127.0.0.1配置文件里要允许远程连接账号要授权否则项目在服务器上启动时直接报连接拒绝。端口不通项目挂了但排查不出原因先确认8080和5005这类端口有没有写在云平台安全组里egress规则里再确认服务器本地防火墙。JDK版本不一致本地用JDK 17编译出来的jar放到只有JDK 8的服务器上会直接报UnsupportedClassVersionError。打包前先确认服务器JDK版本。部署后修改代码不生效改了代码一定要重新mvn clean package -DskipTests很多同学直接复制class文件过去格式不对跑不起来。7. 文档组织、答辩问答与改题定制思路7.1 毕业设计说明书应该怎么组织这套毕设是“全套源码文档”的标配但文档绝不是把代码抄一遍就完事。我的文档结构是这样的选题背景与研究意义讲新能源市场信息过载突出个性化推荐的实际价值。国内外研究现状挑几篇协同过滤、基于内容推荐的论文做综述。需求分析画出系统用例图分用户端和管理员端。系统设计总体架构图、功能模块划分、推荐算法流程。数据库设计ER图加每张表的字段说明重点解释行为表、标签表为什么这样设计。系统实现按模块展示核心代码推荐算法部分占最大篇幅。系统测试功能测试用例表加性能测试数据至少测一下推荐接口在几百毫秒内返回。写文档最忌讳的是“把代码贴一遍然后说这是系统实现”需要写清楚每个关键类的职责、每个算法流程的输入输出、每个参数为什么是这个值。7.2 答辩现场老师最爱问的几个问题我结合自己的答辩经历把高频问题整理成了一张表附上回答切入点问题思路提示你的推荐系统和普通列表页有什么区别说明你的推荐是“千人千面”不同用户看到的结果不同且推荐接口有策略融合和排序逻辑冷启动怎么解决分新用户和新车两个角度提到注册时收集偏好、热门榜兜底、同品牌加权重为什么用余弦相似度不用杰卡德余弦相似度能兼容评分型行为数据杰卡德只适合布尔行为而评分场景更丰富推荐数据哪来的可靠吗如实说明是模拟数据但要说明数据生成时遵循了真实分布规律用户量到百万级你的算法还能用吗诚实说当前本地计算不适合大数据量再说明优化思路离线计算、结果缓存、引入向量化召回每一问都不要求你答出生产级方案但一定要做到“能接住”并展示你有思考过这些场景。其中冷启动和算法选择这两个问题基本是必问的我建议提前把答案背熟。7.3 把题目改成其他领域的定制思路如果你不想要新能源车这个业务背景想改成别的比如二手房推荐、考研院校推荐、美食推荐核心逻辑完全能复用。就拿“基于SpringBoot的考研院校个性化推荐系统”举例把t_vehicle替换成院校库字段换成地区、院校层次、专业、报录比、学费把“收藏车型”换成“收藏院校”把车辆标签换成院校标签“同品牌推荐”换成“同省份同层次推荐”。推荐算法的代码一行不用改直接换参数和数据源就能跑。所以在设计表结构阶段我特意让行为表、标签表、物品表三者解耦就是为自己以后扩展留余地。真到定制的时候你只需要写两个新Mapper和几行查询逻辑剩下的大盘直接搬过来就好。做完整套项目下来我最大的体会是这个题目的难点从来不在SpringBoot本身而在推荐逻辑能不能闭环、数据能不能支撑算法、以及你能否把每一个设计决策讲出理由。我最耗时间的不是写代码反而是造模拟数据那几天——数据分布调不好协同过滤的结果就很奇怪要么所有用户推荐结果一模一样要么推荐出来的车明显不合理。看这篇内容的同学如果时间紧我建议你先把全流程跑通再回头优化算法细节千万不要一开始就陷在算法里。远程演示那块也别拖到最后一天才测提前把云服务器配好给老师一个能直接点开的链接比什么都管用。
阅读完成 · 觉得有帮助?