恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SpringBoot+Thymeleaf+AI推荐:校园课程推荐系统核心设计与实践
首页
资讯中心
/
SpringBoot+Thymeleaf+AI推荐:校园课程推荐系统核心设计与实践
SpringBoot+Thymeleaf+AI推荐:校园课程推荐系统核心设计与实践
发布时间:2026/9/2 6:12:32
这次我们来看一个计算机毕业设计方向的高频项目基于 SpringBoot Thymeleaf AI 推荐的校园课程推荐系统。对于 2025 年准备做毕业设计的同学来说这个选题有几个很现实的优势SpringBoot 是目前企业级开发和毕设答辩中占有率最高的后端框架Thymeleaf 能做到服务端页面渲染、不需要单独拆前端工程而“AI 推荐”又能往大模型、智能算法方向靠天然有选题亮点和答辩切入点。代码结构、数据库设计、推荐逻辑、论文写作这些都能串成一条完整链路。这篇文章不是只贴个标题而是把这套系统从技术栈选型、功能模块拆分、数据库设计、推荐实现思路到本地部署、启动访问、接口测试、常见报错排查和毕设答辩准备完整拆开讲一遍。如果你正在做 SpringBoot 相关的毕设或者打算从零搭一个带 AI 推荐能力的课程管理系统这篇可以直接作为参考路线。1. 核心能力速览系统定位很明确面向高校教务或学生选课场景提供课程信息管理、学生选课、在线学习辅助、课程评价以及基于 AI 大模型的课程个性化推荐。技术形态是典型的单体 Web 应用后端负责业务逻辑和推荐服务调用Thymeleaf 负责页面渲染数据存储在 MySQL。先把核心能力整理成一张表能力项说明项目类型校园课程推荐管理系统毕业设计项目后端技术栈SpringBoot 2.x / 3.x、Spring MVC、MyBatis 或 MyBatis-Plus前端技术栈Thymeleaf 模板引擎、HTML5、CSS3、JavaScript、Bootstrap数据存储MySQL 5.7 或 MySQL 8.xAI 推荐能力对接大模型 API 生成个性化课程推荐结果也可支持传统协同过滤兜底主要功能模块学生管理、教师管理、课程管理、选课退课、课程评价、公告管理、AI 课程推荐推荐载体基于学生已选课程、浏览记录、专业方向和兴趣标签生成推荐说明启动方式IDE 启动 SpringBoot 主类或 Maven 打包后 java -jar 启动是否支持 API支持SpringBoot 天然提供 REST 接口推荐模块可单独封装接口是否支持批量任务选课统计、课程导入、推荐结果缓存可按批次处理适合场景毕业设计源码、Java Web 课程设计、SpringBoot 入门到综合实践从材料看这是一个典型的毕设级完整项目交付物包含源码、LW论文、PPT 和讲解视频。对同学来说最有价值的部分不是代码本身而是这套“需求分析 - 数据库设计 - 功能实现 - AI 能力接入 - 论文撰写”的完整套路。2. 适用场景与使用边界2.1 适合谁先给结论这个系统最适合下面三类人。第一类是计算机科学与技术、软件工程、信息管理等相关专业的本科生正在做毕业设计需要一个“技术栈主流、功能完整、有创新点”的题目。SpringBoot Thymeleaf AI 推荐这个组合既不会像纯管理系统那样被评委说没有技术含量又不会像纯算法项目那样前端后端都是坑。第二类是打算做 Java Web 课程设计或综合实训的同学。相比 Vue SpringBoot 前后端分离Thymeleaf 方案对前端基础薄弱的同学更友好不用处理跨域、不用单独启动 Node 服务一个 SpringBoot 应用全部搞定。第三类是准备面试 Java 开发岗、想快速有个完整项目经验的初学者。通过这个项目可以一次性接触 MVC 分层、ORM 框架、模板引擎、会话管理、接口封装、AI 大模型 API 调用这些真实开发中高频使用的能力。2.2 能解决什么问题从业务角度看它解决的是高校选课场景里的信息过载问题。学生面对几十上百门课程很难快速判断哪些课程适合自己。系统通过收集学生的专业、年级、已选课程、课程评价和点击行为结合大模型的语义理解能力输出个性化的推荐理由和课程匹配度分析比单纯按选课人数排序要更有说服力。从毕设角度看它解决的是“怎么把 AI 大模型融进传统管理系统”的问题。现在很多学校都鼓励毕业设计结合 AI 大模型但完全做大模型应用又容易被卡在算力或 API 成本上。这个项目的思路是传统系统照常做推荐模块通过调用大模型 API 来增强既控制了成本又突出了 AI 应用点。2.3 不适合什么场景这套系统不适合做大规模生产部署。Thymeleaf 的服务端渲染模式在并发量较高的场景下性能和前后端协作体验都不如前后端分离架构。AI 推荐部分如果直接实时调用大模型 API每次请求都有延迟和费用不适合高频刷新的场景。另外如果课程数据只有几十条AI 推荐的区分度会不明显这时候反而应该用简单的标签匹配或协同过滤更可控。2.4 版权、隐私与安全边界涉及 AI 推荐和用户行为数据收集有几个底线必须明确第一学生信息、选课记录属于个人隐私数据项目演示和论文写作时应使用脱敏后的模拟数据不能拿真实学生信息做测试。第二调用大模型 API 时不要把学生姓名、学号等敏感信息拼进提示词推荐逻辑只传专业方向、课程名称、兴趣标签这类非敏感数据。第三如果系统后续要商用或部署到真实校园环境需要完成数据安全合规评估不能直接拿毕设源码上线。第四课程资料、教师讲义如果有版权展示时要注意授权范围。3. 技术架构与设计思路3.1 整体架构SpringBoot Thymeleaf 服务端渲染这套系统的架构是标准的单体分层架构核心流程是浏览器发送请求SpringBoot 的 Controller 接收请求调用 Service 层处理业务逻辑Service 层通过 Mapper 或 Repository 访问 MySQL 数据库业务数据返回给 ControllerController 把数据放进 ModelThymeleaf 模板引擎渲染成 HTML 返回给浏览器。这个架构最大的优势是简单直接。没有前端工程、没有跨域配置、不需要 Nginx 转发一个进程完成全部工作。对毕设来说部署和答辩演示的稳定性很重要服务端渲染恰好能保证“一键启动浏览器访问所有页面正常”。技术选型上SpringBoot 建议优先用 2.7.x 系列原因是 2.7 是 SpringBoot 2.x 的最后一个维护版本社区资料最多、兼容性最好。如果机器上装了 JDK 17 以上也可以直接用 SpringBoot 3.x但要注意 MyBatis 也要配套使用 mybatis-spring-boot-starter 3.x 版本否则会出现启动报错。具体的版本兼容策略会在第 5 节展开。3.2 分层结构设计代码包结构建议按下面这种方式组织这也是毕设论文里最容易讲清楚的架构com.example.courserecommend ├── controller # 控制层接收请求返回页面或 JSON ├── service # 业务层核心业务逻辑和 AI 推荐调用 │ └── impl # Service 实现类 ├── mapper # 数据访问层MyBatis 接口 ├── entity # 实体类对应数据库表结构 ├── dto # 数据传输对象用于接口参数封装 ├── config # 配置类拦截器、跨域、AI 客户端配置 ├── common # 公共工具类、统一返回结果 ├── interceptor # 登录拦截器、权限拦截器 └── CourseRecommendApplication.java # SpringBoot 启动类这样一个包结构在论文里可以画成分层架构图每一层职责清晰控制层只做参数接收和页面跳转业务层放选课逻辑和推荐逻辑数据访问层只处理 SQL。答辩时无论老师问哪一层都能快速对应到具体代码位置。3.3 核心业务流程图系统的核心业务链路可以概括为学生登录 - 浏览课程列表 - 查看课程详情 - 选课 - 课程评价 - 系统记录行为数据 - AI 推荐模块读取行为数据和画像 - 生成推荐结果 - 在首页和学习中心展示管理员侧的链路是管理员登录 - 维护学生信息 - 维护教师信息 - 上传课程 - 审核课程 - 发布公告 - 查看选课统计3.4 AI 推荐模块的设计位置AI 推荐模块不是独立服务而是作为 Service 层的一个推荐服务组件。系统先通过 SQL 查询学生的历史选课、课程标签、专业信息和行为日志组装成一个结构化的请求再调用大模型的 API 接口获取推荐结果。这里的核心思路是“规则过滤 大模型生成推荐理由”。先用确定性规则过滤掉已选课程、不满足先修条件的课程、时间冲突的课程再把候选课程和学生的个性化信息发给大模型让模型输出排序和解释。这样做的好处是即使大模型偶尔给出不合理的推荐系统层面也有一层规则兜底不会出现推荐已经选过的课这种低级错误。4. 核心功能模块拆解4.1 登录与权限管理系统采用基于 Session 的登录认证方式用户分为学生、教师、管理员三种角色。登录成功后把用户信息存入 Session通过 Spring MVC 拦截器做访问控制。不同角色的功能边界如下角色主要功能学生浏览课程、查看课程详情、选课、退课、评价课程、查看 AI 推荐教师查看自己负责的课程、维护课程资料、查看选课学生名单、回复评价管理员学生管理、教师管理、课程管理、公告管理、选课统计、系统参数配置密码不能明文存储。建议使用 Spring Security 的 BCryptPasswordEncoder 或 Hutool 的 DigestUtil 做加盐哈希论文里写“密码经过加密存储”是加分项。4.2 学生管理模块学生管理主要包含学号、姓名、性别、学院、专业、年级、入学年份、联系方式、兴趣标签等字段。管理员可以批量导入学生信息也可以单个新增、编辑、删除、按条件搜索。这里有个容易被忽略的设计细节学生表的专业和年级字段要单独建立索引因为 AI 推荐模块会频繁按专业和年级过滤课程候选集。4.3 教师管理模块教师管理维护教师编号、姓名、职称、所属学院、研究方向、邮箱、授课列表等信息。教师登录后可以看到自己名下的课程和选课学生名单可以修改课程基本信息和上传教学资源。4.4 课程管理模块课程管理是系统的核心数据模块课程表需要包含以下核心字段课程编号课程名称所属学院授课教师 ID课程分类公共必修、专业必修、专业选修、公共选修课程标签如“编程开发”“数据分析”“外语学习”学分课时上课时间上课地点选课人数上限已选人数先修课程课程简介封面图创建时间管理员和教师都可以维护课程信息。选课时要校验选课人数是否达到上限退课后要释放名额。4.5 选课与退课模块学生选课的时序可以简化为1. 学生提交选课请求带上 courseId 2. 系统查询课程当前已选人数 3. 判断是否达到课程容量上限达到则返回“课程已满” 4. 判断学生是否已经选过该课程选过则返回“不能重复选课” 5. 判断是否存在时间冲突冲突则返回“上课时间冲突” 6. 校验通过后插入选课记录课程已选人数加 1退课逻辑相反删除选课记录的同时课程已选人数减 1。选课表建议增加选课时间字段后续可以做“选课高峰期”的统计分析。4.6 课程评价模块学生选课后可以对课程进行评价内容包含评分1 到 5 星和文字评价。评分会进入课程平均分统计文字评价会进入课程详情页展示同时也会作为 AI 推荐模块的输入特征。这里要注意未选课的学生不应该有评价权限后端要做权限校验不能只靠前端隐藏按钮。4.7 公告管理模块管理员发布系统公告比如选课时间安排、系统维护通知。公告列表展示在首页可以按置顶状态排列。这是一个基础但必要的模块能体现系统的完整性。5. 数据库设计要点数据库设计直接决定论文的工作量和技术含量。下面给出核心表结构设计建议。5.1 核心表清单表名作用student学生信息表teacher教师信息表course课程信息表course_selection选课记录表course_comment课程评价表notice公告表behavior_log用户行为日志表记录浏览和点击admin管理员表5.2 选课记录表选课记录表是业务核心设计如下CREATE TABLE course_selection ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, student_id BIGINT NOT NULL COMMENT 学生ID, course_id BIGINT NOT NULL COMMENT 课程ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 选课时间, status TINYINT DEFAULT 1 COMMENT 状态1-正常0-退课, UNIQUE KEY uk_student_course (student_id, course_id) ) COMMENT 选课记录表;这里唯一索引uk_student_course是防止重复选课的关键也是答辩时可以让老师直观看到你懂数据库约束的地方。5.3 行为日志表AI 推荐依赖用户行为数据建议建一张简单但实用的行为日志表CREATE TABLE behavior_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, behavior_type VARCHAR(20) NOT NULL COMMENT view / select / comment / search, behavior_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_student_time (student_id, behavior_time) ) COMMENT 用户行为日志表;这张表的意义在于不需要复杂的推荐算法也能基于“浏览过哪些课、搜索过哪些关键词、选过哪些课”给大模型提供上下文。论文里可以写“系统通过行为日志采集用户兴趣特征为推荐算法提供数据支撑”比空谈协同过滤更有说服力。6. 环境准备与本地部署6.1 基础环境清单在开始部署之前先把环境检查一遍依赖项建议版本JDKJDK 8 或 JDK 17MavenMaven 3.6MySQLMySQL 5.7 或 MySQL 8.xIDEIntelliJ IDEA 2022大模型 API根据实际选择的 AI 服务商配置这里要特别提醒一个 SpringBoot 版本问题如果你用 JDK 8就直接配 SpringBoot 2.7.x不要硬上 SpringBoot 3.x因为 SpringBoot 3.x 要求 JDK 17。反过来说如果你的 JDK 是 17也不要创建 2.x 项目后强行跑否则编译阶段会直接报错。6.2 创建 SpringBoot 项目可以在 Spring Initializr 或 IDEA 中直接创建Project Metadata - Group: com.example - Artifact: course-recommend - Package: com.example.courserecommend - Spring Boot: 2.7.18 - Dependencies: Spring Web, Thymeleaf, MyBatis Framework, MySQL Driver如果是手动添加依赖pom.xml 核心依赖如下parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.2/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency /dependencies6.3 配置文件application.yml是整套系统运行的核心配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/course_recommend?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.courserecommend.entity configuration: map-underscore-to-camel-case: truemap-underscore-to-camel-case: true这个配置很关键这样数据库的create_time可以自动映射到实体的createTime能省掉大量 XML 里的 resultMap。6.4 启动步骤完整启动流程如下# 1. 创建数据库 mysql -uroot -p CREATE DATABASE course_recommend DEFAULT CHARACTER SET utf8mb4; # 2. 导入项目 sql 目录下的初始化脚本 mysql -uroot -p course_recommend sql/course_recommend.sql # 3. 使用 Maven 打包 mvn clean package -DskipTests # 4. 启动应用 java -jar target/course-recommend-0.0.1-SNAPSHOT.jar启动成功后控制台会出现 SpringBoot 的 Banner接着出现Tomcat started on port(s): 8080然后浏览器访问http://localhost:8080/默认情况下会跳转到登录页或首页。6.5 Thymeleaf 页面模板组织方式Thymeleaf 的模板放在src/main/resources/templates/下建议按模块建目录src/main/resources/templates/ ├── login.html ├── index.html ├── student/ │ ├── course-list.html │ ├── course-detail.html │ ├── recommend.html │ └── my-courses.html ├── teacher/ │ ├── my-courses.html │ └── student-list.html └── admin/ ├── student-manage.html ├── teacher-manage.html ├── course-manage.html └── notice-manage.htmlThymeleaf 页面里典型的动态渲染代码如下tr th:eachcourse : ${courseList} td th:text${course.courseName}/td td th:text${course.teacherName}/td td th:text${course.credit}/td td a th:href{/course/detail/{id}(id${course.id})}查看详情/a /td /tr这种写法后端把courseList放进 Model页面直接遍历渲染答辩演示时数据一目了然。7. AI 推荐模块的实现方案7.1 推荐链路总览这是整个项目最有亮点、也最需要讲清楚的部分。推荐模块的整体设计是先做规则过滤再做特征组装最后调用大模型生成推荐结果。流程如下读取学生基本信息专业、年级、兴趣标签 - 查询学生的选课记录和行为日志 - 查询全部可选的课程列表排除已选、满员、冲突课程 - 组装推荐上下文 - 调用大模型 API传入学生画像和候选课程列表 - 解析大模型返回的 JSON提取推荐课程和理由 - 存入推荐结果缓存表在页面展示7.2 与大模型 API 的对接封装大模型 API 的对接可以封装成一个独立的AiRecommendService核心调用逻辑参考下面的伪代码public ListRecommendResult recommendForStudent(StudentProfile profile, ListCourse candidates) { // 1. 组装提示词 String prompt buildPrompt(profile, candidates); // 2. 调用大模型API String response aiClient.chat(prompt); // 3. 解析返回结果 return parseRecommendResponse(response); }提示词工程是决定推荐效果的关键。一个合理的提示词模板如下你是一名高校课程顾问。请根据学生的以下信息 - 专业软件工程 - 年级大三 - 兴趣标签后端开发、人工智能、Python - 已选课程Java Web开发、数据库原理 从下面的候选课程中推荐 3 门最适合的课程 1. 分布式系统专业选修2学分 2. 大数据技术公共选修2学分 3. 编译原理专业必修3学分 ... 请以 JSON 格式返回推荐结果字段包括 courseId、推荐理由、匹配度评分0-100。要求模型返回 JSON 而不是自然语言是因为后续要解析和落库结构化的输出格式在工程上更稳定。7.3 兜底策略没有 API Key 时怎么办这里要给一个实际工程里很常见的提示如果暂时没有大模型 API 的 Key或者演示时不想产生费用推荐模块可以做一层降级。系统内置一个基于课程标签匹配的简单推荐逻辑学生选了“数据库原理”系统就自动推荐标签包含“数据库”“数据管理”的课程并且生成固定模板的推荐理由。降级策略在论文里可以写成“多策略融合推荐”规则推荐保证基础可用性大模型推荐提升推荐结果的语义化解释能力。这样即使答辩现场断网系统也不会推荐不了课程。7.4 推荐结果管理推荐结果要落库不建议每次打开页面都实时调用大模型。建立一张推荐结果表CREATE TABLE recommend_result ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, recommend_reason VARCHAR(500) COMMENT 推荐理由, match_score INT COMMENT 匹配度评分, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_student (student_id) ) COMMENT AI推荐结果表;策略是学生首次访问推荐页时触发一次推荐计算结果存入表中后续访问直接读取缓存数据并提供“刷新推荐”按钮手动触发重新计算。这样既控制了 API 调用次数也提升了页面响应速度。8. 接口设计规范虽然页面是 Thymeleaf 渲染但 SpringBoot 天然支持返回 JSON 的接口可以给推荐模块单独设计一套接口方便后续扩展或答辩时演示。8.1 统一返回结果封装定义一个统一返回结构所有接口都走这个格式public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.code 200; result.message success; result.data data; return result; } public static T ResultT error(Integer code, String message) { ResultT result new Result(); result.code code; result.message message; return result; } }8.2 推荐接口示例推荐接口的请求参数设计如下参数名类型必填说明studentIdLong是学生 IDlimitInteger否推荐数量默认 3使用 curl 测试curl -X GET \ http://localhost:8080/api/recommend?studentId1limit3 \ -H Content-Type: application/json接口返回结果如下{ code: 200, message: success, data: [ { courseId: 18, courseName: 机器学习导论, matchScore: 92, reason: 你已选修数据库原理和Python程序设计机器学习导论与这两门课程的知识关联度高且符合你的人工智能兴趣方向。 } ] }8.3 其他核心接口列表接口路径方法功能/user/loginPOST用户登录/user/logoutPOST退出登录/course/listGET分页查询课程列表/course/detail/{id}GET课程详情/course/selectPOST学生选课/course/cancelPOST学生退课/course/commentPOST提交课程评价/api/recommendGET获取 AI 推荐结果8.4 Python 调用推荐接口示例如果要在论文里放一段外部程序调用推荐接口的示例用 Python 更直观import requests url http://localhost:8080/api/recommend params { studentId: 1, limit: 3 } response requests.get(url, paramsparams, timeout30) data response.json() if data[code] 200: for item in data[data]: print(f课程{item[courseName]}匹配度{item[matchScore]}) print(f推荐理由{item[reason]}) print(- * 50) else: print(f接口调用失败{data[message]})这一小段代码的价值在于可以让论文里的“系统支持接口对接”不是一句空话而是有实际问题验证的。9. 功能测试与效果验证9.1 登录功能测试测试项操作预期结果正确账号登录输入管理员账号和正确密码跳转到后台首页错误密码登录输入错误密码页面提示“用户名或密码错误”未登录访问受限页面直接访问 /admin/student-manage拦截器跳转到登录页9.2 选课功能测试测试项操作预期结果正常选课学生选择一个未满课程选课成功课程已选人数 1重复选课再次选择同一门课提示“不能重复选课”满员选课选择已满课程提示“课程已满”退课已选课程列表点击退课选课记录删除已选人数 -19.3 AI 推荐功能测试用三种不同类型的学生账号分别测试推荐结果学生特征推荐结果预期软件工程 兴趣后端开发推荐结果偏向 Java、分布式、数据库方向课程外语专业 兴趣跨文化交流推荐结果偏向语言类、国际交流类课程大一新生 无历史行为推荐结果偏向通识课和基础课判断推荐是否成功的标准有三个第一推荐列表里没有出现已选课程第二每门推荐课程都有合理的推荐理由且理由结合了学生画像信息第三匹配度评分有一定区分度不同专业学生拿到的推荐结果不同。9.4 异常场景测试还需要验证系统的健壮性数据库连接断开时页面是否会出现 500 页面大模型 API 超时时推荐模块是否会自动降级为标签推荐而不是直接报错课程数据为空时课程列表是否显示“暂无数据”学生重复提交选课请求时数据库唯一索引是否能拦截这些异常场景能写进论文里的“系统测试”章节属于既有实际内容又容易博得老师好感的素材。10. 资源占用与性能观察10.1 本地运行的资源表现由于这是单体 SpringBoot 应用对硬件要求很低。按常见配置推测开发环境下 8GB 内存的笔记本即可流畅运行内存占用主要取决于 JVM 参数和 IDEA 本身的开销。应用本身在无访问压力时占用通常不高但这里不做具体数字承诺以你本机jps和任务管理器的实际观察为准。10.2 大模型 API 调用的延迟影响推荐模块的响应时间主要取决于大模型 API 的返回速度通常从 1 到 5 秒不等不同服务商差别较大。所以要强调结果缓存第一次加载慢一点可以接受第二次访问必须走缓存否则用户体验和演示观感都受影响。10.3 性能优化切入点这个系统可以做的性能优化主要包括优化点手段课程列表查询使用 MyBatis 分页插件 PageHelper避免全表查询选课人数统计在课程表冗余已选人数字段避免 count 聚合推荐结果缓存到 recommend_result 表减少 API 调用静态资源Thymeleaf 模板中静态资源走本地目录压缩图片体积数据库索引为 course_selection 建唯一索引为 behavior_log 建时间索引这些优化点写到论文“系统优化”一节时很有说服力因为不是空谈而是有对应的代码和表结构支撑。11. 常见问题与排查方法下面整理一套实际运行中最高频的问题清单。问题现象可能原因排查方式解决方案启动直接报错JDK 版本与 SpringBoot 版本不匹配查看启动日志第一行JDK 8 用 SpringBoot 2.7.xJDK 17 用 SpringBoot 3.x启动提示数据库连接失败MySQL 未启动或账号密码错误检查 application.yml 数据库配置启动 MySQL核对 url、username、password页面中文乱码数据库编码或连接字符集不正确查看数据库表字符集数据库和表使用 utf8mb4连接加 characterEncodingutf-8访问页面 404Thymeleaf 模板路径不对看控制台日志中模板路径确认模板在 templates 目录下返回视图名与文件名一致登录后跳转回登录页Session 失效或拦截器配置问题检查拦截器放行的路径配置放行 /user/login、/css/、/js/等路径MyBatis 查询字段为 null下划线转驼峰配置未开启检查 map-underscore-to-camel-case在 application.yml 设置 trueMaven 打包报错依赖下载失败或测试用例失败查看 Maven 控制台日志mvn clean package -DskipTests选课接口报 500数据库唯一索引冲突未捕获查看异常堆栈在 Service 层捕获 DuplicateKeyException 并返回友好提示AI 推荐一直转圈大模型 API 超时查看服务端日志中 API 请求耗时增加超时时间并实现推荐结果缓存和降级策略端口被占用上次启动的进程未关闭netstat -ano 查看 8080 端口关闭占用进程或修改 server.port11.1 核心排查思路遇到报错时不要先看页面要看控制台。SpringBoot 的启动日志和运行日志已经把绝大部分错误原因都打印出来了。定位问题的顺序建议是控制台日志是否有 ERROR - 是否有完整的异常堆栈 - 找到 Cause by 行 - 把关键报错信息复制到搜索引擎或 AI 工具里查询 - 修复后重新启动11.2 SpringBoot 版本太高导致的兼容性问题从当前网络搜索材料来看“springboot 版本太高”确实是很多初学者遇到的典型问题。表现有几种新建项目时模板选的 3.x本地 JDK 却只有 8MyBatis 依赖版本不兼容Thymeleaf 模板解析方式变化导致页面渲染失败。最稳妥的做法不要盲目追新版本。对于课程设计、毕业设计项目SpringBoot 2.7.18 JDK 8 MyBatis 2.3.2是一套经过大量项目验证的组合网上能找到的教程和踩坑记录也最多。等你把整套流程跑通了再尝试升级到 SpringBoot 3.x 也不迟。12. 论文写作与答辩建议12.1 论文大纲参考基于这个项目论文目录可以参考第1章 绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 主要研究内容 第2章 相关技术介绍 2.1 SpringBoot 框架 2.2 Thymeleaf 模板引擎 2.3 MySQL 数据库 2.4 AI 大模型与推荐系统 第3章 系统需求分析 3.1 可行性分析 3.2 功能需求分析 3.3 非功能需求分析 第4章 系统设计 4.1 系统总体架构设计 4.2 功能模块设计 4.3 数据库设计 4.4 AI 推荐模块设计 第5章 系统实现 5.1 登录模块实现 5.2 课程管理模块实现 5.3 选课模块实现 5.4 AI 推荐模块实现 第6章 系统测试 6.1 测试环境 6.2 功能测试 6.3 性能测试 第7章 总结与展望12.2 答辩时的高频问题准备这套系统时下面这些问题一定要能答上来SpringBoot 的自动配置原理是什么Thymeleaf 和 Vue 有什么区别为什么选 ThymeleafAI 推荐模块是怎么实现的调用的什么接口提示词怎么设计的如果大模型不可用推荐功能还能用吗选课怎么避免重复选课和时间冲突数据库表为什么这么设计外键为什么不用系统的安全性怎么保证其中“SpringBoot 自动配置原理”是几乎所有 SpringBoot 毕设答辩都会问的高频问题建议提前把SpringBootApplication组合注解、spring.factories或AutoConfiguration.imports、条件注解ConditionalOnClass这几个核心知识点吃透。12.3 演示时的加分操作答辩演示时有下面几个小技巧可以明显提升效果第一提前准备一个“演示专用账号”该账号的选课记录、浏览行为已经足够丰富打开推荐页直接就能看到效果不用现场注册选课。第二演示推荐的“实时刷新”功能时动态修改学生的兴趣标签然后刷新推荐结果让老师看到推荐结果随着兴趣变化而变化。第三提前准备一套课程、学生、教师完整数据不要用空表演示。13. 常见扩展方向如果时间和精力充足这个系统还可以做下面的扩展每一个都能作为论文的“创新点”扩展方向实现思路接入 Redis 缓存用 Redis 缓存课程热门排行榜和推荐结果降低数据库压力角色权限增强引入 Spring Security JWT实现更细粒度的权限控制数据可视化使用 ECharts 展示选课人数分布、课程热度趋势、学生兴趣分布批量导入导出使用 EasyExcel 实现学生信息和选课名单的 Excel 批量导入导出爬虫获取课程数据定时采集公开的课程信息丰富课程库多模型切换推荐模块支持切换不同大模型服务商并在后台配置 API KeyDocker 部署将 SpringBoot 应用和 MySQL 编写为 docker-compose 服务一键启动其中“批量导入导出”和“Docker 部署”特别适合写进论文的“系统实现”章节因为代码量适中、效果直观、技术点明确。14. 总结与下一步这套基于 SpringBoot Thymeleaf AI 推荐的校园课程推荐系统最大的价值在于把传统 JavaWeb 管理系统的完整开发流程和 AI 大模型应用结合在了一起。你实际动手时第一步应该先跑通登录和课程管理第二步把选课和评价功能做完第三步再接入 AI 推荐模块。最容易踩的坑集中在 SpringBoot 版本和 JDK 版本不匹配、数据库字符集配置错误、MyBatis 下划线转驼峰没开启这几个点上提前规避能省不少时间。如果这套系统跑通后想继续扩展优先做批量导入导出和 Docker 部署这两个方向对论文和答辩都有直接帮助。建议先按文章里的步骤把项目启动起来再用自己的课程数据去替换测试数据等整套流程跑通了再去调整推荐提示词和页面样式。