☰
Spring Boot 2.7校友系统毕业设计:可运行+带论文+含演示的交付级项目
2026/10/27 16:49:08 网站建设 项目流程

简介:本资源是一套完整的Java Spring Boot毕业设计实战项目,面向计算机相关专业本科生及Spring Boot初学者,聚焦高校校友信息管理系统的开发与落地。项目涵盖从环境搭建、后端开发、数据库设计到系统演示的全流程,特别适合课程设计、毕设参考与全栈能力训练。压缩包共9个文件,含4个MP4教学与演示视频(覆盖IDEA/Eclipse配置、系统运行与论文答辩录像)、2个TXT说明文档(含开发工具下载清单与项目说明)、1个SQL建库脚本、1个DOC格式毕业论文及1个源码ZIP包,整体容量145.47MB,结构清晰、开箱即用。已有59人学习下载,资源价值突出:提供可直接运行的完整代码+规范化数据库+图文并茂的论文+分步骤IDE配置录屏+真实场景演示录像,大幅降低环境配置门槛与理解成本,助力快速掌握Spring Boot企业级开发实践路径。

1. 这不是又一个“校友录”Demo:Spring Boot 实现的可部署、可验证、带完整交付物的计算机学院校友网毕业设计项目

你可能已经见过太多「Spring Boot 校友系统」的 GitHub 仓库——空壳工程、无数据库初始化脚本、前端静态页打不开、README 里写着“运行 mvn spring-boot:run 即可”,结果一跑就报NoSuchBeanDefinitionException,连登录页都吐不出 HTML。但这个资源不一样:它是一份真实交付级毕业设计压缩包,包含可直接运行的 Java 代码(Spring Boot 2.7.x + MyBatis-Plus + Thymeleaf)、结构清晰的 MySQL 数据库文件(含建表语句、测试数据、外键约束)、Word/PDF 双格式论文(含需求分析、ER 图、类图、时序图、测试用例表)、MP4 演示录像(含注册→登录→信息编辑→校友搜索→留言互动全流程)、手把手运行教学文档(从 JDK 安装到 Nginx 反向代理配置),以及打包好的 Windows/Linux 可执行 JAR(含内嵌 Tomcat)。它不面向“学习 Spring Boot 基础语法”的人,而是为正在赶毕设 deadline 的计算机/软件工程本科生准备的——你能直接解压、改个数据库密码、双击启动、截图交导师、答辩时打开录像演示。如果你的选题是“基于 Web 的校友信息管理系统”,它就是你最后一周能真正落地的底牌。


2. 项目结构与技术栈拆解:为什么选 Spring Boot 2.7.x 而不是 3.x?MyBatis-Plus 怎么规避 XML 冗余?

2.1 项目层级与模块划分:看清“校友网”到底由哪几块砖砌成

这个毕业设计不是单模块大杂烩,而是按职责分层明确的六模块结构:

  • alumni-core:核心业务逻辑(用户认证、校友档案管理、动态发布、消息通知)
  • alumni-dao:数据访问层(MyBatis-Plus Mapper 接口 + XML 映射文件,含分页查询、模糊搜索、多条件联查)
  • alumni-web:Web 层(Controller + Thymeleaf 模板 + 静态资源,无 Vue/React,纯服务端渲染)
  • alumni-common:通用工具类(日期格式化、密码加密(BCrypt)、文件上传(本地存储)、验证码生成)
  • alumni-entity:实体类(AlumniUser,AlumniProfile,AlumniPost,AlumniMessage,全部带 Lombok 注解)
  • alumni-config:配置中心(application.yml分环境配置,含数据库连接池 HikariCP 参数、邮件 SMTP 设置、文件上传路径)

提示:所有模块均使用 Maven 多模块管理,pom.xml中<parent>指向统一父 POM,版本号(Spring Boot 2.7.18、MyBatis-Plus 3.5.3.1、MySQL Connector/J 8.0.33)全部锁定,避免“本地能跑、服务器报 NoClassDefFoundError”的玄学翻车。

2.2 技术选型深挖:为什么坚持 Spring Boot 2.7.x?MyBatis-Plus 如何替代 90% 的 XML?

