又到一年毕设季。每年这个时候,后台都有大量同学来问“有没有现成的系统选题”“能不能给个能跑通的源码”,而基于Spring Boot的无人机销售系统,就是我在“电商类毕业设计”里比较推荐的一个方向。它既有完整的交易闭环——注册登录、商品展示、购物车、下单支付、订单管理,又因为“无人机”这个品类自带话题性和业务延展性,在答辩时非常容易讲出亮点。
这篇文章不搞虚的,我直接以这套系统的设计与实现为主线,把你在做同类毕设时一定会遇到的选型问题、表结构设计、核心业务实现、调试部署、文档撰写和答辩准备全部过一遍。不管是第一次接触Spring Boot的新手,还是想给自己的系统加几个加分功能、冲刺高分的同学,都能从这里找到可以直接抄作业的思路。
1. 项目定位与需求拆解
做毕设最怕的就是选题太空、需求太模糊。无人机销售系统听起来是一个电商平台,但要想清楚它和普通“图书商城”“零食商城”类的系统到底有什么区别,这会直接影响你的数据库设计和功能亮点的呈现。
1.1 为什么选无人机销售这个方向
先说选题逻辑。电商类系统是毕设的常青树,但正因为它太常见,很多同学做出来千篇一律,答辩老师一眼看穿是照着教程改的。无人机销售系统好就好在“商品有属性、场景有特色、演示有画面感”。无人机不是普通标品,它有品牌、型号、机身重量、续航时间、最大飞行距离、拍摄像素、图传距离、避障能力等一堆真实业务会关心的参数。这些特性天然适合做“商品参数详情”“多条件筛选”“分类对比”这些功能模块,比单纯卖一本书、卖一件衣服的信息密度高得多。
另外一个现实因素是数据可视化。销售系统如果只有CRUD,很难拿高分。而无人机这种单价高、型号区隔明确的商品,非常适合做“销量排行”“品牌占比”“价格带分布”这类统计图表,管理员首页放几个ECharts图表,整个系统的完成度和专业度立刻就不一样了。
1.2 角色与功能边界怎么划分
这套系统的用户角色一定要清晰,我通常建议拆成三类,不要贪多:
- 普通用户(前台):注册登录、浏览无人机、按分类/关键字搜索、查看商品详情、加入购物车、提交订单、在线支付(模拟)、查看订单状态、取消订单、个人资料管理。
- 管理员(后台):用户管理、分类管理、无人机商品管理(增删改查、上下架、库存维护)、订单管理(发货、查看详情、统计)、公告管理、轮播图管理等。
- 系统维度:登录鉴权、权限拦截、数据统计看板。
角色边界一旦定下来,后面的接口设计、表结构设计、页面开发就都有了清晰的靶子。我在实际辅导过程中见过不少同学一开始把功能画得特别大,什么秒杀、团购、直播带货全塞进去,结果开发一个月连订单流程都没跑通。毕设不是创业项目,把核心闭环做扎实,再挑两个亮点做深,远比大而全但每个功能都是半成品要强得多。
1.3 需求分级:分清“必须做”和“加分项”
我会在动手开发之前先做一次需求分级,把功能拆成三层:
- 基础层(不做完没法交付):登录注册、用户管理、商品分类与列表、商品详情、购物车、订单提交、订单列表、管理员对商品和订单的CRUD。
- 进阶层(体现业务完整性):库存自动扣减、订单状态流转(待付款→已付款→已发货→已完成/已取消)、多条件筛选、分页、文件上传(商品图片)。
- 加分项(答辩高光点):销量与销售额统计图表、订单导出、公告管理、轮播图、密码加密存储、JWT无状态登录、参数校验、统一的异常处理。
我在辅导中反复强调一个观点:进阶层是系统能“自圆其说”的关键,加分项是拉开差距的关键。基础层让你及格,进阶层让你有底气,加分项让你能讲出“你是怎么思考的”。
2. 技术选型与系统架构
很多同学一上来就纠结用Spring Boot还是SSM,用JSP还是Vue。我的建议非常直接:别在技术上走冷门路线,选生态最成熟、资料最多的组合,因为你要的不是炫技,而是稳定跑通并且能被老师认可。
2.1 为什么主干选Spring Boot
Spring Boot在Java毕设江湖中的地位不用我多说。它有几点对毕设场景特别友好:
- 自动配置大幅减少了XML配置,你把依赖一引、配置一写,项目就能跑,省下来的时间可以全部投入到业务代码上。
- 内嵌Tomcat,打包成jar直接运行,部署也简单,演示的时候一条命令就能启动。
- 面试和答辩阶段,“用过Spring Boot”几乎是Java岗位的标配,这个技术点写进简历是加分项。
版本选择上,我建议用Spring Boot 2.7.x,这是2.x系列的收官版本,稳定、教程多、跟当前绝大多数第三方依赖的兼容性好。如果你对3.x不够熟悉,不要冒险,2.7足够应付整个毕设周期。
2.2 持久层:MyBatis Plus是最优解
数据访问层目前的主流选择有两个:Spring Data JPA和MyBatis Plus。我自己在带毕设时几乎无脑推荐MyBatis Plus,理由非常现实:
- MyBatis Plus对单表CRUD做到了开箱即用,内置的
BaseMapper让你连SQL都不用写,能省下大量体力活。 - 它的条件构造器
QueryWrapper在做多条件筛选、分页时非常好用,对应无人机的“品牌+价格带+关键字搜索”这类需求,几行代码就能搞定。 - 它的分页插件也是现成的,避免你手写Limit和总条数统计的繁琐逻辑。
也用JPA的同学来做这类电商系统,多表关联和动态查询时容易写出比较绕的代码,对初学者而言调试成本偏高。MyBatis Plus在这类中小型Web系统中的统治力,目前还是最强的。
2.3 前端方案:优先前后端分离
前端我比较推荐用Vue 2 + Element UI,或者Vue 3 + Element Plus。原因是:电商类系统的后台管理页面有大量的表格、表单、弹窗、选项卡,Element这套组件库能把后台页面开发效率提升好几倍。你用JSP+原生JS当然也能做,但前端代码的量和调试成本会明显上升,风格上也容易显得老旧。
前后端分离还有一个巨大的隐形好处:你的后端接口是纯JSON返回,答辩时可以现场用Postman或Apifox调用接口展示数据,直接证明你懂接口设计规范和前后端联调流程。很多答辩老师的关注点就在这里,这比单纯点页面更容易讲出技术深度。
如果你的前端基础比较薄弱,也不用太担心。管理后台的页面结构其实是高度模板化的:左侧菜单、顶部栏、内容区表格。照着现成的后台模板改,替换成无人机相关的业务字段和接口,完全来得及。
2.4 项目分层与包结构
一个清晰的项目结构,不仅方便你自己开发,也是答辩时“项目架构”提问的直接素材。我推荐的标准分层是五层,从controller到mapper逐层调用:
com.example.drone ├── controller // 接收请求、参数校验、返回结果 ├── service // 业务逻辑层,事务控制放在这里 │ └── impl // Service实现类 ├── mapper // MyBatis Plus的Mapper接口 ├── entity // 数据库实体类 ├── common // 通用返回结果、异常处理、常量、工具类 ├── config // 配置类(跨域、拦截器、分页插件等) └── vo / dto // 给前端展示用的视图对象,避免直接暴露实体这里很多人会犯一个毛病,就是把Entity直接返回给前端。你会发现无人机商品表里可能还有deleted、create_time这些字段,直接返回既不安全也不规范。写一个DroneVO用来组装最终的展示字段,页面只认VO,既能保护数据,也让接口结构更干净。这个细节在答辩时把它讲出来,老师会认为你具备工程意识。
3. 数据库设计与建模
数据库设计是整个项目的底盘,底盘不稳,后面写代码越写越难受。很多同学做毕设时表关系特别随意,比如订单里直接塞一个商品名称字段就完事,这种设计在答辩时非常容易被问到漏洞。我们按电商闭环的标准来建模,但表数量控制在合理范围,不搞过度设计。
3.1 核心表结构清单
我建议的表结构是这样一套,每一张表都有明确职责:
| 表名 | 主要字段 | 职责说明 |
|---|---|---|
user | id, username, password, nickname, avatar, phone, role, status, create_time | 用户表,role区分管理员和普通用户,status控制禁用 |
category | id, name, parent_id, sort, status | 无人机分类表,支持二级分类(消费级/专业级,多旋翼/固定翼) |
drone | id, name, brand, model, category_id, price, stock, sales, cover_image, detail_images, weight, battery_life, max_distance, max_speed, pixel, description, status, create_time | 无人机商品表,字段冗余了核心参数便于列表展示 |
cart | id, user_id, drone_id, quantity, checked, create_time | 购物车表 |
orders | id, order_no, user_id, total_amount, pay_amount, pay_type, status, receiver_name, receiver_phone, receiver_address, remark, create_time, pay_time, ship_time | 订单主表 |
order_item | id, order_id, drone_id, drone_name, drone_image, price, quantity, subtotal | 订单明细表(快照) |
address | id, user_id, receiver_name, receiver_phone, province, city, district, detail, is_default | 收货地址表 |
announcement | id, title, content, create_time | 公告表 |
banner | id, image, target_url, sort, status | 轮播图表 |
这里有两个设计点需要特别说明。
第一,order_item里的drone_name、drone_image、price是故意冗余的快照字段。为什么?因为商品的价格和名称随时可能被修改,但如果订单明细跟着变,你的历史订单就全乱套了。快照的意义在于:下单那一刻,这些东西是什么就记录什么,永久不变。这个点几乎是我每次答辩模拟时的必问项,一定要能讲清楚。
第二,orders里的order_no不要用自增ID直接对外展示,要用时间戳+随机数生成唯一业务单号,比如20250515224568123456。这既是业务习惯,也是防止订单号被遍历的安全细节。
3.2 字段设计的几个硬性规范
先说金额字段。所有跟钱有关的字段,一律用decimal,不要用double或float。二进制浮点数在计算时会存在精度丢失,0.1+0.2不等于0.3的问题在真金白银的场景里是绝对不能接受的。total_amount定义成decimal(10,2),单位用元,既直观又足够。
再说逻辑删除。MyBatis Plus默认支持@TableLogic逻辑删除,给drone表加一个deleted字段,查询时自动过滤已删除数据。这样商品下架不是物理删除,而是把它标记为删除,数据依然保留在库里,方便追溯。
最后是时间字段,统一用datetime,由后端统一填充,不要交给前端传。MyBatis Plus的MetaObjectHandler可以实现插入和更新时自动填充create_time和update_time,省心且规范。
3.3 数据库设计文档要写到什么程度
毕设文档里的数据库设计部分,光贴几张表结构截图是不够的。要包含:E-R图(实体关系图)、数据字典(每个表的字段名、类型、是否为空、默认值、说明)、关键索引说明。数据字典可以做成表格,每张表一个表,字段一行一条,截图到Word或Markdown里排版整齐。
我在检查文档时最看重的是“字段含义是否说得清”。很多同学把字段名写得特别随意,比如a1、b2,这会给答辩减分。字段名宁可长一点,也要见名知义。一个规范的数据字典,能让老师不看代码就对你的数据设计一目了然,这个印象分很重要。
4. 核心业务逻辑实现要点
框架搭好、表建好之后,就到了真正能体现工作量也最容易出Bug的业务逻辑阶段。这里我不会贴大段完整代码,而是把每个核心模块的实现思路、关键代码片段和最容易踩的坑讲透。掌握这些,你自己动手写的时候会省非常多的调试时间。
4.1 登录鉴权:JWT + 拦截器方案
登录模块最简洁可靠的方案是JWT(JSON Web Token)。流程是:用户提交用户名密码,后端校验通过后生成一个带过期时间的token返回给前端;前端存储token,在后续请求的Header里带上Authorization: Bearer <token>;后端通过拦截器统一校验token,解析出用户信息后放行。
密码存储一定不要明文,用BCryptPasswordEncoder做加密。它每次加密的结果都是随机的,但校验时能正确比对,安全性远高于MD5这种可被彩虹表破解的算法。代码方面,拦截器要排除登录、注册、商品列表、商品详情这些公开接口,只拦截需要登录的接口。用户和管理员可以用role字段区分,在拦截器里校验角色的访问权限。
这里有一个我自己在辅导时反复强调的细节:token里不要放敏感信息,只放userId和role就够了,其它用户信息接口实时查库获取。一旦用户被禁用或者角色变动,token里存的过期信息会导致权限判断失误。
4.2 商品搜索与多条件筛选
无人机列表页的筛选条件是典型的多条件查询场景:关键字、分类、品牌、价格区间、续航时间,这些条件组合起来产生动态SQL。MyBatis Plus的QueryWrapper在这种场景下简直是神器:
QueryWrapper<Drone> wrapper = new QueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(keyword), "name", keyword) .eq(categoryId != null, "category_id", categoryId) .eq(StringUtils.isNotBlank(brand), "brand", brand) .ge(minPrice != null, "price", minPrice) .le(maxPrice != null, "price", maxPrice) .orderByDesc("sales");每个条件前面的布尔表达式是这段代码的灵魂:条件为true才拼接进SQL,条件为空时直接跳过。这样前端传不传参数,后端都不用写一堆if分支。
分页使用MyBatis Plus的分页插件,配置一个MybatisPlusInterceptor并添加PaginationInnerInterceptor,然后:
Page<Drone> page = new Page<>(current, size); IPage<Drone> result = droneMapper.selectPage(page, wrapper);返回给前端时带上total、pages、records,前端就能完整渲染分页组件。商品列表的排序我建议默认按销量倒序,这符合电商习惯,也能让销售数据有一个自然的展示逻辑。
4.3 购物车:入库还是放Redis
购物车的实现有两种常见方案:数据库表和Redis缓存。毕设系统里我建议直接用数据库表,简单可靠,能清楚演示增删改查。每个用户登录后从cart表查自己的购物车数据,关联drone表取最新价格和库存。
加入购物车的逻辑要判断:如果该用户购物车中已经存在同一款无人机,就做数量累加,否则新增一条记录。修改数量时要带上数量上限校验,比如不能超过库存。勾选、全选、删除这些操作都是围绕cart表的行级操作,接口设计得很直观。
这里要注意,前端展示购物车时要显示“小计”,也就是drone.price * cart.quantity。这个价格虽然来自drone表,但在购物车阶段不落库,真正的价格快照在下单生成order_item时才固化。想明白这两者的界限,你写代码的时候就不会混乱。
4.4 下单与库存扣减:事务与防超卖
下单是这套系统里业务最密集的接口,也是高并发面试题的经典考点。我在毕设版本里建议这样设计:
@Transactional public OrderVO createOrder(Long userId, List<CartItem> items, Long addressId) { // 1. 校验收货地址和购物车数据 // 2. 计算订单总金额 // 3. 扣减库存 // 4. 生成订单主表和明细表 // 5. 清空已下单的购物车项 // 6. 返回订单号 }@Transactional保证这六步要么全部成功,要么全部回滚,不会出现库存扣了但订单没建成的脏数据。
防超卖是最容易被人忽略但答辩最爱问的点。最直观的问题是:如果库存只剩1台,两个用户同时下单,会不会两个都成功?最简单的可靠方案是使用数据库的行级锁,扣减库存时使用乐观锁或者带条件的更新:
// 乐观锁方案:更新时校验版本号或库存数量 int rows = droneMapper.updateStockById(droneId, quantity); // 对应的SQL:UPDATE drone SET stock = stock - #{quantity}, version = version + 1 // WHERE id = #{droneId} AND stock >= #{quantity} if (rows == 0) { throw new RuntimeException("库存不足或商品已下架"); }这种写法把“校验库存是否充足”和“扣减库存”做成了一个原子操作,数据库层面就不会出现超卖。如果查出库存充足再更新,中间大概率超卖。这个逻辑你在答辩时一定要能主动讲出来,老师一听就知道你是真写过,而不是纯缝合。
订单状态流转我建议用常量或枚举定义好:0待付款、1已付款、2已发货、3已完成、4已取消。待付款的订单超过30分钟未支付可以自动取消,这个定时任务用Spring的@Scheduled就能实现,也是一个不复杂的加分功能。
4.5 管理后台的数据统计
管理后台的首页如果只有用户列表和商品列表,那叫“孤儿后台”。加上统计看板,整个系统的完整度会质的提升。我推荐至少做四个统计维度:
- 今日/本月销售额和订单量
- 销量Top 10的无人机排行
- 各品牌销售额占比(饼图)
- 最近30天的销售趋势(折线图)
这些数据用order_item表和orders表做SQL聚合就能查出来。比如品牌销售额占比,就是把order_item联表drone,按drone.brand分组,SUM(subtotal)。ECharts拿到数据直接渲染,效果非常直观。
写统计SQL时要注意时间范围过滤,比如“最近30天”用order.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)。还要注意统计周期内没有销售额时图表也得正常显示,可以在Service层做一次空数据的兜底填充,避免前端直接收到空列表导致图表渲染报错。
4.6 模拟支付与物流状态
真实支付接口在毕设里涉及商户号、证书、回调地址,环境复杂且不适合演示。更务实的做法是实现一个模拟支付接口:用户点击“立即支付”,后端把订单状态从“待付款”改为“已付款”,记录支付时间和支付方式。如果有余额功能,可以再设计一个用户钱包表做余额扣减,逻辑上更完整。
如果你想在中级加分项上更进一步,可以在订单模块里加入“模拟发货”的操作:管理员点击发货,填写物流单号,订单状态变更为“已发货”,前端用户端实时展示“已发货”和物流单号。这一个小功能就能把角色之间的交互完全串起来,演示时非常有说服力。
5. 调试运行与部署实战
技术方案写得再好,代码跑不起来也是零。我见过太多同学在环境配置和启动排错上耗费一周时间。这一节我把从零启动项目到最终部署的路径完整梳理一遍,并整理出一份高频异常排查表,方便你遇到问题直接对表找原因。
5.1 本地开发环境准备
你需要准备的环境和版本建议如下:
- JDK 8或JDK 17(取决于Spring Boot版本,2.7.x用JDK 8或11最稳)
- Maven 3.6+(用IDEA内置的也行)
- MySQL 5.7或8.0
- Redis(如果购物车或验证码功能用了缓存;不用Redis的话可以省略)
- Node.js 14+(用于运行Vue前端项目)
- IDEA开发工具
前端项目启动顺序通常是:先启动后端Spring Boot,再启动前端Vue。后端在IDEA里直接运行主类即可,前端在项目目录下执行:
npm install npm run dev注意npm install在国内如果网络慢,可以切换镜像源。安装完成后看到Compiled successfully就说明前端起来了。数据库方面,我一般建议提供两个SQL文件:schema.sql负责建表,data.sql负责导入初始数据。初始数据量不用大,无人机商品放6到10条、覆盖三四个品牌、价格从3000到30000分布开,就足够演示筛选和图表了。
5.2 常见异常排查速查表
下面这些异常是我在辅导时遇到频率最高的,按“现象→原因→解决”的格式整理成了一张速查表,贴在这里供你直接查阅。
| 异常现象 | 可能原因 | 解决办法 |
|---|---|---|
启动报Port 8080 was already in use | 端口被占用 | 改application.yml里的server.port,如8081 |
连接数据库报Access denied for user | 数据库账号密码不对 | 核对application.yml里的username/password与MySQL实际一致 |
报Unknown database | 指定的库名不存在 | 先在MySQL里执行建库语句再启动 |
| Maven依赖下载失败 | 网络问题或仓库源慢 | 换阿里云镜像源,IDEA里设置settings.xml |
| 启动成功但访问接口返回404 | 请求路径写错或项目没启动完整 | 核对Controller的@RequestMapping路径与前端请求地址 |
| 前后端分离项目请求跨域 | 浏览器阻止跨域 | 后端配置CorsFilter或使用@CrossOrigin |
| MyBatis Plus查询返回字段全是null | 实体驼峰字段没映射下划线列名 | 配置mapUnderscoreToCamelCase=true,MP默认开启 |
| 登录接口报JWT解析失败 | token过期或解析密钥不一致 | 检查JWT工具类的密钥和过期时间配置 |
| 上传图片后访问不到 | 静态资源映射未配置 | 配置WebMvcConfigurer的addResourceHandlers映射上传目录 |
这张表解决的是“看得见”的报错,还有一类“看不见”的坑是配置类没有扫描到。比如你写了分页插件配置类但忘了加@Configuration,MyBatis Plus分页会失效,SQL正常执行但total永远为0。这种问题不报错但结果不对,排查起来最耗时间。我的建议是:凡是配置类,随手检查注解是否齐全,@Configuration要么加在类上,要么通过@MapperScan扫描到Mapper。
5.3 部署到服务器演示
如果你想把系统部署到云服务器上供答辩时远程演示,流程并不复杂。后端项目在IDEA右侧Maven面板执行package打包,会生成一个target/目录下的jar包。服务器上装好JDK和MySQL,把jar包上传后执行:
nohup java -jar drone-sales-system-0.0.1-SNAPSHOT.jar > app.log 2>&1 &前端项目执行npm run build,产物是dist/静态目录,可以用Nginx托管,并把/api开头的请求反向代理到后端的监听端口:
server { listen 80; server_name your_domain; location / { root /opt/dist; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } }try_files这行的作用是让前端路由在刷新页面时不出现404,属于SPA应用部署的必备配置。生产环境里记得把数据库账号改成专用账号,不要用root直连,也算是一个安全习惯的体现。
6. 毕设文档撰写与答辩准备
代码写完了,还有一道大关就是文档和答辩。很多同学项目做得很扎实,却因为文档结构混乱、答辩时讲不到点子上而丢分,非常可惜。我个人建议代码写完千万别急着交给老师,花三五天时间按照学术规范把文档打磨好,这个时间花得非常值。
6.1 毕设论文的标准章节结构
高校的毕设文档格式不尽相同,但核心结构高度一致,通常包含五到六章:
- 绪论:选题背景与意义、国内外研究现状、论文结构安排。
- 相关技术介绍:Spring Boot、MyBatis Plus、Vue、MySQL、JWT等,写清楚技术选型理由。
- 需求分析:可行性分析(技术、经济、操作)、功能需求分析、用例图。
- 系统设计:总体架构设计(B/S架构、前后端分离)、功能模块设计、数据库设计。
- 系统实现:每个模块的功能描述、核心代码片段、运行截图。
- 系统测试:测试环境、测试用例表(功能测试、性能测试)、测试结论。
这里有一个很实用的建议:每一章的配图要讲究,不要只贴页面截图,要贴有标注的图。比如“注册登录模块”除了贴页面,还要贴序列图或流程图;“数据库设计”配E-R图和数据字典表。有图有表有代码,文档的丰满度和可信度一下子就上来了。
代码片段不要大段大段粘贴,选每个模块最核心的六七行就够了。文档的定位是说明白“为什么这样设计、怎么实现的”,不是让你把源码打印一遍。我见过有同学把整个Controller代码全贴进去,文档三百页,老师看着都头疼,这反而暴露了“凑篇幅”的意图。
6.2 答辩高频问题与应对思路
我把答辩老师最爱问的问题整理成了一份清单,并附上应答思路:
| 高频问题 | 应答思路 |
|---|---|
| 为什么选择Spring Boot做后端? | 自动配置简化开发、内置容器、生态成熟、社区资源丰富,再对比SSM提一下配置成本 |
| 你的系统有哪些角色?权限是怎么控制的? | 用户/管理员双角色,JWT携带角色信息,拦截器校验身份和权限 |
| 项目中你遇到的最大的技术难点是什么? | 建议讲库存防超卖或订单状态一致性,从问题场景→解决方案→代码实现→最终效果完整讲 |
| 前后端是如何交互的? | 前端通过axios发起HTTP请求,后端以JSON返回,处理跨域并统一响应格式 |
| 数据库为什么这样设计? | 订单明细做快照冗余是为了历史追溯,商品和分类分开是遵守范式并兼顾查询性能 |
| 系统安全性做了哪些考虑? | 密码加密、JWT无状态鉴权、参数校验、逻辑删除,防止恶意的直接访问 |
回答问题的核心不是背答案,而是用“当时遇到什么问题→我是怎么分析的→最后怎么解决的”来组织陈述。哪怕方案不是最优的,只要你展示了独立思考的过程,老师都会认可。
6.3 源码讲解:如何把自己讲成“作者本人”
还有一个非常尴尬的现场:有些同学的源码是买的或者借用别人的,答辩时评阅老师随便指一个类问“这是干什么的”,你答不上来,基本就坐实了不是自己做的。表面上是诚信问题,实际上是你根本没有花时间梳理项目的整体脉络。
我的建议是,答辩前坚持做一次“代码走读”,把项目里的每一个Controller接口的作用、每一个Service的业务逻辑、每一张表的用途都自己口述一遍,重点是能画出“请求从页面到数据库的完整链路”。例如用户点击“加入购物车”后,网络请求怎么走、后端哪个类处理、执行什么SQL、返回什么结构,这个链路能流畅说下来,你就能应对绝大多数追问。这个过程不用老师提问,你自己拿张纸默写一遍就能自我检验。
写在最后:动手之前先想清楚三件事
做了这么多年Java方向的毕业设计辅导,我最大的感受是:很多同学不是能力不够,而是动手太急。拿到题目就开写,写一半发现表结构不对又要推倒重来,全程被Bug追着跑,最后交出来的东西自己都心虚。
如果你准备开始做这个基于Spring Boot的无人机销售系统,我建议你在写第一行代码之前,先花两三天把三件事搞定:第一,把需求分级列清楚,明确哪些是基础功能、哪些是加分项;第二,把数据库表结构设计好,字段规范、关系清晰;第三,把技术栈和项目结构定下来,别写到一半换框架。这三件事想透,后面的开发就是按图索骥,速度反而快得多。
我也要特别提醒一句:毕设的本质不是“做产品”,而是“证明你掌握了做产品的基本方法”。你不必追求高大上的微服务、分布式、消息队列,把一个前后端分离的Spring Boot单体项目做得干净、严谨、能讲出设计理由,就已经是一份相当合格的答卷了。做项目的过程中多看多试,调试中踩的每一个坑,最后都会变成你在答辩现场最真实、最有说服力的素材。