
作为曾经被毕设折磨过、也帮不少学弟学妹看过代码的人我对“基于SpringBoot的超市便利店信息管理系统”这类题目印象太深了。十个做Java毕设的人里有三四个会拿到购物系统、商城系统或者超市管理系统题目换个名字核心逻辑全是同一套东西——用户、商品、购物车、订单、库存。今天这篇就把这个项目的完整链路拆开揉碎讲清楚从选题分析到数据库设计从核心业务逻辑到论文写作再到部署打包和演示视频准备全流程走一遍。无论你是刚拿到题目一头雾水还是已经写了一半卡在某个环节这篇文章都能给你一个能直接落地的参考方案。1. 这个系统到底在做什么先划清需求边界1.1 一句话说清楚系统核心线上超市购物管理系统本质上就是一个B2C的电商系统只是业务范围被限定在“超市/便利店”这个场景里。它要解决的事情很简单让用户能在网页上浏览商品、把想买的东西加进购物车、下订单、产生一笔模拟交易同时给管理员一个后台用来管理商品上架下架、处理订单、查看用户信息。很多同学拿到题目就慌了觉得要做一个像淘宝那么大的系统其实完全不需要。毕设项目的核心是证明你掌握了SpringBoot开发的基本能力并且能够独立完成一个完整的业务闭环。线上超市这个场景比通用商城更简单的地方在于它没有复杂的SPU/SKU概念不需要区分尺码颜色没有秒杀活动没有优惠券体系没有复杂的物流追踪。你把“超市货架上的商品”抽象成数据库里的一张商品表把“用户提着购物篮去收银台结账”抽象成订单表的创建和状态流转系统的主干就清晰了。1.2 两种叫法背后的同一套逻辑题目里出现了“线上超市购物管理系统”和“超市便利店信息管理系统”两个叫法很多同学纠结于这俩是不是两个不同项目。我可以负责任地告诉你这就是同一个系统换了个名字。如果导师给你的题目是“线上超市购物管理系统”重心在“购物流程”也就是前端用户侧的体验——浏览、加购、下单。如果题目是“超市便利店信息管理系统”重心在“信息管理”也就是后台管理侧——商品信息、库存信息、订单信息、会员信息的增删改查。但真正落地实现的时候一个完整的系统必然是前后台都有的所以不管题目怎么叫你最终做出来的东西都包含以下几块用户侧注册登录、商品分类浏览、商品搜索、商品详情、购物车、下单、模拟支付、个人订单查询。管理侧商品管理、分类管理、订单管理、用户管理、库存管理。我建议你在写开题报告和论文的时候把“线上超市购物管理”和“便利店信息管理”都写进去叙述逻辑就是本系统既面向消费者提供线上购物能力也为便利店经营者提供商品信息和订单信息的统一管理平台。这样不管导师抠题目里的哪个字你都能圆回来。1.3 前台和后台分别承担什么前台用户端的功能说白了就是引导用户完成一次“发现商品→决定购买→确认订单→假设付款”的完整旅程。这里要注意用户端并不需要重复开发一套“管理系统”用户端只需要看自己下单的订单以及修改个人资料管理端才是系统真正“管理”的部分。后台管理端是这个项目的重头戏因为技术上它的增删改查更密集。商品管理要能新增商品上传图片、填价格、填库存、修改商品上下架状态订单管理要能查看所有用户的订单、按状态筛选、修改订单状态比如从已支付改成已发货用户管理要能查看用户列表、禁用异常账号。这几张CRUD界面一做出来整个系统的后台部分看起来就非常充实论文里的功能模块图也画得满。2. 技术选型为什么这么定最稳的组合与最不该踩的坑2.1 SpringBoot版本怎么选别一上来就追新技术选型这件事毕设有毕设的逻辑生产项目有生产项目的逻辑。你可能在某些论坛上看到“SpringBoot 3.0发布啦性能提升多少多少”但对于做毕设的人来说稳定和容易找到资料才是第一位的。关于版本我最直接的建议是JDK用1.8也就是Java 8SpringBoot用2.7.x系列。原因有三个第一JDK 8是绝大多数学校机房、老师电脑、教程视频里默认的环境网上能找到的海量博客、论坛帖子、GitHub项目跑的都是这个组合。你遇到问题去搜索别人的解决方案大概率跟你同一个版本直接就能用。用JDK 17 SpringBoot 3.x的话很多旧教程里的写法会报错排查成本完全没必要。第二SpringBoot 3.x相比2.x是较大的跨代变动它基于Jakarta EE部分包的路径都改了比如javax.servlet变成jakarta.servlet很多第三方框架的兼容版本还没跟上。你就是做个毕设不需要在兼容性问题上给自己加戏。第三SpringBoot 2.7是2.x版本的最终分支官方维护期很长稳定性经过大量项目验证。你可以在maven仓库看到2.7.18这个版本号这就是2.x的最后一个小版本闭着眼选它就行。2.2 ORM框架MyBatis Plus为什么是毕设首选数据库访问层用MyBatis还是MyBatis Plus这是一个几乎每届学生都会纠结的问题。我自己带过的学生里凡是用原生MyBatis的一半以上在写XML的resultMap时被坑过因为实体类的属性名和数据库字段名之间有下划线和驼峰命名的映射问题。MyBatis Plus直接解决了这些琐碎的麻烦它提供了内置的单表CRUD方法selectById、insert、updateById全都帮你写好了。你的用户表、商品表、订单表这些基础表的增删改查几乎不需要写一句SQL就能跑通。有同学担心“用了MyBatis Plus会不会显得我没技术含量答辩的时候被老师追问底层原理”。我的回答是你需要担心的方向反了。答辩老师更在意你有没有把项目的核心业务逻辑讲清楚而不是你用了哪个ORM框架。你可以在论文里写一句“本系统使用MyBatis Plus作为持久层框架在保留了MyBatis灵活性的同时通过内置通用Mapper简化了单表操作使开发效率提升让开发人员可以把更多精力投入到业务逻辑的实现上”。这句话放在论文里非常加分因为它表明了你的选型是有意识的决策而不是随便找一个。2.3 前端方案Vue、JSP还是Thymeleaf前端的选择是另一个纠结点。这里有个现实情况题目里写的是“基于SpringBoot的超市购物系统”并没有要求前后端分离。所以你有两条路可以走路线A不走前后端分离使用SpringBoot内置的Thymeleaf模板引擎服务端渲染页面。好处是部署简单、整个项目打成一个jar包就能跑、不需要额外开一个前端服务缺点是页面长得比较朴素界面美化需要花些心思在CSS上。路线B前后端分离用Vue 2或者Vue 3 Element UI现在Element Plus用得多了后端提供JSON接口。好处是页面外观做得漂亮论文里可以贴上前后端分离架构图看起来更“现代”坏处是你要多维护一套前端工程代码部署的时候要么打包到SpringBoot的static目录下要么用Nginx去代理流程多了一截演示环境出问题的概率也大——比如前端的axios请求跨域问题就够折腾一天。我的建议很简单如果你前端基础一般优先选Thymeleaf把有限的时间花在后端逻辑和数据库上如果你对Vue比较熟那就大胆用前后端分离界面能明显拉开档次。两种方案都稳稳能过不存在哪个绝对更好看你的精力分配。2.4 梳理一下最终需要用到的依赖确定了大方向后用一个比较标准的maven依赖清单把项目搭起来parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency 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 groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies这里每个依赖都说说是什么用spring-boot-starter-web提供Spring MVC的web能力和内嵌Tomcat是后端服务的根基mybatis-plus-boot-starter帮我们免去大量单表SQLmysql-connector-java连数据库用注意SpringBoot 2.7版的依赖坐标里这个artifactId是mysql-connector-java到了SpringBoot 3.x就变成com.mysql:mysql-connector-j了这也是版本差异带来的坑lombok用来给实体类省去写getter/setter的体力活毕设项目里用Lombok绝对没问题答辩老师甚至会觉得你懂得简化开发。注意如果本地MySQL驱动版本太新连接数据库时可能会遇到Public Key Retrieval is not allowed的错误。在数据库连接URL后面加上allowPublicKeyRetrievaltrueuseSSLfalse这两个参数就解决了。这个坑出现频率极高提前写好能省半小时查错。3. 数据库设计是毕设的命脉表结构决定上层逻辑3.1 核心表到底有哪几张数据库设计是毕设项目的命脉因为后端的代码基本上就是围着表转。一个线上超市购物系统最精简也最完整的表集合是这六张用户表、商品分类表、商品表、购物车表、订单表、订单明细表。有的同学会问要不要加一张“收货地址表”这就看你的需求定位。如果你做的是前后端分离项目页面里有用户添加收货地址的功能那就需要如果你简化一下让用户下单时手动填写收货人、收货电话、收货地址这三个字段存到订单表里那就能省一张表。从毕设体量来说两种都没问题。我倾向于建议把地址作为订单表的字段而不是单独一张表因为“管理收货地址”这个功能边界做起来会牵扯出一个新的功能模块而订单里存三个快照字段收货人、电话、地址已经能满足演示需求论文里也说得通。这几张表的关系可以这样理解用户表是主表的根商品表挂在分类表下购物车表是用户和商品之间的临时关系表订单表是用户和商品之间的交易关系表而订单明细表是把订单里买的每一件商品具体记下来形成的子表。3.2 订单与订单明细为什么要分开这一步我要重点强调一下。很多初学者会把订单和订单明细合并成一张表也就是订单表里直接存商品名、单价、数量。这样做的后果是如果一个订单买了5种商品那就要在订单表里插5条记录这5条记录的订单号、用户、总价、收货信息全部重复一遍数据冗余得厉害。更糟糕的是你想查询“某个订单的所有商品”时得到的是5行“部分重复”的记录数量与金额的逻辑对不上。正确的做法是拆分订单表t_order一条记录对应一次下单行为包含订单号、用户ID、订单总金额、订单状态、收货信息、下单时间订单明细表t_order_item一个订单ID对应多条记录每条记录存一个商品ID、下单时的商品名称、下单时的单价、购买数量。注意“下单时的”这个说法商品名称和价格要看“快照”而不是去关联实时商品表因为超市商品会调整价格如果用户已经下单了支付了他订单里的价格应该是他当时看到的价格。这个细节写进论文里导师会认为你想到了实际业务的关键点。两表配合的思路是查订单列表时用订单表查某个订单的商品明细时用WHERE order_id ?去订单明细表查。总金额和明细金额的关系是一对多总和这个逻辑在答辩时一定会被问到你先把这个说透答辩老师基本就不会再深挖了。3.3 库存字段放在哪里一张表还是单独一张库存字段我建议直接放在商品表里就叫stock。很多同学看了一些企业级项目的文章知道库存可能需要单独一张inventory表甚至会加version字段做乐观锁这属于过度设计。对于毕设项目你的库存只是一个整数放在商品表里完全可以支撑业务。生成订单的时候程序要做的事情是先查商品表拿到库存数判断库存是否大于等于购买数量如果满足就更新库存减去购买数量。虽然这不一定能解决高并发下的超卖问题大家也几乎不会真的用JMeter去并发压测一个毕设项目但“先判断再更新库存”这个逻辑已经足够在答辩时把自己的思路讲清楚。如果你想让答辩更有含金量可以在这里做一个升级更新库存时用一条带条件的UPDATE语句来实现原子操作——UPDATE t_product SET stock stock - #{quantity} WHERE id #{productId} AND stock #{quantity}——并且向老师解释这条SQL通过数据库的行锁避免了并发场景下的库存扣为负数比你分三步“查询-判断-更新”更安全。这种细节上的优化才是答辩时真正加分的点。3.4 建表SQL怎么写几个核心表直接抄作业下面给出几张关键表的建表SQL你可以直接拿过去用字段上稍微调整下就行CREATE TABLE t_user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 用户ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(100) NOT NULL COMMENT 密码, nickname varchar(50) DEFAULT NULL COMMENT 昵称, phone varchar(20) DEFAULT NULL COMMENT 手机号, role tinyint NOT NULL DEFAULT 1 COMMENT 角色1普通用户 2管理员, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1正常 0禁用, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; CREATE TABLE t_category ( id bigint NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 分类名称, sort int DEFAULT 0 COMMENT 排序, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品分类表; CREATE TABLE t_product ( id bigint NOT NULL AUTO_INCREMENT, name varchar(200) NOT NULL COMMENT 商品名称, category_id bigint NOT NULL COMMENT 分类ID, price decimal(10,2) NOT NULL COMMENT 单价, stock int NOT NULL DEFAULT 0 COMMENT 库存, sales int NOT NULL DEFAULT 0 COMMENT 销量, image varchar(255) DEFAULT NULL COMMENT 商品图片, detail text COMMENT 商品详情, status tinyint NOT NULL DEFAULT 1 COMMENT 上架状态1上架 0下架, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_category (category_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表; CREATE TABLE t_order ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单号, user_id bigint NOT NULL COMMENT 下单用户ID, total_amount decimal(10,2) NOT NULL COMMENT 订单总金额, status tinyint NOT NULL DEFAULT 0 COMMENT 状态0待支付 1已支付 2已发货 3已完成 4已取消, receiver_name varchar(50) NOT NULL COMMENT 收货人, receiver_phone varchar(20) NOT NULL COMMENT 收货电话, receiver_address varchar(200) NOT NULL COMMENT 收货地址, create_time datetime DEFAULT CURRENT_TIMESTAMP, pay_time datetime DEFAULT NULL COMMENT 支付时间, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表; CREATE TABLE t_order_item ( id bigint NOT NULL AUTO_INCREMENT, order_id bigint NOT NULL COMMENT 订单ID, product_id bigint NOT NULL COMMENT 商品ID, product_name varchar(200) NOT NULL COMMENT 商品名称快照, price decimal(10,2) NOT NULL COMMENT 单价快照, quantity int NOT NULL COMMENT 购买数量, PRIMARY KEY (id), KEY idx_order_id (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单明细表;3.5 关于ER图论文里怎么画才更像回事数据库设计这块在论文里要配一张ER图实体关系图。很多同学喜欢用Word自带的文本框一条条线去画画一下午还歪歪扭扭。我建议用一些绘图工具比如draw.io来画里面自带的数据库实体模板可以直接用。ER图最关键的地方不是画得多好看而是实体间的联系标注要准确用户和订单是一对多订单和订单明细是一对多商品和分类是多对一用户和购物车商品是一对多。论文里画好一张清晰的ER图再加上你对每张表的设计说明每个核心字段为什么这么设计数据库设计这一章基本就是高分了。4. 主流程的实现逻辑从登录到购物车到生成订单4.1 登录和权限拦截怎么做才不丢人用户登录这块很多教程里直接用Session存用户信息写一个LoginController接收用户名密码验证通过后session.setAttribute(user, user)然后在需要登录的接口里手动判断session是否为空。这种写法可以用但你需要在每个需要登录的接口里重复写判断代码非常不优雅而且答辩时老师如果问你“怎么保证没登录就不能访问购物车”你只能支支吾吾。更好一点的做法是写一个拦截器HandlerInterceptor。定义一个LoginInterceptor类实现HandlerInterceptor接口在preHandle方法里判断session里有没有用户没有就重定向到登录页或者返回一个JSON提示“请先登录”。然后在一个配置类里注册这个拦截器通过addPathPrefix加上拦截的路径再用excludePathPatterns排除掉登录页、注册接口、商品列表这些不需要登录就能访问的路径。后端只能拦截接口层面的访问前端路由层面的控制是另一回事但后端拦截已经做到了“即使绕过前端直接调接口也进不去”这在安全层面就是合格的。密码存储这里我多说一句**一定不要明文存密码。**最省事又合理的方案是使用MD5加盐工具类里把用户名和密码拼起来再做MD5这样数据库里存的是加密后的串论文里还能写一句“本系统采用MD5加盐的方式对用户密码进行加密存储提升了数据安全性”。你要是敢明文存密码答辩被问到安全性的相关问题时就是送分题变送命题。4.2 加入购物车背后的数据变化购物车的实现思路有几种。一种是用Redis缓存性能好但需要额外引入Redis服务和配置一种是把购物车数据存进数据库表也就是上面建好的t_cart表还有一种是不落库直接存Session。毕设项目我用的是数据库表方案理由有三好演示、逻辑统一、论文好写。用户点击“加入购物车”时后端接口做得事情是先判断这个用户的购物车里是否已经有这个商品了如果有就把数量加一没有就新建一条购物车记录。这个逻辑既可以是用户自己加购也可以在商品详情页输入数量后加购。购物车页面展示的时候前端拿到当前用户的购物车列表逐条显示商品名称、价格、数量、小计再算一个总金额。购物车里数量加减、单选全选、删除这些操作本质上是t_cart表的增删改查没有什么难度但页面交互要做好看还是需要花些功夫的。4.3 生成订单时的库存扣减最容易写错的地方从购物车提交生成订单是整个项目业务逻辑最复杂的一段也是答辩老师最爱问的一段。完整流程是这样的前端把购物车ID列表和收货信息提交给后端。后端根据购物车ID列表查出所有要购买的商品和数量计算总金额。校验库存是否充足。此时就要用到上面讲的原子更新SQL。创建订单表记录订单号、用户ID、总金额、状态、收货信息。创建订单明细记录每一条购物车记录对应一条明细把商品名和单价作为快照存进去。扣除库存增加销量。清空对应的购物车记录。返回订单ID或订单号给前端跳转到支付页面。这里有一个细节我想特别提醒**删除购物车记录和扣减库存的操作需要放在事务里。**方法上加Transactional注解确保中间某一步失败时所有操作都能回滚不会出现“钱扣了但订单没生成”或“订单生成了但库存没减”这种数据不一致的局面。关于事务的说明在论文里单独拿出来一小节写标题就叫“下单事务一致性设计”这个标题的信息量非常足答辩时可以展开说因为涉及多张表的写操作必须通过Spring声明式事务来保证原子性。4.4 模拟支付毕设最合理的做法支付这块如果你要接真实的微信支付、支付宝支付那就给自己挖了一个大坑。真实支付需要商户号、密钥、回调域名等等等一系列资质学生个人根本申请不下来就算申请下来了也极其麻烦。所以毕设里做模拟支付是完全正确且合理的选择。实现方式就是在支付页面放一个“模拟支付”按钮点击后调用后端接口pay(orderNo)做的事情就是把这个订单的状态从“待支付”改成“已支付”再把pay_time字段设置为当前时间。你可以做得稍微有点仪式感在页面上写“此页面为模拟支付环境不产生真实扣款”反而显得系统严谨。如果你想让这个模块更有亮点可以考虑引入一个简单的沙箱支付页面或者写一个支付二维码的生成逻辑用Java生成一个静态的模拟二维码图片但这纯粹是视觉上的提升逻辑上不变。5. 超市管理后台的几个功能模块怎么做5.1 商品管理图片上传这个点怎么处理商品管理模块是后台的核心。管理员登录后需要看到商品列表支持按名称搜索、按分类筛选、点击“新增商品”按钮打开一个表单填名称、分类、价格、库存上传一张商品图片填详情描述保存后商品出现在前台商品列表里。商品图片上传是很多同学一开始不知道怎么处理的点。最省事的方案是把图片保存到本地磁盘的一个upload目录下然后把访问路径返回给前端页面上用img src/images/xxx.jpg来显示。SpringBoot里需要配置一个静态资源映射把/images/**映射到本地上传目录Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/images/**) .addResourceLocations(file: System.getProperty(user.dir) /upload/); } }这里System.getProperty(user.dir)指项目的根目录图片存到项目根目录的upload文件夹里访问路径就是http://localhost:8080/images/xxx.jpg。这个方案不依赖任何第三方对象存储服务演示的时候本地就能跑通非常实用。5.2 订单管理状态流转是管理端的业务核心管理端的订单管理功能核心是把订单状态管理好。订单状态的枚举可以定义为0待支付、1已支付、2已发货、3已完成、4已取消。管理员的常见操作是看到一笔“已支付”的订单点击“发货”订单状态变更为“已发货”用户收到货后点击“确认收货”订单状态变更为“已完成”。管理端还可以考虑一个“取消订单”的按钮当用户支付超时或者管理员主动取消时订单置为取消状态。此时需要把库存回补把商品库存加回去这个动作也要小心做对别取消订单之后库存数量反而是错的。我建议你在状态流转这块写清楚一个状态机所有可能的状态路径都罗列出来比如“待支付→已支付→已发货→已完成”以及“待支付→已取消”。答辩老师问到“状态是怎么管理的”你把这个状态机讲清楚就是一个很完整的回答。5.3 用户管理分级和禁用两件事用户管理后台相对简单用户列表展示所有注册用户的基本信息管理员可以查看用户详情也可以将某个异常用户“禁用”或“启用”。禁用操作的实现就是在用户表里把status改为0然后在登录拦截器里多加一个判断如果用户状态是0拒绝登录提示“该账号已被禁用请联系管理员”。用户表里的role字段决定了这个人是普通用户还是管理员。最简单的做法是在数据库初始化脚本里直接插入一个管理员账号比如admin的role设为2系统启动后就可以用这个账号登录进后台。6. 论文LW到底怎么写章节框架和内容组织6.1 一种不会被驳回的章节安排毕设论文的基本章节结构是固定的你的题目属于“系统设计与实现”型论文常规结构就是下面六章加总结和致谢。第一章是绪论写选题的背景和意义、国内外研究现状、论文的结构安排。这里有个技巧背景部分一定不要空谈“随着互联网的发展”要扣住“超市/便利店”这个具体场景来写比如写社区便利店线上化转型的需求痛点。第二章是相关技术介绍写SpringBoot框架、MyBatis Plus、MySQL数据库、前端框架或者Thymeleaf模板引擎。每一小节写这个技术是什么、为什么项目选它、它在项目里承担什么角色。注意不要写成名词解释抄百科而是要结合本项目来叙述。第三章是系统分析包括可行性分析技术可行性、经济可行性、操作可行性、需求分析功能需求、非功能需求、用例图和数据流图。功能需求要把前台和后台分开列成用例表。第四章是系统设计画系统总体架构图、功能模块图然后是数据库设计ER图、每张表的表结构说明。第五章是系统实现按功能模块一个一个展示核心功能页面截图和核心代码片段。这一段篇幅要足够长因为导师和评阅老师通常会重点看这部分以确认系统确实做出来了。第六章是系统测试写测试用例表编号、测试名称、操作步骤、期望结果、实际结果再加上测试结论。这里一定要写真实测试过的内容不要编造一个“测试通过”就直接交差答辩时老师要是当场让你演示某个功能你演示不出来就尴尬了。6.2 论文里该放什么图不该放什么图论文中需要出现的关键图包括系统架构图、功能模块图、业务流程图、ER图、几张核心页面截图。这里面功能模块图是最容易画的用树状结构图工具就能画出一棵“系统功能结构树”。业务流程图画下单流程可以画一张简洁的时序图或者流程图。截图要截得干净整洁浏览器地址栏和无关标签页都关掉图片标注好功能名称。核心代码不要放太多每段代码放8到15行就够了目的是展示某个关键逻辑。代码排版要使用等宽字体行距统一否则打印出来会很难看。6.3 降重是在做什么是表达的重组织不是翻译论文查重一共是很多同学最头疼的环节我这里总结了几个实际有效的方法不是让你去抄而是教你如何把引用的内容转化为自己的语言一是把原句子的主干结构换掉。比如“系统采用SpringBoot框架进行开发”可以改成“在SpringBoot提供的框架基础上完成本系统的研发工作”意思不变但句式完全不同。二是把长句拆分或把短句合并。参考资料的原文如果是长句你拆成两个短句写原文是短句你加上因果关系扩写成复合句。注意不要为了降重把句子改得逻辑不通。三是把被动语态改成主动语态。比如“该模块被设计用来处理订单信息”改成“订单信息的处理工作由该模块负责”。四是适当加入你自己的对比、评价和项目相关的细节表述。这部分是查重系统永远查不到的因为它是你针对自己项目的独特内容。比如在写技术介绍时你可以加一句“经过对比本系统最终选择了MyBatis Plus作为持久层框架因为它的内置通用Mapper可以大幅简化商品表和用户表等基础数据表的操作”这种结合自己项目语境的话是降重的最好方式。7. 部署、打包和演示视频决定项目“看起来”好不好的三件事7.1 本地部署要准备哪些环境部署这块不要想复杂了。最标准的本地部署流程是在你的电脑上装好JDK 1.8、MySQL、IDE推荐IDEA然后导入项目改好数据库配置运行。演示之前先启动MySQL服务确保数据库中已经导入了建表SQL和初始化数据然后启动SpringBoot项目浏览器访问http://localhost:8080就可以看到系统首页。整个环节最常出的问题就是数据库连不上。配置文件里spring.datasource.url写的是本机地址jdbc:mysql://localhost:3306/supermarket?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai注意serverTimezone这个参数一定要加否则时空区报错。数据库用户名的密码也要确认无误有些人项目配置文件里写的还是自己测试时的密码换了电脑忘改结果数据库连接报错。7.2 打包成jarpom里最容易忽略的一个插件如果你想把项目打包成一个可执行的jar在IDEA里的Maven面板执行package命令就行。但我见过很多同学打包成功后在命令行里运行java -jar xxx.jar却报“没有主清单属性”的错误原因就是pom.xml里缺少spring-boot-maven-plugin插件。这个插件负责把SpringBoot应用打包成可执行的fat jar缺少它打出来的包就是个普通jar无法直接运行。build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build打包成功之后jar包通常在target目录下。命令行运行java -jar supermarket-0.0.1-SNAPSHOT.jar启动日志里能看到Tomcat started on port 8080就说明启动成功。7.3 jar包部署与IDE运行的区别这里多说一句不少同学在演示的时候直接在IDEA里点了运行按钮这个没有问题。但如果你把jar包部署到云服务器上注意jar包所在目录下要配置文件里带上相对路径。比如resources下的application.yml是在jar包内部的不需要外部提供但如果你有上传图片的需求注意服务器的磁盘路径要跟配置文件对应起来。用宝塔面板部署SpringBoot项目时需要添加Java项目指定jar包路径、JDK版本、项目端口然后在面板里把域名解析好这是一条比较省事的云部署路径。7.4 演示视频拍什么才不乱演示视频这个东西我的建议是先写一个演示脚本把要演示的功能一步一步列出来然后再开录。一个合格的演示视频应该包含以下内容打开系统首页展示商品列表和分类导航演示商品搜索。注册一个新用户或者用已有账号登录登录成功后进入用户中心。把几个商品加入购物车在购物车页面调整数量点击结算下单。模拟支付查看订单状态从待支付变成已支付。切换到管理员账号登录展示后台的商品管理、订单管理、用户管理功能。在订单管理中把刚才那位用户的订单状态改成已发货。拍摄工具用你电脑上自带的录屏软件就行Outlook自带的录屏、Windows的录屏剪辑工具都可以。录制过程有几个注意事项分辨率调高一点字体别太细太小录制前先把数据库里都准备好演示数据多插几条商品记录和一些分类这样页面看起来才丰富录的时候操作不要太快每点一步停顿两秒方便评委看清。千万不要一边录制一边讲解口播容易紧张出错后期配字幕工作量又大。最简单安全的方式是纯操作录屏不加声音关键操作可以通过鼠标点击的位置让评委自己看明白。8. 一群容易被忽视的细节答辩前务必检查的清单答辩之前的项目检查这份清单有非常高的实际价值我连续几年带学生对口答辩总结下来的经验就是代码里最致命的问题往往不是业务逻辑而是项目启动都过不去。第一点检查项目是否能在干净的电脑上从零跑起来。这里说的“干净”是指没有你的IDE配置、没有你自定义的环境变量。很多项目在你自己电脑上跑得好好的换到答辩教室的电脑就启动失败原因往往是全局变量配置、MAVEN仓库路径、MySQL版本不匹配。你至少要在答辩前一周用一台没配过Java环境的机器或者虚拟机完整跑一遍项目这样心里才有底。第二点检查各种边界情况是否做了处理。比如库存为0的商品还会不会显示“加入购物车”按钮用户购买数量超过库存时后端会不会报友好提示用户把购物车清空了再下单会不会出现“结算”按钮不可点这些边界情况如果现场被评委点出来操作非常影响观感。第三点准备一到两个“加分亮点”的演示话术。比如下单时的库存原子更新、订单和明细的拆分设计、拦截器的登录拦截、密码加盐加密这些亮点在演示时顺口提一句答辩评分不会差。第四点重要的演示数据要准备好。管理员账号记在备忘录里测试商品数据多准备一些分类、图片选择清晰一些的高质量图片数据库里的数据不要只有孤零零的三条至少每个分类都要有商品看起来像是一个真实营业中的超市系统。第五点备份做好。项目源码、数据库SQL脚本、论文Word稿、演示视频、部署文档、PPT所有这些材料放在同一个文件夹里文件名规范压缩成一个zip一份存U盘一份存网盘。每年毕业季都有同学把代码放在某个论坛里付费下载的压缩包里结果那个压缩包本身是坏的或者里面的数据库脚本还是空表——这种低级失误不要在答辩前发生。答辩本身最重要的原则是诚实和自信。项目如果是你自己写的哪怕有不足老师问起来你能把思考过程讲清楚都是可以通过的。如果项目是买的、网上找的代码都没看过一遍那才是真正的风险所在。所以不管你从哪里拿到这个项目拿到之后第一件事就是把项目跑起来从头到尾把每一行核心代码看一遍把每个功能点都能自己说清楚这才是最稳妥的答辩准备方式。