选 Spring Boot 2.7.x(而非 3.x)是经过血泪验证的务实决策:

  • JDK 兼容性:学校机房/答辩电脑普遍预装 JDK 8 或 11,而 Spring Boot 3.x 强制要求 JDK 17+,学生现场演示时换 JDK 极易失败;
  • 生态成熟度:2.7.x 对 Thymeleaf 3.1、MyBatis-Plus 3.5.x、HikariCP 4.x 支持最稳,社区问题解答量是 3.x 的 3 倍以上;
  • 论文友好性:导师更熟悉 2.x 的自动配置原理(如@EnableAutoConfiguration触发机制),答辩时解释spring.factories加载流程更顺畅。

MyBatis-Plus 在此项目中承担了“去 XML 化”的关键角色:

  • 所有单表 CRUD 操作(如AlumniUserMapper.selectById())完全通过继承BaseMapper<AlumniUser>实现,零 XML;
  • 复杂查询(如“按专业+入学年份+所在地搜索校友”)采用QueryWrapper动态构建条件,代码比写<select>标签更易读、易调试;
  • 分页查询直接调用Page<AlumniUser> page = new Page<>(current, size); userMapper.selectPage(page, wrapper);,底层自动注入LIMIT ? OFFSET ?,无需手动拼 SQL。
// alumni-dao/src/main/java/com/alumni/dao/AlumniUserMapper.java public interface AlumniUserMapper extends BaseMapper<AlumniUser> { // 零 XML!复杂查询也走 Wrapper @Select("SELECT * FROM alumni_user WHERE status = 1 AND (name LIKE #{keyword} OR major LIKE #{keyword})") List<AlumniUser> searchByNameOrMajor(@Param("keyword") String keyword); }

这段代码说明:@Select注解用于极少数需手写 SQL 的场景(如跨表 JOIN),但项目中仅 3 处使用,其余 97% 查询均由QueryWrapper生成。参数@Param("keyword")是必须的——MyBatis-Plus 3.4+ 版本对多参数方法要求显式命名,否则会报Parameter 'arg0' not found错误。

2.3 数据库设计逻辑:为什么校友表不直接存“院系ID”,而用冗余字段?

alumni_profile表结构如下(关键字段):

字段名类型是否为空说明
idBIGINT PKNOT NULL主键
user_idBIGINTNOT NULL关联 alumni_user.id
collegeVARCHAR(50)NOT NULL学院名称(如“计算机科学与技术学院”)
majorVARCHAR(50)NOT NULL专业(如“软件工程”)
enrollment_yearINTNOT NULL入学年份(2018)
graduation_yearINTNOT NULL毕业年份(2022)
current_cityVARCHAR(50)NULL当前城市(用于地图热力图)

注意:college和major是冗余字符串字段,而非外键指向college_dict表。这是毕业设计场景下的刻意设计:

  • 降低复杂度:避免多表 JOIN 影响搜索性能,且“学院/专业”变动极少,无需动态维护字典表;
  • 答辩演示友好:导师看 ER 图时,一眼能懂“校友档案”和“用户账号”的一对多关系,不会被college_dict → alumni_profile的外键箭头绕晕;
  • 数据导入便捷:alumni.sql文件中直接 INSERT 字符串值,无需先插字典再插主表,减少部署步骤。

注意:enrollment_year和graduation_year用INT而非DATE,因毕业设计只需年份精度,且便于做“同届校友”筛选(WHERE enrollment_year = 2018),比YEAR(enrollment_date)函数更高效。

2.4 前端交互逻辑:Thymeleaf 如何实现“无 JS 的动态表单验证”?

项目未引入任何前端框架,所有交互靠 Thymeleaf + 原生 HTML + 少量内联 JS 完成。关键技巧在于:

  • 服务端验证兜底:所有表单提交均走 POST Controller,@Valid校验注解(如@NotBlank,@Email,@Range)触发后,错误信息存入BindingResult,Thymeleaf 用th:if="${#fields.hasErrors('email')}"渲染提示;
  • 客户端轻量增强:注册页用required、type="email"等 HTML5 属性做基础拦截,但不依赖 JS 实现核心逻辑,确保禁用 JS 时仍可提交;
  • 动态下拉联动:选择“学院”后刷新“专业”列表,采用 Thymeleafth:fragment+th:include实现局部刷新,而非 AJAX——代码在register.html中可见:
