ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SpringBoot+Vue构建本科生交流培养管理平台:毕设选题到答辩全指南

2026/10/6 8:39:32 拓冰建站 浏览量
SpringBoot+Vue构建本科生交流培养管理平台:毕设选题到答辩全指南 又到了一年两度的毕设选题季后台总是有一批同学来问同一个问题能不能推荐一个难度适中、不容易翻车、老师看完还觉得有东西的项目。我一般会反问三个条件第一业务逻辑你自己能不能讲清楚第二技术栈是不是主流网上资料多不多第三做完之后能不能在答辩现场演示出一条完整的业务闭环。如果三个条件都满足我第一个想到的往往就是标题里这种——SpringBootVue的本科生交流培养管理平台。先交代结论这套东西用Java做后端、SpringBoot提供REST接口、Vue构建前端页面、MySQL持久化数据核心业务围绕本科生在校期间的交流互动和培养管理两条主线展开。难度属于中等偏下但胜在业务场景真实、模块边界清晰、可扩展性强拿来当毕设、课设都非常合适也适合想完整走一遍前后端分离项目全流程的初学者。下面这套方案是我基于实际交付过的同类型项目总结出来的通用设计思路和实现细节你可以把它当成一份从选题到答辩的工程化参考来看。1. 选题价值拆解为什么交流培养管理平台是毕设的稳妥选择1.1 业务足够清晰三条主线不容易写跑偏很多毕设翻车翻的不是技术难度而是业务边界。题目一模糊写着写着就不知道自己在做什么了。交流培养管理平台这个名字听起来简单但拆开看其实很明确交流对应的是学生之间的互动比如发帖、评论、点赞、私信以及导师对学生的答疑解惑培养对应的是教务相关的管理比如培养计划、课程安排、选课、导师分配、指导记录、成绩管理平台则意味着有管理员的角色存在负责用户管理、内容审核、数据统计之类的工作。三条主线分别对应学生、教师、管理员三类角色任何人登录进来都有自己的活要干不会出现某个模块做完之后根本没人用的尴尬情况。这一点对于答辩来说非常重要——评委最怕看到的就是功能堆砌而业务主线清晰的系统演示的时候可以沿着一条完整的故事线走下来学生进来发个帖子提问、导师看到后回复、管理员审核内容、后台产生统计数据整个过程顺理成章。1.2 难度适中但有东西可讲我见过不少同学一上来就选基于深度学习的某某系统或者高并发秒杀系统结果调研两周发现光环境就配不明白最后只能换题。交流培养管理平台没有这类问题它本质上是标准的CRUD项目核心任务是把数据关系理清楚、把业务规则做完整不需要高深的算法知识。但CRUD并不等于没有亮点。你可以在这个基础上做很多合理延展比如导师与学生的双向选择学生提交申请、导师确认、管理员审批这是一个有状态流转的功能不是简单的一张表。交流内容的敏感词过滤与管理发布前自动校验管理员还能对已发布内容进行下架操作。按专业、年级生成培养计划支持Excel导入课程表前端按学期时间线展示视觉和功能都有加分空间。数据可视化看板用ECharts在管理端展示活跃用户数、发帖趋势、选课率等统计图表。这些点每加一个你的系统设计章节就能多写两页答辩时老师问你这个系统有什么难点和亮点你完全接得住。1.3 工作量可控适合独立开发按照我个人的经验这类平台前端大约8到12个页面后端设计20到30个接口数据库核心表5到8张就够跑通整个闭环。如果每天投入三四个小时一个半月到两个月就能保质保量地完成不至于熬夜赶工把代码写崩。如果你打算做团队课设还可以把前端和后端分给两个人接口约定好就行。2. 技术栈选型SpringBootVueMySQL这套组合到底香在哪2.1 SpringBootJava后端开发的标准答案SpringBoot在教育项目里的地位基本是默认选项原因很简单它把Spring繁琐的XML配置全部变成了自动配置内置Tomcat写一个main方法就能启动一个Web服务。学习成本低、社区资料多、面试也常问一个项目能同时服务毕设、课设和找工作的需求性价比极高。版本选择上需要注意SpringBoot 3.x 要求JDK17及以上而网上大量教程和现成代码都是基于SpringBoot 2.x JDK8写的。如果你对版本管理不熟我的建议是选SpringBoot 2.7.x JDK8或JDK11的组合资料最多、踩坑最少。如果要用3.x请做好依赖版本冲突的心理准备这个我在后面第8章会专门展开。2.2 Vue组件化前端开发效率确实高Vue的核心优势是组件化和响应式数据绑定。写页面的时候把登录框、表格、分页条这些UI封装成组件哪个页面要用直接引入开发速度和维护性都很好。配合Element UI或Element Plus这类组件库不需要自己手写CSS就能做出看得过去的后台界面。对于毕设来说Vue 2 Element UI的生态最成熟教程多、坑都被踩完了。如果你不担心踩新坑Vue 3 Element Plus Vite也可以性能更好但部分第三方组件可能还需要时间适配。我的建议还是以稳定为主毕设的关键是如期交付不是追逐最新版本。2.3 MySQL最容易上手的生产级数据库MySQL开源、免费、安装简单Windows上跟着向导一路Next就能装好具体步骤第7章会说。大学课程里数据库原理讲的也是MySQL/SQL语言语法熟悉用Navicat或者DBeaver连接后直接可视化建表、导数据效率非常高。版本方面5.7.44 和 8.0 都可以但我建议新项目直接上8.0它的窗口函数、公用表表达式WITH语法在写统计报表的时候很好用。如果你机器上装的是5.7也不用换功能上做这个项目完全够。2.4 这套组合的完整骨架整个系统的请求链路是Vue页面发起Axios请求经过前端代理或直接跨域调用SpringBoot的REST接口Controller接收参数后交给Service处理业务逻辑再通过MapperMyBatis或MyBatis-Plus操作MySQL数据库查询结果封装成统一JSON格式返回给前端渲染。后端层面我建议用MyBatis-Plus代替原生MyBatis。它能省掉大量单表CRUD的XML代码内置分页插件代码量能少三分之一。很多同学一开始纠结用不用MyBatis-Plus我的看法是毕设考察的是你的业务设计和工程能力不是考察你手写SQL的能力用更高效的插件是工程上合理的选型答辩时讲清楚插件做了什么就行。3. 业务功能架构从需求到模块的落地设计3.1 三类核心角色与权限边界做任何系统先把角色和权限想清楚。这套平台的用户类型可以划分为学生注册登录、完善个人资料、浏览培养计划、选课、查看成绩、选择导师、发布/回复帖子、点赞收藏、查看通知公告。教师导师登录后可以查看指导学生列表、回复学生提问、发布培养计划相关公告、录入学生成绩、维护个人基本信息。管理员用户管理禁用/启用账号、交流内容审核通过/下架、课程与培养计划管理、导师分配审批、数据统计。权限控制不一定非得上Spring Security或Shiro这种重型框架做一个自定义拦截器加JWT校验就够了。管理员接口判断当前登录用户的角色字段不是管理员就直接返回无权限访问。这样实现简单、代码可读性强答辩的时候也能讲明白。3.2 功能模块拆解下面是我建议的功能结构你可以根据自己时间增减模块功能点涉及角色用户模块注册、登录、资料编辑、头像上传、密码修改所有角色交流模块发帖、删帖、评论、点赞、收藏、帖子审核学生、教师、管理员培养计划模块培养方案查看、学期课程展示学生、教师选课模块选课、退课、成绩录入、成绩查看学生、教师导师管理模块申请导师、分配导师、指导记录、回复记录学生、教师、管理员公告通知模块发布公告、查看通知所有角色后台管理模块用户管理、内容审核、数据统计看板管理员3.3 一个典型业务闭环拿学生找导师答疑这个场景举例完整链路是这样的管理员先在后台设置接受指导申请的教师名单学生在导师管理页看到可选教师列表点击申请并填写申请理由教师登录后看到待处理的申请选择同意或拒绝学生端收到状态更新后续学生可以在指导记录里发一条遇到的困惑教师回复师生之间的对话记录全部留痕管理员在统计页可以看到每个导师带了几名学生、平均回复时长等数据。这个闭环覆盖了5张以上的表和10个以上的接口一旦跑通你的系统从功能上讲已经是一个完整的平台了而不是一堆孤立的页面。4. 数据库建模核心表结构与关键字段设计4.1 用户表单表还是多表用户设计有两种常见方案一种是建一个user表用role字段区分学生/教师/管理员另一种是建student表、teacher表、admin表三张表各自单独存学号/工号、专业等属性。我推荐单表方案对于这个项目来说够用且查询、登录认证都简单。如果后续要做用户统一管理禁用账号、统计用户数一张表搞定所有逻辑。教师和学生各自特有的字段就通过可空字段如student_no、teacher_no存着表格看起来会有一点零散但业务上完全成立。CREATE TABLE user ( id int NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 登录账号, password varchar(100) NOT NULL COMMENT 加密后密码, real_name varchar(50) DEFAULT NULL COMMENT 真实姓名, role tinyint NOT NULL DEFAULT 1 COMMENT 1学生 2教师 3管理员, student_no varchar(20) DEFAULT NULL COMMENT 学号, teacher_no varchar(20) DEFAULT NULL COMMENT 工号, major varchar(50) DEFAULT NULL COMMENT 专业, grade varchar(20) DEFAULT NULL COMMENT 年级, phone varchar(20) DEFAULT NULL, email varchar(50) DEFAULT NULL, avatar varchar(255) DEFAULT NULL COMMENT 头像URL, status tinyint NOT NULL DEFAULT 1 COMMENT 1正常 0禁用, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;密码字段千万别存明文用MD5加盐或BCrypt加密。答辩时老师几乎必问密码是怎么处理的。4.2 交流模块帖子和评论怎么设计帖子表需要记录标题、正文、发布人、所属分类求助/经验分享/闲聊、浏览数、点赞数、评论数、状态待审核/已通过/已下架。评论表则要考虑层级评论的情况用parent_id标记回复的是哪条评论值为0表示顶级评论同时还需要记录post_id来确定评论属于哪条帖子。点赞建议单独建表存记录而不是只在一个数字上累加这样可以做到一个人只能点赞一次重复点赞自动取消这点很加分。CREATE TABLE post ( id int NOT NULL AUTO_INCREMENT, user_id int NOT NULL COMMENT 发布人ID, title varchar(100) NOT NULL, content text, category varchar(20) DEFAULT NULL, view_count int DEFAULT 0, like_count int DEFAULT 0, comment_count int DEFAULT 0, status tinyint DEFAULT 1 COMMENT 1待审核 2已通过 3已下架, create_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT帖子表;4.3 培养管理模块课程、计划、导师、指导记录课程表course记录课程名称、任课教师ID、学分、开课学期、适用专业。选课表student_course把学生和课程关联同时存成绩字段成绩为空代表还没出分。培养计划如果要做得简单可以设计成一张plan表存计划的名称、适用年级专业、计划内容大段的JSON或者富文本前端按学期展示即可要做复杂一点再拆出plan_detail表每条记录是某个学期的某一门课程。导师分配表tutor_select里建议加一个state字段用来记录申请状态0待审核、1已通过、2已拒绝这样教师端和学生端都能根据状态做出不同展示。指导记录表guidance需要存提问内容、提问时间、回复内容、回复时间这是体现交流培养闭环的核心表。4.4 关联关系、索引与排序外键在毕设项目里可以加但实际开发我一般不加物理外键而是在代码里维护逻辑关系。表多了之后物理外键更新删除会有很多限制而逻辑外键配合索引查询效率更高写起来也灵活。每张表的核心查询字段都要建索引比如post表的user_id、student_course的student_id、guidance的student_id否则数据量大了分页查询会明显变慢。排序上建议给create_time建普通索引按时间倒序是交流平台最常见的展示逻辑。MySQL 8.0的窗口函数可以在统计每个导师带了多少学生时省不少代码这也是一个不错的答辩亮点。5. 后端接口实现从Controller到Service的分层思路5.1 统一返回结构与全局异常处理前后端分离项目最常见的问题就是接口返回值格式不统一前端解析起来很痛苦。我习惯定义一个统一返回类Result包含三个字段code200成功、message提示信息、data业务数据。所有Controller都返回这个结构。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(操作成功); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }配合RestControllerAdvice做全局异常处理业务代码里throw一个自定义异常统一由异常处理器转成Result返回Controller里就不会到处都是try-catch。这个设计属于标准化操作但很多同学的代码里完全没有写上之后代码质量立刻上一个档次。5.2 登录认证与JWT用JWT做登录认证是这个项目的核心设计之一。用户登录成功后后端签发一个包含用户ID、用户名、角色的token返回给前端前端把它存在localStorage里每次请求通过Authorization请求头带上后端写一个拦截器拦截需要认证的路径解析token失败就返回401。为什么选JWT而不是Session两点原因一是前后端分离架构下后端接口可能被不同客户端调用Session的跨域支持比较别扭二是JWT是无状态的服务端不需要维护会话信息更贴合REST风格。答辩时这两个理由足够你讲清楚为什么不用Session。{ alg: HS256, typ: JWT } { userId: 1, username: student001, role: 1, exp: 1750000000 }5.3 核心接口代码实现登录接口是最基础的但也是最容易被写出问题的。我见过不少项目登录接口直接select * from user where username? and password?这种做法最大的问题是没有考虑用户被禁用、密码错误提示不友好、也没有签发token。正确的做法应该是先查用户是否存在再比对密码再检查status最后才生成token。PostMapping(/login) public ResultLoginResponse login(RequestBody LoginRequest request) { User user userService.findByUsername(request.getUsername()); if (user null) { return Result.error(用户不存在); } if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { return Result.error(密码错误); } if (user.getStatus() 0) { return Result.error(账号已被禁用); } String token JwtUtils.generateToken(user); LoginResponse resp new LoginResponse(); resp.setToken(token); resp.setUserInfo(user); return Result.success(resp); }5.4 分页查询与模糊搜索交流模块的帖子列表、后台的用户列表、选课列表都需要分页。用MyBatis-Plus的话分页只需配置一个PaginationInnerInterceptor然后调Page方法即可非常省事。模糊搜索建议用LambdaQueryWrapper的like方法注意对搜索关键词做特殊字符处理防止SQL注入。public PagePostVO pagePosts(int page, int size, String keyword, String category) { PagePost p new Page(page, size); LambdaQueryWrapperPost wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.hasText(category), Post::getCategory, category) .and(StringUtils.hasText(keyword), w - w.like(Post::getTitle, keyword).or().like(Post::getContent, keyword)) .eq(Post::getStatus, 2) .orderByDesc(Post::getCreateTime); return postMapper.selectPage(p, wrapper); }6. 前端页面实现Vue组件化与交互细节6.1 项目结构与路由设计创建Vue项目建议用Vue CLIvue create命令它会帮你把Webpack、Babel、ESLint都配好省去一堆环境问题。常用的目录结构是这样的src/api存放所有接口请求函数src/router路由配置src/storeVuex或Pinia状态管理src/views页面组件src/components通用组件头像上传、分页条、富文本编辑器等src/utils工具函数比如request.js路由配置里必须做登录守卫router.beforeEach。核心逻辑是未登录用户访问需要认证的页面时强制跳转到登录页已登录用户访问登录页时跳回首页。这一步不做你系统里的所有认证都是摆设。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { next(/login) } else if (to.path /login token) { next(/) } else { next() } })6.2 Axios请求封装与跨域处理每个页面直接调axios没问题但几十个页面都这么写一旦token过期或者后端返回错误处理逻辑要在每个页面重复一遍。我建议封装一个request.js统一处理baseURL、请求头、响应拦截和错误提示。import axios from axios import { Message } from element-ui import router from /router const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }) request.interceptors.response.use( response { const res response.data if (res.code ! 200) { Message.error(res.message || 请求失败) return Promise.reject(new Error(res.message)) } return res }, error { if (error.response error.response.status 401) { localStorage.removeItem(token) router.push(/login) } Message.error(error.message || 网络异常) return Promise.reject(error) } )跨域问题记住一个就行开发阶段在vue.config.js里配置proxy代理让前端请求指向后端地址生产环境把前端打包后的静态文件放到后端服务里同源访问就没有跨域了。module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }6.3 典型页面交流社区实现思路交流社区页面复用性特别高。列表组件用Element UI的el-card el-tag展示帖子的分类和状态配合el-pagination做分页点击进入详情页后展示正文和评论区。这里有几个容易忽略的细节点赞状态进入详情页时要请求一次当前用户是否已点赞按钮要区分已赞和未赞两种状态后端要提供查询接口。评论富文本如果帖子内容允许上传图片建议用wangEditor或Quill这类开箱即用的富文本编辑器不要自己写图片上传逻辑。加载状态列表和详情页都要loading动画接口慢的时候体验不会太差。图片预览使用el-image组件自带预览模式点击放大图片代码量很少体验提升明显。6.4 打包配置与静态资源处理前端开发完成之后需要打包成静态文件。在vue.config.js里设置publicPath为./否则部署到二级路径或放到SpringBoot静态目录下资源会404。打包命令是npm run build生成dist目录。如果你选择把前端打包后放进SpringBoot对应热词vue打包放进springboot中把dist目录里的文件复制到src/main/resources/static下然后访问http://localhost:8080/index.html就能看到整个系统。注意要用hash方式的路由或者在后端加一个未匹配路径转发到index.html的处理否则刷新子页面会出现404。7. 环境搭建与部署从零到能跑通全流程7.1 开发环境一览先列一份环境清单缺什么补什么。我见过太多同学卡在环境上其实都是版本不对工具建议版本说明JDK8 或 11配SpringBoot 2.7.x不要直接上JDK17除非你用Boot 3.xMaven3.6配置阿里云镜像加速Node.js14 或 16太高版本可能和旧版本依赖冲突MySQL5.7.44 或 8.0Windows安装过程见下IDEIntelliJ IDEA社区版就够用数据库工具Navicat / DBeaver可视化建表导数据7.2 Windows下MySQL安装要点Windows装MySQL建议下载zip压缩包而不是msi安装包解压后自己配置过程可控且不会遗留一大堆流氓服务和驱动。步骤概括为下载zip包解压到指定目录、在根目录新建my.ini、用管理员权限打开cmd执行mysqld --initialize-insecure、然后mysqld install注册服务、net start mysql启动服务、最后mysql -u root -p进入命令行改密码。my.ini里三个核心配置不能少端口号默认3306、字符集utf8mb4、存储引擎InnoDB。utf8mb4这个配置很重要它决定你能不能存emoji和生僻字很多同学数据库乱码就是因为用了默认的latin1。连接时如果报SSL错误连接地址里加上useSSLfalseserverTimezoneAsia/Shanghai就能解决这个在第8章会细说。7.3 后端工程创建与配置用IDEA创建SpringBoot项目时选择Spring Initializr勾选Web、MySQL Driver、MyBatis或MyBatis-Plus、Lombok依赖。生成后在application.yml里配置数据源和端口server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/edu_platform?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver如果Jar包下载很慢修改maven的settings.xml把中央仓库换成阿里云镜像。IDEA里设置Maven时候选好自己的settings文件避免出现依赖已导入但代码飘红的尴尬情况。IDEA里配置SpringBoot启动端口的正确做法是改application.yml的server.port改完之后点击Rerun重启服务。热词里面那个idea 2026 怎么配置springboot服务 编辑配置数据 比如启动端口其实就是在IDE里选择启动类然后在Program arguments里加--server.port8081或者直接在配置文件里改二选一即可。7.4 前端工程创建与配置Node安装完成后打开命令行执行node -v和npm -v确认版本。然后npm install -g vue/cli安装脚手架再用vue create frontend创建一个新项目。创建过程会问你选哪些功能一般勾选Router和Vuex就够了。进入项目目录执行npm install安装依赖然后npm run serve启动开发服务器。默认端口8080容易和SpringBoot冲突vue.config.js里可以改掉module.exports { devServer: { port: 3000, proxy: { ... } } }前端开发服务器在3000后端在8080代理把/api开头的请求转发到8080两边互不干扰联调非常舒服。7.5 部署方案独立部署还是打进SpringBoot答辩时老师一般会现场看演示我建议准备两套方案。第一套是开发模式联调idea的SpringBoot跑后端、npm run serve跑前端演示最流畅改代码也能热更新。第二套是演示当天的保底方案直接用打包后的方式前端npm run build把dist目录放到后端static目录启动一个java -jar xxx.jar就能访问整个系统。保底方案的存在价值是万一现场要换个电脑演示只需要装JDK和MySQL不需要装Node环境更不怕前端依赖装不上。真正的交付也应该以这种方式为准。8. 高频踩坑与排查实录版本、连接、打包8.1 SpringBoot版本太高引发的依赖地狱这是最近被问得最多的问题没有之一。SpringBoot 3.x确实新但它是基于Jakarta EE的很多旧教程里的javax包已经改成jakarta了同时3.x强制要求JDK17部分老版本第三方库又不兼容。你要是照着2.x时代的博客配置3.x项目经常会出现类找不到、Bean创建失败的报错。我的处理建议是直接锁定版本。pom里继承的spring-boot-starter-parent明确写2.7.18配套的mybatis-plus-boot-starter选3.5.xJWT用jjwt 0.9.1这些版本都是被大量项目验证过的。如果你非要挑战SpringBoot 3.x优先去找打上2023年之后标签的教程版本管理上用Spring Initializr生成的默认版本做基准不要自己手写依赖版本号。8.2 MySQL连接时报SSL错误的根因与修复项目启动时控制台飘红SSL connection error或者命令行里提示Public Key Retrieval is not allowed原因往往是MySQL 8.0默认开启了SSL校验而你的JDBC连接串没有设置对应参数。解决办法非常直接在jdbc url后面追加useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiuseSSLfalse关闭SSL加密校验allowPublicKeyRetrievaltrue解决客户端无法获取公钥的问题serverTimezone把时区固定为东八区三件套写上去基本就安静了。mysql-connector-java的驱动类也要注意MySQL 8.0用com.mysql.cj.jdbc.Driver旧版驱动类在8.0下已经废弃了。8.3 Vue打包后放进SpringBoot的404问题这个坑几乎每个人都踩过。前端路由用了history模式直接访问后端地址比如http://localhost:8080/post/1后端根本不知道这个路径要去哪里找资源自然返回404。解决方案有三个选一个就行把路由模式从history改成hash即mode: hashURL里多个#号刷新不会404最简单。后端加一个Controller所有未匹配的接口路径都转发到index.html。配置Spring Boot的ErrorViewResolver把404错误映射到前端入口。我推荐第一方案改动小、不依赖后端代码。缺点是URL不美观但毕设演示完全够用。同时注意publicPath设置成./否则静态资源路径在二级路径下会拿不到JS和CSS。8.4 跨域、端口、上传等隐性问题接口报跨域开发时优先用proxy代理必选方案生产环境如果前后端分开部署需要后端配置CorsFilter允许前端域名访问。端口被占用启动SpringBoot时报Port 8080 was already in useWindows命令netstat -ano | findstr :8080找到占用PID然后taskkill /PID xxxx /F强杀或者干脆换端口启动。文件上传失败SpringBoot默认上传单文件大小限制为1MB超过会报MaxUploadSizeExceededException配置文件里把multipart相关参数调大spring: servlet: multipart: max-file-size: 10MB max-request-size: 50MB前端Axios携带token后仍然401检查拦截器里是否把token放到了请求头后端拦截器是否需要从请求头取参数而不是从请求参数取这两个地方经常闹矛盾。9. 答辩演示与交付最后一步别掉链子9.1 演示流程设计答辩现场最忌讳的是打开系统不知道从哪开始点。提前设计一条演示主线控制在8到10分钟先用管理员账号登录展示用户列表和内容审核然后切换学生账号演示注册登录、浏览培养计划、选课、发帖提问、选择导师再切教师账号回复学生提问、录入成绩最后回到管理端展示统计看板。三个角色来回切换正好覆盖系统全部核心功能。演示时先把数据库里的演示数据准备充分至少3个学生账号、2个教师账号、若干帖子、评论、课程记录。临场去造数据不仅浪费时间还容易暴露细节问题。9.2 答辩高频问题准备这几类问题几乎必问提前组织好答案为什么选择SpringBootVue答案要点前后端分离提高开发效率SpringBoot简化配置内置服务器降低部署成本Vue组件化提升前端复用性和维护性两者都是当前主流技术栈贴近企业开发场景。表之间的关系是怎样的把user与post一对多、student与course多对多、student与teacher通过tutor_select关联这些逻辑讲清楚配合数据库截图比背概念有用得多。权限控制怎么做基于拦截器加JWT实现自定义注解也可以提一下。有什么可优化的方向可以回答引入Redis缓存热点帖子、用WebSocket做即时消息通知、引入消息队列做异步推送说明你思考过扩展性比说没有强一百倍。如果用户量变大哪里会成为瓶颈数据库查询、文件存储、单机部署的并发能力三个点回答得越具体越好。9.3 文档、注释与代码规范项目交付给老师的通常是源码加论文或文档代码本身也要能经得起打开。命名规范用驼峰类名首字母大写Controller返回统一Result业务逻辑写在Service层Controller保持轻薄核心代码加注释但不要一行一个废话注释。数据库脚本要单独放一个.sql文件并附上初始账号密码至少提供管理员、教师、学生的测试账号这样老师拿到源码能直接跑起来。论文的章节安排我建议绪论背景与意义—需求分析角色与功能用例—系统设计架构、数据库、接口设计—系统实现每个模块的关键代码和截图—系统测试功能测试用例表。截图要高清、流程要完整表格里的测试用例写个五六条就够重点体现你测试过典型场景正常登录、错误密码、未登录访问、越权访问、数据为空时页面表现。我自己实际交付这类项目最大的体会是决定分数的往往不是代码里有多少高级技巧而是你能不能在评审面前清晰说出我做了什么、为什么这么做、遇到了什么问题、怎么解决的。把业务逻辑理顺把测试数据准备好把每个模块的演示路径走一遍这个项目就已经成功了一大半。最后再分享两个小技巧。一是写代码的时候顺手把每个接口的请求参数和返回结构记录在README里后面写论文、画接口图、答辩都能直接复用。二是不要把数据库密码和账号配置写在博客或者公开文档里演示时用统一的环境变量或者在application.yml里用占位符等项目交完再整理一个干净的配置说明。这些细节不花多少时间但能替你省下不少答辩前的突发状况。