ARTICLE DETAIL

资讯详情

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

基于Java的九价疫苗预约系统开题答辩复盘

基于Java的九价疫苗预约系统开题答辩复盘 九价HPV疫苗“一苗难求”这几乎是最近几年女性健康话题里出现频率最高的现实痛点之一。线下排队、电话问询、社区群蹲号最后能不能约上全凭运气和手速。把这个场景做成毕业设计题目就落在了“基于Java的九价疫苗预约系统”上。我当时完整走了一遍开题答辩流程从选题立意、技术选型、核心库表设计到老师现场抛出的多个Java相关问题整个过程非常值得复盘。如果你也是计算机相关专业、正打算做管理系统或预约类项目或者单纯想用好Spring Boot MySQL Redis做一套具备真实并发场景的系统这篇记录应该能帮你少走不少弯路。1. 答辩前夜先想清楚“为什么做”和“凭什么能做”1.1 选题立意九价疫苗预约系统的真实价值开题答辩老师第一句话通常不是问技术而是问“你为什么选这个题目”。这个问题答不好后面技术再炫也会被扣印象分。我的经验是选题不要只写“因为九价疫苗很火”而是要把“真实需求”和“技术空间”讲清楚。九价疫苗预约为什么适合做信息系统首先是供需矛盾突出。疫苗供应量有限但适龄人群基数大放号瞬间被抢空是常态。这个背景天然带来了高并发、库存扣减、防超卖、防脚本刷号等一系列问题而这些恰好是计算机专业学生能展示能力的地方。其次是业务边界清晰。用户注册登录、浏览批次、预约、取消、后台放号、审核、统计所有角色和流程都能用成熟的技术方案落地不会做到一半发现需求不可控。最后是数据可验证。预约系统的核心规则——比如同一身份证不能重复预约、号源不能超卖、过期号源自动释放——都是能被写测试用例验证的硬逻辑这在毕设得分上非常有利。这里要特别提醒一点选题别贪大。我见过有人把“疫苗预约”扩展成“疫苗全流程管理平台”又要对接疾控、又要做冷链监测、又要开发小程序和APP结果开题答辩直接被问蒙。开题阶段的系统边界一定要收窄九价疫苗预约就聚焦“预约”二字后台放号、用户抢号、预约记录管理把这条主链路做扎实已经足够优秀。1.2 开题报告里的技术选型不能拍脑袋技术选型是开题答辩里第二个高概率问题区。老师不一定要求你用最前沿的技术但一定会问你“为什么选它”。我当时的技术栈是Java 8 Spring Boot 2.7 MyBatis-Plus MySQL 8 Redis Vue辅助工具是Maven、Git、Postman。为什么用Java而不是Python或Go我的回答逻辑是这是管理系统类项目的经典选择。Java生态成熟相关资料最多遇到问题几乎都能搜到解决方案这对毕设阶段来说非常重要。Spring Boot解决了传统SSH/SSM里大量繁琐配置问题自动装配、内嵌Tomcat、健康检查、指标监控这些能力开箱即用能让项目快速跑起来而不是把时间耗在配置XML上。MyBatis-Plus则是在MyBatis基础上的增强单表CRUD不用写SQL分页插件、代码生成器也都现成能极大提升开发效率。Redis的引入是这套选型里最能体现思考深度的部分。九价疫苗预约的核心场景是“抢号”一个批次的疫苗号源有限大量用户在同一时间点提交请求。如果把所有请求都直接打到MySQL上数据库很容易成为瓶颈。Redis基于内存读写单线程模型下仍然能支撑每秒数万次的命令执行非常适合做库存预扣减、接口限流和热点数据缓存。我当时的表述是“数据库负责最终落库Redis负责扛住瞬时流量二者通过异步方式保持一致。”这句话在答辩现场非常加分因为老师能看到你做过架构层面的权衡。1.3 把“进度安排”写成人话老师更愿意买账开题报告里的进度安排很多同学喜欢照着模板抄“第1周需求分析第2周概要设计……”这种写法没有错但它没有说服力。老师更想看到的是一个符合实际开发规律的节奏安排至少能说明你对项目体量有概念。我当时的时间表是分四段排的。第一阶段用两周左右搭骨架包括项目初始化、数据库设计、通用返回结构、异常处理、JWT登录认证。第二阶段用三周做核心业务包括疫苗批次管理、放号计划、用户预约、库存扣减、预约取消与过期释放。第三阶段用两周做辅助功能包括后台统计报表、预约记录导出、接口文档整理。第四阶段用一周做联调测试、压测和论文初稿。这里有个小技巧进度安排里一定要预留“缓冲时间”。我写的是四周半实际开发中肯定会遇到环境问题、数据问题、逻辑遗漏如果进度排得太满答辩时老师追问“你目前推进到哪了”会非常被动。另外开题答辩不等于项目已经完成老师更在意的是你有没有能力在接下来的时间里把它做完所以进度安排本质上是在证明“你的计划可执行”。2. 开题报告的核心模块与数据库设计怎么讲才不虚2.1 系统角色与核心业务流程拆解开题答辩中讲系统功能时最忌讳照着功能模块图念名字“本系统分为用户模块、预约模块、管理模块。”这等于什么都没讲。更好的方式是把角色和业务流程串成一条线让老师听明白这套系统是怎么运转的。九价疫苗预约系统的角色很清楚普通用户、系统管理员。用户端核心场景是注册登录、浏览可预约批次、申请预约、查看预约结果、取消预约管理端核心场景是维护疫苗批次、制定放号计划、查看预约列表、管理用户、统计预约数据。如果把业务流程画成人话版本就是管理员创建疫苗批次并设置号源总数然后开放放号时间用户登录后在放号时间点提交预约请求系统先校验用户身份和资格再扣减号源扣减成功则生成预约记录处于“已预约”状态用户如果取消预约号源回补预约时间过期仍未接种状态变成“已过期”号源过期作废或重新释放。这套业务逻辑里有一个关键点必须提前定义清楚同一用户对同一批次能否重复预约我的设计是同一身份证号在同一批次只能有一条有效预约记录有效状态指“已预约”或“待核销”。这个约束用数据库唯一索引加业务层校验双重保障也是答辩时老师爱问的细节之一。2.2 数据库表设计我画了哪几张表、为什么这样画开题答辩如果时间有限数据库设计不一定全部展开但核心表结构必须能讲明白。老师非常喜欢问“你这几张表的关系是什么”“为什么这个字段要这样设计”。我当时的表设计相对精简总共四张核心表。一张用户表字段包括用户ID、姓名、身份证号、手机号、密码密文、性别、年龄、创建时间。身份证号加唯一索引这是预约资格校验的基础。一张疫苗批次表字段包括批次ID、疫苗名称、生产厂家、总号源数、剩余号源数、放号开始时间、放号结束时间、批次状态。批次状态用枚举表示例如未开始、放号中、已约满、已结束。一张预约记录表字段包括预约ID、用户ID、批次ID、预约编号、预约状态、创建时间、更新时间、乐观锁版本号。其中预约编号用时间戳加随机数生成方便后续核销。这里要重点解释version字段的用途。在“抢号”场景下两个用户同时预约最后一个号源如果直接用“先查询剩余号源数再判断大于0然后update减一”的逻辑数据库层面很容易出现超卖。我的方案是给预约记录表添加version字段更新时带上version条件例如“update appointment set status 1, version version 1 where id ? and version 0”如果更新影响行数为0说明版本已变化预约失败。这种乐观锁方案在开题答辩里非常常见也是老师检验你是否理解并发控制的一个重要考察点。2.3 预约放号的核心规则怎么避免“超卖”“超卖”这个问题几乎每个做预约类项目的同学都会被问到。九价疫苗预约系统里号源数量有限同一时间大量用户请求如果没有合适的库存控制方案就会出现“预约成功人数超过号源总数”的事故。开题答辩时我准备了三种方案作为对比。第一种是纯数据库方式用事务加for update行锁。每次预约请求开启事务执行“select * from vaccine_batch where id ? for update”锁住该批次记录然后检查剩余号源数如果大于0则扣减并提交事务。这种方案的优点是逻辑简单绝对可靠缺点是数据库行锁在并发高时会拉长等待队列性能天花板较低。第二种是基于乐观锁的方式。更新剩余号源时带上版本号或条件“where quantity_left 0”影响行数为0就提示“号源已被抢完”。性能比行锁好一些但高并发下会有大量无效请求打到数据库。这种方案适合对数据一致性要求极高、并发量适中的应用。第三种是Redis预扣减的方式。放号前把号源总数加载到Redis用户请求到达时先执行Redis的decrement原子操作减出来的值大于等于0则说明抢号成功然后异步把预约记录写入数据库减出的值小于0则说明号源不足直接返回“已约满”。这个方案是把流量挡在数据库前面扛并发能力最强也是我当时计划采用的方案。老师听到这里通常会眼睛一亮接下去就会追问Redis相关原理这就是下一章要说的高频问答区。3. 答辩现场问答实录Java方向高频问题全收录3.1 第一波选题动机、可行性与业务边界第一个问题很常规你这个系统面向的用户是谁我当时回答主要面向适龄且有九价疫苗接种需求的群体以及社区卫生服务中心的疫苗管理人员。系统不做私人诊所的对接只做预约管理本身。这个回答给自己圈定了边界避免后续被追问“你怎么对接疾控中心数据”“你怎么保证疫苗冷链运输信息”这些问题。第二个问题紧随其后你觉得这套系统和12306抢票、淘宝秒杀本质上有区别吗我的回答是没有本质区别都是典型的“高并发库存扣减”场景区别只在于系统规模和数据量。12306要考虑余票计算、席位分配、分布式事务我的系统更侧重单体应用下的性能优化和数据一致性。老师点头说明我至少清楚自己的系统定位。第三个问题是关于数据来源的系统的疫苗批次信息从哪里来我回答疫苗批次由系统管理员在管理端维护来源以官方公示的接种点信息为准系统本身不接入外部数据源所有业务数据由后台人工录入或系统生成。这类问题其实是在考察你有没有考虑过业务数据的真实性一定要给出明确来源不能含糊。还有一个差点翻车的追问如果两个不同用户一个用户先点了预约但还没付款/确认另一个用户随后也点了预约最后一个号源给谁这个问题本质上是在问预约状态机的过渡方式。我的设计是预约不涉及在线支付用户点击预约会进入“预占号源”状态此时号源已经被扣减但预约记录处于待确认状态。系统允许用户在一定时间内确认或取消超时未确认则自动释放号源。所以最后一个号源会给到最先提交预约请求且完成预占的用户。老师听完表示逻辑自洽但提醒我“超时释放的时间窗需要认真设计不然用户体验会很差”这个提醒后来被我写进了需求文档。3.2 第二波Java基础与Spring生态原理这波问题开始进入Java八股文区域。老师问的第一个问题是Spring Boot的自动配置是怎么实现的这种问题如果你只看过网上的面经可能会背出一堆“EnableAutoConfiguration”“spring.factories”之类的名词但最好还是用自己的理解讲清楚毕竟开题答辩不是机械背题。我当时的回答思路是Spring Boot在启动时会扫描META-INF目录下的自动配置类这些类上带有ConditionalOnClass、ConditionalOnMissingBean等条件注解只有当项目里引入了对应的依赖类时自动配置才会生效。比如引入了spring-boot-starter-data-redis自动配置类才会配置RedisTemplate。启动过程本质上是一个“按需装配”的过程。回答完我还补了一句“类似逻辑我还用来排查过RedisTemplate序列化方式不对导致存储进去的key带了前缀的问题。”这算是一个展示动手能力的信号老师们通常都吃这一套。紧接着老师问MyBatis框架里#{}和${}有什么区别这个问题在项目开发里非常实际。我回答#{}是预编译占位符对应JDBC的PreparedStatement可以防止SQL注入${}是纯字符串拼接虽然在一些动态场景比如排序字段、表名场景里要用但直接把用户输入拼进去会有注入风险。我的项目里排序字段做了白名单校验不允许前端直接传列名拼接。还有一波问题是围绕Java集合的你在项目里都用到哪些集合为什么要用这里不用背源码但要能讲出实际场景。我说用户提交预约信息时前端传过来的是一个JavaBean后台需要用Map来接收查询参数统计预约数量时用ArrayList存储查询结果需要保证批次ID和名称映射有序时用LinkedHashMap另外在计算某个批次预约人数时我用了Stream的groupingBy按批次分组配合lambda表达式一行代码就能完成分组计数。老师追问HashMap线程安全吗我说不安全多线程写场景下会出现数据覆盖所以并发场景我用ConcurrentHashMap或者直接用Redis原子操作。这个回答自然引出了后面的并发问题算是我有意埋的一条线。老师还问到一个和项目很搭的问题项目里用到了排序算法吗可能因为关键词里一直有人问冒泡排序Java和快速排序Java。我说预约列表中需要按预约创建时间倒序排列数据库层面用order by即可在DTO组装时我用Comparator和lambda表达式对预约记录按时间排序这里的排序由Java底层归并排序实现稳定性好。随即补了一句“如果需要把一批待核销记录按身份证号排序我也会用Java的sort方法不会自己手写排序算法但如果老师想让我对比冒泡和快排的时间复杂度我也能展开。”老师笑了一下这个问题就算过了。3.3 第三波并发、缓存与数据库一致性的硬核追问这波问题是开题答辩的重头戏因为评审老师都清楚预约系统的难点在并发控制。第一个问题是你说用Redis做库存预扣减那Redis的decrement方法报not an integer or out of range怎么办这个问题其实很实战。RedisTemplate的increment方法当key对应的value不是数字类型时会抛出RedisDataIntegrityViolationException底层原因是把字符串或其他类型当成整数做了原子自增。我的处理方式分两层第一层初始化key时使用StringRedisTemplate的set方法写入长整型字符串确保类型正确第二层所有扣减操作统一通过increment(key, -1)执行不要把别的业务数据放到同一个key里。另外代码层面加一个异常分支捕获到类型转换异常时主动删除错误key并重新初始化避免影响后续请求。老师对这种“遇到过坑、有应对方案”的回答通常比较认可。然后老师问缓存和数据库不一致怎么办我的设计思路是“Redis只存储号源数和热点批次信息预约记录的最终状态以MySQL为准”。请求进入后先走Redis扣减扣减成功后写一条待确认的预约记录到数据库。如果写库失败需要补偿操作把库存回补到Redis。这里的一致性无法做到绝对强一致但通过记录补发和定时对账可以做到最终一致。老师追问如果Redis在扣减后、写库前宕机了库存数和数据库实际数据就不一致了怎么办我的回答是启动一个定时任务每隔一段时间扫描Redis中的剩余号源数和数据库的实际已预约数量做差值比对如果发现不一致以数据库为准修正Redis中的库存同时标记异常记录供人工排查。这是一个标准的“对账补偿”思路老师觉得虽然没有引入消息队列和分布式事务但对毕设体量来说已经足够。还有一个必问的问题是为什么Redis是单线程的还这么快我回答因为Redis基于内存访问大量的时间消耗在网络IO上而不是磁盘寻址。Redis采用多路复用模型单线程避免了线程切换和锁竞争的开销同时所有命令按顺序执行天然没有并发安全问题。性能瓶颈主要在内存和网络带宽而不是CPU。回答完我还补充了一句所以用Redis做库存预扣减的时候核心命令都是原子性的我自己不用额外加锁。这里把“原子性”和项目场景挂上了钩。紧接着是缓存三大经典问题缓存穿透、缓存击穿、缓存雪崩。我的回答是穿透用布隆过滤器或缓存空值击穿用互斥锁或逻辑过期雪崩用随机过期时间和多级缓存。同时结合项目场景用户查询不存在的批次号属于穿透风险所以缓存未命中时会缓存一个短时空值某个批次刚开放放号属于热点数据击穿风险所以预约高峰期只允许请求穿透到数据库一次其他请求在Redis上等待所有缓存key的过期时间都做了随机偏移避免大批key同时失效。老师还问了一个系统设计问题如果一个用户把身份证号填错了但预约已经成功怎么处理我说预约记录生成后用户可以主动取消但取消次数会有限制防止恶意用户反复占用号源如果发现填错需联系管理员后台修改或作废记录。管理员审核时也会检查身份证号格式和实名制信息和用户表中的历史记录比对系统会拒绝同一身份证号重复预约。老师接着问同一身份证号重复预约你靠什么保证我答数据库对user_id vaccine_batch_id status字段加唯一索引业务层再做一次存在性判断双保险。这个“唯一索引兜底”的细节是开题答辩里非常棒的回答建议大家讲数据库设计时主动拿出来。3.4 第四波环境与部署的“隐形雷区”答辩进行到后半段老师可能会从技术原理回到工程项目本身问一些更琐碎但非常实际的问题。这些问题在网上很容易被忽略但真遇到了非常卡人。第一个问题你的项目在别的电脑上怎么跑起来这听起来像聊天实际上是考察“可交付性”。我回答项目用Maven管理依赖环境变量配置好JAVA_HOME后在命令行执行mvn spring-boot:run就能启动。数据库脚本放在项目的sql目录下初始化时自动执行。Redis需要本地启动并配置密码。我讲到这里老师追问了一句你没有考虑过别人环境里没有JDK或者版本不对怎么办我补答项目使用的是Java 8Maven打包时会校验编译级别如果本地JDK版本过高或过低编译期会直接报错我在README里写了Java版本要求也写了一个环境检查脚本。第二个问题很经典你遇到过ClassNotFoundException或者NoClassDefFoundError吗怎么排查这类问题在Java项目里很常见尤其把项目从一台电脑迁移到另一台电脑时依赖包不完整就会触发。我的排查思路是先在IDE里检查Maven依赖是否完整然后mvn dependency:tree看依赖树确认缺哪个包最后检查是不是因为本地仓库被清理导致jar包丢失重新导入或指定版本解决。如果运行时才报NoClassDefFoundError则优先怀疑某个类在编译时存在但运行时缺失典型情况是某个依赖只在compile作用域没被打进运行包。第三个问题是关于Lombok的你代码里用了Data注解但有时候编译会报错提示you arent using a compiler supported by lombok怎么解决这个问题对应的实际情况是IDE里的Lombok插件没装或者Java版本和Lombok版本不兼容。我的处理方法是先确认pom中lombok版本和JDK版本匹配升级到较新版本再检查IDE是否安装了Lombok插件并开启注解处理最后在Maven编译时如果仍然报错可以在编译器参数里加上annotationProcessorPaths显式指定lombok。这个回答比较完整老师能明显感觉到我是踩过这些坑的。第四个问题考的是基本功Java中数组越界异常什么情况下发生这算是一道送分题但也常被用来验证基础扎实程度。我说访问数组不存在的位置时抛ArrayIndexOutOfBoundsException比如循环边界没有控制好写成了i length实际项目里比较多的是从List转数组后再下标取值没判断空值直接取第0个。我的习惯是所有容器取值前先判空和判定size。同时我补了一个原则能用增强for或Stream时尽量不用原始下标降低越界风险。还有一道和环境变量直接相关的题JAVA_HOME配置不对会发生什么这个问题的实际场景是我在答辩演示前就遇到过。我答如果JAVA_HOME没有配置或指向了错误目录命令行执行java -version正常但某些基于Java的工具可能找不到JDK如果是启动Spring Boot项目可能出现“Error: Could not find or load main class”或者“Java Home is not valid”这类提示。解决方式就是在系统环境变量里重新设置JAVA_HOME并把%JAVA_HOME%\bin加入Path。为了更严谨我还在答辩PPT里放了张检查命令的截图java -version、javac -version、echo %JAVA_HOME%让整个排查有据可查。3.5 问答速查表开题答辩现场高频问题一句话版除了上面展开的详细问答我还整理了一张速查表方便所有准备答辩的同学快速过一遍高频考点。这张表你不用背下来但每个问题都要能说出一两句话至少不会冷场。提问方向核心问题一句话回答思路项目背景为什么选九价疫苗预约系统痛点真实、需求清晰、技术有挑战技术选型为什么用Spring Boot生态成熟、配置简化、适合快速交付业务规则同一用户能否重复预约同一批次同一身份证只允许一条有效记录并发控制怎么防止超卖Redis原子扣减加数据库唯一索引兜底数据库优化MySQL索引为什么用B树树高矮、磁盘IO少、范围查询友好Java基础HashMap底层数据结构数组加链表转红黑树扩容基于负载因子Java新特性lambda表达式用过吗Stream分组统计、集合遍历排序等场景框架原理MyBatis-Plus和MyBatis区别MyBatis-Plus增强CRUD、分页、代码生成安全控制用户密码怎么存储BCrypt加盐哈希不存明文部署运维系统怎么部署单体应用Maven打包单机RedisMySQL异常处理OutOfMemoryError怎么排查jps查看进程jmap导出堆jstat观察GC前端交互项目有前端吗有Vue或Thymeleaf渲染页面测试方案你怎么保证功能正确单元测试加Postman接口测试加压测扩展方向后续可以怎么扩展微服务拆分、消息队列、分布式部署这张表适合打印出来贴在电脑前每天过两遍。到真正答辩时就算紧张肌肉记忆也能帮你撑住前三秒。4. 开题答辩的翻车点与急救话术4.1 老师不会明说但一定会问的3个细节开题答辩里老师除了问技术问题还会考察项目是否“可落地”。有几个细节他们嘴上不说但其实一定会从你的回答里找蛛丝马迹。第一个细节是普通用户能不能绕过预约界面直接调用后台接口换句话说接口层的安全校验怎么做。我当时的设计是登录后发放JWT令牌每次请求带令牌后端拦截器统一校验对预约接口额外加了“只能提交当前用户ID的预约请求”的校验防止水平越权修改他人预约。如果你在开题阶段完全没提这个点老师一旦追问“你怎么防止别人改我的预约信息”就会比较被动。第二个细节是有人用脚本在放号瞬间狂刷接口怎么办这个问题直接关系到系统的公平性。我的方案是第一层接口限流用Redis的incr统计同IP或同用户在一秒内的请求次数超过阈值返回“操作太频繁”第二层预约前增加一个简单的前端加密参数作为轻量校验挡住一批用脚本直接POST接口的请求第三层后台日志记录请求频率异常IP或账号加入黑名单。这套方案不能完全阻止脚本但足够证明你有安全防护意识。第三个细节是管理员误操作怎么办比如放号时不小心多放了100个号源。这个问题的本质是管理端操作审计和状态机约束。我的设计是修改放号数量时需要二次确认弹窗每次变更都会记录管理员操作日志留下操作人、操作时间、变更前后值。如果放号已经进入预约阶段批次下的号源以后台设置为“已约满”为主不能直接修改总数。老师追问我还会补充“人工审批比技术手段更有效”这句话反而显得务实。4.2 “不知道答案”时怎么接话不冷场开题答辩最怕遇到不会回答的问题。但说实话老师问的问题范围太广不可能每个都答得完美。关键在于你不会答的时候怎么接话。一个比较通用的应急框架是先复述问题再限定边界最后给出临时方案或后续计划。举个例子老师问“你知道分布式事务的最终一致性怎么实现吗”如果我对这块了解不深我会这样回答“老师我理解你问的是预约系统和库存系统之间的数据一致性问题。在我的系统里目前生产环境是单体架构Redis和数据库之间的最终一致性是通过本地定时任务对账实现的。如果后续要把系统拆成微服务我计划用本地消息表加消息队列的方案先把预约消息写入数据库本地表再由MQ发送到库存服务保证两边都能落地。”这段话既没有装懂也展示了我有“扩展思考”的能力。另外一个很重要的原则是不要沉默超过五秒。哪怕你只能说“我不确定但我可以从这个角度分析”都要比站在那里不说话强。老师考察的是你的思维习惯不是一定要把你问倒。我在答辩前专门拉着同学模拟了三四轮专门练这种“半会不会”的时候怎么接话到现场果然用上了。4.3 答辩PPT的最后一页不要写“谢谢观看”这个小细节很多人会忽略。开题答辩的PPT最后一页如果只写“谢谢观看”等于浪费了最后一个展示机会。老师给分靠的是整体印象最后一页往往会被停留最久为什么不用来强化重点我当时最后一页写的是“核心难点与应对方案”用三行字列出了库存并发扣减的方案选择、预约状态机的设计、接口层安全防护。每一行右侧标注了“已设计”“待验证”“开发中”的状态。老师看完之后反而针对这些状态提了更具体的问题而不是泛泛问“你这个系统能不能做完”。所以我的建议是最后一页放3个你最有自信讲清楚的关键技术点配上一句“以上是本项目的主要设计思路希望在后续开发中逐一验证和完善”比单纯的“谢谢观看”要专业得多。5. 答辩结束后的启动清单从开题报告到毕业设计的高效过渡5.1 开题通过后第一个月应该先写什么开题通过不等于万事大吉真正的开发才刚刚开始。很多同学败在“开题时想得太复杂动手时不知道从哪开始”。我分享一下自己当时第一周的顺序亲测有效。第一件事不是写代码而是写接口文档和数据库建表脚本。数据库是系统的地基四张核心表的字段和索引确定下来后后续功能开发就不会反复推倒重来。第二件事是搭建Spring Boot项目骨架包含统一返回结构、全局异常处理器、Result类、跨域配置、JWT工具类和应用配置。这个骨架搭好后后面每个模块都是往里填肉。第三件事是实现登录注册功能虽然这是最基础的模块但它能帮你跑通完整链路前端请求、Controller接收、Service处理、Mapper查库、Token签发、拦截器校验。只要这条链路通了后面的预约模块就是在同一个模板上复制扩展。我当时对自己的要求是第一周必须跑通“注册—登录—访问受保护接口”这条链路。只要这一步完成后续的疫苗批次管理、预约记录、库存扣减等模块都能按类似的架构去加写起来非常顺手。相反如果一上来就研究高并发那一套很容易把项目卡死在环境配置和依赖问题上迟迟拿不出可演示的成果。5.2 给Java技术栈同学的3个保命建议结合我自己的实际经验给准备用Java做毕业设计的同学几个建议。第一所有用到的技术栈都要亲手跑一遍最小样例。比如你打算用Redis做库存预扣减不要等写到预约模块时才去查API先用一个测试Controller模拟100个请求并发decrement观察最终值和预期是否一致。把坑提前踩完比在答辩前夜才被环境问题折磨要舒服得多。我在开题后就花了半天时间写了一个压测小案例后来预约模块的代码几乎是从这个测试案例里直接改过来的。第二把commit记录当成项目进度证据。Git提交历史就是你的开发日志答辩时老师问“这个功能做了多久”“这个Bug是怎么修的”你打开Git记录就能讲出故事。我当时每个模块完成一个核心功能就commit一次消息写清楚“完成用户登录Token签发”“修复预约超卖问题”这些记录在最终答辩和论文写作时非常有用。第三不要在系统里使用你完全没把握的技术。开题报告里写了什么最终答辩时最好就做什么。如果实现过程中发现某个方案太难可以提前和老师沟通调整方案但不要在答辩现场突然说“我换了一种技术”。老师对“技术选型一致性”是有期待的。比如你在开题报告里写了用Redis做库存扣减那最终系统必须真的用Redis不能只在某个角落写个demo就完事。很多同学容易把开题答辩当成一个“走形式”的环节但我的体会是完全相反。开题答辩其实是一次低成本的压力测试老师问的问题、指出的漏洞都是代码还没写出来之前最宝贵的修正机会。我印象最深的一个瞬间是老师问我“你怎么证明你的系统真能扛住抢号”我当时愣了一下然后回答“我会在开发环境用JMeter模拟1000个并发请求把压测报告作为测试文档的一部分”。这个回答不仅让老师看到了我的计划也让我在后来的开发过程中真的去做了压测。所以说答辩时那些让你有点慌的问题恰恰是你后面最应该认真研究的问题。把这篇文章里记录的问答过程当成一面镜子提前把自己的弱点找出来远比抱着侥幸心理去碰运气要稳妥得多。
返回列表