ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

学生档案管理系统从零到一:Spring Boot工程化设计与实战

学生档案管理系统从零到一:Spring Boot工程化设计与实战 曾有学生拿着答辩 PPT 来找我说老师问了一句“你的系统如何保证高并发下的数据一致性”他当场愣住了。那一刻我意识到很多同学在做学生档案管理系统这类“经典 CRUD”毕设时并不是不会写代码而是没有建立起一套完整的工程思维——从选题定位、表结构设计、接口实现到最终的调试排错每一步都应该是能被问倒之前就准备好的答案。这篇内容就是基于我辅导大量同类项目后的经验总结我会尽可能把从零到一的全过程展开包括每个关键设计背后“为什么这样做”的逻辑希望能给正在做或准备做这个题目的同学一个可以直接参考的完整样本。这类系统在各大毕设清单里常年霸榜原因很简单业务边界清晰、用户角色明确、数据模型成熟非常适合作为 Spring Boot 入门到进阶的综合练习。但正因为做的人多如果你的系统只是把增删改查写出来答辩时很难出彩。所以这篇文章我会把重心放在“如何把常规项目做出差异化的工程深度”上从数据库设计、后端分层、权限控制、导入导出到调试验证全部走一遍最后分享几个我在真实项目中踩过、也帮学生填过的坑。1. 毕业设计选题为什么学生档案管理系统是“进可攻退可守”的选择1.1 这个题目的真实定位与隐藏优势先说选题。学生档案管理系统听起来确实不够炫酷不像“基于深度学习的某某识别系统”那样一听就有技术含量但它有自己不可替代的优势业务完整度极高、涉及技术面恰好覆盖企业招聘时的常规要求、而且不容易翻车。我见过太多选了“高并发秒杀系统”“分布式电商平台”的同学到中期发现 RabbitMQ、Redis、分库分表这些组件自己根本没能力驾驭最后要么疯狂粘贴网上代码却跑不起来要么答辩时被追问两句就直接原地自爆。学生档案管理系统则完全相反它的核心是“人员信息 学籍变动 权限管控 统计查询”四个维度每一步都用得上 Spring Boot 最基础也最核心的知识点。换个角度说这个题目是典型的“下限低、上限不低”。如果你能力一般老老实实做标准的 CRUD 分页 登录也能顺利及格毕业如果你想把项目做出亮点同样这个题目可以承载 Spring Security、Excel 批量导入导出、AOP 操作日志、Redis 缓存院校专业数据、甚至 Vue 前后端分离这些进阶能力。同一个外壳丰俭由人这才是它最宝贵的地方。1.2 角色与核心业务场景的梳理做任何管理系统之前第一件事不是建表而是搞清楚谁在用这个系统他们分别想干什么学生档案管理系统的用户角色通常分为三类系统管理员维护教职工账号、重置密码、管理系统配置、查看全量操作日志。教务/档案管理员录入新生档案、发起学籍变动申请休学、复学、转专业、退学、维护班级和专业信息、导出各类统计表格。普通教师/辅导员查询学生信息、查看班级结构、下载学生花名册。这三大角色的存在直接决定了系统的权限模型必须设计成“基于角色的访问控制”也就是常说的 RBAC。很多毕设系统表面上做了登录但进去之后所有人看到的菜单全都一样这在答辩时是一个非常明显的减分项。如果你准备在系统中加入不同角色的菜单隔离、按钮级权限控制这个项目在答辩时的技术层次会立刻不一样。1.3 核心业务流程与个人体会我习惯把学生档案管理的核心流程勾勒成一条时间线新生入学 → 管理员批量导入或逐条录入建档 → 整理入学前履历 → 在校期间维护奖惩记录/成绩/住宿信息 → 发生学籍变动转系、休学、复学→ 毕业归档。这条时间线看起来顺理成章但里面藏着一个很多同学不做就会在答辩时露馅的细节档案的“历史可追溯性”。举例来说某个学生在大二从计算机系转到了外语系那么系统里应该既能看到他现在属于外语系也能查到转系前他属于计算机系、什么时候转的、审批人是谁。如果表结构里只有“学生表”直接挂一个“班级ID”字段这个历史变化就没有地方记录。所以我会在项目里加入档案履历表专门记录每一次关键信息的变动这也成为一个很好展示的设计亮点。2. 系统架构与技术选型把每一个组件选型的原因写在明面上2.1 单体架构为什么更适合毕设场景现在微服务是大热门不少同学一上来就想把项目拆成 Nacos Gateway 多个服务。但我的建议很直接除非你的题目明确写着“微服务”否则毕设项目不要用微服务。理由很朴实——微服务解决的是团队协作和独立部署问题一个单人开发的毕设项目用微服务只会把自己拖入服务通信、配置中心、链路追踪的泥潭中而这些内容在有限的项目周期里几乎不可能真正吃透。答辩时老师只要追问一句“你拆了两个服务但这两个服务有独立扩展的需求吗”大多数人都答不上来。Spring Boot 单体应用是当前最稳妥的选择。它足够承载学生档案管理系统全部业务逻辑开发调试成本低打成一个 jar 包就能直接部署还能省出时间把权限设计、导入导出、操作日志这些真正有含金量的部分做深。技术栈建议如下层次选型说明开发框架Spring Boot 2.7.x生态成熟、资料多尽量避开 3.x 刚升级时的兼容问题ORM 框架MyBatis-Plus单表 CRUD 无需手写 SQL复杂统计才需要自定义数据库MySQL 8.0数据量小但演示效果好支持窗口函数权限认证Sa-Token 或 Spring Security JWT两者都行优先选择自己真正能讲清楚的前端模板Thymeleaf 或 Vue 3 Element Plus会前端的选后者展示效果明显更好报表导出EasyExcel阿里开源内存友好支持模板填充接口文档Knife4j自动生成在线接口文档答辩演示时很加分2.2 关于 Spring Boot 和 Java 版本搭配的重要提醒这个问题真不是我小题大做而是每年都有学生因为版本不匹配花掉整整两天时间去排查莫名其妙的报错。Spring Boot 2.7.x 搭配 Java 8 或者 Java 11这是最稳的组合。如果你非要用 Spring Boot 3.x那必须配套 Java 17 以上同时引入 Spring Boot 3 专用的依赖坐标很多网上教程中可以直接用的javax.*包会变成jakarta.*。IDEA 版本也不能太旧老版本 IDEA 对新版本 Spring Boot 的初始化支持并不好建议直接用最新的 IntelliJ IDEA Community 或 Ultimate。我个人的推荐配置是JDK 1.8 Spring Boot 2.7.18 MySQL 8.0 Maven 3.8。这套组合看起来不新但它的资料齐全到几乎每一种异常都有人踩过并给出过解决方案对赶时间的同学非常友好。2.3 为什么数据库设计是整个项目的“胜负手”数据库表设计这个环节在答辩时的占比其实比很多人想象中大得多。原因很简单学生档案管理系统的代码量并不复杂真正能拉开差距的就是表格是否合理、字段是否完整、业务逻辑能否在数据库层面有据可依。接下来这个部分我会把核心表和字段设计展开细讲这也是整个项目最值得“抄作业”的地方。3. 数据库核心表设计与“为什么这样建”3.1 学生基础信息表student这张表是整个系统的心脏它几乎决定了后续所有业务逻辑的走向。我第一次带学生设计这张表时大家都很自然地写了id, name, student_no, gender, birthday, phone, class_id就结束了但真正落到“学生档案”这个业务场景里还有很多信息比想象中更重要CREATE TABLE student ( id BIGINT AUTO_INCREMENT PRIMARY KEY, student_no VARCHAR(32) NOT NULL COMMENT 学号, name VARCHAR(64) NOT NULL COMMENT 姓名, gender TINYINT COMMENT 性别 1-男 2-女, birthday DATE COMMENT 出生日期, id_card VARCHAR(18) COMMENT 身份证号, native_place VARCHAR(128) COMMENT 籍贯, political_status VARCHAR(32) COMMENT 政治面貌, nationality VARCHAR(64) COMMENT 民族, photo_url VARCHAR(255) COMMENT 照片地址, class_id BIGINT COMMENT 当前班级ID, enrollment_date DATE COMMENT 入学日期, graduate_date DATE COMMENT 毕业日期, status TINYINT DEFAULT 1 COMMENT 学籍状态: 1-在读 2-休学 3-退学 4-毕业, is_deleted TINYINT DEFAULT 0 COMMENT 逻辑删除, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_student_no (student_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生基础信息表;这里想特别强调三个容易被忽略的设计点第一用逻辑删除而不是物理删除。毕设里也建议统一使用逻辑删除。学生档案是敏感数据一旦误删很难恢复用is_deleted字段标记删除状态既能保留数据痕迹也是企业开发中非常基础的习惯。第二学号必须加唯一索引。这个不用多说学号就是学生的业务主键。注意我加的是唯一索引而不是把student_no直接当主键——原因是很多学校系统内部关联时习惯和数字ID打交道学号既能保证唯一又不必影响主键的自增策略。第三status 字段为学籍状态设计预留空间。很多系统只区分“在读/毕业”但真实业务中还要有“休学”“退学”“转出”这些状态这些状态会直接影响学生能否被查询到、能否发起新变动。3.2 学籍变动表student_change_log这张表是我的强烈建议。如果你希望项目在技术上能多说几句话这张表值得好好设计。它记录的是学生从入学到毕业期间所有涉及学籍档案的关键变动记录。字段结构可以是这样的idstudent_id学生IDchange_type变动类型休学、复学、转专业、保留学籍、退学before_value变动前内容JSON或普通文本after_value变动后内容reason变动原因operator_id操作人audit_status审批状态待审核、通过、驳回create_time这个表实际上同时承载了“审批流记录”和“履历档案”两个职责。例如转专业时before_value和after_value分别记录原来的班级ID和目标班级ID审批通过后同步更新学生表的class_id并把这条记录留档这样任何时候老师想看某个学生的学籍轨迹都能直接查出来。为什么要单独一张表而不是直接修改学生表因为学籍变动的本质是业务事件事件是要有“来龙去脉”的。一张独立的事件表自然形成了历史归档而且让审计和回溯变得有序可查。这也为后续做审批功能打好了基础。3.3 用户与权限表sys_user / sys_role / sys_menu / sys_user_role / sys_role_menu权限模块如果只做“用户表里存一个角色字段”确实简单但是答辩时基本就是送命题。更规范的方案是经典的 RBAC 五表模型sys_user -- 用户表id, username, password, real_name, status, create_time sys_role -- 角色表id, role_code, role_name, remark sys_menu -- 菜单表id, parent_id, menu_name, path, perms, type sys_user_role -- 用户角色关联表id, user_id, role_id sys_role_menu -- 角色菜单关联表id, role_id, menu_id这套模型的核心思想是用户不直接绑定权限而是通过“用户→角色→菜单权限”的链路过桥。比如要给所有“档案管理员”增加一个“导出成绩单”的权限只需要在sys_role_menu中给该角色关联上这个菜单权限所有该角色下的用户即时生效不需要逐个改用户。在我辅导的项目里我通常会在这里加入一道坎管理员登录后只能看到自己角色权限范围内的菜单前端按接口返回的菜单列表渲染后端在每一个接口上再做一次权限码校验。前端控制让界面干净后端控制让接口安全两者缺一不可。做好这一步答辩时在“系统安全性设计”这个问题上你就有了说得出口的答案。4. Spring Boot 核心代码落地从分层到关键业务实现4.1 标准分层架构为什么 5 层比 3 层更舒服我见过不少学生的项目代码只有一个Controller 几十个方法的“大杂烩”类运行能运行但代码看起来非常吃力。Spring Boot 工程可以拆分成这样的结构com.example.archive ├── controller // 接收请求参数校验响应封装 ├── service // 业务逻辑层事务边界 │ └── impl ├── mapper // MyBatis-Plus 数据访问接口 ├── entity // 数据库实体类 ├── dto // 接收前端参数的模型 ├── vo // 返回给前端的模型 ├── config // 配置类跨域、拦截器、Knife4j ├── common // 公共类统一返回结果、全局异常、常量 ├── utils // 工具类Excel、文件上传等 └── aspect // AOP切面日志记录前端用 Vue 的同学可以在此基础上再加一层ResultT统一响应体比如code, message, data三段式前后端约好这个结构之后所有接口都返回它前端统一做拦截处理。阿里的规范里推荐这种做法它能让联调时少掉很多头发。这种分层并不是形式主义它把“请求接入”“业务规则”“数据访问”三条关注点拆开后续无论你改哪个模块影响都被限制在局部。你在实际开发里越早习惯这种结构后面接手任何企业项目都会更快进入状态。4.2 登录认证与权限拦截的具体实现逻辑学生档案系统里有很多敏感操作查看身份证号、导出通讯录、修改学籍状态所以认证和授权一定不能只写在观赏层面。以 Sa-Token 为例整体逻辑非常清爽RestController RequestMapping(/api/auth) public class AuthController { Autowired private SysUserService sysUserService; PostMapping(/login) public ResultString login(RequestBody LoginDTO dto) { // 1. 校验用户名密码 SysUser user sysUserService.login(dto.getUsername(), dto.getPassword()); // 2. 登录成功签发 token StpUtil.login(user.getId(), new SaLoginModel().setDevice(pc)); // 3. 返回 token 给前端 return Result.ok(StpUtil.getTokenValue()); } PostMapping(/logout) public ResultVoid logout() { StpUtil.logout(); return Result.ok(); } }Sa-Token 的拦截器配置也很直接放行登录接口其余接口统一校验Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaInterceptor(handle - StpUtil.checkLogin())) .addPathPatterns(/**) .excludePathPatterns(/api/auth/login, /doc.html, /api-docs/**); }这里再补一个进阶方案供有余力的同学参考把权限码直接落到方法上比如SaCheckPermission(student:export) GetMapping(/export) public void export() { ... }这样界面菜单控制、接口权限拦截、方法级细粒度校验三层全部到位。答辩时你能把这三层链路讲明白这个项目的技术深度已经超过大多数同期作品。4.3 学生档案核心 CRUD 实际写起来要抓住的几个细节点有了表结构有了分层写一个标准的新增学生接口是很快的但完整的学生档案管理还要考虑下面几个关键细节新增学生时同时处理“建档履历”。学生首次录入系统本身就是学籍档案的起点所以在addStudent的事务里不仅要 insert 学生表同时也要往student_change_log中插入一条“入学建档”记录。这一个细节就能体现出做系统的人是不是真懂业务。编辑学生时做敏感字段操作保护。比如说身份证号、手机号、家庭住址这类字段不是所有角色都能看到的。档案管理员可以看完整信息教务处老师只能看到姓名、班级、学号。实现上可以用JsonIgnore按角色动态过滤字段或者 DTO 分层隔离。我通常采用一种更简单易懂的方案按角色返回不同的 VO把不允许查看的字段直接不填充。查询列表必须支持多条件组合筛选。按姓名、学号、班级、性别、状态等多个维度筛选这是档案检索的核心场景。如果用 MyBatis-PlusLambdaQueryWrapper配合条件构造器写起来非常快public PageStudentVO pageStudents(StudentQueryDTO query) { LambdaQueryWrapperStudent wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(query.getName()), Student::getName, query.getName()) .eq(StringUtils.hasText(query.getStudentNo()), Student::getStudentNo, query.getStudentNo()) .eq(query.getClassId() ! null, Student::getClassId, query.getClassId()) .eq(query.getStatus() ! null, Student::getStatus, query.getStatus()) .orderByDesc(Student::getCreateTime); return studentMapper.selectPage(new Page(query.getPageNum(), query.getPageSize()), wrapper); }注意.like()和.eq()方法里的第一个参数是 boolean 条件条件不成立时该条件自动跳过这样前端不管传什么值SQL 都不会拼接出错也非常好讲。4.4 Excel 批量导入导出放在这里做简直是最惊喜的加分项学生档案管理系统里大量学生信息的录入是整个业务里最耗时间的场景。如果系统只支持一条条手填效率会非常低。这时候引入 EasyExcel 做批量导入导出操作体验和项目档次都会提升一大截。导入的逻辑重点是“先校验后落库”读取 Excel 模板逐行转为StudentImportDTO逐行校验学号是否为空、学号格式是否正确、是否已在系统存在、班级ID是否存在汇总所有校验错误一次性返回给前端展示避免用户改一个错一个再来回传校验全部通过后统一批量插入。核心代码大概长这样public ImportResult importStudents(MultipartFile file) { ListStudentImportError errors new ArrayList(); ListStudent toSave new ArrayList(); ListStudentChangeLog logs new ArrayList(); EasyExcel.read(file.getInputStream()) .head(StudentImportDTO.class) .registerReadListener(new AnalysisEventListenerStudentImportDTO() { Override public void invoke(StudentImportDTO dto, AnalysisContext context) { // 逐行校验和转换 Student student validateAndConvert(dto, errors); if (student ! null) { toSave.add(student); logs.add(buildCreateLog(student)); } } Override public void doAfterAllAnalysed(AnalysisContext context) { // 忽略稍后批量处理 } }) .sheet().doRead(); if (errors.isEmpty()) { studentService.saveBatch(toSave); changeLogService.saveBatch(logs); return ImportResult.success(toSave.size()); } return ImportResult.fail(errors); }导出就更加直接了把查询结果用 EasyExcel 写出注意报表里的列要按照教务老师日常习惯来排例如学号、姓名、性别、出生日期、籍贯、班级、状态这些放前面。GetMapping(/export) public void exportStudents(HttpServletResponse response) throws IOException { ListStudentExportVO list studentService.listAllForExport(); response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setCharacterEncoding(utf-8); String fileName URLEncoder.encode(学生档案信息, UTF-8).replaceAll(\\, %20); response.setHeader(Content-Disposition, attachment;filename*utf-8 fileName .xlsx); EasyExcel.write(response.getOutputStream(), StudentExportVO.class) .sheet(学生档案) .doWrite(list); }每次带学生做完这块他们答辩时被问到“系统有没有实际价值”时手里的王牌就多了一张老师系统支持 Excel 批量导入500 个新生信息一次性就能完成建档。5. 从源码到能跑通调试运行全流程解析与高频坑位排雷5.1 拿到项目后的环境初始化步骤无论你自己从零写的还是拿到网上参考的源码要跑起来第一步都是统一环境。我看到过太多因为“电脑上装的东西比较杂”导致项目跑半天起不来的同学最后排查发现是 MySQL 密码配置文件没改。所以环境准备阶段建议严格按顺序检查确认 JDK 版本命令行输入java -version确认 Maven 已安装并配置好阿里云镜像否则下载依赖会慢到怀疑人生打开 IDEA用File - Open直接选择项目根目录等 Maven 自动导入依赖检查application.yml中的数据源配置用户名密码改成你自己本机的在 Navicat 或命令行中执行项目附带的sql脚本确认表和数据全部导入成功启动 Spring Boot 主类观察控制台启动日志前端如果是 Vue 项目进入前端目录执行npm install完成后执行npm run dev。这一套里面最容易出问题的就是第 4 步和第 6 步。第 4 步不解释了第 6 步常见错误是Access denied for user rootlocalhost基本就是密码错了或者Unknown database student_archive说明数据库脚本还没执行或库名对不上。5.2 Spring Boot 项目起不来这份排查链路直接复用我把这些年学生项目中碰到频率最高的启动失败问题整理成了一个排查流程你可以直接照着走第一步确认端口是否被占用。启动日志里如果出现Port 8080 was already in use说明你机器上某个进程已经占用了 8080 端口。最简单的解决方案是改项目配置server: port: 8081或者在命令行强制找到占用进程并结束它Windows 用户netstat -ano | findstr :8080 taskkill /F /PID 你的进程号第二步确认数据库连通性。如果日志里有Cannot create PoolableConnectionFactory说明程序连不上数据库。先用 Navicat 手动试一下你自己填的用户名和密码能不能连上再去检查application.yml的url里是不是多写了奇怪的字符。有一处细节特别容易被忽略serverTimezoneAsia/Shanghai是有必要的否则系统默认 UTC 会比北京时间晚 8 小时。第三步确认 Maven 依赖完整下载。如果日志中出现NoClassDefFoundError或ClassNotFoundException大概率是依赖没下全。IDEA 右侧 Maven 面板点一下刷新或者直接执行mvn clean install -DskipTests强制重新下载并构建项目。第四步看日志里最具体的异常栈而不是只看红色字体的最后一行。这是很多新手排查问题的致命误区——只看报错的最后一句根本不看 Caused by 的完整链路。Spring Boot 的异常栈里“Caused by”往下可能还有三四层真正的原因往往藏在最内层。把完整异常栈贴到搜索引擎里搜绝大多数问题都能找到答案。5.3 常见数据库与登录问题的根因与处理下面用表格列几个高频问题几乎每个学生项目里都会遇到至少一个问题现象根本原因解决方案登录时提示用户名或密码错误前端表单字段名与后端 DTO 不一致打开浏览器 F12 看请求体实际提交的字段名数据库中文乱码数据库连接串没指定 utf8mb4在 jdbc url 加入characterEncodingutf8useSSLfalse查询列表为 null实体类字段与表字段驼峰/下划线未映射确认map-underscore-to-camel-case: true配置开启上传照片加载不出静态资源路径没配置设置spring.web.resources.static-locations指向上传目录Excel 导入时提示格式错误EasyExcel 的 DTO 属性与表头标题不匹配检查ExcelProperty注解 value 是否与 Excel 实际表头一致5.4 启动成功之后的功能冒烟测试清单项目跑通了不代表没有隐藏问题我建议在正式演示或提交前按照下面的冒烟测试清单完整过一遍使用管理员账号登录确认能看到全部菜单新建一个学生档案录入完整信息后保存确认列表能查到编辑该生档案修改班级信息确认档案履历表多了“修改记录”给该生发起一个“休学”申请走完审批流确认学生状态变为休学导出当前列表为 Excel打开文件确认数据完整用普通教师账号登录确认看不到“权限管理”菜单用普通教师账号直接访问学生编辑接口确认被拦截提示无权限删除一名学生确认列表不再展示但数据库仍保留记录逻辑删除。这 8 条如果全部通过系统在功能层面的完整性就有了保障剩下就是打磨细节和准备答辩词。6. 让项目在答辩中加分的定制扩展方向6.1 学习履历增强把“学生档案”变成“学生成长时间线”基础的学生信息只有静态字段并没有覆盖档案的本质含义。档案嘛除了基本信息还要有成长轨迹。所以一个很推荐的方向是增加“学习经历维护”功能从高中经历、大学入学、专业分流、每个学期的综合表现到毕业去向全部按时间线维护前端用时间轴效果展现。这样老师打开一个学生的详情页不再是冷冰冰的几个字段而是一条完整的时间线。这个功能开发成本不高但在展示效果上非常讨喜。6.2 一键生成学籍证明与报表打印教务日常工作中很常见的需求是打印学籍证明比如考研报名、出国的成绩材料、入职时的学历证明。你可以做一个“学籍证明模板”让系统把学生信息填充到固定的 Word/PDF 模板里然后一键下载打印。这个功能在答辩时一演示实用性直接拉到满分。实现思路也不复杂用 Apache POI 或 Hutool 的 Word 工具操作模板按占位符替换变量导出为 docx 或 pdf。这种功能在实际业务中是真正的刚需。6.3 统计分析可视化让数据说话最后再加一个“学生统计大屏”方向按学院/专业/年级统计学生人数、按性别比例展示分布、按学籍状态统计在读/休学/毕业人数使用 ECharts 以柱状图、饼图、折线图渲染。这部分的图表效果很适合放在答辩 PPT 的截图里老师一眼就看出系统有“数据决策”的雏形而不是单纯的信息存储工具。7. 你可能还会遇到的其他问题统一回答问系统中学生的身份证号属于敏感数据需要加密吗正常情况下学生档案管理系统里身份证号属于敏感个人信息正规企业项目里至少要做加密存储。毕设项目如果时间宽裕可以用 AES 或国密 SM4 对身份证号加密展示时按需脱敏比如只展示前 6 位和后 4 位。如果时间紧张至少要做一个“列表页默认脱敏”的功能这个细节会非常加分。问图片上传后刷新页面就丢了是怎么回事原因是图片上传到了本地磁盘的某个临时目录而 Spring Boot 对静态资源映射的默认路径不包含它。解决方案是在配置中加一个资源映射Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceHandler(file: System.getProperty(user.dir) /upload/); } }问前端写好之后怎么和后端联调前后端联调时最怕跨域问题。在 Spring Boot 侧临时加一个全局跨域配置即可Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(*) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }如果用了 Sa-Token前端需要在请求拦截器里把token放到请求头satoken中否则后端会一直提示未登录。问登录功能的问题最常见的是密码加密用什么方式比较好直接用 BCrypt 算法Spring Boot 的spring-security-crypto依赖中自带。BCrypt 每次加密同一密码得到的密文不同但校验时用matches方法可以正确比对安全性远高于 MD5这也是 Java 社区里目前推荐的做法之一。问Maven 下载依赖太慢怎么办在settings.xml中配置阿里云公共镜像一般在 5 分钟内能拉完 Spring Boot 全家桶。这部分网上资料很多照着改一次一劳永逸。8. 最后的最后几个我自己的实操建议带过这么多学生项目之后有两件事我几乎每次都会反复叮嘱再在这里多说一次。第一件事是从第一天就做好数据库脚本的版本管理。建表脚本仅仅执行一次是不够的随着开发推进你会不断调整表结构。建议每次改完表都导出一份新的 SQL 文件放进项目根目录的sql/目录并且用文件名区分版本比如v1.0_schema.sql、v1.1_schema.sql。这样哪怕哪一次不小心把库删了也能快速恢复完整的库表结构。第二件事是养成每个接口都写测试的习惯。不用很复杂至少 Controller 层写完一个接口之后在 Knife4j 页面或 Postman 里执行一次确认返回结构和字段都正确。如果每写完一个模块就立即验证整个项目的调试时间至少能减少一半以上如果全写完再一起调最后往往需要面对连环报错痛苦得多。学生档案管理系统这类“经典 CRUD”题目最大的价值恰恰在于它不花哨却能让你把软件工程里最核心的那些基础功练扎实——分层设计、权限模型、事务边界、数据一致性、日志可追溯、批量任务。把这一套完整的流程走完你收获的不仅是一个能过答辩的系统更是以后真正进入企业写业务代码时每天都在用的那套思维框架。希望这篇内容能帮你把这条路走得顺一点。
返回列表