
如果你正在为计算机毕业设计发愁或者想把手上的Java技能点整合成一个能跑、能答辩、能写进简历里的项目基于SpringBoot的社区医疗健康管理系统值得你认真研究。这个题目表面上是一个常规的管理系统但它属于典型的“业务有复杂度、技术有发挥空间”选题社区居民健康档案的建立、预约挂号、慢病随访、体检数据管理每一个环节都能做出亮点。重点在于用SpringBoot做后端MySQL存业务数据再补上权限、事务、统计这些工程细节做完之后你对Java Web实战的理解会明显上一个台阶。这篇文章我会把自己做这个项目时的完整思路拿出来讲一遍从选题判断、技术选型、数据库设计到核心功能实现、踩坑记录、扩展方向再到论文和答辩的注意事项。无论你是第一次做毕设还是想把这个项目当作秋招项目包装都能照着思路落地。1. 选题判断社区医疗健康管理系统为什么值得做1.1 社区医疗信息化的真实痛点去过社区医院的人都有体验排队时间长纸质档案容易丢慢病患者复查记录前后对不上。社区医疗机构承担着居民健康档案、慢性病随访、疫苗预约、老年人体检等工作但很多基层机构的信息化水平仍然停留在“Excel加纸质台账”的阶段。社区医疗健康管理系统本质上就是把“居民—档案—医生—随访”这条主线数字化让社区医生能快速调出签约居民的健康记录让居民能在线完成预约和查看报告。这类项目的业务复杂度正好是毕业设计最需要的它不只是一个CRUD系统而是涉及多角色管理员、医生、居民、多状态预约、就诊、随访、多类型数据基础信息、生理指标、既往病史的综合系统。正因如此这个题目一直是计算机毕业设计里的常青树。从技术角度看SpringBoot是当前Java Web开发的主流框架学习资源多、生态成熟、面试也常被问到。把SpringBoot、MyBatis-Plus、MySQL、Redis、Vue组合起来做一个前后端分离的完整项目既能锻炼工程能力也能在简历上写出一段有实感的项目经历。相比纯电商或纯管理类系统医疗健康领域有明确的业务规则和数据敏感性做完之后你自然会知道“系统设计”和“堆接口”的区别。1.2 这个题目作为毕业设计的定位先给你一个直观定位它的难度中等偏上一点点适合已经学过Java基础、Servlet/SSM或Spring基础的同学也适合想刷一个高质量项目参加校招的人。它不像秒杀系统那样高并发、高可用也不像纯仓库管理系统那样单调重心在于“业务完整性”和“工程规范性”。我整理了毕业设计通常要满足的要求你可以对照看必须有真实可用的系统能注册登录、能增删改查、能处理复杂业务状态必须有足够数量的数据表至少六张以上体现数据库设计能力必须有一个或两个技术亮点比如权限控制、定时任务、数据统计必须能写出需求分析、数据库设计、系统测试等论文章节。这些要求社区医疗健康管理系统全部能覆盖。而且这个方向有大量公开的需求文档和源码可以参考一旦做的时候卡住不至于无路可走。但我要提醒一句参考归参考一定要修改数据模型、增加自己的功能模块比如加一个健康指标趋势分析或用药提醒否则答辩时很容易被老师追问“这里为什么这么设计”答不上来就会很被动。1.3 前置技能与准备清单如果你决定做这个项目先确认自己是否具备以下基础Java基础集合、泛型、异常、Stream API能熟练使用Spring基础了解IOC和AOP的用途能看懂自动装配数据库会写SQL知道事务、索引、外键约束的概念前端基础能看懂Vue或HTML表单页会调用接口工具IDEA、Navicat或MySQL Workbench、Postman、Git。没有前端基础不用慌你可以使用SpringBoot加Thymeleaf做服务端渲染虽然不够“新潮”但胜在简单、易排查。如果想要加分再配一个Vue 3加Element Plus的前端。我的建议是优先保证后端质量和业务闭环前端用最顺手的方式做不要为了炫技把战线拉太长。2. 技术选型与项目骨架我为什么选择这套组合2.1 后端技术栈SpringBoot 2.7 MyBatis-Plus毕业设计项目不要太追求新版本稳定优先。SpringBoot 2.7是我个人用得最顺的一个版本兼容性比3.x好官方文档资料多遇到问题搜索时能拿到大量答案。如果你非要使用3.x就要注意javax和jakarta包名迁移的问题很多老代码直接复制会跑不起来。MyBatis-Plus是我强烈建议引入的持久层框架。它能在保留MyBatis灵活性的前提下提供BaseMapper、分页插件、逻辑删除、自动填充这些实用功能。对于社区医疗系统这种有大量单表CRUD的业务用它的开发速度比手写XML快得多复杂查询再写自定义SQL也完全够用。2.2 数据库与缓存MySQL和Redis要不要上MySQL是毋庸置疑的主力存储。为了演示效果建议使用MySQL 5.7或8.0统一utf8mb4字符集。Redis是否引入取决于你的系统要不要做验证码、Token和缓存热点数据。我建议引入原因有三个登录token放入Redis可以统一管理失效时间实现强制下线预约挂号时需要防止同一时段重复预约Redis的setnx能很快做并发控制首页统计信息可以缓存提高接口响应速度。但注意不要为了用Redis而用Redis。如果你的项目只是单机演示把Redis用在登录态和验证码上就够了复杂度完全可控。2.3 前端方案RESTful API Vue 前后端分离我更推荐前后端分离。后端提供JSON接口前端用Vue 2或Vue 3加Element UI或Element Plus搭建管理后台用户端可以做成微信小程序或H5。做后端管理系统时你可以参考一些开源后台模板的设计思路但千万别直接整个拿来做毕设老师一眼就能看出来。你要理解它的菜单权限、多数据源这些设计然后自己重写业务模块。如果前端基础不够也可以使用SpringBoot加Thymeleaf把所有页面放到resources/templates下服务端渲染省去跨域、Token传递这些麻烦。我当年选的是前后端分离因为想锻炼接口设计能力但这样确实要多花时间处理跨域和登录态。下面我会给出关键配置。2.4 项目分层与代码组织一个可维护的SpringBoot项目应该按“Controller—Service—Mapper—Entity—DTO/VO”分层不要把所有逻辑堆在Controller里。我的包结构如下com.health.community ├── config # 配置类跨域、MyBatis-Plus分页、Redis序列化 ├── controller # 接口层 ├── service # 业务层接口impl ├── mapper # MyBatis-Plus的Mapper接口 ├── entity # 数据库实体 ├── dto # 入参对象带校验注解 ├── vo # 返回对象聚合业务数据 ├── utils # 工具类JWT、MD5、日期处理 └── exception # 全局异常处理DTO和VO分开是我踩了几次坑之后养成的习惯。如果直接用实体类接收前端参数很容易把数据库字段暴露给前端也会导致“前端多传字段、后端误更新”的问题。使用专门的入参对象后配合NotNull、NotBlank这些校验注解接口安全性会高很多。pom.xml核心依赖如下SpringBoot版本用的是2.7.18dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdcom.auth0/groupId artifactIdjava-jwt/artifactId version4.4.0/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependencyapplication.yml里要注意几个很容易出错的地方spring: datasource: url: jdbc:mysql://localhost:3306/community_health?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 123456 redis: host: localhost port: 6379 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0url里的serverTimezone如果不写成Asia/Shanghai系统部署到服务器后很容易出现“相差8小时”的问题。日志配置成StdOutImpl可以在控制台直接看到SQL调试时极度方便。3. 数据库设计这些表是怎么一步步设计出来的3.1 核心表关系总览社区医疗健康管理系统最少需要这些表用户表、角色表、居民档案表、医生表、科室表、预约挂号表、就诊记录表、随访记录表、健康体检表、慢病信息表、公告表。表与表之间的关系我整理成一张表表名核心字段说明sys_userid, username, password, real_name, phone, role_id登录用户区分管理员、医生、居民health_archiveid, user_id, id_card, gender, birthday, height, weight, blood_type, allergy_history居民建档信息身份证唯一departmentid, dept_name, intro, doctor_count科室信息doctor_infoid, user_id, dept_id, title, specialty, schedule医生信息与排班appointmentid, archive_id, doctor_id, appoint_date, time_slot, status, fee预约挂号状态为待就诊、已就诊、已取消visit_recordid, appointment_id, archive_id, diagnosis, prescription, create_time就诊记录follow_up_recordid, archive_id, follow_type, content, next_time, create_time慢性病随访记录血压血糖等health_metricid, archive_id, metric_type, metric_value, measure_time可扩展的健康指标数据一张好的表设计不是字段越多越好取决于你要支撑哪些业务场景。比如预约表如果不把time_slot设计进去后续就无法避免医生排班冲突随访表如果next_time为空系统的“待随访提醒”功能就无从做起。3.2 居民健康档案表的设计要点健康档案是整个系统的数据基础。设计这个表时最容易犯的错是把所有信息塞到一张表里。我的建议是“基础信息动态指标”分离基础信息表存身份、联系方式和过敏史等相对固定的数据健康指标表存每次测的血压、血糖、心率用metric_type区分。这样做的好处是居民每次体检产生的数据往里追加即可不需要反复更新档案主表做趋势分析时也能直接按时间和指标类型查询SQL写起来很顺畅。档案表的身份证号建议加密存储至少要在接口返回时做脱敏展示防止明文泄露。很多同学的毕设系统被老师指出的问题就是“隐私数据直接暴露”其实你只需要在VO层做一个脱敏处理比如中间四位用星号代替就是一个小小的加分点。3.3 预约挂号表的时间窗口设计预约挂号的时间窗口设计是整个项目里最有业务复杂度的地方之一。你需要考虑医生排班以“天”为单位还是以“时段”为单位一个时段允许多少人取消预约后如何释放名额当天还能不能预约。我采用的是半天的时段切分上午、下午各开放十个号源在appointment表中存appoint_date和time_slot字段并在doctor_id、appoint_date、time_slot三个字段上建立唯一索引。这样数据库层面就能挡住同一个号源的重复预约。同时Redis里用一个key来计数比如appointment:count:{doctorId}:{date}:{timeSlot}每次预约前先incr超过上限就返回“号源已满”保证并发下的安全。这个设计的唯一索引是必须的因为前端按钮和Service层判断都可能出现并发同时插入的情况。你只靠Java代码判断“是否有余号”是不够的数据库唯一索引兜底才是正确答案。3.4 慢病管理表的边界与扩展思路慢病管理是本项目不同于普通医院挂号系统的亮点模块。对高血压、糖尿病这类慢性病医生需要定期随访。随访表除了记录随访内容和建议还应该记录随访方式电话、门诊或上门以及下次随访日期。光有记录还不够你还可以加一个提醒任务每天由定时任务扫描“今天需要随访但还没填写记录的居民”生成待办列表推送给社区医生。这个功能可以用SpringBoot自带的Scheduled实现工作量不大但答辩时非常能体现你对业务的理解。如果想让慢病管理更专业还可以拆出用药提醒表、并发症筛查表但作为毕设做到随访闭环就已经足够了。要注意随访后续可能与短信或微信推送结合这不是硬性要求却是一个很好的扩展方向。4. 核心功能实现从登录到预约这些代码可以抄但要懂4.1 登录鉴权JWT Redis 的实现方式我不建议在毕业设计里使用复杂的Spring Security加OAuth2除非你有充足时间。用JWT加拦截器已经能很好说明你对认证授权的理解。具体流程用户提交用户名密码Service层校验后在Redis中存入用户信息并设置过期时间生成JWT令牌把用户ID和角色写进token前端每次请求在Header里带Authorization: token拦截器解析token同时在Redis里检查是否存在实现强制下线功能。拦截器代码大致长这样public class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getMethod().equals(OPTIONS)) { return true; } String token request.getHeader(Authorization); if (token null || token.isEmpty()) { response.setStatus(401); return false; } try { DecodedJWT jwt JWT.require(Algorithm.HMAC256(your-secret)).build().verify(token); // 从Redis中校验是否存在若不存在说明已被强制下线 String redisKey login:token: jwt.getClaim(userId).asString(); if (!redisUtils.hasKey(redisKey)) { response.setStatus(401); return false; } request.setAttribute(userId, jwt.getClaim(userId).asString()); request.setAttribute(role, jwt.getClaim(role).asString()); return true; } catch (Exception e) { response.setStatus(401); return false; } } }生产上JWT的secret要放在配置文件中不要硬编码。答辩时老师常问“JWT过期时间放哪里”标准答案是token本身有exp同时Redis中的key也有过期时间二者取较短的那个。4.2 健康档案的增删改查与逻辑删除健康档案的CRUD看似简单但有一些设计细节要注意。第一身份证号在新增时一定要校验唯一性用数据库表上的唯一索引兜底第二修改档案时不能把未修改的字段置空所以前端要传整个表单后端需要做字段合并第三删除档案不要物理删除用逻辑删除字段deletedMyBatis-Plus里只需要在实体上标记TableLogic后续查询会自动过滤。处理档案查询时我通常会提供一个复合查询接口支持姓名、身份证、签约状态、建档时间范围。用MyBatis-Plus的LambdaQueryWrapper可以很优雅地拼条件LambdaQueryWrapperHealthArchive wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(name), HealthArchive::getName, name) .eq(StringUtils.hasText(idCard), HealthArchive::getIdCard, idCard) .between(startDate ! null endDate ! null, HealthArchive::getCreateTime, startDate, endDate);这里的condition参数很实用传入false时该条件不会生效。很多新手写查询接口时喜欢写四个if分支其实一个wrapper就能搞定。4.3 预约挂号的状态机流转预约模块最怕逻辑混乱我建议画出状态图待就诊可以转移到已就诊也可以转移到已取消已取消是终态已就诊后不能再取消。在Service层里每次状态变更都先要校验当前状态是否允许变更。实现时可以直接用枚举public enum AppointmentStatus { PENDING(0, 待就诊), FINISHED(1, 已就诊), CANCELLED(2, 已取消); }在更新状态的SQL里加一个条件where id ? and status 0这样就能避免并发情况下同一个预约被重复“取消”或“完成”这是一种乐观锁思路。如果还在Service层里先select再update那么更新时很可能因为中间状态改变而覆盖数据这是并发编程里很典型的丢失更新问题。4.4 随访提醒与数据统计报表随访提醒用SpringBoot的Scheduled就能实现。定义一个定时任务每天凌晨扫描当天需要随访的记录写入待办表。注意定时任务默认是单线程串行执行如果系统里只有这一个任务直接用没问题。如果后面加了多个定时任务要设置线程池否则会互相阻塞。数据统计报表可以包括各年龄段居民数量、慢病患病率、每月预约量趋势、医生工作量排行。用聚合查询SQL配合VO直接返回图表数据SELECT date_format(create_time, %Y-%m) AS month, count(*) AS cnt FROM appointment WHERE status 1 GROUP BY month ORDER BY month;如果不方便写复杂SQL也可以用Java 8的Stream在内存里分组统计数据量不大时完全能接受。我在答辩演示时最喜欢点开报表页图表页面一拉出来老师会觉得你的系统“有数据分析能力”这比堆一屏表格更有说服力。5. 开发中的典型踩坑每一次调试都值得记录5.1 时区问题预约时间神秘地少了8个小时第一个让我记忆犹新的坑是本地测试时预约时间正常把jar包部署到服务器后前端显示的时间总是比预约时间少8小时。排查链路如下先看数据库里的datetime发现存的时间是对的再看后端返回的JSON发现输出的时间少了8小时检查jackson配置发现没有设置time-zone默认使用了服务器时区服务器时区是UTC数据库时区是Asia/Shanghai导致转换混乱。解决方法很简单在application.yml里设置spring.jackson.time-zone: GMT8。另外数据库连接串里的serverTimezone也要统一。这类问题一定要形成排查思路先确认数据层再确认序列化层不要上来就改代码。5.2 事务失效为什么我的数据不一致在取消预约时我需要同时更新预约状态、释放号源、记录操作日志于是在方法上加了Transactional。但测试时发现如果方法内部抛异常预约状态回滚了操作日志却留下了。这通常是因为把Transactional加到了private方法或同类的内部调用上。Spring的事务代理基于AOP只有通过代理对象调用时事务注解才生效。所以正确做法是把事务注解加在public方法上不同方法之间的调用要注入自身代理或者拆成两个Service。另一个事务失效的原因是异常被吞掉try { // 业务操作 } catch (Exception e) { // 这里打印日志但没有抛出异常 }在事务管理里只有RuntimeException或Error会触发回滚默认情况下捕获后吃掉异常会让Spring误以为一切正常。我的习惯是自定义一个BusinessException在需要回滚的地方直接抛出再由全局异常处理器统一返回错误信息。5.3 跨域与拦截器顺序前端请求被奇怪地拦截前后端分离时前端从8080端口请求后端的8081端口浏览器会发一个OPTIONS预检请求。如果拦截器没有放行OPTIONS请求就会出现“前端明明登录了但所有请求都返回401”的诡异现象。记得在拦截器preHandle里判断if (request.getMethod().equals(OPTIONS)) { return true; }同时在跨域配置类里设置允许的请求头、请求源和携带凭证。很多人把跨域配置写在web.xml或Nginx层但在SpringBoot里最简单的方法是实现WebMvcConfigurer.addCorsMappings。注意allowedOrigins(*)和allowCredentials(true)不能同时使用这时候你需要指定具体的来源比如http://localhost:8080。5.4 逻辑删除与唯一索引冲突给健康档案表加了deleted逻辑删除字段后出现了新的问题同一个身份证号的居民被删除后又新增一名同身份证居民此时数据库报“Duplicate entry”错误。原因很简单唯一索引建在了id_card上逻辑删除行的id_card仍然存在。解决办法有两种唯一索引改为uk_id_card_deleted(id_card, deleted)但只对少量历史数据有效因为deleted被置为1后第二次删除该身份证又会冲突更稳妥的方案删除前先查询该身份证的历史记录若存在逻辑删除记录则执行“恢复加更新信息”的操作而不是继续插入。第二种办法需要写一个补偿逻辑在Service层做。把这个事情想清楚能反映出你真正理解了业务数据的一生而不只是会写CRUD。5.5 分页插件和自定义SQL的坑MyBatis-Plus的分页插件配置错误时分页不生效返回的还是全量数据。记得要在配置类里加入PaginationInnerInterceptor同时指定数据库类型是MySQL。还有一个容易踩的点如果写了自定义SQL并且做了多表联查分页插件生成的总数SQL可能会因为表别名而报错。解决办法是提供自定义的countSql。我在做医生工作量统计时遇到过这种问题后来直接改用两个接口一个查列表一个查总数。这样前端要调两次但代码逻辑清晰出错概率大大降低。毕业设计场景下简单可靠远比性能优化重要。6. 项目扩展把毕设做出亮点的小程序、大数据与数据采集方向6.1 微信小程序端复用后端接口如果你有余力可以为系统加一个小程序端特别适合作为“居民端”。SpringBoot后端做成RESTful API后小程序只需要通过wx.request请求同一个接口即可。需要考虑的点包括小程序登录态如何与后端JWT互通、如何缓存用户信息、如何解析手机号。小程序登录建议使用wx.login获取code然后后端调用微信接口换取openid在SysUser表中增加openid字段首次登录自动创建用户并关联健康档案。这样居民在小程序上就能查看报告、预约挂号、接收随访提醒。小程序端做好之后不仅答辩加分简历上也多了一项“全栈”能力。如果时间紧张用H5手机端打包也能达到类似效果。6.2 数据采集爬虫相关要懂业务场景和合规边界题目里提到“爬虫”在很多毕设中通常指“利用爬虫技术从公开网站采集健康资讯、药品信息、疾病百科”等。比如你要在系统首页展示健康科普文章完全可以使用爬虫采集公开的科普数据但必须注意只采集公开且允许抓取的数据遵守网站的robots协议不涉及用户隐私、不绕过登录或验证码采集下来只用于学习研究注明数据来源。如果要采集药品数据推荐使用Python的requests加BeautifulSoup也可以直接在SpringBoot里用HttpClient加Jsoup实现。Jsoup是一个纯正的Java库适合采集静态网页。但要注意网站结构经常会调整爬虫代码很容易失效所以采集功能建议做成定时增量采集而不是一次性跑完。另外千万别把爬虫写成攻击性脚本或者抓取隐私数据这是红线在论文里也要突出“合规采集”。健康数据本身很敏感系统里的居民数据更不能被随意爬取这部分要重点做权限保护。6.3 大数据分析用Flink或Spark对毕设来说可能太重提到“大数据”很多毕设题目会加“基于XX大数据分析”但社区医疗系统在数据量有限的前提下直接上Hadoop、Spark是杀鸡用牛刀。如果你的项目确实想展示大数据能力可以做离线分析把数据库中的健康数据导出到Excel或CSV用Python pandas做统计或者写一个定时任务把预约、随访数据同步到ClickHouse再用报表展示。毕设里更聪明的做法是不引入重型框架而是在系统中实现数据统计模块用SQL完成聚合分析再通过ECharts可视化展示。然后在论文里说明当数据量达到百万级时可平滑迁移到Spark或Flink。这样的表述既有技术含量又不会被老师追问“你数据量多大为什么要用Spark”。如果没有真实大数据场景强行引用框架反而容易露怯。6.4 部署上线一台服务器搞定还是本地演示最后是部署。毕业设计一般不需要公网上线但至少要在演示时能稳定跑起来。我建议你准备一套Docker Compose环境把MySQL、Redis、SpringBoot后端、Vue前端放到几个容器里。这样做的好处是换电脑演示时一条命令就能启动整个系统不用一步步装环境。如果不太熟悉Docker那至少要做到数据库初始化脚本可重复执行、后端jar包能一键启动、前端打包后能部署到Nginx。把这些提前写在README里答辩时老师要看源码你的工程规范性就有了。7. 毕设交付与答辩论文怎么写、演示怎么演7.1 论文结构参考毕设论文通常包括绪论涵盖背景、意义、国内外现状关键技术介绍需求分析系统设计包括架构设计、功能模块设计、数据库设计系统实现系统测试总结与展望。不要把代码整段贴进论文而是用功能截图加核心逻辑描述。数据库设计章节要放ER图和主要表结构字段注释要完整。写论文最忌讳的是“技术名词堆砌”。比如写了“本系统基于Redis实现缓存”但正文里没有说明缓存了什么、缓存淘汰策略是什么这会被视为不懂装懂。宁可少写技术点也要把写进去的每一个点讲明白。7.2 演示路径如何让老师快速看到亮点演示不要从头开始点所有菜单建议设计一条业务主线管理员登录创建医生账号和科室居民注册并完善健康档案居民预约某个医生医生登录查看预约并填写就诊记录医生发起慢病随访生成随访提醒管理员打开统计报表查看预约趋势和居民健康分布。跟着这条业务线走能展示你完整的设计思路。演示前一定要把数据库清空重跑一遍初始化脚本确保时间、状态都是最新数据。我还见过有人演示时把“个人中心未完成”的菜单点开导致老师看到半成品页面非常扣分。完成度低的页面宁可先隐藏。7.3 答辩必问问题清单提前准备这些问题的答案会有效降低紧张感为什么选择SpringBoot而不是SSM可以答自动配置、生态成熟、快速开发但底层仍是Spring数据库有哪些表之间关系是什么准备好你设计的表关系图预约并发怎么处理数据库唯一索引加Redis计数JWT和Session有什么区别无状态、可横向扩展但要配合Redis做主动失效遇到过哪些难题怎么解决的挑一两个上面踩坑的例子。答辩时只要能把一个技术点从“为什么要用”讲到“内部原理”就比泛泛地提五个技术名词强得多。我自己的经验是老师最喜欢追问的不是你怎么写代码而是你怎么做决策。把做决策的思考过程写进论文里就已经赢了大多数人。最后再分享一个小技巧整个项目调试过程中一定要保持Git提交记录清晰每个功能模块一个commit。这不仅是为了防止代码丢失也是答辩时展示工程素养的加分项。当你认真做完这个系统你会发现不光是SpringBoot变得更熟了对“数据怎么设计才合理”“接口怎么拆才好用”也会形成自己的判断。祝顺利通过答辩。