ARTICLE DETAIL

资讯详情

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

SpringBoot+SSM校园超市购物系统毕设全流程复盘

SpringBoot+SSM校园超市购物系统毕设全流程复盘 每年一到毕设季总能看到一圈人围着“选题”两个字发愁。如果你手里正好挂着“校园生活超市购物系统的设计与实现”这类题目或者你想在Java Web方向找一个能完整落地、工作量适中、答辩不容易被追问到崩溃的项目那这篇复盘应该能帮上忙。我完整做过SpringBoot SSM组合的校园超市购物系统包括选题、技术选型、建库建表、核心业务开发再到写论文、打包部署、参加答辩中间踩过不少坑这篇就一次说清楚。文章不打算按教科书顺序把SpringBoot和SSM重新讲一遍而是从“你要复现它、要写论文、要过答辩”的角度把那些真正影响进度和质量的细节摊开。内容会涉及选题价值、技术栈怎么自圆其说、功能模块边界、数据库建模、下单这类核心逻辑如何处理并发和一致性问题、论文目录怎么安排以及最后的打包部署和答辩准备。适合正在准备SpringBoot相关毕设或者想用一套后台管理系统来练手的同学。1. 为什么“校园生活超市购物系统”是性价比很高的毕设选题1.1 校园场景自带真实业务不做“空中楼阁”很多毕设项目的通病是业务空洞比如做一个“某某信息管理系统”只有增删改查没有任何业务张力老师看一眼就会问“这个系统解决了什么实际问题”。校园生活超市购物系统不一样它有明确的业务场景学生用户有注册登录需求有浏览商品、加购物车、下单结算的需求管理员有商品管理、库存管理、订单管理、数据统计的需求。这个场景非常贴近生活任何人都能在五分钟之内理解系统要干什么。而且校园超市有真实的业务痛点课间和饭点是下单高峰收银台排队严重学生希望看到商品库存和价格最好在线下单、宿舍自提或配送超市需要快速上架新商品、调整促销价格、处理过期临期商品。把这些问题抽象成软件功能就是商品管理、分类检索、购物车、订单、支付模拟、库存预警等模块整套系统做下来既有逻辑深度又不会失控。1.2 难度弹性大适合不同基础的同学这也是这个选题最讨喜的地方它的难度可深可浅。基础一般的同学可以把重点放在标准的CRUD流程上把SpringBoot SSM的请求流转跑通做一个功能完整的单体系统一样能写出像样的论文。基础不错的同学可以在某些点做深比如用乐观锁处理并发扣库存把订单状态做成有限状态机引入Redis做商品缓存甚至接入MinIO做商品图片文件存储。这部分深度在论文里可以单独列一小节答辩时是非常好的加分项。我见过不少选题很大的同学比如“校园智慧生活服务平台”一听就宏大结果做出来只有五六个页面。这个项目不会有这种问题因为“购物”本身就是一个完整闭环从浏览到下单到发货每个环节必须有数据流转很难敷衍。对于要快速毕业、又想把论文写得有模有样的人来说这个题目属于典型的上等马。1.3 与课程体系高度匹配老师认可度高SpringBoot和SSM是绝大多数高校Java Web课程的核心内容选这个题老师不用花时间理解你的技术栈。如果你用了一个老师没听过的框架答辩时大概率会被反复追问而SpringBoot SSM属于“标准答案”式的组合沟通成本极低。同时网上关于这类项目的参考代码、开源项目、教程数量非常多遇到问题能搜到大量解决方案不会卡在一个环境问题上三天出不来。2. 技术选型论证SpringBoot和SSM到底是怎么配合的2.1 框架分层与各自职责很多人搞不清楚一件事SpringBoot和SSM明明是两套东西为什么可以一起叫“SpringBoot SSM”。其实要拆开看SSM指的是Spring、SpringMVC、MyBatis这三个框架的组合Spring负责对象管理和事务SpringMVC负责HTTP请求的分发和响应MyBatis负责数据库持久化。SpringBoot则是把这些框架整合起来的一套“快速开发脚手架”它通过自动配置把大量XML配置削减掉让你能通过少量配置就启动项目。选型时我建议坚持一个原则项目里真正管业务的一定是SSM这一套SpringBoot只是“电梯”。SpringBoot负责把Spring、SpringMVC、MyBatis自动装配好内嵌Tomcat帮你免去部署麻烦Spring负责Service层的Bean管理和事务边界SpringMVC负责Controller层的请求映射、参数绑定和视图跳转MyBatis负责Mapper层把SQL映射成Java对象。这样每一层职责都明确论文里画框架图也清晰。千万别把SpringBoot理解成一个独立于SSM的东西它更像是SSM这套体系在新时代的“快速启动器”。实际项目里我是这样划分代码包的controller接收请求、校验参数SpringMVC负责把前端传来的JSON或表单数据绑定到DTO对象。service业务逻辑比如下单要查库存、扣库存、生成订单事务注解在这里。mapperMyBatis的接口配合XML或注解写SQL。entity和数据库表对应的实体类。configSpringBoot里的配置类比如拦截器、跨域、全局异常处理。这个分层很常规但论文的“系统设计”章节画一个层次架构图再配上这个包结构基本就达到要求了。2.2 为什么是MyBatis而不是JPA我见过不少同学在技术选型时纠结SpringBoot官方推荐Spring Data JPA为什么不直接用它。答案是JPA对多表联查、动态SQL、复杂报表这类场景并不友好而校园购物系统恰好有大量这类需求。比如后台的销售统计要按商品维度聚合订单明细按时间段统计销售额用JPA的实体关联确实也能写但麻烦程度远超直接写SQL。MyBatis的优势在于SQL可控一个复杂的统计SQL可以直接写出来性能也好排查。至于MyBatis-Plus这项技术本质上还是MyBatis只是在你不想写通用单表CRUD时提供了现成的Service和方法完全兼容SSM体系。如果你时间紧可以引入MyBatis-Plus它能帮你少写很多基础的增删改查代码但论文的关键技术里要写清楚它是MyBatis的增强插件不要让人误以为换了一个框架。2.3 版本搭配建议和坑先说结论我最推荐的是SpringBoot 2.7.x JDK 8/11 MySQL 5.7/8.0。这个组合生态最成熟几乎所有网上教程都能对得上。SpringBoot 3.x改动比较大比如javax包名变成了jakarta很多老教程里的import直接报错JDK版本也要求17以上对一部分同学的电脑环境不友好。如果指导老师没有强制要求新技术栈我建议不要碰SpringBoot 3.x。另外一个比较容易踩的坑是SpringBoot 2.7之前的版本和之后的版本在某些配置上有细微差别比如Thymeleaf的配置前缀从spring.thymeleaf开始在折腾页面热更新时要注意缓存开关。数据库连接串里如果有中文参数还要在url后面加上characterEncodingutf8和serverTimezoneAsia/Shanghai否则查询中文数据和插入时间时容易出现乱码和时区偏移。这类细节在开发时不注意等写到论文的“系统实现”章节再回来补就很费时间。3. 业务蓝图功能模块、角色权限与核心流程3.1 用户端功能清单用户端面向学生用户我在设计时没有堆砌功能而是沿着购物动线走了一圈。注册登录就不用说了可以直接用手机号或学号作为用户名。登录之后是首页需要按分类展示商品、支持关键字搜索、展示商品缩略图和价格点击商品进入详情页能看到商品描述、库存量、销量和图片。购物车允许用户修改数量、删除商品、勾选多个商品一起结算。下单结算模块的体验直接决定系统好不好用。我这里设计成两步第一步确认订单展示收货人信息或者自提点选择、商品明细、配送费用和实付金额第二步提交订单并进入模拟收银台用户选择“校园卡余额”或“微信模拟支付”支付成功后订单状态变为待发货。订单中心包含全部状态页签待支付、待发货、待收货、已完成、退款/售后。用户还可以在个人中心查看校园卡余额记录和基本信息。3.2 管理端功能清单管理端我给两种角色普通管理员和超级管理员实际落地时可以做一套RBAC权限模型也可以简单用一个role字段区分。核心模块是控制台仪表盘展示今日订单数、今日销售额、商品总数量、库存预警列表这些数据来自订单表和商品表的聚合查询。商品管理需要做到新增商品、编辑商品、商品上下架、删除商品逻辑删除以及库存调整。图片上传是一个容易忽略但又很基础的需求建议本地存储和MinIO对象存储都留接口论文里可以写成“系统设计初期采用本地存储后期可平滑迁移到MinIO”。订单管理需要订单列表、订单详情、发货操作订单按状态筛选。用户管理主要是禁用/启用账户、重置密码、调整余额这在处理学生“充值”或“退款”场景时很实用。3.3 核心流程从登录到订单完成的状态流转我把核心流程整理成了一条链路这条链路在后文代码实现和论文里都会反复用到建议你先有整体印象注册或登录进入首页浏览商品搜索或按分类筛选进入商品详情点击加入购物车在购物车勾选商品点击结算确认订单并选择地址或自提点提交订单进入支付页模拟支付成功后订单状态变成已支付待发货管理员在管理后台看到订单并点击发货用户收到货后确认收货订单完成如果用户后悔了可以在待支付状态取消订单。这个流程里最关键的是订单状态的准确切换。我在数据库里用数字存储状态码其中0代表待支付1代表已支付待发货2代表已发货3代表已完成4代表已取消。支付接口、发货接口、取消接口都会修改这个状态字段所以接口设计时要校验“当前状态是否允许做这个操作”。比如用户已经支付了就不能再调取消接口必须先走售后流程。这些规则在论文需求分析里可以作为功能用例写清楚。4. 数据库建模从E-R关系到具体表结构4.1 核心实体与关系梳理数据库是整个系统最不能偷懒的部分表设计不合理后面写SQL会难受死。我梳理出的核心实体有用户、管理员、商品分类、商品、购物车、订单、订单明细、库存流水。关系也很直接用户和订单是一对多订单和订单明细是一对多商品分类和商品是一对多用户和商品通过购物车是多对多用户加购多个商品一个商品可被多个用户加购。很多同学容易漏掉的是订单明细表他们喜欢把购买的商品信息直接塞到订单表里。这是错误示范因为一个订单可能包含多个商品如果订单表里用逗号拼接商品ID后面统计和发货都很难处理。正确做法是“一订单多明细”orders表存订单的公共信息订单号、总金额、收货人、状态、创建时间order_item表存每个商品的子信息商品快照、单价、数量、小计金额。注意这里要做“商品快照”而不是直接关联商品表主键因为商品价格和名称后续可能修改订单里应该保留下单那一刻的记录。4.2 关键表结构与字段设计我贴几张自己在项目里使用的核心表字段不追求多但求实用。用户表这样设计id主键自增username登录账号唯一索引password加密后的密码别存明文real_name、student_no真实姓名和学号用于实名phone联系方式balance校园卡余额类型用DECIMAL(10,2)status账户状态1正常0禁用create_time注册时间商品表里比较重要的字段包括category_id分类外键、name、subtitle副标题、main_image主图URL、detail_images详情图可以用JSON数组字符串、price、stock、sales销量、status1上架0下架、create_time、update_time。这里有一点要特别说明库存不要用int用无符号类型且扣减库存时要配合乐观锁SQL。sales这个字段可以每次下单成功后由程序累加不用实时去统计订单表减少查询压力。订单表的设计我单独说因为它是全系统最核心的表。主要字段有order_no业务订单号唯一、user_id、total_amount、pay_amount实付、status、receiver_name、receiver_phone、receiver_address或pickup_point、remark用户留言、create_time、pay_time、ship_time、finish_time。订单号不要用自增ID对外展示我用的是时间戳加用户ID加随机数拼接保证并发下不重复。total_amount和pay_amount分开的好处是后续做满减活动或者优惠券时不用改表结构。4.3 建模中的三个常见陷阱第一是金额字段类型。很多新手会用double或float存金额这在高并发且涉及对账场景就是个隐患浮点运算会丢精度。一律用DECIMAL(10,2)代码里对应BigDecimal计算单价乘数量时也要用BigDecimal的multiply方法。第二是时间和时区问题。数据库连接URL必须加上serverTimezoneAsia/Shanghai否则在高版本MySQL驱动下插入时间会报错。create_time、update_time这类字段建议设置默认值比如DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP这样代码里不用手动set减少出错。第三是删除策略。商品和分类不要物理删除用status字段做逻辑删除即可。因为订单明细中的商品快照虽然不依赖商品表但后台统计销量、用户查看历史订单会需要商品的名称和图片物理删除会导致这些页面查不到数据。管理员在后台“删除”商品时实际执行的是把status置为0同时商品列表默认只查status 1的数据。5. 核心业务代码落地登录、购物车、下单与模拟支付5.1 登录鉴权Session方案和密码加密处理校园购物系统属于后台管理系统加电商前台鉴权用Session是最省事、也最容易答辩讲清楚的做法。具体实现用户登录成功后把用户对象塞进HttpSession同时记录一个loginTime。拦截器里判断Session中是否存在用户不存在就重定向到登录页。我提供一个参考配置Configuration public class WebConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns(/cart/**, /order/**, /user/info, /user/balance); } }密码存储要加密这是答辩老师必问点。我用的方案是MD5 固定盐比如把用户名后四位拼到密码后面再MD5。虽然生产环境更推荐BCrypt但毕设场景下MD5加盐也能自圆其说重点是把“为什么不能存明文”解释清楚数据库一旦泄露用户明文密码就全部暴露这在校园信息系统中是不可接受的安全事故。还有一个容易被忽略的问题XSS攻击。用户昵称、收货地址、商品评论这些字段如果原样渲染到页面上可能注入脚本。我的做法是在后端做一个全局过滤器把请求参数里的script等危险标签做转义同时在页面输出时使用Thymeleaf等模板引擎自带的转义功能。这个点写进论文里可以作为“系统的安全设计”小标题技术上虽然简单但体现了完整思考。5.2 购物车模块查询展示与数量处理购物车表的设计建议直接关联用户和商品核心字段是user_id、product_id、quantity、checked。checked字段代表是否勾选结算比纯靠前端存储勾选状态更稳定用户重新登录状态依然保留。查询购物车时我直接用一条SQL联查商品表和购物车表返回购物车ID、商品ID、名称、主图、单价、数量、小计金额SELECT c.id AS cart_id, c.product_id, p.name, p.main_image, p.price, c.quantity, (p.price * c.quantity) AS subtotal, c.checked FROM cart c LEFT JOIN product p ON c.product_id p.id WHERE c.user_id #{userId} ORDER BY c.create_time DESC这里注意不要用Java代码一层层循环去查数据库那是典型新手写法会引发N1查询。一条联表查询把东西全部带出来性能好且代码简洁。修改购物车数量时直接用UPDATE cart SET quantity #{quantity} WHERE id #{cartId} AND user_id #{userId}加一个user_id条件做越权防护防止用户改别人的购物车。5.3 下单事务扣库存与生成订单的原子性下单是整个系统的核心难点核心诉求是扣减库存、生成订单、生成订单明细、清空对应购物车、计算销量这五个动作必须全部成功或全部失败。我用Transactional把下单逻辑包裹起来一旦其中一个步骤抛异常就整体回滚。并发场景是答辩老师最爱追问的点比如“两个用户同时抢最后一个商品会不会超卖”。简单的先查询库存再判断再扣减在高并发下一定会有超卖风险。我的做法是使用条件更新的乐观锁方案直接在SQL层面判断库存是否充足Override Transactional(rollbackFor Exception.class) public Order createOrder(Long userId, Long[] cartIds, String receiverInfo) { ListCartItemVO items cartMapper.selectCheckedByIds(userId, cartIds); if (items null || items.isEmpty()) { throw new BusinessException(购物车中没有勾选的商品); } BigDecimal total new BigDecimal(0.00); for (CartItemVO item : items) { int rows productMapper.deductStock(item.getProductId(), item.getQuantity()); if (rows 0) { throw new BusinessException(商品[ item.getProductName() ]库存不足); } total total.add(item.getPrice().multiply(new BigDecimal(item.getQuantity()))); orderItemMapper.insert(...); } Order order new Order(); order.setOrderNo(generateOrderNo(userId)); order.setTotalAmount(total); order.setStatus(0); orderMapper.insert(order); cartMapper.deleteByIds(userId, cartIds); return order; }对应SQL是这样写的UPDATE product SET stock stock - #{quantity}, sales sales #{quantity} WHERE id #{productId} AND stock #{quantity}当stock #{quantity}条件不满足时影响行数为0代码里就能感知到库存不足直接抛异常。这里即使两个请求同时进来数据库行锁也会让其中一个失败不会出现扣成负数的情况。这套方案不是高并发秒杀级设计但在单体应用的业务场景下已经足够稳健而且作为论文“系统实现”章节的技术亮点非常合适。需要注意的是事务里不能调用远程接口比如如果后面接了真实支付支付回调必须在事务提交后再处理否则支付成功但本地事务回滚就会出现资金和订单不一致的情况。在毕设里我用的是模拟支付接口它在事务内只更新订单状态和扣减余额所以没有这个问题但论文里如果写到了“后续扩展”这点要提前打个预防针。5.4 模拟支付状态机和余额抵扣的边界情况购物系统一般不真正接入支付宝微信成本和资质问题所以需要设计一个模拟支付页面。流程是用户提交订单后跳转到支付页页面显示订单号、实付金额选择“校园卡余额支付”或者“模拟微信支付”。模拟微信支付就直接调用一个后端接口把订单状态从待支付改成已支付待发货校园卡余额支付则要额外校验余额是否够够则扣减余额并将订单置为已支付。这里有一个容易写偏的地方校园卡余额支付和订单更新必须在同一个事务里否则可能余额扣了但订单没支付或者订单支付了余额没扣。我用一个Service方法同时处理两件事内部调用balanceMapper.deductBalance和orderMapper.updateStatus外层加Transactional。余额不足直接抛异常前端捕获后提示“余额不足请先充值”。充值功能我是在管理端手动给用户余额增加因为校园充值本质上应该对接学校一卡通系统毕设里做成“管理员代充”或“模拟充值”即可。订单取消逻辑也要放在同一个模块里用户待支付订单超过30分钟未支付可以手动取消也可以由定时任务自动关闭。定时任务用Spring的Scheduled很容易实现每隔一分钟扫描一次超过30分钟仍为待支付的订单将状态改成已取消并恢复库存。这个设计在论文里很加分因为大部分同学的毕设没有定时任务这个模块。6. 论文怎么写一套能直接套用的框架和避坑思路6.1 推荐论文目录结构设计与实现类论文切忌写成“产品说明书”也就是光贴页面截图不写设计思路。我整理了一个比较标准的目录框架如果你没有特殊要求可以直接照框架往里填内容第1章 绪论课题背景、研究意义、国内外现状、主要研究内容、论文组织结构第2章 相关技术介绍SpringBoot、Spring、SpringMVC、MyBatis、MySQL、Thymeleaf或Vue第3章 系统需求分析可行性分析技术、经济、操作、功能需求分析前台用户、后台管理员、非功能需求分析性能、安全、易用性第4章 系统设计系统总体架构、功能模块设计、数据库设计E-R图和表结构、接口设计第5章 系统实现前台功能实现、后台功能实现、核心业务逻辑实现重点写事务和并发控制第6章 系统测试测试环境、功能测试用例、性能测试分析、测试结论第7章 总结与展望总结毕设工作说明不足和后续改进方向这套目录的好处是层层递进每个章节都有明确对应的论文内容评审老师挑不出大毛病。你只需要注意第2章不要大段抄框架官方文档要把技术写“活”比如SpringBoot的自动配置原理对开发效率的提升MyBatis的动态SQL如何适应复杂查询这些理解性描述才是正文的核心。6.2 写作中的几个高分技巧和常见扣分点写技术介绍时最忌讳名词堆砌。很多同学写“SpringBoot是一个用于简化Spring应用开发的框架它采用约定大于配置的方式快速构建项目”这没问题但如果下面就没有自己的理解了那这一节就是凑字数。我的建议是每介绍一个技术都要附带“在本项目中的作用”比如MyBatis在项目中负责商品多条件查询和订单聚合统计的SQL映射把框架和项目实际挂钩这样内容才算真正饱满。在系统实现这一章每个功能块的截图别只贴一张要贴“操作前页面—操作后结果—数据库对应数据变化”这组对比。例如发布商品时管理员填表单、点击保存后商品列表出现新商品、数据库product表多了一条记录这一套截图贴下来论文的可信度比单纯贴页面高太多。测试章节也是容易丢分的地方。功能测试用例列表一定要体现边界条件比如“用户输入超长商品名称”“下单时库存仅剩1件但加入购物车2件”“用户重复提交订单”“后台管理员禁用某用户后该用户仍尝试下单”。这些用例表在答辩时能证明你真做过测试而不只是跑起来点一下。6.3 关于代码和论文查重论文中的核心代码不要整段贴只贴关键方法和关键SQL篇幅控制在一页以内。大量粘贴Spring框架的样板代码没有任何意义导师也烦。可以适当用文字描述代码逻辑比如“这里使用乐观锁控制库存扣减当影响行数为0时抛出异常并回滚事务”比贴一整段方法体更体现你的理解。关于降重我建议大家不要过度使用同义词替换这种机械手段很容易把句子改得不自然。更靠谱的方式是用自己的话把源码文档重新组织加上项目背景描述。比如讲SpringMVC时顺着“一次HTTP请求从DispatcherServlet分发给Controller再经过Service落到Mapper”这条链路讲而不是概念化复述。7. 部署落地与答辩准备从本地打包到Docker部署7.1 Maven打包与常见配置细节本地开发时IDEA直接跑SpringBootApplication没问题但论文的系统部署章节一般要求体现“打包部署”能力所以Maven打包是必须要走的流程。在项目根目录执行mvn clean package -DskipTests如果一切正常target目录下会生成一个xxx.jar直接在命令行用java -jar xxx.jar就能启动。这一步之所以拦下不少人是因为数据库连接串、Redis地址、文件上传路径等配置写死了。我建议工程里保留两个profile开发环境用application-dev.yml部署环境用application-prod.yml启动时用--spring.profiles.activeprod指定环境。这是生产级的做法写进论文的“系统部署”可圈可点。还有一个很容易翻车的地方本地数据库用户名密码和服务器不一样或者MySQL字符集不是utf8mb4。打包前检查一下配置文件里的jdbc:mysql://localhost:3306/campus_mall?serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf8确保中文数据不会乱。如果遇到端口被占用的报错可以在配置里写server.port: 8080指定固定端口也可以临时用server.port: 0让系统随机分配端口不过那只适合本地调试。更推荐的还是固定端口方便防火墙放行和反向代理配置。7.2 Docker部署的完整步骤如果你想让论文的部署章节更有含金量Docker部署是很好的加分项。思路是把SpringBoot应用打成Docker镜像再把MySQL装到另一个容器里用docker-compose把整个环境编排起来。一个基础Dockerfile可以这么写FROM eclipse-temurin:8-jre WORKDIR /app COPY target/campus-mall.jar /app/campus-mall.jar EXPOSE 8080 ENTRYPOINT [java, -jar, /app/campus-mall.jar]构建命令docker build -t campus-mall:1.0 . docker run -d -p 8080:8080 --name campus-mall campus-mall:1.0如果MySQL也用Docker记得让容器网络互通最简单的方式是用docker-compose把两个服务定义在同一个网络里。这里有个细节SpringBoot应用里的数据库地址不能再写localhost要写成MySQL容器的服务名比如jdbc:mysql://mysql:3306/campus_mall否则应用容器访问不到数据库。这类细节在论文里不要写错否则答辩老师一句“你这里数据库地址写local:3306为什么能通”就会露馅。如果电脑上不方便跑Docker也可以退而求其次使用外部的MySQL服务SpringBoot应用照样打包成jar部署到云服务器。无论哪种方式论文里都建议放一张“系统部署架构图”说明应用服务和数据库服务分别部署在哪里端口怎么映射域名和HTTPS是否配置。这一小节能体现你对“上线部署”完整流程的把握性价比很高。7.3 答辩高频问题与回答思路答辩环节老师基本围绕“技术选型、业务逻辑、数据库设计、以及你自己代码的细节”提问。我准备了一份高频问题清单第一个必问点是为什么选SpringBoot回答思路是“它简化了传统SSM的大量XML配置提供了自动配置和起步依赖内嵌Tomcat让我们把精力集中在业务逻辑上但底层依然是Spring的IoC和AOP机制管理对象依赖和事务切面”。第二个必问点是事务保证围绕Transactional的失效场景比如同类内部调用导致代理失效数据库引擎必须是InnoDB才能用事务MyBatis的批量操作如果不会自动提交也要放在同一事务里。你只要能说出“事务只对Spring代理的Bean方法生效类内部自调用不经过代理对象事务不生效”这类话老师基本就满意了。第三个必问点是查询性能优化回答思路是MyBatis动态SQL拼接条件匹配常用查询字段建立联合索引分页用LIMIT统计报表用聚合函数而不是Java内存遍历。更进阶可以提到Redis缓存首页热点商品。只要逻辑自洽哪怕代码里没有完全实现答辩现场表述清晰就不会被扣分。还有一个高频问题是“如果用户量变大了怎么办”。这个问题考察可扩展性认知答案是“当前系统采用单体架构适合校园级用户量后续可以引入Redis缓解数据库压力将图片文件迁移到MinIO对象存储再按业务模块拆分微服务用消息队列削峰下单流程”。即便不是真正实现只要回答有层次就能体现全局观。最后补充一点自己的体会回到开头那个“校园生活超市购物系统”它在技术上不算惊艳却是我接触过的课程设计里最适合完整走一遍的题目。因为它逼着你去考虑数据一致性逼着你在订单状态流转上做设计逼着你去琢磨页面背后数据库发生了什么变化这些都是纸上谈兵学不到的。我个人在正式提交前还额外做了一件事把所以订单相关的业务日志打了一遍比如创建订单时打印用户ID、购物车IDs、最终总金额支付时打印原状态和新状态。调试的时候真的救了大命尤其并发测试看到超卖问题时有日志比一点点打Debug快太多了。如果你时间来得及建议也加一个全局日志切面在service层统一打印入参和耗时这既能帮你排查问题论文的系统实现里还能多一个小亮点。祝你早日完成项目顺利通过答辩。
返回列表