
1. 选题分析与价值拆解每年到了毕业设计选题季总有不少同学在“做什么题目”这件事上反复纠结。有的题目太简单三两下写完但答辩时没什么可讲有的题目过于复杂做到一半发现技术栈根本撑不起来。如果让我推荐一个兼顾实用性、技术含金量和上手难度的方向基于SpringBoot的一站式考研平台绝对是一个值得认真考虑的选项。为什么这么说首先这个题目紧扣当下考研热的大背景。每年报考人数数百万考生在院校查询、科目规划、资料获取、时间管理等方面都存在真实需求系统做出来不是“空中楼阁”而是有明确的用户场景。其次从技术角度看SpringBoot是目前Java后端开发的事实标准企业级项目几乎都在用把这个框架吃透对后续找工作也是直接加分项。最后这个题目的功能边界可以灵活伸缩——基础版可以做资讯展示加后台管理进阶版可以加入志愿推荐、学习打卡、在线交流等模块完全可以按自己的能力和时间预算来设计不会出现“开头很宏大、结尾只能PPT”的尴尬。我见过太多同学把毕业论文写成“项目说明书”整篇都在罗列功能菜单没有任何技术深度。而这个题目的巧妙之处在于它的名字里已经隐含了三层价值SpringBoot代表的是技术栈的规范性与工程能力一站式代表的是业务聚合与流程设计能力考研平台代表的是对真实用户需求的理解能力。把这三点讲清楚论文的骨架自然就立起来了。适合什么样的人做这个题目如果你是Java基础尚可、用过SpringBoot写过增删改查、但还没有完整独立开发过一个前后端分离项目的同学这个题目的难度曲线非常友好。它不会像秒杀系统、分布式中间件那样需要深厚的底层知识但也绝不是那种“一个SSM框架写到底”的老掉牙项目。同时如果你对教育类产品有兴趣想通过毕业设计积累一些产品设计经验这个题目也能给你足够大的发挥空间。2. 系统定位与核心模块规划2.1 角色权限与核心业务流程设计在动手写代码之前一定要先把“这个平台到底服务谁、每个人进来能干什么”这件事想清楚。考研平台不是BBS也不是简单的资讯站它需要承担信息聚合、流程引导和学习管理三类职责所以我把系统的角色划分为五类游客、注册考生、院校管理员、平台运营管理员和超级管理员。游客只能浏览公开资讯和院校库这是为了降低访问门槛同时也能起到引流作用。注册考生是系统的核心用户他们可以查看院校专业详情、收藏意向院校、下载备考资料、参与考研问答讨论、管理自己的备考日程。院校管理员在系统中承担的是“信息提供者”角色负责维护本校的招生简章、专业目录和历年分数线这些信息经过运营审核后才会公开展示。平台运营管理员负责整个内容生态的运转包括资讯发布、资料审核、问答管理和用户举报处理。超级管理员则管理所有后台账号和系统配置。这个设计中有一个容易被忽视但很重要的点内容必须经过审核才能展示。考研信息关系到考生的决策如果任何人都能随意发布院校数据系统很快就会充斥着错误甚至虚假信息。在论文里这部分可以写成“基于状态机的内容审核流程”具体来说就是每条院校信息或资料都经历“草稿→待审核→已发布→已下架”的状态流转每一次状态变更都会记录操作人、操作时间和审核意见。这样一个看似简单的设计既保证了数据的可信度也丰富了论文的流程设计内容。核心业务流程方面我把用户的成长路径梳理为四条注册登录→完善个人信息→浏览/搜索院校→收藏意向院校→查看备考指南→制定学习日程这是一条信息获取链路提问→其他用户回答→采纳最佳答案是一条社区互动链路管理员发布资讯→内容审核→用户端展示是一条内容运营链路用户上报进度→系统生成周报→调整学习计划是一条个性化服务链路。能画出这四条链路导师一眼就能看出你对系统是有整体把握的而不是把功能堆在一起就完事。2.2 功能清单与优先级取舍很多同学在做功能规划时容易犯“贪多”的毛病觉得功能越多显得系统越强大。实际做毕业设计功能数量不是第一位的功能的完整性、逻辑的自洽性才能真正体现实力。在时间有限的情况下我建议把功能分成三个梯队第一梯队是核心必备功能包括用户注册登录含验证码、权限拦截、院校库的浏览与条件检索按地区、层次、学科门类筛选、院校详情页含专业目录、历年分数线、个人中心的收藏与足迹、后台的院校信息管理和资讯发布管理。这些功能构成了平台的骨架任何一个都不能少。第二梯队是加分功能包括考研问答社区发帖、回帖、采纳、备考资料管理上传、下载、积分制访问、学习日程管理打卡、进度跟踪、志愿智能推荐基于个人情况和录取数据进行匹配。这些功能可以显著提升平台的“一站式”属性直接对应论文中的特色亮点。第三梯队是锦上添花的功能比如站内信通知、数据可视化报表用ECharts展示各专业报考趋势、访客统计、操作日志审计。这些功能实现起来不算复杂但放在论文里非常好看尤其是数据可视化一张折线图比一千字描述更能让答辩老师直观地看到系统的效果。我特别想提醒的是做功能取舍时要有一个原则每个功能都必须能讲出一个“为什么需要它”的故事。比如志愿推荐模块你可以说是为了帮助考生在海量院校中快速定位适合自己的目标。如果只是机械地复制其他系统的功能答辩时一问“你这个功能解决了什么问题”答不上来就很容易露出破绽。3. 技术栈选型与架构设计3.1 后端为什么选SpringBoot MyBatis-Plus既然题目明确要求基于SpringBoot那后端主框架没有太多悬念。SpringBoot最大的价值在于“约定优于配置”它把繁琐的XML配置大幅简化让开发者能够快速构建独立运行的Spring应用。在毕业设计中这意味着你可以把主要精力放在业务逻辑上而不是纠结于配置文件写错一个属性导致整个项目启动失败。对于本科生来说这无疑是最合适的选择。持久层框架我推荐MyBatis-Plus而非原生MyBatis或JPA理由是它结合了MyBatis的灵活SQL控制与Plus的便捷CRUD能力。MyBatis-Plus提供内置的通用Mapper单表操作不需要手写SQL分页插件可以直接通过配置启用代码生成器能够一键生成实体类、Mapper、Service、Controller的整套代码。这个东西在真实项目中几乎已经成了标配毕业设计里用上它写论文时在“技术选型理由”这一节会非常充实而且答辩时评委基本不会为难你——因为这就是目前行业里最主流的组合。数据库选型上MySQL依然是这个体量项目的最优解。它部署简单、资料丰富、遇到问题网上一搜就有答案。另外要注意的是字符集一定要设置成utf8mb4而不是utf8因为utf8mb4才能完整支持生僻汉字和Emoji表情否则用户在问答区发一个表情符号整条数据就可能插入失败。表引擎选择InnoDB因为它支持事务和外键约束适合考研平台这种需要保证数据一致性的场景。3.2 前端选Vue Element UI的理由前端框架这里我推荐Vue 2结合Element UI而不是赶时髦用Vue 3。不是说Vue 3不好而是考虑到毕业设计项目的时间约束和生态成熟度。Vue 2的教程数量最多、面试时被问到的概率也大Element UI的组件风格非常符合后台管理系统的使用习惯表格、表单、分页、弹窗这些高频组件开箱即用并且已经经过大量项目的验证稳定可靠。前端项目我建议采用vue-element-admin作为基础模板。这套开源后台管理框架提供了登录鉴权、动态路由、权限指令、标签页视图等完整的后台方案可以在它的基础上进行二次开发。很多同学担心用开源模板会不会被判定为抄袭实际上只要你在代码中清晰地标注了哪些部分是自定义的业务代码哪些是基于开源框架的封装答辩时诚实说明这是基于成熟模板的二次开发这反而是工程化能力的体现——真实企业中没有人会从零手写一套后台脚手架。前后端交互我统一采用RESTful API风格通过Axios发送异步请求。数据格式约定为统一的JSON结构包含响应码code、提示消息msg和数据体data三个字段。前端通过拦截器统一处理Token过期和业务异常后端通过全局异常处理器返回标准格式的报错信息。这套机制虽然简单但能让整个前后端联调过程清爽很多避免了“前端拿到一堆看不懂的错误信息”的混乱局面。3.3 环境搭建与项目初始化开发环境方面给出我的参考配置操作系统Windows 10或11JDK使用1.8版本千万不要用17以上很多依赖和插件对高版本JDK支持存在兼容性问题Maven 3.6及以上Node.js 14以上MySQL 5.7或8.0IDE选择IntelliJ IDEA社区版或Ultimate版均可。后端项目初始化时需要注意一个关键操作SpringBoot版本不要盲目选择最新版。网上很多教程会默认引导你选择最新版本但新版框架对JDK版本的要求可能已经发生了变化导致项目创建成功却启动失败。建议在Spring Initializr上选择2.7.x这个版本线它非常成熟稳定市面上绝大多数第三方集成方案都能兼容。创建时勾选Web、MyBatis、MySQL Driver、Lombok这几个依赖后续再根据需求手动添加Redis、JWT等依赖。前端项目的初始化相对简单把vue-element-admin下载到本地后建议先花一天时间浏览它的目录结构和核心代码搞清楚路由守卫、权限判断和请求封装是怎么工作的再动手改造。盲目直接删代码会留下很多隐患比如删了权限模块但路由表里还残留着权限字段运行时就会出现页面空白这类诡异问题。我第一次做这类项目时就踩过这个坑所以在浏览器上看到白屏不要慌张打开控制台看报错信息逐个解决就好。4. 数据库设计与核心表结构解析4.1 核心表设计思路数据库设计是整个项目中真正见功力的环节也是论文中必须重点展开的部分。一个设计良好的数据库结构能够直接体现出你对业务的理解深度。我把考研平台的表结构划分为五大块用户体系、院校内容体系、学习管理体系和互动体系、系统支撑体系下面逐个讲核心表的用途和关键字段。用户体系的核心是用户表user除了常规的用户名、密码、昵称、手机号、邮箱、头像字段外我额外增加了“考研年份”和“目标院校ID”字段。可能有人问这个有什么用用处大了这是实现个性化功能的数据基座。比如系统可以根据用户的考研年份自动推算备考阶段在首页展示不同的引导内容可以根据目标院校ID推送该校的最新招生动态。这些细节功能虽然微不足道但在论文的“系统特色”章节写出来就是“以用户为中心的设计”。院校内容体系是业务的重心。院校表college需要存储学校名称、学校代码、所在省份、城市、院校层次985/211/双一流/普通本科、办学类型综合/理工/师范等、官网地址、学校简介等。专业表major存储专业名称、专业代码、所属学科门类、考试科目组合。分数线表涉及的关键字段包括年份、专业ID、复试线、录取最低分、录取最高分、报考人数、录取人数。我强烈建议把分数线数据做成独立表而不是直接挂在专业表里因为分数线是按年份不断累积的数据如果直接塞在专业表里每年更新都要改动主表逻辑上非常混乱。学习管理体系包括备考资料表resource、学习日程表study_plan和打卡记录表study_checkin。资料表需要设计下载次数和被收藏次数这两个字段用于后续实现热门资料排名。日程表除了基本的计划标题和日期外还要设计完成状态和进度百分比字段这样用户就能直观地看到当日的备考任务是否完成。互动体系包括考研问答表question、回答表answer和评论表comment。问答表的关键在于状态字段——待回答、已解决、已关闭这个状态驱动着社区运营策略比如运营人员可以定期处理“待回答”超过3天的问题保证平台互动率。另外这里隐藏着一个重要的数据库设计考点逻辑删除字段deleted用户如果在社区发表敏感内容管理员执行的是逻辑删除而不是物理删除既保留证据链又避免误删恢复不了的情况。系统支撑体系包含管理员表admin、角色表role、菜单权限表menu和操作日志表operate_log采用标准的RBAC权限模型。操作日志表需要记录操作用户、操作类型、操作内容、IP地址、操作时间这块数据在论文中可以作为“系统安全性设计”章节的有力支撑材料。4.2 索引设计与数据关联经验数据库表设计好之后索引设计是影响查询性能的关键。对于这个体量的系统不需要像我之前做电商平台那样设计复杂的索引策略只需要遵循几个基本规则即可。主键一律使用自增ID不要在业务上使用UUID等字符串做主键因为自增主键在InnoDB索引结构中插入性能更好存储空间更小。外键字段必须建立索引比如院校专业表里的college_id和major_id因为外键字段是高频查询条件没有索引会走全表扫描。经常作为查询条件的字段建议建立普通索引比如院校表的province_id和level字段用户筛选院校时经常按这两个维度进行组合查询。在表关联方面我建议复杂业务尽量用单表查询加内存组装的方式而不是写多表关联的大SQL。因为MyBatis-Plus对多表关联支持不算友好而且一旦涉及分页和条件筛选大SQL的可读性和可维护性会迅速下降。以院校详情页为例我先查出院校基本信息再分别查专业列表、分数线列表、热度数据最后在Service层组装成一个VO返回给前端。这种做法虽然在效率上不是最优但代码结构非常清晰排错也容易。针对于毕业设计的评委老师他们更看重的是你能否把逻辑讲清楚而不是极致性能。数据库访问层有一个实践细节容易踩坑全局异常中要统一处理数据库操作异常否则当用户重复收藏同一所院校时如果唯一约束没有预判好前端会收到500错误码用户看到的是“系统异常”体验就很差。后来我在收藏表里建了user_id, college_id唯一索引并在Service层先判断是否已存在再决定新增还是提示“已经收藏过了”这样既保护了数据一致性也让交互更友好。5. 核心业务实现与难点攻坚5.1 登录认证与权限控制的完整实现方案登录认证是每个系统的门面也是答辩时评委大概率会问的地方。我不建议用传统的Session方案而是采用当前业界主流的JWT 拦截器的无状态认证方案。JWTJSON Web Token将用户身份信息加密签名后返回给前端前端在请求头中携带这个Token后端通过拦截器统一验证。这样做的好处是服务器不需要保存会话状态天然支持前后端分离架构也方便后续做横向扩展。具体实现分为几个步骤用户登录成功后后端生成一个有效期设为2小时的JWT包含用户ID、角色标识和过期时间。前端将Token存入localStorage并在Axios请求拦截器中把Token加到Authorization头。后端自定义一个拦截器在请求处理前校验Token的合法性和时效性校验通过后将当前用户信息存入ThreadLocal这样Controller中任何地方都可以方便地取出当前用户。对于管理员接口可以额外加一层自定义注解进行角色权限校验比如标注需要“ROLE_ADMIN”权限的接口就只允许管理员访问。核心代码示意如下Component public class JwtInterceptor implements HandlerInterceptor { Autowired private StringRedisTemplate redisTemplate; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (OPTIONS.equals(request.getMethod())) { return true; } String token request.getHeader(Authorization); if (StringUtils.hasText(token) token.startsWith(Bearer )) { token token.substring(7); } try { Claims claims JwtUtil.parseToken(token); Integer userId claims.get(userId, Integer.class); // 检查版本控制与单点登录状态 String cacheKey login:token: userId; Boolean isValid redisTemplate.hasKey(cacheKey); if (isValid ! null isValid) { UserContext.setUserId(userId); UserContext.setRole(claims.get(role, String.class)); return true; } } catch (Exception e) { log.warn(token校验失败{}, e.getMessage()); } response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } }特别注意JWT的密钥必须写在配置文件中而不是硬编码到代码里答辩时如果对这个设计进行提问这就是一个加分的亮点。另外使用JWT进行身份认证时一定想好登出和Token作废的策略。我在这个项目中引入了Redis来维护有效Token的Key用户退出时直接删除Key达到“立即作废”的效果。如果没有这一层设计JWT在有效期内始终是有效的用户点了退出但Token还能继续用这在答辩中是很容易被追问的安全漏洞。5.2 志愿推荐模块的算法简化与落地志愿推荐模块是系统最亮眼的特色功能也是写论文时最能体现“技术含量”的部分。这个模块不需要做得很复杂但要逻辑严谨、可解释性强。我采用的是基于加权评分的多维度匹配算法核心原理是提取考生的分数、地区偏好和专业偏好与院校的录取数据进行匹配打分按得分排序输出推荐列表。算法的关键参数计算方法如下把“分数匹配度”设为基础权重0.5即如果考生的预估分数比该院校近三年平均录取线高出10%左右则分数匹配度接近满分“地区意愿匹配度”占0.3考生选择省份偏好的则给高分没有明确偏好就给中性分“院校层次匹配度”占0.2考生可选择“冲一冲”较高层次院校、“稳一稳”匹配层次院校、“保一保”较低层次院校三个梯度对应不同的权重调整。这里我不建议用基于机器学习的协同过滤算法因为毕业设计的数据量根本训练不出来而且算法原理过于复杂答辩时如果对细节做深入追问解释不清容易翻车。加权评分方案的优点是逻辑透明、代码简洁导师问起实现思路时能够清晰自然地讲明白。同时它在论文中也能形成一个完整的“算法设计”章节配上公式推导和效果展示数据整体档次就上去了。实现时有一个细节值得关注如果直接在Service层用代码循环遍历所有院校进行计算在两三万条院校数据量的情况下会产生性能瓶颈。我用Redis做了一层缓存优化把院校的静态度量指标录取线、层次值、地区值提前加载到内存中匹配计算时只做纯内存运算即使全量数据参与计算也能在两秒内返回结果。5.3 备考日程打卡与进度追踪的实现细节学习日程管理模块的难点不在CRUD而在于时间维度的业务逻辑处理。用户创建一个“数学强化阶段计划”周期是7月1日到8月15日每天需要完成2小时学习任务。系统应该在计划激活后自动生成每一天对应的子任务记录用户可以逐天打卡。实现上我采用“主表-明细表”的设计模式。主表保存计划的主题、开始日期、结束日期和整体状态明细表保存每一天的执行记录。创建计划时通过程序批量生成明细记录而不是等到用户打卡时才临时创建这样用户可以直观地看到未来每一天的任务安排同时能统计整体计划的完成率。这个逻辑在代码中要注意的是批量生成时的时间跨度控制和闰年处理写一个时间工具类来处理日期加减和月份判断。打卡界面的交互设计同样值得思考。我采用的是日历视图用户在日历上点击某一天弹出当日任务详情点击“完成打卡”按钮即可。日历视图的实现可以用Vue的第三方日历组件或手写一个简易版。这个功能虽然代码量不大但在论文和答辩演示中非常出彩——一个带有连续打卡热力图的日历视图直观地展示了学生的备考节奏和坚持程度远比展示一堆后台表格有说服力。5.4 文件上传与内容审核的实现方案考研平台的资料模块需要支持用户上传PDF、Word和图片文件这里涉及文件存储方案的选择。我把文件存储设计为本地磁盘存储并配合数据库记录文件元信息。在配置文件中指定上传根目录按日期分目录存储文件名采用UUID重命名以避免冲突同时保留原文件扩展名。上传完成后文件表会记录存储路径、访问URL、文件大小、上传者和上传时间。有人可能会问为什么不使用OSS或MinIO说实话对于毕业设计的体量本地存储已经足够还能减少部署复杂度。但如果你学有余力引入MinIO搭建对象存储也是很好的加分项。MinIO是一款开源的对象存储服务提供与OSS兼容的API部署在本地非常方便。可以做成“先传MinIO再存路径到MySQL”的架构这样论文中就能多出一个“分布式文件存储设计与实现”的小节技术广度自然就上去了。当然如果选择这个方案答辩前一定要反复测试上传、下载和访问的全链路避免在演示时当场翻车。资料审核流程同样要走状态机用户上传资料后文件状态为“待审核”运营管理员审核通过后状态变为“已发布”此时其他用户才能看到并下载。审核不通过的记录会记录驳回原因。如果资料包含敏感内容管理员还可以直接执行物理删除或逻辑删除。这里我遇到过一个细节问题文件上传完成后要判断文件类型是否匹配扩展名比如扩展名为PDF的文件内容也必须是以%PDF-开头否则会被嵌入恶意代码。用文件头校验代替扩展名校验既能提升安全性也能在答辩时展示“我是考虑过安全问题的”。6. 论文写作结构与答辩准备要点6.1 论文结构各章节写什么、怎么写很多同学写论文时最头疼的就是“不知道每章该写多少内容”。我建议采用经典的五章结构并严格控制每章之间的篇幅平衡。第一章绪论约占全文10%交代研究背景、国内外现状、研究内容和意义。这里一定要结合考研行业的真实数据来写比如报考人数的增长趋势、考生对信息获取渠道的核心痛点从问题切入引出系统开发的必要性。第二章相关技术介绍约占15%逐一介绍SpringBoot、MyBatis-Plus、Vue、MySQL、Redis等核心技术的选型理由。不要长篇大论抄官方文档每项技术用一小段讲清“它是什么、它解决什么问题、我为什么选它”就够了。第三章系统分析约占15%包括可行性分析、功能需求分析、用例分析和数据流图。这部分强烈建议用画图工具把用例图、流程图、数据流图画清楚图文并茂的论文在评阅老师那里的印象分会高很多。第四章系统设计约占25%是论文的绝对重心包括总体架构图、功能模块设计、数据库E-R图、核心表结构设计。每张表都要附上字段说明表格确保读者能够只看论文就能还原出系统的数据结构。第五章系统实现与测试约占35%这是工作量最有体现的部分。按功能模块逐个展开每个模块配核心代码片段和运行截图。测试部分要包含功能测试用例表明确写出测试步骤、预期结果和实际结果。最后一章总结与展望提炼做这个项目的收获与不足给出后续优化方向。注意用词一定要谦虚写实不要夸张吹大。写论文最忌讳的就是“抄模板”现在各高校评审对查重控制极严。我不建议直接套用网上某篇同题的论文。更好的做法是学习多篇论文的写法和结构结合你自己项目的真实细节组织语言。特别是有实际运行效果的代码和截图这是绝对原创的内容也可以有效降低文字重复率。6.2 答辩演示与讲解策略答辩演示环节是决定最终成绩印象分的关键因素之一。强烈建议准备两套演示路径一套是完整流程约8分钟展示核心业务流程另一套是快速演示约3分钟只跑亮点功能。正式演示时用完整流程如果评委时间紧张就切换快速路径。千万不能让演示变成“开浏览器操作一遍”那么敷衍。演示时有一个顺序值得遵循先展示系统登录和权限拦截的效果比如未登录时访问后台接口被拦截这样技术感就出来了接着演示核心业务比如院校检索——筛选条件组合查询、院校详情展示、收藏操作然后演示特色功能比如志愿推荐输入分数和个人偏好给出结果后的计算过程可视化展示最后演示后台管理展示数据统计报表和审核流程。这样整套演示呈现出“从前端到后端、从用户到管理员、从基础功能到特色功能”的完整逻辑链条评委跟着你的思路走很少会中途打断挑毛病。被评审追问的高频问题也提前消化掉“为什么用JWT而不用Session”你可以回答JWT天然适合前后端分离服务器无状态并且配合Redis解决了主动失效的问题“为什么推荐算法不用机器学习”可以回答当前系统更看重结果可解释性和数据可获取性加权评分在样本量有限的情况下效果更稳定同时复杂度可控“系统的安全性体现在哪些方面”从MD5加盐存储、JWT过期校验、XSS过滤、SQL注入防护、文件类型白名单五个角度作答。这些问题是可以在论文写作阶段就预设好的提前准备好答案答辩时从容程度完全不一样。7. 常见问题与避坑经验总结7.1 开发过程中的高频踩坑记录这个项目我从搭建到完成大概花了三周时间过程中踩过不少坑把最有价值的几个经验分享出来。坑一SpringBoot版本选择不当导致项目启动失败。第一次搭建时图新鲜选择了最新的SpringBoot 3.x结果发现很多网上教程的依赖写法都不兼容MyBatis-Plus和部分工具类的API发生了重大变化搞了一整天连数据库连接都没通。后来切回2.7.x版本问题随即消失。我的建议是毕业设计一律使用2.7.x虽然不算最新但它“恰好够用”不会让新手困在版本适配的环境地狱里。坑二前端联调阶段遇到跨域问题。后端接口运行在localhost:8080前端运行在localhost:9528浏览器出于同源策略拒绝跨域请求。解决办法是在后端配置全局CORS跨域过滤器放行前端地址并允许携带凭证。这个配置要放在项目启动配置阶段完成否则前端所有请求都会报错。注意CORS放行时要限制具体来源而不是使用通配符*否则无法携带Authorization头完成JWT认证。坑三使用Lombok时实体类的坑。我在实体类上使用了Data注解但在一个地方需要自定义某字段的序列化格式直接写了一个getXxx方法后发现Both get方法和Lombok生成的get方法冲突了编译直接报错。解决办法是不要混用手动getter和Lombok自动生成的getter要么统一用Lombok要么统一手写不要对同一个字段同时使用两种方式。坑四分页查询在MyBatis-Plus中的配置。如果没有配置分页插件调用Page对象做查询时你会发现查出来的总数total始终为0。这在一开始浪费了我不少时间排查。只要在配置类中注册一个MybatisPlusInterceptor并添加PaginationInnerInterceptor这个内置拦截器就行这个问题是每个新手几乎都会遇到的。坑五数据库连接参数没写好导致中文乱码。连接串末尾没有加characterEncodingutf8参数导致入库的中文全部变成问号。在后端代码中写入数据后从MySQL客户端看数据全是问号排查了一下午才发现是连接串的问题。这种基础型问题在答辩时越早发现越好否则演示现场展示的数据全是乱码就非常被动。7.2 项目部署与演示环境的准备建议毕业设计评审和答辩通常需要现场演示系统环境准备不充分导致现场事故的例子每年都很多。这里给出我验证过的一套稳妥方案。开发环境完成后我建议至少在答辩前一周准备一套独立的演示环境。数据库使用MySQL 5.7JDK使用1.8Redis使用Windows版本的压缩包直接解压运行。整个部署过程可以是“前端打包成静态文件交给后端托管后端直接使用内嵌Tomcat启动”也就是说一个SpringBoot应用即可承载前端资源和后端API的全部内容。这样做的好处是演示时只需要启动Java进程不需要额外启动前端开发服务器大大降低了演示环境的复杂度。部署命令也很简单在前端项目根目录执行npm run build生成dist目录下的静态文件将文件复制到后端项目的src/main/resources/static目录下然后执行mvn clean package打出jar包。最后使用java -jar命令启动即可。如果要调整端口在application.yml中修改server.port即可否则默认就是8080端口。如果考虑到现场网络不稳定完整保留一套本地运行的配置至关重要。所有系统依赖全部放在本地不要依赖云端任何服务。比如验证码、文件存储等都要保证不连接外网也能正常运行。这一点务必提前测试因为很多院校答辩教室的网络环境并不稳定如果系统必须联网才能跑起来风险就太大了。另外数据库初始化脚本要写清楚版本变更情况。准备一份完整的init.sql包含建库建表和基础测试数据并且在实际环境完整跑一遍。我有一个习惯是每改一次表结构就追加一个migration.sql脚本确保任何时间点都能从零重建完整数据库环境。这在答辩前尤为重要因为万一样例数据被某位老师误删了从零重建只需要一分钟就能恢复。最后还有个锦上添花的建议录制一个3分钟的系统演示视频放在本地作为Plan B。万一现场电脑出现投影故障、系统闪退等不可控因素直接播放录播视频然后配合PPT继续讲解保住答辩流程不中断。这些都是经历过翻车的人才懂得的保命技巧。