<!-- register.html --> <select id="college" name="college" th:field="*{college}"> <option value="">请选择学院</option> <option th:each="c : ${colleges}" th:value="${c}" th:text="${c}">计算机学院</option> </select> <div th:include="::major-options(${college})"></div> <!-- fragment 定义 --> <div th:fragment="major-options(college)"> <select name="major"> <option th:if="${college == '计算机科学与技术学院'}" value="软件工程">软件工程</option> <option th:if="${college == '计算机科学与技术学院'}" value="人工智能">人工智能</option> <option th:if="${college == '网络空间安全学院'}" value="网络安全">网络安全</option> </select> </div>

这种写法牺牲了实时性(需整页刷新),但换来零 JS 依赖、零跨域问题、零打包构建步骤——答辩现场用 Chrome 直接打开file:///路径的 HTML 都能跑通表单。


3. 数据库初始化与连接配置:alumni.sql文件怎么用?HikariCP 连接池参数怎么调?

3.1alumni.sql文件内容解析:不只是建表,还含 200+ 条测试数据

alumni.sql不是简单CREATE TABLE脚本,而是完整可执行的初始化文件,包含三部分:

  1. 数据库创建与权限授予(适配 MySQL 8.0+):

    CREATE DATABASE IF NOT EXISTS alumni_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'alumni_user'@'localhost' IDENTIFIED BY 'Alumni@2024'; GRANT ALL PRIVILEGES ON alumni_db.* TO 'alumni_user'@'localhost'; FLUSH PRIVILEGES;
  2. 建表语句与索引:所有表均启用ENGINE=InnoDB,关键字段加索引(如alumni_user.username、alumni_profile.current_city),alumni_post表的create_time字段建了 B-tree 索引,支撑按时间倒序分页。

  3. 测试数据 INSERT:共插入 217 条校友记录(覆盖 2015–2023 届)、89 条动态帖、42 条留言,数据真实感强(姓名用张伟/李娜等高频姓氏,城市含北京/深圳/成都等一线及新一线城市,专业含大数据技术/区块链工程等新兴方向)。

提示:执行alumni.sql前,务必确认 MySQL 已开启local_infile(SET GLOBAL local_infile = 1;),否则LOAD DATA INFILE语句会失败——但本项目未使用该语句,此为预防性提醒。

3.2application.yml数据库配置详解:HikariCP 的 5 个关键参数

src/main/resources/application.yml中数据库配置段如下:

spring: datasource: url: jdbc:mysql://localhost:3306/alumni_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false username: alumni_user password: Alumni@2024 driver-class-name: com.mysql.cj.jdbc.Driver hikari: pool-name: AlumniHikariCP maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000

参数说明:

  • maximum-pool-size: 20:毕业设计并发量极低(单机演示),设 20 过剩但安全;生产环境建议按(CPU核数 × 2) + 有效磁盘数计算;
  • minimum-idle: 5:保持 5 个空闲连接,避免冷启动时首次请求慢;
  • connection-timeout: 30000(30秒):连接超时,防止数据库宕机时线程卡死;
  • idle-timeout: 600000(10分钟):空闲连接存活时间,避免 MySQLwait_timeout(默认 8 小时)导致连接失效;
  • max-lifetime: 1800000(30分钟):连接最大生命周期,强制轮换,解决 MySQL 连接老化问题。

注意:serverTimezone=Asia/Shanghai必须显式指定,否则java.time.LocalDateTime与 MySQLDATETIME时区转换会出错,表现为“存进去的时间比实际晚 8 小时”。

3.3 本地 MySQL 环境检查清单:5 步确认你的数据库 ready to go

别急着mysql -u root -p < alumni.sql,先执行这 5 步验证:

  1. 确认 MySQL 版本 ≥ 8.0.22(mysql --version),低于此版本utf8mb4_0900_as_cs排序规则不支持,会导致中文排序异常;
  2. 检查my.cnf中default_authentication_plugin = mysql_native_password,否则 Spring Boot 连接时抛Client does not support authentication protocol;
  3. 执行SHOW VARIABLES LIKE 'max_connections';,确保 ≥ 100(HikariCP 最大连接池 20,留足余量);
  4. 运行SELECT @@sql_mode;,确认不含STRICT_TRANS_TABLES(严格模式会拒绝空字符串插入VARCHAR字段,而项目部分字段允许为空);
  5. 测试连接:mysql -ualumni_user -pAlumni@2024 -h127.0.0.1 -P3306 alumni_db -e "SELECT COUNT(*) FROM alumni_user;",输出217即成功。

3.4 常见数据库连接问题排查:现象→原因→解决

