
最近很多同学都在找 Java 方向的毕业设计题目SpringBoot 几乎是标配但只做一个普通 CRUD 管理系统答辩时很难出亮点。这次我们来看一个把传统 Web 开发和大模型能力结合起来的选题基于 SpringBoot Thymeleaf AI 大模型的校园课程推荐系统。整个项目包含源码、毕业论文LW、答辩 PPT 和讲解视频适合计算机相关专业本科毕设也适合想快速搭建一个带 AI 亮点的 Web 项目的开发者。这个项目的重点不是算法有多深而是把“SpringBoot 后端开发 Thymeleaf 服务端渲染 推荐系统设计 大模型接口调用”完整串起来。课程推荐系统解决的是高校选课场景里的典型问题课程数量多、信息分散、学生不知道哪些课适合自己。传统做法是基于协同过滤或课程标签做召回排序这个项目在此基础上增加了 AI 大模型能力可以生成个性化推荐理由甚至支持自然语言问答式选课助手技术层次一下就拉开了。本文会带你把整个项目的技术方案、数据库设计、推荐算法实现、大模型接入方式、环境启动步骤、接口调用方法和答辩要点完整过一遍。无论你是要参考选题、改造成自己的毕设还是想快速跑起来演示都可以按本文的思路落地。1. 核心能力速览能力项说明项目类型Java Web 全栈项目前后端不分离适合计算机毕设后端框架SpringBoot版本建议 2.7.x 或 3.x需按实际环境确认前端方案Thymeleaf 服务端模板引擎 Bootstrap HTML/CSS/JavaScript数据库MySQL 8.x通过 MyBatis-Plus 或 Spring Data JPA 操作AI 大模型能力对接大模型接口生成课程推荐理由实现智能选课问答推荐算法基于课程标签的内容推荐 基于用户行为的协同过滤核心功能学生选课、课程管理、成绩管理、推荐课程展示、AI 问答助手启动方式本地 IDE 启动 / Maven 打包后 java -jar 运行是否支持 API支持项目内置 RESTful 接口可扩展为前后端分离是否支持批量任务推荐计算支持批量生成适合定时任务触发适合场景毕业设计、课程设计、SpringBoot 综合实战练手从材料看这个项目采用 SpringBoot Thymeleaf 的经典服务端渲染架构和当前主流的前后端分离项目不一样。这种选型在毕设里有明确优势逻辑都在后端页面由 Thymeleaf 直接渲染代码量少调试方便论文里也好画架构图。缺点是前端体验不如 Vue 项目丝滑但对毕设来说完全够用。2. 适用场景与使用边界2.1 这个项目适合谁第一类是大三、大四准备毕设的计算机专业学生尤其是 Java 方向、想快速完成一个功能完整且带技术亮点的系统。第二类是 Java Web 初学者想通过一个完整项目把 SpringBoot、Thymeleaf、MyBatis-Plus、MySQL、Redis 这些常用技术串起来。第三类是教学场景作为软件工程课程设计或实训项目。2.2 能解决什么问题课程推荐系统解决校园选课场景的三个典型问题信息过载课程数量多学生选课前很难快速筛选出适合自己的课程。缺乏个性化传统选课系统所有学生看到的内容一样没有差异化推荐。决策支持弱学生选课主要靠猜缺少课程难度、先修知识、就业方向等辅助信息。这个项目通过推荐算法生成候选课程列表再通过 AI 大模型生成推荐理由和学习建议把“系统推荐 语义解释”结合起来既实用又有展示效果。2.3 不推荐的使用方式这个项目本质是教学和毕设导向不建议直接用于生产环境的真实选课系统。它的用户体系、权限管理和并发能力都比较基础如果要做生产级系统需要补充完整的权限框架、数据加密、日志审计和性能优化。2.4 合规与安全边界接入 AI 大模型接口时需要注意几个边界学生信息属于个人敏感数据接入大模型接口时要脱敏处理不要直接把学号、姓名等隐私数据发送至第三方服务。调用第三方大模型 API 时不要在代码中硬编码密钥密钥应通过环境变量或配置文件管理。项目引用的源码、论文、PPT 材料使用前应确认开源许可和授权范围避免版权问题。如果使用本地部署的开源大模型要注意模型许可证和算力要求。3. 技术栈与系统架构设计3.1 技术栈选型这个项目的技术栈以 SpringBoot 为中心围绕它展开。推荐使用 2.7.x 版本原因是稳定、资料多、对 Thymeleaf 集成友好。如果要用 JDK 17 或更高版本可以考虑 SpringBoot 3.x但要注意 javax 包名改成了 jakarta。层次技术选型说明前端模板Thymeleaf服务端渲染可直接在 HTML 中写 th:text、th:eachWeb 层SpringMVCSpringBoot 内置处理请求路由和参数绑定数据持久层MyBatis-Plus 或 Spring Data JPA推荐 MyBatis-Plus代码生成方便数据库MySQL存储用户、课程、选课记录、评价数据缓存Redis可选缓存热门课程和推荐结果提升响应速度大模型接入HTTP 调用第三方大模型 API 或本地推理服务生成推荐理由、实现智能问答构建工具Maven管理依赖和打包前端样式Bootstrap快速实现响应式页面3.2 系统分层架构推荐使用经典的四层结构Controller 层接收请求返回视图或 JSON ↓ Service 层业务逻辑选课事务推荐计算 ↓ Mapper/DAO 层数据库操作 ↓ MySQL 数据库在此基础上增加一个独立的recommend包专门处理推荐相关的逻辑避免把算法代码和业务代码混在一起。大模型调用统一封装在ai包下的 client 类中方便切换不同的模型服务商。3.3 大模型能力设计从毕设的角度AI 大模型在这个项目里主要承担三个职责生成推荐理由根据学生的选课历史、专业方向和观看/收藏行为为每门推荐课程生成一段自然语言说明。智能选课问答学生输入“我想学 Java该选哪门课”“数据库和操作系统哪个先修”等问题系统调用大模型给出答案。学习路径建议结合学生已有课程成绩推荐下一阶段适合学习的课程序列。这三个能力不需要全部实现按毕设工作量选择一到两个即可。最推荐的是“生成推荐理由”实现简单、展示效果好答辩时可以直接演示。4. 数据库设计与核心表结构数据库是毕设论文中的重要部分。课程推荐系统至少需要 6 张核心表用户表、课程表、课程分类表、选课记录表、收藏表、推荐日志表。如果实现了 AI 问答可以再加一张问答记录表。4.1 核心表设计用户表sys_userCREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 登录账号, password VARCHAR(100) NOT NULL COMMENT 密码建议 BCrypt 加密, real_name VARCHAR(50) COMMENT 真实姓名, role VARCHAR(20) DEFAULT STUDENT COMMENT 角色STUDENT/ADMIN, major VARCHAR(100) COMMENT 专业, grade VARCHAR(20) COMMENT 年级, created_time DATETIME DEFAULT CURRENT_TIMESTAMP, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT 用户表;课程表courseCREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(100) NOT NULL COMMENT 课程名称, course_code VARCHAR(50) COMMENT 课程编号, category_id BIGINT COMMENT 课程分类ID, teacher_name VARCHAR(50) COMMENT 授课教师, credit DECIMAL(3,1) DEFAULT 2.0 COMMENT 学分, course_hours INT DEFAULT 32 COMMENT 学时, course_tags VARCHAR(255) COMMENT 课程标签如Java,SpringBoot,后端, course_desc TEXT COMMENT 课程简介, difficulty_level INT DEFAULT 1 COMMENT 难度级别1-5, selected_count INT DEFAULT 0 COMMENT 选课人数, status INT DEFAULT 1 COMMENT 状态0下架 1上架 ) COMMENT 课程表;选课记录表course_selectionCREATE TABLE course_selection ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL COMMENT 学生ID, course_id BIGINT NOT NULL COMMENT 课程ID, score DECIMAL(5,2) COMMENT 成绩, status INT DEFAULT 1 COMMENT 状态1选课中 2已结课, created_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_student_course (student_id, course_id) ) COMMENT 选课记录表;推荐日志表recommend_logCREATE TABLE recommend_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, recommend_type VARCHAR(20) COMMENT 推荐类型CONTENT/CF/HYBRID, reason_text TEXT COMMENT 推荐理由可为大模型生成, score DECIMAL(10,6) COMMENT 推荐分数, created_time DATETIME DEFAULT CURRENT_TIMESTAMP ) COMMENT 推荐日志表;4.2 建表规范与论文写作建议论文中写数据库设计时要包含 E-R 图、表结构说明和关键字段解释。一个常见问题是学生直接截图数据库工具界面看起来不专业。建议用 draw.io 或 Visio 画清晰的 E-R 图字段说明写清楚业务含义。5. 推荐模块设计从协同过滤到大模型增强这是整个项目的核心亮点也是答辩时可以深入展开的部分。5.1 基于课程标签的内容推荐课程表里有course_tags字段存储了课程的标签信息。内容推荐的思路是先为每个学生建立兴趣特征向量再计算学生特征和课程标签之间的相似度。学生对标签的兴趣强度可以用行为加权计算选课操作权重 5收藏操作权重 3浏览操作权重 1例如学生对 Java、SpringBoot 相关课程有选课和收藏行为那么“后端开发”“Java”这些标签的权重就会更高。推荐时优先召回包含这些标签的课程。5.2 基于用户的协同过滤协同过滤解决的是“相似学生喜欢什么”的问题。计算逻辑构建学生选课向量。通过余弦相似度或皮尔逊相关系数计算学生之间的相似度。找到当前学生最相似的 K 个学生。把相似学生选过但当前学生没选过的课程作为候选集。按相似度加权得分排序取 TopN。基于用户的协同过滤实现代码不复杂适合作为论文中的算法创新点。但要注意数据稀疏问题当选课记录很少时相似度计算不准推荐效果会退化。5.3 混合推荐策略更稳妥的做法是采用加权混合内容推荐得分占 0.5协同过滤得分占 0.4课程热度分占 0.1得到综合推荐分。这样即使协同过滤因为数据稀疏失效内容推荐和热度分还能兜底。public class HybridRecommender { private final ContentRecommender contentRecommender; private final CollaborativeRecommender collaborativeRecommender; public HybridRecommender(ContentRecommender contentRecommender, CollaborativeRecommender collaborativeRecommender) { this.contentRecommender contentRecommender; this.collaborativeRecommender collaborativeRecommender; } public ListCourse recommend(Long studentId, int topN) { MapLong, Double scoreMap new HashMap(); // 内容推荐得分权重 0.5 contentRecommender.recommend(studentId, topN * 2) .forEach(item - scoreMap.merge(item.getCourseId(), 0.5 * item.getScore(), Double::sum)); // 协同过滤得分权重 0.4 collaborativeRecommender.recommend(studentId, topN * 2) .forEach(item - scoreMap.merge(item.getCourseId(), 0.4 * item.getScore(), Double::sum)); // 课程热度兜底权重 0.1 courseService.listHotCourses(topN) .forEach(course - scoreMap.merge(course.getId(), 0.1, Double::sum)); return scoreMap.entrySet().stream() .sorted(Map.Entry.Long, DoublecomparingByValue().reversed()) .limit(topN) .map(entry - courseService.getById(entry.getKey())) .collect(Collectors.toList()); } }5.4 大模型增强生成个性化推荐理由推荐算法算出的课程列表是“黑盒结果”学生不知道为什么要推荐这些课。大模型增强的思路是把学生的专业、已选课程、目标课程列表组合成提示词请求大模型生成自然语言推荐理由。提示词模板示例你是大学选课助手。学生专业是{专业}当前已选修课程包括{课程列表}。 请为以下推荐课程生成推荐理由要求结合学生专业背景和课程内容 说明课程学习价值、难度建议和先修要求字数控制在100字以内 {推荐课程}调用大模型接口生成结果后存入recommend_log表前端页面直接展示。5.5 大模型接口调用封装在编写代码时必须把大模型调用单独封装成一个服务类避免在 Controller 里直接写 HTTP 请求。这样做的目的是便于换模型。Service public class AiModelClient { Value(${ai.model.api-key}) private String apiKey; Value(${ai.model.endpoint}) private String endpoint; private final RestTemplate restTemplate; public AiModelClient(RestTemplate restTemplate) { this.restTemplate restTemplate; } public String generateRecommendReason(String prompt) { // 这里以通用 HTTP 接口为例实际字段需按所选模型服务调整 MapString, Object requestBody new HashMap(); requestBody.put(prompt, prompt); requestBody.put(max_tokens, 200); requestBody.put(temperature, 0.7); HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth(apiKey); HttpEntityMapString, Object entity new HttpEntity(requestBody, headers); ResponseEntityMap response restTemplate.postForEntity(endpoint, entity, Map.class); // 假设返回值中有 choices 数组具体字段要以实际接口文档为准 if (response.getBody() ! null) { ListMap choices (ListMap) response.getBody().get(choices); if (choices ! null !choices.isEmpty()) { Map message (Map) choices.get(0).get(message); return (String) message.get(content); } } return 暂无推荐理由; } }配置项放在application.yml中ai: model: api-key: ${AI_API_KEY:sk-xxxxxxxx} endpoint: ${AI_ENDPOINT:https://api.example.com/v1/chat/completions}这里要特别说明上面代码中的 endpoint 和返回字段是通用模板实际使用时要根据你所选的模型服务商文档修改。建议把模型选择、超时时间、重试次数都做成配置项。6. SpringBoot 环境准备与项目启动6.1 环境要求从技术栈推算本地开发环境建议如下JDK 1.8 或 JDK 17对应不同 SpringBoot 版本Maven 3.6MySQL 8.xIDEA 2022 或更新版本Redis如果项目用到缓存如果打包部署到 Docker可以使用maven:3.8-openjdk-8镜像构建运行时用openjdk:8-jre镜像。注意 SpringBoot 3.x 需要 JDK 17 基础镜像。6.2 项目结构从毕设项目特点来看推荐使用以下包结构com.example.courserecommend ├── controller # 控制器层页面跳转和接口访问 ├── service # 业务层 │ ├── impl │ └── recommend # 推荐模块 ├── mapper # 数据访问层 ├── entity # 实体类 ├── dto # 数据传输对象 ├── config # 配置类 ├── ai # 大模型调用封装 └── common # 通用返回结果、异常处理6.3 核心依赖配置如果是 SpringBoot 2.7.x MyBatis-Plus 的选型pom.xml核心依赖如下dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies6.4 application.yml 配置server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/course_recommend?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: root thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html redis: host: localhost port: 6379 mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl注意以上配置为通用示例数据库密码、IP、端口需要按实际环境修改。6.5 启动方式在 IDEA 中打开项目后找到主启动类直接运行main方法。启动成功后会看到 SpringBoot 的 Banner 日志控制台输出默认端口 8080。如果要用命令行启动# 先打包 mvn clean package -DskipTests # 运行 jar 包 java -jar target/course-recommend-0.0.1-SNAPSHOT.jar启动后浏览器访问http://localhost:8080/如果你用的是云服务器或虚拟机注意安全组放行对应端口。7. 功能测试与效果验证7.1 登录与权限测试系统应内置管理员和学生两类账号。管理员负责课程管理和公告发布学生负责选课和查看推荐。测试时重点验证角色权限是否生效学生访问管理员接口时是否被拦截。7.2 课程管理测试管理员登录后进入课程管理页面可以执行新增课程、编辑课程信息、上下架课程、按条件查询课程列表等操作。测试时输入一门带标签的新课程保存后检查数据库对应字段是否正确写入。7.3 选课功能测试学生登录后浏览课程列表并选择课程系统应检查是否冲突、是否已选过。重复选同一门课应提示已选。测试完成后查看course_selection表是否存在对应记录。7.4 推荐功能测试推荐功能的测试步骤如下准备至少 10 门课程分别设置不同标签如 Java、Python、数据库、前端等。创建 3 个测试学生账号分别选择不同方向课程构造差异化行为数据。学生登录首页查看“为你推荐”列表。对比推荐结果是否与学生历史选课标签一致。判断推荐是否合理的标准推荐结果和用户兴趣标签的重合度是否高于随机推荐。如果学生选了 Java 和 SpringBoot 课程推荐结果里应该出现其他后端方向的课而不是全部推 Python。7.5 AI 推荐理由测试在推荐列表中每门课程下方应有“推荐理由”字段。这里测试大模型接口是否正确返回文本内容。打开页面后查看课程卡片是否展示自然语言描述内容应提到课程标签、难度评价或学习建议。如果页面提示“暂无推荐理由”优先排查大模型接口的 API Key、网络连通性和返回字段解析逻辑。7.6 智能问答测试如果实现了 AI 问答功能在页面问答输入框输入“学习 Java 需要先修哪些课程”“数据库原理和数据结构哪个先学”等问题观察是否返回合理回答。这个功能在答辩时演示效果很好但要注意大模型输出延迟建议设置 Loading 状态并控制回答长度。7.7 响应时间验证推荐页面打开后记录从发起请求到页面完全渲染的时间。如果响应超过 5 秒需要检查是否有慢 SQL、推荐计算是否耗时过长、大模型接口调用是否阻塞了主线程。建议把大模型调用改成异步方式页面先展示推荐课程列表推荐理由后加载Async public CompletableFutureString generateRecommendReasonAsync(Long studentId, Long courseId) { String reason aiModelClient.generateRecommendReason(buildPrompt(studentId, courseId)); return CompletableFuture.completedFuture(reason); }主启动类加EnableAsync注解Controller 中先返回课程列表前端再通过 Ajax 请求补充分理由。8. 接口 API 与前端渲染实现8.1 页面接口设计虽然是 Thymeleaf 服务端渲染但也会用到局部刷新的 Ajax 接口。典型接口如下接口路径请求方式功能说明/api/course/listGET课程分页列表/api/course/{id}GET课程详情/api/selection/selectPOST学生选课/api/selection/cancelPOST退课/api/recommend/listGET推荐课程列表/api/recommend/reasonGET获取 AI 推荐理由/api/chat/askPOST智能选课问答8.2 推荐接口示例RestController RequestMapping(/api/recommend) public class RecommendController { Resource private RecommendService recommendService; GetMapping(/list) public ResultListCourseVO recommendList(RequestParam Long studentId, RequestParam(defaultValue 10) Integer topN) { ListCourseVO courses recommendService.recommendCourses(studentId, topN); return Result.success(courses); } GetMapping(/reason) public ResultString recommendReason(RequestParam Long studentId, RequestParam Long courseId) { String reason recommendService.generateReason(studentId, courseId); return Result.success(reason); } }8.3 Thymeleaf 页面渲染推荐页面的核心片段div classrow th:eachitem : ${recommendList} div classcol-md-4 div classcard div classcard-body h5 classcard-title th:text${item.courseName}课程名称/h5 p classcard-text th:text${item.courseTags}课程标签/p p classcard-text text-muted th:text${item.aiReason}AI 推荐理由/p a classbtn btn-primary th:href{/course/detail/{id}(id${item.id})}查看详情/a /div /div /div /div如果希望在页面加载后异步获取 AI 推荐理由可以用 jQuery$(function() { $(.recommend-item).each(function() { var courseId $(this).data(course-id); var studentId $(#studentId).val(); $.get(/api/recommend/reason, {studentId: studentId, courseId: courseId}, function(res) { if (res.code 200) { $(this).find(.ai-reason).text(res.data); } }.bind(this)); }); });8.4 通用接口返回格式建议统一返回对象Data 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; } }9. 常见问题与排查方法问题现象可能原因排查方式解决方案启动报错端口被占用8080 端口被其他进程占用命令行执行 netstat -anofindstr 8080页面打开报 Whitelabel Error Page控制器路径错误或视图不存在查看控制台日志对比访问路径检查 Controller 的 RequestMapping 与模板文件路径数据库连接失败数据库账号密码不对或 MySQL 未启动检查 MySQL 服务状态和配置修改 application.yml 中的 url、username、password大模型接口无返回API Key 无效、网络不通、字段解析错误用 Postman 直接调用大模型接口测试更换 Key、检查代理设置、调整返回字段解析推荐结果为空行为数据太少或课程没有标签查看推荐日志表推荐的中间结果增加测试数据给课程补标签页面加载慢推荐计算耗时或大模型调用阻塞查看慢 SQL 日志和接口耗时添加 Redis 缓存异步化大模型调用中文乱码数据库编码或响应编码不对检查 MySQL 连接 URL 的 characterEncoding连接 URL 加characterEncodingutf8页面加 meta charset依赖下载失败Maven 仓库连接问题查看 Maven 日志更换阿里云 Maven 镜像9.1 SpringBoot 版本过高的坑这里特别提一下 SpringBoot 版本问题。很多同学在创建项目时直接选了最新版结果发现旧教程里的代码跑不通。主要差异在SpringBoot 3.x 使用jakarta.servlet而不是javax.servlet。spring-boot-starter-web默认内嵌 Tomcat 版本更高对 JDK 版本有要求。spring.factories自动配置机制改为AutoConfiguration.imports。如果项目给你的源码是基于 2.x 写的不要强行升级 3.x。稳定运行优先。9.2 Redis 没启动导致报错如果项目配置了 Redis 但没启动服务启动时会出现连接超时。排查方法# 检查 Redis 是否运行 redis-cli ping如果没安装 Redis可以把项目里的 Redis 依赖和配置注释掉先用本地内存缓存代替。10. 答辩要点与论文写作建议10.1 答辩时展示什么答辩演示的核心顺序建议展示系统功能先演示管理员课程管理再演示学生选课最后展示推荐结果和 AI 推荐理由。展示数据库设计打开 E-R 图介绍核心表关系。展示推荐算法逻辑重点讲混合推荐策略说明为什么在内容推荐之外还要引入协同过滤。展示大模型集成现场输入一个选课问题调用 AI 问答接口展示返回结果。展示系统亮点异步推荐理由、缓存设计、异常处理、统一返回结果。10.2 评委可能会问的问题评委通常围绕“为什么这么设计”提问常见问题包括为什么选 Thymeleaf 而不是 Vue协同过滤的数据稀疏问题怎么解决大模型生成推荐理由的延迟怎么处理如果用户行为数据很少推荐怎么办项目的安全设计有哪些为什么使用混合推荐而不是单一算法回答时要体现工程思维例如数据稀疏问题可以用内容推荐兜底大模型延迟可以用异步加载。这种答案比空洞的“我用了 Redis 做缓存”更有说服力。10.3 论文结构建议论文可以按以下章节展开绪论背景、意义、国内外研究现状。相关技术介绍SpringBoot、Thymeleaf、推荐算法、大模型。系统分析可行性分析、功能需求、非功能需求。系统设计架构设计、功能模块设计、数据库设计、推荐算法设计。系统实现核心功能页面和关键代码。系统测试功能测试、性能测试、测试结果分析。总结与展望。论文的创新点可以写两点一是将大模型生成内容引入传统推荐系统解决推荐结果缺乏解释性的问题二是采用混合推荐策略缓解单一算法的数据稀疏问题。11. 最佳实践与开发建议如果要用这个项目完成毕设或练手以下建议值得注意。11.1 先跑通再优化第一次拿到源码不要急着改功能。先按照 README 把项目跑起来确认数据库初始化脚本执行成功管理员账号能登录推荐页面能出数据。跑通之后再研究代码结构。11.2 数据量决定推荐效果推荐系统很依赖数据量。如果数据库里只有少量测试数据推荐结果会看起来不太智能。建议准备 30 门以上课程、5 个以上测试学生账号每个学生至少有 3 条选课或收藏记录推荐效果才有说服力。11.3 大模型调用要做降级处理大模型接口是外部依赖可能出现超时、限流、欠费等情况。代码里一定要做降级接口调用失败时推荐理由返回默认文案不影响页面正常展示。public String generateRecommendReason(String prompt) { try { return aiModelClient.generateRecommendReason(prompt); } catch (Exception e) { log.error(AI 推荐理由生成失败使用默认文案, e); return 推荐课程与你的学习方向匹配建议结合课程大纲选择。; } }11.4 密钥不要提交到 Git.gitignore中要排除application-dev.yml或包含密钥的配置文件。如果已经提交过需要清除 Git 历史中的敏感信息。11.5 保留测试脚本推荐写一个简单的初始化测试数据脚本># 构建 SpringBoot 应用镜像 FROM maven:3.8-openjdk-8 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn clean package -DskipTests FROM openjdk:8-jre COPY --frombuild /app/target/course-recommend-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, /app/app.jar]version: 3 services: mysql: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: course_recommend ports: - 3306:3306 app: build: . depends_on: - mysql ports: - 8080:8080 environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/course_recommend注意如果使用 SpringBoot 3.x基础镜像需要改为openjdk:17。12. 总结与下一步扩展方向这个项目最值得尝试的地方是它把传统 Java Web 开发和大模型能力做了实际融合不是简单包装 API而是把大模型生成的推荐理由真正嵌入到推荐流程中。推荐算法、数据库设计、Thymeleaf 页面渲染、SpringBoot 接口开发这些知识点全部覆盖对毕设来说性价比很高。拿到项目后建议先验证三个东西本地能否正常启动、推荐列表是否有数据、大模型接口能否返回文本。这三步跑通项目核心链路就通了。最容易踩的坑是大模型接口配置和版本兼容问题。接口返回字段不按模板解析会导致推荐理由为空SpringBoot 版本升级导致老代码兼容性问题也时有发生这两个坑建议提前看代码确认。如果你想继续扩展可以考虑几个方向把前端改成 Vue 3 Element Plus用 Redis 缓存推荐结果加入定时任务每日更新推荐列表或者用 RAG 方式让 AI 能基于课程大纲内容回答更具体的问题。这些都可以作为论文里的“展望”部分来写。