ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringBoot智慧化教学辅助系统开发实战:从需求拆解到毕业设计避坑

SpringBoot智慧化教学辅助系统开发实战:从需求拆解到毕业设计避坑 1. 项目到底要做什么先别急着写代码把需求拆开嚼碎SpringBoot智慧化教学辅助系统这个题目说穿了就是给学校或者培训机构做一套教学全流程数字化管理平台。很多同学一看到智慧化智能化这种词就发怵觉得是不是要上人工智能、机器学习那一套。其实绝大多数毕业设计题目里的智慧化落地下来就是数据分析辅助决策不是真正的AI算法。你只要把学生的过程性数据采集全、把评价维度设计得合理、把排名和预警做得直观就已经远超同期平均水平了。我当年带过的毕业生里凡是系统做得像样的第一步都不是打开IDEA新建项目而是把需求文档写到能回答三个问题谁在用用他干什么痛点是什么这个系统无非三类用户管理员、教师、学生。管理员管人管课管权限教师管班级管作业管成绩学生看课表看成绩看排行。痛点也很清晰——线下教学的成绩统计靠Excel来回传过程性评价没法落地期末总评时教师翻聊天记录翻到崩溃。所以你看把这个场景翻译成技术语言系统的核心就变成了多角色权限控制 课程班级数据建模 作业考试流程管理 可配置的评价计算引擎。下面我把这个项目的需求拆解、技术选型、核心实现、评价算法设计、避坑经验一条条讲透。建议不管你是不是用SpringBoot做同类教学管理系统的都先把这篇文章的思路过一遍比瞎写代码强十倍。1.1 教学辅助系统不是学生管理系统的换皮很多同学拿到题目第一反应是去GitHub上找一个学生管理系统改改。这里我要直接泼冷水如果只是把学籍管理、课程管理、成绩CRUD拼在一起你的答辩大概率会被老师一句话问住——这套系统的业务闭环在哪里说一个最常见的翻车场景。学生管理系统的成绩模块本质是一个成绩登记表老师录分、学生查分完事了。但教学辅助系统不一样它的核心是辅助教学过程不是记录教学结果。你得想清楚老师布置作业之后学生怎么提交提交之后老师怎么批改平时分怎么根据多次作业、考勤、课堂表现自动算出来期末总评怎么把平时分和考试成绩按比例合成这些环节串起来才叫智慧化。我自己在做类似项目时习惯用用户故事来梳理需求。比如教师角色作为教师我创建课程后可以批量导入学生这样不用一个个录入。作为教师我发布一次作业系统自动提醒所有选课学生。作为教师我批改完作业后系统自动更新该生的过程性评价记录。作为教师我可以在期末一键生成总评成绩而不是拿着Excel做VLOOKUP。学生角色也一样作为学生我登录后能看见所有课程的待办任务。作为学生我提交作业后能实时看到批改状态和得分。作为学生我能看到自己在班级里的综合排名和各项能力雷达图。把这些故事列出来系统边界就清楚了。你不需要做直播课堂、不需要做AI题库生成、不需要做智能阅卷——那些是另一个量级的项目。教学辅助系统的智慧化体现在对数据的整合、计算与可视化这就够了。1.2 三类用户的真实痛点就是你的需求清单把用户故事再往下挖一层每个角色背后的痛点-方案对应关系会直接决定你的数据库表设计和接口设计。先看管理员。管理员的痛点是账号、课程、基础数据的维护效率。一个高校可能有几百个教师、上万个学生靠命令行或者直接改数据库不现实。所以管理员端必须提供批量导入Excel上传解析、账号启用禁用、教师与课程的关系绑定、系统参数配置比如总评成绩的默认比例。这个模块不复杂但Excel导入导出是一个隐藏重点几乎每个答辩评委都会问数据怎么初始化。再看教师。教师是使用频率最高的角色也是最容易抱怨系统难用的角色。教师端的功能可以分为授课前、授课中、授课后三个阶段授课前创建课程、导入学生名单、发布教学大纲授课中发布作业、发起课堂签到、记录课堂表现授课后批改作业、录入考试成绩、查看教学分析报表。这里有一个很关键的体验细节教师批量批改的流程要顺。比如一个班40人20个人交了Word文档教师如果一次只能看一个人的点40次下一个那这系统他第三次就不想用了。所以批量下载、批量判分、快速给评语这些交互细节要做扎实。学生端的痛点则是信息分散。今天老师在微信群发作业明天在邮箱收作业后天在群里发成绩单。你的系统要把这些收拢到一个地方今日待办、历史作业、成绩单、课程公告、排名曲线。学生不关心系统后端有多复杂他们只关心我今天要做什么这个问题能不能一眼看到答案。所以学生端首页的待办聚合接口是开发优先级最高的接口之一。1.3 功能边界怎么划先把不做想清楚做毕业设计最容易犯的错误就是需求无限膨胀。今天想加一个在线聊天明天想加一个直播功能后天想加一个自动出题。我直接给你一个建议凡是需要额外部署独立服务、需要引入重型中间件、需要大量人工标注数据的功能全部砍掉。原因很实在——你只有几个月时间还要写论文、准备答辩不是做一个商用的产品。以我个人的经验推荐圈定这样的功能边界做多角色登录与权限管理、班级与课程管理、作业发布/提交/批改、考试管理成绩录入方式即可不做在线考试答题、签到考勤、成绩过程性评价、个人排名与趋势图、数据看板、Excel导入导出。不做在线直播、即时聊天、AI自动阅卷、复杂推荐算法、微服务拆分、消息队列。这套功能做完已经是一个完整度很高、业务闭环清晰的教学平台了。更重要的是每个功能模块都能在论文里对应上一个需求分析-设计-实现-测试的章节答辩的时候你有得讲不会被问倒。2. 技术选型分析为什么SpringBoot是毕业设计的最优解技术选型这一节我说点掏心窝的话。SpringBoot不是所有场景的最优解但在毕业设计这个场景它几乎是唯一解。原因有三条第一市面上资料最多遇到问题搜得到答案第二面试官和答辩老师对这个框架的认可度极高它代表你掌握了企业级开发的基本能力第三生态太成熟了从权限框架到Excel处理全都有封装好的库开发效率吊打手写Servlet那一套。但选SpringBoot和会用SpringBoot是两回事。很多同学的SpringBoot项目就是把Controller加Service加Mapper套进去对自动配置、Starter机制、Bean生命周期一问三不知。如果深度不够答辩时老师一句SpringBoot为什么能自动配置就能把你问住。所以这篇博文的后半部分我会把SpringBoot的核心机制和这个项目的结合点讲透。2.1 SpringBoot到底帮你省了什么自动配置、Starter、内嵌容器先解决一个最基础的问题SpringBoot相对传统SSMSpring SpringMVC MyBatis到底省了什么省的是三件麻烦事繁琐的XML配置、Web容器部署、依赖版本冲突。传统SSM项目你得写web.xml、spring-mvc.xml、spring-mybatis.xml还要配置数据源、事务管理器、视图解析器……一套下来配置文件几百行。SpringBoot用**自动配置AutoConfiguration**把这个过程简化了。核心原理是SpringBoot的jar包里有一个spring.factories文件里面列了一堆XxxAutoConfiguration类。程序启动时SpringApplication会通过EnableAutoConfiguration注解去加载这些配置类再根据你项目里引入了什么依赖比如引入了spring-boot-starter-web就自动配置DispatcherServlet按条件装配Bean。这就是约定大于配置的底层逻辑。再就是Starter机制。你只需要引入一个spring-boot-starter-web它就会把SpringMVC、Jackson、Tomcat相关的依赖全部传递引入。做这个教学系统我推荐的Starter组合如下用途Starter/依赖说明Web基础spring-boot-starter-web含内嵌Tomcat、SpringMVC数据持久层mybatis-plus-boot-starterMyBatis增强版单表CRUD不用写SQL数据库驱动mysql-connector-jMySQL 8.x驱动缓存spring-boot-starter-data-redis用于验证码、高频查询缓存认证授权spring-boot-starter-security / JWT二选一推荐JWT方案参数校验spring-boot-starter-validation注解式字段校验Excel处理easyexcel阿里出品导入导出神器接口文档knife4j基于Swagger的美化文档还有内嵌容器。SpringBoot的Web应用打成一个jar包直接用java -jar就能跑因为Tomcat被内嵌在依赖里了。这省掉了部署War包到外部Tomcat的步骤也意味着你演示项目时只需要一个能跑Java的环境不用装完整Tomcat。说到这里顺便提醒一句spring-boot-maven-plugin的打包配置不要删删了你打出来的jar包就跑不起来了这个坑我见太多次了。2.2 毕业设计场景下的技术组合一套打满分的搭配方案介绍完SpringBoot本身下面把这套系统整体的技术组合列一下。我推荐的方案是SpringBoot 2.7 MyBatis-Plus MySQL 8.0 Redis Vue 3 Element Plus ECharts。后端选MyBatis-Plus是因为它的BaseMapper内置了insert、selectById、updateById、deleteById这些单表方法简单的CRUD你连SQL都不用写。复杂的多表关联查询比如查某个学生的成绩汇总再用Select注解或XML写自定义SQL。MyBatis-Plus还带分页插件配合Page对象分页接口10分钟搞定。有同学担心用了MyBatis-Plus会不会显得技术含量低其实不会现在企业里大量项目也用MyBatis-PlusCRUD用现成方法、复杂SQL手写恰恰是工程化的正确姿势。Redis在这里的用法要克制。别什么数据都往Redis里扔毕业设计场景下我建议只有三个地方用Redis图形验证码5分钟过期、登录Token的token-blacklist实现退出登录、学生首页的待办聚合缓存30秒失效。其他数据直接查MySQL就行避免引入缓存一致性这个无底洞。前端选Vue 3 Element Plus是出于两个考虑一是Element Plus组件库颜值在线表格、表单、弹窗、上传组件都很成熟适合快速搭后台界面二是Vue 3的组合式APIComposition API写起来比Vue 2的Options API更清爽而且现在教程也多。前后端通过JSON交互后端接口先定义好ResultT统一返回结构前端用Axios封装一层request拦截器统一处理Token失效。2.3 关于SpringBoot版本踩过坑的人都懂开头你看到了热搜词里有一条是springboot版本太高这句话背后全是泪水。用我最近带项目遇到的实际情况来说如果你用的是JDK 81.8SpringBoot能用的最高版本就是2.7.x系列3.x系列硬性要求JDK 17及以上。有些同学图新把SpringBoot 3.2或者3.3建出来发现JDK版本对不上项目启动直接报错或者数据库驱动配置方式都变了——因为从SpringBoot 2.5开始spring.datasource.url这种配置就受到DriverClassName强制校验SpringBoot 3.x更是全面把javax.*换成了jakarta.*网上老教程的代码几乎全部失效。这不是说SpringBoot 3.x不好而是你的毕业设计不要在这里多花时间。选一个资料最多、自己最熟的组合才是王道。我自己的推荐是JDK 8 SpringBoot 2.7.18 Maven 3.8.x这组合稳定、教程多、跟主流网课对得上。另外Maven的镜像源一定要配置阿里的不然下载依赖能把你急死。改的是~/.m2/settings.xml加一个mirror节点mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror3. 核心功能模块从登录到评价每个模块怎么落地进入实操环节。这一节我会把系统里必须做好的核心模块逐个拆开讲包括表结构设计、接口逻辑、注意事项。这是全文最长的部分也是最值钱的部分。3.1 用户模块三套角色一套权限JWT不做成玩具用户模块是系统的地基。我的建议是一张sys_user表解决所有登录账号不要分什么student表、teacher表、admin表。三种角色的公共字段手机号、密码、状态都放在sys_user里再通过role字段区分角色通过关联表把教师关联到具体课程、把学生关联到具体班级。表结构核心字段大概是id、username、password、nickname、avatar、role枚举ADMIN/TEACHER/STUDENT、status启用/禁用、create_time、update_time。密码存储直接用BCrypt加密。Spring Security里的BCryptPasswordEncoder可以单独拿出来用不引入全套Security也能实现。千万别用MD5裸存储答辩时老师看一眼就会揪住不放。登录认证方案毕业设计我首推JWT 拦截器。JWTJSON Web Token把用户ID和角色加密在Token里服务端不需要存Session天然适合前后端分离。具体流程是登录成功后用jjwt库生成一个过期时间7天的Token返回给前端前端把Token放在请求头Authorization: Bearer token里后端写一个JwtInterceptor或者HandlerInterceptor在preHandle里校验Token解析出用户信息存入ThreadLocal。这里有个关键细节Token里只放用户ID和角色不放密码等敏感信息。因为JWT的payload是Base64编码的谁都能解码只是篡改不了没有密钥。再一个细节是登录成功之后查询用户基本信息要查库不要直接信Token里的数据防止信息更新后Token不生效。退出登录功能JWT天然不支持服务端销毁解决办法是把Token加入Redis的黑名单设置和Token相同的过期时间——这也是我们在2.2节提到Redis的一个原因。3.2 课程与班级模块数据建模的关键在关联关系课程和班级是整个教学系统的核心实体。我见过很多初学设计出来的库课程表里直接塞一个teacher_name字段班级表里直接塞一个student_name字符串这种设计属于一看就没做过实际项目。正确的做法是拆分成course表课程基本信息、teacher_course表教师-课程关联、class_info表班级基本信息、student_class表学生-班级关联、course_class表课程-班级关联表示这堂课是给哪个班上的。这部分设计上有几个实际决策点一个教师可以带多门课一门课也可以由多位教师合带比如一位讲理论、一位讲实验。所以教师-课程是多对多要用关联表。一个学生只属于一个行政班但可以选多门课。如果这个系统不做选课流程只是由管理员导入那就把数据导入做成班级导入模式导入一个班级时同时把学生-班级关系、课程-班级关系建好。课程要排学期semester字段成绩和作业都要挂到学期下否则数据一多全乱套。还有一个小细节course表里建议加status例如进行中/已结课class_info表里加grade年级和major专业。这两个字段在后面的统计报表里会用到比如按专业统计平均分没有这些维度就做不了。3.3 作业与考试模块在线批改的流程怎么设计才顺手作业模块是整个系统业务流程最完整的模块。建议的表设计homework表作业基本信息、homework_submission表学生提交记录、homework_file表附件列表一对多。homework表的关键字段course_id哪个课程的作业、title、description、deadline截止时间、total_score满分、type作业类型比如课后作业/实验报告/小组作业、create_by布置教师。提交记录表是关键homework_submission表。它的核心字段homework_id、student_id、submit_time、content富文本内容、score批改分数、comment教师评语、status未提交/已提交/已批改/已退回。注意提交状态不要用有无记录来推断而是用一张表加状态字段否则学生撤回重新提交、教师退回修改这些流程就没法表达。教师批改的交互流程我的建议是教师进入作业详情页系统按班级分组显示提交情况已交/未交一目了然。未交名单要支持导出Excel方便教师发群里催。批改时支持下一个连续切换不必退回列表重新点。分数录入后系统实时提示该生平时成绩更新为X分。考试模块如果做在线考试复杂度会高很多——要处理试题库、随机组卷、计时交卷、自动判分工作量直接翻倍。对于教学辅助系统我建议把考试模块简化为教师录入考试成绩支持模板Excel导入学生查询成绩。这比做在线考试系统省事但业务完整性不受影响。当然如果你的毕设题目明确写了在线考试那另说。3.4 成绩与评价模块把平时分变成可计算的指标成绩评价模块是实现智慧化这个点题功能的地方。先明确一个规则总评成绩 平时成绩 × 比例 期末成绩 × 比例。平时成绩又由出勤、作业、课堂表现等维度加权而来。如果不做过程性记录平时分就只能靠教师拍脑袋。所以我们做的事是让平时分每一分都来自系统里的实际记录。建议设计一张evaluation_rule表评价规则配置结构是rule_id 规则ID course_id 所属课程 type 维度类型ATTENDANCE 出勤 / HOMEWORK 作业 / CLASS_PERFORMANCE 课堂表现 weight 权重总和为1 is_enabled 是否启用然后每个月或者每个教学节点系统根据已有的签到记录、作业成绩、课堂表现记录自动聚合一次平时成绩展示给教师确认。确认后写入evaluation_records表形成一条历史快照。这样教师期末打分时可以直接看到每位学生的平时成绩怎么来的有理有据也好跟学生解释。再往下走总评成绩的计算逻辑要写成一个独立的Service方法public BigDecimal calcFinalScore(Long studentId, Long courseId) { // 1. 查询该课程的总评规则平时比例、期末比例 EvaluationRule rule evaluationRuleMapper.selectByCourseId(courseId); // 2. 查询平时成绩快照 BigDecimal usualScore getUsualScore(studentId, courseId); // 3. 查询期末成绩 BigDecimal examScore getExamScore(studentId, courseId); // 4. 加权计算并保留一位小数 BigDecimal finalScore usualScore.multiply(rule.getUsualWeight()) .add(examScore.multiply(rule.getExamWeight())); return finalScore.setScale(1, RoundingMode.HALF_UP); }3.5 课堂互动模块签到、提问、表现记录课堂互动是教学过程数字化最直观的体现也是答辩时的加分项。我建议实现两个功能就够二维码签到和课堂表现打分。二维码签到逻辑教师在课程详情页点发起签到后端生成一个有效时间5分钟的签到码返回一个二维码图片可以用zxing库生成前端把它展示到投屏上。学生打开手机端小程序或网页扫二维码调用签到接口后端核验签到码有效且未过期写一条签到记录。这里有个容易被忽视的点是否限制签到位置。高校教室一般是开放环境如果做位置校验GPS定位偏差很大且容易被学生投诉定位飘了。建议不做实时定位但可以加一个简单的防代签策略学生扫码前先输入自己的学号后四位做二次校验。这个策略的代码量不大但答辩时能讲出防作弊的考量。课堂表现打分建议做成随手记的形式教师在课堂中看到一个学生回答问题很积极点一下加2分并填写一句备注。这个分数自动汇总到学生的课堂表现维度方便期末给平时分时参考。跟成绩评价模块联动起来整体就串成了一个闭环。4. 智能化评价模块别堆算法先把权重算明白智慧化三个字在评分标准里很大程度上靠评价模块撑起来。很多同学以为智能就是要上深度学习、上推荐算法这是误区。教学场景下的智慧主要体现在规则的自动化执行和数据可视化。4.1 为什么评价模块最容易沦为增删改查因为默认实现就是给成绩表做个CRUD教师手动录入学生手动查看。这种做法不是不能用但没有体现辅助两个字。你要思考一个问题教师为什么需要在系统里看到什么系统才能帮助他做出更好的教学决策我建议把这个模块拆成三个层级数据层把每一次签到、每一次作业、每一次课堂表现都沉淀为一条可追溯的记录。计算层通过评价规则引擎把原始数据聚合成过程性评价指标。展示层通过排行榜、趋势图、预警列表把计算结果直观呈现给教师和学生。4.2 评价维度与权重设计让每一项分数都有出处以一门学期的课程为例我设计过一套权重分配方案你可以直接参考评价维度权重数据来源计算方式出勤表现20%签到记录实到次数 / 应到次数 × 100作业表现50%作业提交记录各次作业得分的加权平均课堂表现30%课堂表现记录累计加分设上限100平时成绩100%上述三项加权出勤×20% 作业×50% 课堂×30%期末成绩—考试录入百分制总评成绩100%平时期末平时×50% 期末×50%这里的比例可以由每门课老师在开课时自行配置系统默认给一组合理的初始值。我把这套设计叫做四次计算一个闭环出勤分、作业分、课堂分 → 平时分 → 总评。每一步计算都在系统里留痕学生端能看到我的出勤分来自12次签到记录缺勤2次这就叫数据可解释。加权计算时要注意空值处理。如果一个学生某门课还没产生任何作业成绩计算时应该跳过该维度并按其他维度比例重新归一化而不是直接把50%的权重丢掉。不然一个缺交全部作业的学生平时分反而可能因为作业维度为空而虚高。这个坑必须填上。4.3 排行榜和标签让数据可视化成为亮点光有分数还不够直观排行榜是最容易抓住答辩老师眼球的功能。我建议实现三类排行班级单科排行榜按总评成绩排序显示排名变化较上次考核名次上升还是下降。综合能力雷达图每个学生按出勤、作业、课堂、实验、测试多个维度渲染一张五维雷达图用ECharts前端画。教师视角的班级学情图横轴是各次考核节点纵轴是班级平均分叠加显示及格率曲线。实现排行榜的SQL语句本身不复杂就是一个ORDER BY score DESC。难点在排名变化计算要拿到上一次考核的快照分数做一次差集比较。所以我在前面提到的写入evaluation_records历史快照这一步就很重要没有快照就没法对比只能实时算历史数据一改就乱。再说一个答辩小技巧你可以在演示时展示一个连续三次作业分数下滑的学生系统在他的教师端页面自动生成一条预警记录。这个预警的实现逻辑很简单-- 查出最近三次作业均低于60分的学生 SELECT student_id, COUNT(*) AS fail_times FROM evaluation_records WHERE course_id #{courseId} AND record_type HOMEWORK AND score 60 AND semester 2025-2026-1 GROUP BY student_id HAVING COUNT(*) 3;但这样一个简单查询配合预警的概念展示效果非常好能直接回答你的系统智能在哪里的问题。4.4 预警功能让数据真正动起来预警功能是评价模块的一个自然延伸也是我觉得性价比极高的功能。它不需要复杂算法就是定时任务扫描数据发现异常就生成一条消息。做成三档预警低危预警缺交作业≥2次提醒学生尽快补交。中危预警最近3次作业平均分低于60提醒学生预约教师答疑。高危预警出勤率低于70%提醒辅导员关注。实现方案有两类一是Spring自带的Scheduled定时任务每晚上凌晨跑一次二是用Quartz做更灵活的调度。毕业设计用Scheduled就够了可别在这上面引入额外复杂度。提醒的渠道建议做站内消息就好不要接短信、邮件推送。站内消息就是一张notification表查出来在页面右上角小红点展示。接短信要买服务、要审核模板纯给自己添麻烦。到时候可以跟老师讲预留了短信通知的接口生产环境接入即可这个说法既体面又不会被追问。5. 实操中的坑与排查心得我从这类项目里总结的避坑清单最后这章我把自己以及同行走过的弯路汇总一下。这些内容不是理论推演而是真实项目里一个一个踩出来的。5.1 环境搭建篇JDK、Maven、Lombok的三角关系环境问题几乎每个学生都会遇到也是私聊问得最多的。第一个是JDK版本与SpringBoot版本匹配上文已强调过JDK 8就用SpringBoot 2.7.x不要碰3.x。第二个是Lombok的坑Lombok版本需要和JDK版本匹配JDK 8下用1.18.30左右没问题但如果你环境里有个很老的JDK可能会遇到java.lang.ExceptionInInitializerError。解决办法是去Maven仓库把Lombok升到最新版并确认IDE里安装了Lombok插件。第三个是IDEA的Lombok注解处理Settings - Build - Compiler - Annotation Processors勾选Enable annotation processing不然Data生成的getter/setter全都找不到。另外推荐一下我的开发环境建议后端用IDEA前端用VS Code数据库用Navicat或者DBeaver接口调试直接用IDEA自带的HTTP Client或者Postman。顺手学一下Docker跑MySQL和Redis能在演示阶段省很多事但不要把应用本身容器化那会引入额外的不稳定因素。5.2 数据库设计篇字段类型、逻辑删除、时间字段这一节多讲几个能救命的细节。字段类型的选择要慎重。学生学号建议用VARCHAR(20)而不是BIGINT因为学号有些包含字母而且前面有0的话用数字类型会丢掉。成绩字段建议用DECIMAL(5,1)不要用FLOAT或DOUBLE因为有精度问题你存一个89.9查出来可能是89.9000000001做合计时会出幺蛾子。状态字段用TINYINT就够了不要用INT但在Java代码里用枚举去映射别让魔法数字散落各处。逻辑删除是MyBatis-Plus的默认支持。在实体类上加TableLogic注解配置logic-delete-field删除操作就自动变成UPDATE ... SET deleted 1。这个功能一定要用因为系统里有外键关联课程关联了成绩物理删除了成绩记录历史数据就全断了。毕业设计不需要做高并发复杂分库分表但逻辑删除这个设计理念一定要体现。时间字段统一用DATETIME别用TIMESTAMP。因为后者有2038年问题而且受MySQL时区影响容易出现时间差了8小时的诡异Bug。数据库连接串上记得加serverTimezoneAsia/Shanghai和characterEncodingutf8mb4spring.datasource.urljdbc:mysql://localhost:3306/teaching_assistant?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue5.3 接口安全篇JWT 拦截器 参数校验接口安全这块不需要做得像企业生产那样复杂不需要OAuth2、不需要网关但基本的三个点要覆盖统一返回结构定义一个ResultT类包含code、message、data三个字段。所有接口都返回这个对象前端才能统一解析。别今天返回一个Map明天返回一个List前端会骂人的。JWT拦截器自定义AuthInterceptor实现HandlerInterceptor接口在preHandle里从请求头拿Token解析校验把用户信息存入ThreadLocal。注册到WebMvcConfigurer里并配置好放行名单登录接口、静态资源、Swagger文档。Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); if (StringUtils.isBlank(token) || !token.startsWith(Bearer )) { throw new BusinessException(未登录或登录已过期); } // 解析JWT取出userId Long userId JwtUtil.parseToken(token.replace(Bearer , )); UserContext.setUserId(userId); return true; }参数校验用Validated配合NotBlank、NotNull、Min、Max注解在Controller入参上做校验。配合全局异常处理器把校验失败信息统一返回。5.4 接口性能与数据返回篇Redis缓存什么、不缓存什么性能优化不是毕业设计的必选项但如果做不好也容易被追问你这么烂的性能怎么处理多并发。建议守住三条底线验证码必须用Redis且有效期5分钟一个用户一个Key。首页看板数据可以做缓存管理员首页的统计学生总数、教师总数、课程总数Redis缓存30秒学生首页的待办聚合缓存60秒。其他数据不要做缓存尤其是一张课表、成绩单这种强一致性数据。万一缓存和数据库不一致答辩时不好解释。还有一个性能相关的小细节分页查询一定要用分页插件不要SELECT *全查出来在内存里手动分页。数据量小的时候没感觉数据量一大直接卡死。5.5 答辩与展示篇把数据库8张表讲清楚比讲100个亮点有效最后分享一点答辩经验。很多同学拿到这个题目会把系统做成一个大而全的东西表建了20多张功能堆了几十个。但答辩时老师最反感的就是讲PPT念完功能列表没有一个能串起来的业务故事。我的建议是准备一个一条龙演示脚本。从管理员导入学生开始讲讲到教师创建课程、发布作业再讲到学生收到待办、提交作业然后教师批改、系统自动算出平时分最后期末总评生成、学生端呈现排行榜和雷达图。这整个流程走下来老师能清楚地看到系统是怎么支撑教学全流程的也自然理解了你说的智慧化在哪里。如果老师问为什么选SpringBoot你可以回答不光是图方便而是看中了SpringBoot在企业级应用中的三个能力——快速集成生态Starter、统一配置管理application.yml、自动装配机制。再配合MyBatis-Plus简化CRUD、Redis做缓存、JWT做无状态认证这套组合是当前中小型管理系统的主流技术栈具备实际工程参考价值。如果老师问你系统里最难的点是什么不要含糊地说最难的是前端。每一个模块都应该有一个能讲清楚的技术难点比如成绩评价模块的归一化计算、二维码签到的时效校验、Excel导入的模板校验。选一个你真正做透的模块从需求讲到实现再到测试比说十个会强得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进