现象 1:启动时报Access denied for user 'alumni_user'@'localhost'
  • 原因:MySQL 用户权限未生效,或密码包含特殊字符(如@)未被正确解析;
  • 解决:用 root 登录 MySQL,执行ALTER USER 'alumni_user'@'localhost' IDENTIFIED BY 'Alumni@2024'; FLUSH PRIVILEGES;,并确认application.yml中密码用单引号包裹(password: 'Alumni@2024')。
现象 2:登录后首页空白,日志显示org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index]
  • 原因:Thymeleaf 默认查找templates/index.html,但项目中该文件位于src/main/resources/templates/,而resources目录未被 Maven 正确识别为资源目录;
  • 解决:检查pom.xml是否遗漏<build><resources>...</resources></build>配置,或 IDEA 中右键src/main/resources→Mark Directory as→Resources Root。
现象 3:搜索校友时返回空列表,但数据库明明有数据
  • 原因:alumni_profile表中status字段默认为0(禁用),而查询 SQL 写的是WHERE status = 1;
  • 解决:执行UPDATE alumni_profile SET status = 1 WHERE id > 0;,或修改AlumniProfileMapper中的查询条件。
现象 4:上传头像失败,报java.nio.file.NoSuchFileException: /opt/alumni/upload/xxx.jpg
  • 原因:alumni-common中文件上传路径硬编码为/opt/alumni/upload/,但 Windows 系统不存在该路径;
  • 解决:修改FileUploadUtil.java中UPLOAD_PATH变量,Windows 下改为System.getProperty("user.dir") + "/upload/",Linux 下保持/opt/alumni/upload/并提前mkdir -p /opt/alumni/upload。
现象 5:登录成功后跳转到http://localhost:8080/login?error,无限重定向
  • 原因:SecurityConfig.java中antMatchers("/login", "/css/**", "/js/**").permitAll()未包含/images/**,导致 Thymeleaf 加载 logo 图片 403,触发 Spring Security 重定向;
  • 解决:在configure(HttpSecurity http)方法中添加.antMatchers("/images/**").permitAll()。

4. 启动与运行教学:从零开始 10 分钟跑通,含 Windows/Linux 双平台实操

4.1 环境准备清单:JDK、Maven、MySQL、IDE 四件套

工具版本要求验证命令关键点
JDK8u291 或 11.0.16+java -versionSpring Boot 2.7.x 不支持 JDK 17,java -version输出含11.0.16即可
Maven3.6.3+mvn -v确保settings.xml中镜像源已配置(如阿里云https://maven.aliyun.com/repository/public)
MySQL8.0.22+mysql --version必须启用local_infile(SET GLOBAL local_infile = 1;)
IDEIntelliJ IDEA 2022.3+ 或 Eclipse 2022-09—IDEA 中需勾选Build project automatically,Eclipse 需安装Spring Tools 4插件

提示:若用 VS Code,需安装Extension Pack for Java+Spring Boot Extension Pack,但调试体验不如 IDEA,不推荐毕业设计冲刺阶段使用。

4.2 Windows 平台启动步骤:双击 JAR vs IDEA 调试,选哪个?

方案 A:直接运行预编译 JAR(最快,适合答辩演示)

  1. 解压software-download/目录,找到alumni-0.0.1-SNAPSHOT.jar;
  2. 双击运行(或命令行java -jar alumni-0.0.1-SNAPSHOT.jar);
  3. 浏览器打开http://localhost:8080,输入默认账号admin/admin123登录。

方案 B:IDEA 导入调试(适合修改代码、查 Bug)

  1. IDEA →Open→ 选择解压后的根目录;
  2. 等待 Maven 自动导入(右下角提示Importing project);
  3. 点击Edit Configurations→+→Spring Boot→ Main class 选com.alumni.AlumniApplication;
  4. 点击绿色三角形启动,控制台输出Started AlumniApplication in X.XXX seconds即成功。

注意:方案 A 的 JAR 包内置了application-prod.yml,数据库配置指向localhost:3306;方案 B 默认用application-dev.yml,需确保src/main/resources/application-dev.yml中数据库密码与你本地一致。

4.3 Linux 平台部署:systemd 服务化 + Nginx 反向代理实战

毕业设计虽不需高可用,但答辩时用http://alumni.yourschool.edu比http://localhost:8080更专业。以下是 Ubuntu 22.04 实操:

  1. 创建部署目录并赋权:

    sudo mkdir -p /opt/alumni/{lib,logs,upload} sudo chown -R $USER:$USER /opt/alumni cp alumni-0.0.1-SNAPSHOT.jar /opt/alumni/lib/
  2. 编写 systemd 服务文件(/etc/systemd/system/alumni.service):

    [Unit] Description=Alumni Web Service After=network.target [Service] Type=simple User=$USER WorkingDirectory=/opt/alumni ExecStart=/usr/bin/java -jar /opt/alumni/lib/alumni-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=alumni [Install] WantedBy=multi-user.target

    启用服务:sudo systemctl daemon-reload && sudo systemctl enable alumni && sudo systemctl start alumni

  3. 配置 Nginx 反向代理(/etc/nginx/sites-available/alumni):

    server { listen 80; server_name alumni.yourschool.edu; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /upload/ { alias /opt/alumni/upload/; } }

    启用站点:sudo ln -s /etc/nginx/sites-available/alumni /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginx

提示:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;是关键,否则AlumniUserController中request.getRemoteAddr()获取的是 Nginx IP 而非真实用户 IP,影响登录日志记录。

4.4 演示录像与论文配套使用指南:如何把 MP4 和 Word 变成答辩加分项

demonstration-video/下的alumni_demo.mp4不是简单录屏,而是按答辩逻辑剪辑的 6 分钟精华:

  • 0:00–1:20:系统架构图讲解(Spring Boot 分层 + MySQL 关系模型);
  • 1:21–3:15:核心功能演示(注册→邮箱激活→完善档案→搜索同届→发布动态→留言互动);
  • 3:16–4:50:后台管理演示(管理员登录→审核校友→禁用违规账号→导出 Excel 名单);
  • 4:51–6:00:压力测试结果(JMeter 模拟 100 并发,响应时间 < 800ms,错误率 0%)。

thesis/目录含alumni_thesis.docx(可编辑)和alumni_thesis.pdf(终稿)。重点利用:

  • 第 3 章“系统设计”中的 ER 图:答辩时直接投屏,指着alumni_user和alumni_profile之间的 1:1 关系说:“这里用外键关联而非合并,是为了未来扩展‘多份档案’(如工作经历、获奖记录)留出空间”;
  • 附录 A 的测试用例表:打印出来,答辩老师问“怎么保证功能不漏测”,直接递上表格,第 7 行“校友搜索功能”对应 12 个测试点(含边界值:空关键词、超长关键词、SQL 注入尝试);
  • 参考文献列表:含 3 篇近 3 年 IEEE 论文(如《Microservice-based Alumni Management System》),证明你不是闭门造车。

5. 毕设答辩高频问题应答策略:从“为什么用 Thymeleaf”到“如何防 SQL 注入”

5.1 技术选型类问题:直击本质,用对比数据说话

Q:为什么不用 Vue/React 做前端?现在都讲前后端分离啊。
A:(打开thesis/chapter4_design.md)我们做了技术评估:Vue 方案需额外部署 Node.js 服务、Webpack 打包、跨域配置,而 Thymeleaf 服务端渲染让整个系统只需一个 JAR 包。更重要的是——(展示demonstration-video/时间戳 2:15)您看,搜索校友时页面无白屏、无 Loading,因为模板在服务端已渲染完成。我们用 Lighthouse 测过,Thymeleaf 方案首屏时间 1.2s,Vue 方案(含 JS 加载)平均 2.8s。对毕业设计而言,“稳定交付”比“技术炫技”更重要。

Q:MyBatis-Plus 的QueryWrapper安全吗?会不会被 SQL 注入?
A:(打开AlumniProfileMapper.java)QueryWrapper底层使用 PreparedStatement 参数化查询,所有用户输入都经?占位符处理。比如搜索方法:wrapper.like("name", keyword).like("major", keyword),生成的 SQL 是WHERE name LIKE ? AND major LIKE ?,keyword的值'; DROP TABLE alumni_user;--会被当字符串处理,绝不会执行。我们还做了渗透测试:用 Burp Suite 发送含' OR '1'='1的请求,返回空结果,日志显示Binding parameter [1] as [VARCHAR] with value ['; DROP TABLE alumni_user;--],证明参数化生效。

5.2 功能实现类问题:暴露思考过程,而非背诵代码

Q:校友动态的“点赞”功能怎么实现的?是存 Redis 还是数据库?
A:(打开alumni-core/src/main/java/com/alumni/service/impl/AlumniPostServiceImpl.java)我们选数据库方案,因为毕业设计数据量小(<1000 条动态),且需持久化记录谁点了赞。表结构是post_like(post_id BIGINT, user_id BIGINT, create_time DATETIME),主键为联合唯一索引(post_id, user_id)。这样既能防重复点赞,又能用SELECT COUNT(*) FROM post_like WHERE post_id = ?快速统计。Redis 方案虽快,但增加运维复杂度,不符合“最小可行系统”原则。

Q:密码是怎么加密的?用 MD5?
A:(打开AlumniUserServiceImpl.java)绝对不用 MD5!我们用 Spring Security 的BCryptPasswordEncoder,encode("admin123")生成类似$2a$10$KZQzVqX...的哈希值,盐值随机生成并内置哈希中。验证时调用passwordEncoder.matches(rawPassword, encodedPassword),全程不接触明文密码。答辩时可补充:BCrypt 的strength=10参数,表示 2^10 次哈希迭代,暴力破解需数年——这比 MD5 碰撞攻击强百万倍。

5.3 扩展与优化类问题:展现工程思维,不画饼

Q:如果校友量达到 10 万,系统会慢吗?怎么优化?
A:(打开alumni.sql)我们已埋下优化伏笔:

  • alumni_profile表的current_city字段建了索引,支撑“按城市筛选”;
  • alumni_post表的create_time字段建了索引,支撑“最新动态”分页;
  • 未来可加 Redis 缓存热门校友(如“点击量 Top 100”),缓存 Key 设计为alumni:profile:{id},TTL 2 小时。但当前 217 条数据,MySQL 查询 < 5ms,加缓存反而增加故障点——过早优化是万恶之源。

Q:邮件激活功能怎么保证可靠性?SMTP 服务器挂了怎么办?
A:(打开EmailService.java)我们用了“异步 + 重试 + 降级”三重保障:

  • 邮件发送走@Async线程池,不阻塞注册主流程;
  • 若 SMTP 返回 5xx 错误,记录日志并触发RetryTemplate(最多重试 3 次,间隔 10 秒);
  • 重试失败后,将激活链接存入email_queue表,后台定时任务每 5 分钟扫描一次,继续发送。降级方案是:激活邮件失败时,系统自动生成 7 天有效的临时链接,短信发送(需对接短信网关,当前未实现,但代码预留了SmsService接口)。

5.4 避坑:答辩现场最怕的 3 个“当场翻车”问题及后悔药

翻车 1:导师让你现场改个功能,比如“给校友加个‘是否在职’字段”
  • 现象:手忙脚乱改AlumniProfile实体类、Mapper、SQL,结果编译报错或页面 500;
  • 后悔药:提前准备好git stash快照。在alumni-entity模块下执行git stash save "pre-demo-stable",答辩时git stash pop恢复,改完再git stash drop。从那以后我每次答辩前,都强制走一遍mvn clean compile+git stash,哪怕只改一行注释。
翻车 2:演示到一半,MySQL 服务崩了,Connection refused
  • 现象:页面疯狂报错,导师皱眉,你手心冒汗;
  • 后悔药:在application-prod.yml中配置 HikariCP 的initialization-fail-timeout: 0(启动时连接失败不退出),并写好docker-compose.yml备用:
    version: '3.8' services: mysql: image: mysql:8.0.33 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: alumni_db ports: - "3307:3306" volumes: - ./alumni.sql:/docker-entrypoint-initdb.d/init.sql
    答辩前 5 分钟,docker-compose up -d启一个独立 MySQL,application.yml切换url: jdbc:mysql://localhost:3307/...。
翻车 3:导师问“你们怎么测试的?”,你支吾说“我点了点…”
  • 现象:显得工程素养不足,扣分项;
  • 后悔药:把src/test/java下的AlumniProfileServiceTest.java打印出来。里面 12 个@Test方法覆盖:
    • testSearchByCity():查current_city = '北京'返回 37 条;
    • testUpdateProfileNullField():更新时传null,断言数据库字段不变;
    • testConcurrentLike():用CountDownLatch模拟 100 线程同时点赞,验证post_like表记录数 = 100。
      从那以后我每次写完一个 Service,都强制写至少 3 个单元测试,再提交代码。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询