选毕业设计题目这件事,我们真的好久没吵过了。一头是导师说“要有工作量”,一头是自己在“能做出来”和“不能在寝室熬到凌晨四点”之间反复横跳。如果你正在看这个标题,大概率已经和这个方向对上了眼:农产品管理与销售APP,需求不冷门、技术栈主流、业务量可控,还能顺便把前端App和后台管理端一起展示出来。这个组合用于毕设答辩,属于那种看起来有“系统观”、实际落地又不太折磨人的类型。
这篇文章我不打算给你讲怎么从零“手写”一个项目,而是直接站在一个被这个类题目“折磨”过、也带人完成后期的视角,把这个基于Spring Boot的农产品销售App,从功能拆解、技术选型、数据库设计、接口实现到论文答辩配套,掰开揉碎地讲清楚。愿它能把你从“不知道先动哪块代码”和“写完不知道论文怎么凑”这两个日常焦虑里捞出来。
1. 项目定位与毕设选型的底层逻辑
1.1 为什么“农产品+销售App”是个好框架
先说选题本身。很多同学担心农产品销售这个方向“太土”,担心答辩老师觉得没技术含量。恰恰相反,农产品是电商领域里最容易讲出业务差异的垂直场景。普通商品销售系统,商品、订单、购物车、支付,做来做去都是一套模板,几千行代码堆上去,老师看一眼就审美疲劳。
农产品不一样,它有自己鲜明的业务约束:第一,时效性。蔬菜水果有保质期,所以订单和库存之间的联动比普通商品更强调“库存锁定”和“过期处理”。第二,多角色。农产品销售链条里,除了普通消费者,还天然存在着农户/商家、批发商这样明显的角色分层。第三,非标品。同一种西红柿,不同批次、不同大小、不同产地,价格和规格都不同,所以在商品设计上,规格和批次字段比普通商品系统更有存在意义。
这些业务特点,放在毕设论文里是非常好看的故事线。写“需求分析”的时候,你不用硬凑一些假大空的“系统优势”,只需要老老实实把“农产品有别于工业品的特点”梳理出来,然后说“本系统针对这些特点设计了对应功能”,标题的立意瞬间就立住了。这比在答辩时支支吾吾解释“为什么商品表里要多加两个字段”要有说服力得多。
很多人的毕设败在一点上:功能表拉得巨长,前后台加起来十几张页面,但问细节全是“这个功能没做完”“那个按钮只是摆设”。所以我始终坚持一个原则:功能宁少勿多,但每个功能必须在主流程上站得住脚。对农产品销售系统来说,真正重要的一条主流程只有一个——农产品上架、用户浏览下单、库存扣减、订单状态流转、用户评价。把这个闭环跑通了,你的项目就是完整的。其余像优惠券、积分、社区发帖这类型功能,能加就加,不能加坚决不碰。
1.2 明确角色边界:前台App、后台管理端和“中间层”
整个项目在标题里明确写了“APP”,所以系统的前端主体是移动端,这部分需要考虑清楚。但农产品销售系统不可能只有一个用户端,你还得有个商家端或者平台管理端,否则商品怎么维护、订单怎么处理、数据怎么统计,都无从谈起。
我的建议是按三块来划分:
- 用户端APP:面向消费者,核心功能为登录注册、农产品浏览搜索、商品详情、加入购物车、下单支付、订单列表、评价。
- 商家端/管理员端:核心功能为商品上下架、库存管理、订单发货与处理、销售数据统计。
- 后端服务:基于Spring Boot提供REST API,统一处理认证鉴权、业务逻辑、数据持久化。
这种划分方式的好处是,它天然对应了论文里的“系统角色分析”,也方便代码层面的分模块开发。很多同学容易把用户端和管理端的功能混在一个包里,然后在controller层判断角色,代码看着乱,Controller臃肿得没法读。我自己在实践中的经验是,哪怕数据库表只有一张用户表,在后台接口路径上也要把/api/user/**和/api/admin/**分开。这样写毕业论文“接口设计”一节时,表格都能做得更整洁,单独走一下URL就能看出系统的层次感。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型详解与毕设项目环境搭建
2.1 后端:Spring Boot为主,SSM的“安全版”替代
Spring Boot的版本选择建议直接在构建网站上选一个稳定版,当前阶段新开项目的话用 2.7.x 或 3.x 都没有问题。但这里有个影响后续开发的大坑,请一定提前注意:Spring Boot 3.x 最低要求 Java 17,而很多学校的机房电脑或者你买来的旧教程,还在用 Java 8。如果你不想在开发到一半时被莫名其妙的“Unsupported major version”错误卡住,建议先确认自己的JDK环境再决定版本。
从毕设角度讲,Spring Boot + MyBatis Plus是当下最省力的组合。JPA上手快但写复杂查询时容易踩坑,尤其联合多表查询时调试麻烦;原生MyBatis写XML又略费时间。MyBatis Plus刚好在中间,单表CRUD默认生成,多表查询再手写SQL,而且它对交付论文里的“数据访问层设计”也有帮助——可以说。
配套组件方面,有几个是强烈建议加上的:
- Spring Security + JWT:用于登录认证和接口鉴权。
- Lombok:减少实体类里的Getter/Setter样板代码,实体少的时候坚持长风格,实体多了你才能真正感到它有多香。
- Swagger/knife4j:自动整理接口文档,你在答辩时演示接口直接用网页调,效果非常好。
- Hutool:工具库,处理日期、随机数、验证码都有现成方法。
2.2 前端App的实现方案:原生、Web端还是小程序
标题写的是APP,但毕业设计圈里“APP”这个词的含金量一直很复杂。真正的纯原生Android开发(Java/Kotlin)对很多同学来说,工作量可能比后端更大,而且答辩演示时需要Android模拟器,电脑配置不好还容易卡。如果你是移动开发方向,本身底子好,原生没毛病。但如果你主要方向是Java后端,我强烈建议别把精力耗在原生App的适配和打包上。
可行的替代方案有这么几个:
- WebApp模式:用Vue/React做一个移动端适配的H5页面,打包成App或直接在浏览器用手机模拟器演示,这是最稳妥的路线。开发快、调试方便、和Spring Boot接口联调最顺畅。
- UniApp模式:一套代码编译成iOS、Android、H5和小程序,对有一定前端基础的同学特别友好。
- 小程序模式:用微信开发者工具微信小程序,这个方向如果导师认的话,演示效果其实比App更贴近真实使用场景,因为你只需要用手机微信扫码就能展示。
从我的经验来看,绝大多数做Java后端方向的毕设同学,最终选择了“Vue + Vant UI 做移动端H5页面,打包成App壳”的方案。这个方案的优势是,你简历上可以写“熟悉Vue全家桶”“了解移动端适配”,项目演示也不依赖Android虚拟机,浏览器一开就能跑。
2.3 环境清单:从零到系统跑起来
一个比较省心但不省事的环境准备顺序是这样:
- 安装JDK,配置环境变量,命令行
java -version能通过。 - 安装MySQL(建议8.x)和Navicat或Workbench。
- 安装Maven,配置国内镜像源,否则依赖拉取慢到让人怀疑人生。
- 安装IDEA,安装Lombok插件(新版IDEA自带)。
- 初始化数据库,导入项目中附带的SQL脚本。
- 启动后端,看控制台日志是否打印出端口号;如果用的8080,确认没有被占用。
- 启动前端,配置代理转发到后端地址。
这个顺序看着简单,实际卡人的地方几乎都在第5步和第7步。数据库脚本导入时最容易报错的是字符集问题,尤其是农产品名称、产地这些字段中间如果夹着中文,导入乱码了,后面你查数据会查得崩溃。所以建库时一定要指定utf8mb4字符集。
3. 核心业务模块与数据库设计实战
3.1 实体关系梳理:从“用户”到“评价”的完整链路
数据库设计是毕设项目里最体现功底的环节,也是答辩老师最常追问的地方。农产品销售系统的表,按最小化但主流程完整的原则,至少需要以下这些:
| 表名 | 核心字段 | 作用说明 |
|---|---|---|
| 用户表 | id, 用户名, 密码, 手机号, 角色, 头像 | 区分消费者与管理/商家角色 |
| 商品分类表 | id, 分类名, 排序 | 农产品一级/二级分类 |
| 商品表 | id, 名称, 分类id, 描述, 主图, 价格, 库存, 规格, 产地, 上下架状态 | 系统核心商品信息 |
| 购物车表 | id, 用户id, 商品id, 数量, 加入时间 | 用户端购物车,也可用Redis替代 |
| 订单表 | id, 订单号, 用户id, 总金额, 状态, 地址, 创建时间, 支付时间 | 订单主表 |
| 订单明细表 | id, 订单id, 商品id, 商品快照名称, 商品快照价格, 数量 | 保存下单时商品信息快照 |
| 收货地址表 | id, 用户id, 联系人, 电话, 地址 | 用户多地址管理 |
| 评价表 | id, 订单id, 用户id, 商品id, 评分, 内容, 图片 | 商品评价 |
| 库存变动记录表(可选) | id, 商品id, 变动数量, 原因, 操作时间 | 用于追溯库存变化 |
这里面有两个细节,不管对业务还是答辩都非常有效。
第一,订单明细表里一定要做商品快照。什么意思呢?用户下单了,你不能让订单明细里的商品名称和价格直接关联商品表。因为商家以后可能改价或者删商品,但已经支付的订单,用户看到的购买信息不能跟着没。这里最简单的方法就是在插入订单明细时,把商品名称、单价、图片链接原样存进订单明细表。答辩时老师问“订单为什么要冗余商品字段”,你能从业务一致性角度回答清楚,这是加分项。
第二,商品表里加一个“规格/批次”字段。农产品和普通商品不一样,同一种蔬菜可能因为产地不同、采摘批次不同,价格也不同。这个字段哪怕只是一个字符串,比如“山东大葱 5kg/箱”,也比你单纯放一个价格要更贴合业务。
3.2 数据库设计的三个注意点:精度、索引、删除方式
价格字段千万别用double或者float。这个坑几乎每个新手都踩过:花10.59元买的商品,计算完出现10.589999999。数据库金额类型直接上decimal(10,2),Java端对应BigDecimal,这是规范性要求,没什么可讨论的。
索引方面,用户表登录时查询用户名,商品表根据分类筛选,订单表按用户查订单列表,这三个高频查询的字段应当建普通索引。原价字段别动,量小的时候增加索引反而怪。如果你没学过索引原理,记住一个朴素的道理:查询频繁的字段把它建立索引。
删除方式建议用逻辑删除。用户删订单,其实只是把订单的状态改成“已取消”或“已删除”,而不是真的把记录从MySQL里抹掉。MyBatis Plus里加个@TableLogic注解,就能做到自动改写SQL为逻辑删除。这个点放到论文里写“数据安全与可追溯性设计”也很漂亮。
3.3 库存扣减与订单并发:毕设系统也要有一点起码的严谨
农产品销售的核心操作是下单扣库存。如果一个商品库存只剩10件,10个用户同时下单,系统不能让每个用户都觉得“我下单成功了”。这是典型的并发问题,也是面试/答辩时老师最爱追问的“如果并发高了你怎么办”。
但是这里注意,如果直接上Redis分布式锁、消息队列、乐观锁这些大词,项目复杂度会立刻失控。作为毕设,我推荐用数据库层面的乐观锁来解决:商品表增加一个version字段,更新库存的SQL写为:
sql复制update product
set stock = stock - #{count}, version = version + 1
where id = #{productId} and stock >= #{count} and version = #{version}
如果更新影响的行数为0,说明库存不够或者版本号不一致,业务层抛一个“库存不足”异常就好。这个做法实现简单,但你能在论文中写出“系统通过版本号机制避免超卖问题,保证数据一致性”,专业度立刻上去了。更妙的是,这个方案不需要引入额外组件,是实实在在能跑通并演示的。
4. 后端接口设计:从登录鉴权到订单流转
4.1 登录与JWT鉴权:Roles接口怎么分开控制
登录模块是每个系统的门面。基于Spring Security + JWT做接口鉴权,效果最直观。
简单描述下流程:用户提交账号密码,后端查询用户表,用BCrypt算法校验密码(数据库里存的密码绝不能是明文,这是安全底线),校验通过后生成一个JWT字符串,里面带上用户id和角色,返回给前端。前端请求其他接口时,在请求头里带上Authorization: Bearer <token>,后端通过拦截器/过滤器解析token,拿到当前用户的身份再决定要不要放行。
角色控制方面,最省力的设计是在Spring Security配置里定义两种角色:ROLE_USER和ROLE_ADMIN。接口层面,/api/user/**开头的接口只放行普通用户,/api/admin/**只放行管理员。如果某同学拿着用户token去请求管理端接口,直接返回403。这个设计配合上文说的URL分层,整个权限体系就很清晰了。
有个细节容易忽略:JWT的秘钥和过期时间不要写在代码里。放到application.yml里配置,答辩时老师问“你这个安全配置能不能改”,你说“可以,系统把签名密钥和过期时长抽取为配置项,便于部署调整”,这就是实战经验。
4.2 农产品商品模块:分类、搜索和上下架
商品模块是信息展示的基础,接口上分为用户端和管理端两套视角。
用户端接口主要有:
GET /api/user/product/list:分页查询在售商品,支持关键字模糊搜索、分类筛选、价格区间筛选。GET /api/user/product/detail/{id}:查询商品详情,包含商家名称、库存、评价列表。GET /api/user/product/hot:查询热门商品,可以按销量或浏览量排。
管理端接口:
POST /api/admin/product:新增商品PUT /api/admin/product/{id}:修改商品信息PUT /api/admin/product/status/{id}:上下架操作DELETE /api/admin/product/{id}:逻辑删除商品
商品搜索有一个小点值得做:按关键字LIKE查询时,把名称、产地、描述三个字段都拼接进去。这样用户搜“山东苹果”时,用APP搜索产地,也能找到对应商品。很多同学只按名称搜,实际上农产品很多用户确实喜欢按产地挑,这点非常重要。
4.3 购物车与订单流程:下单、支付、发货、完成、评价
完整的订单流程是系统的核心主线,流转状态建议这么设计:
- 待支付:用户提交订单后,库存预扣减,订单状态为待支付。
- 待发货:用户完成支付(毕设里可以用模拟支付),商家看到待发货订单。
- 待收货:商家发货后,用户看到物流信息(也可以只填一个物流单号)。
- 已完成:用户确认收货后,可以评价,订单状态变为已完成。
- 已取消:用户在待支付阶段取消订单,系统释放库存。
订单号的生成,建议不要用数据库的自增id作为对外展示的订单号。因为太容易被人猜出来今天产生了多少订单。最简单的做法是时间戳 + 随机数,比如20250607153012 + 4位随机数。前端展示给用户看到是“订单编号”,后端内部用id关联。
提交订单和扣减库存,务必放到同一个数据库事务里。如果在Spring的@Transactional方法里执行,先插入订单主表和明细表,再更新商品库存。这两个操作任何一步失败,都要回滚,否则就会出现“订单建了库存却没减”或者“库存减了订单没建”这种测试时发现不了、演示时必翻车的脏数据。
支付处理上,不建议你真的去对接微信支付或支付宝,那需要企业资质不说,流程也复杂。这里做模拟支付入口即可。用户点击“去支付”后,跳转一个模拟支付页面,点“确认支付”后,系统直接把支付时间写入订单表,并把状态从“待支付”改为“待发货”。这个做法在答辩时就说“本系统实现的是支付流程的模拟集成,真实支付环节预留了第三方接口”,完全站得住脚。
4.4 管理端数据看板:销售统计和商品排行
很多同学的管理端就一个列表增删改查,缺少亮点。给管理端加一个数据看板,性价比很高。哪怕不画图表,只是用表格展示统计数据,系统的高度立马不一样。
这些统计接口大概需要:
- 今日订单数、今日销售额
- 近7日销售趋势(按日期分组求和)
- 商品销量排行TOP10
- 各分类商品数量统计
SQL写起来也不复杂,例如累计销售排行,订单明细表和商品表做个连接聚合,按销售数量倒序。这类SQL刚好是答辩中非常有说服力的内容,你甚至可以主动跟老师说:“我用聚合函数对订单明细表做分组统计,生成了销售排行数据。”有明显的实操深度。
5. 前端App的页面设计与联调技巧
5.1 页面结构:用户端要解决哪些核心操作
如果选择H5移动端方案,页面结构和App中常见的底部Tab模式保持一致,用户一看就熟。基本底栏设置四个:
- 首页:搜索框、商品分类导航、轮播图、商品瀑布流列表。
- 分类:展示一级和二级分类,点击筛选商品。
- 购物车:购物车商品列表、数量加减、合计金额、去结算。
- 我的:用户信息、订单入口、收货地址、退出登录。
除了底栏,商品详情和订单确认页是业务密度最高的页面。商品详情页要展示多图轮播(如果只有一张主图,也可以略过)、价格库存、规格选择、数量选择;订单确认页要展示收货地址、商品明细、运费计算、支付方式,然后才是提交订单按钮。
页面数量的话,大约9到10个页面,工作量适中。加上管理端的商品管理、订单管理、数据看板页面,前后累计十几页,是一个很完整体量的毕设。
原本我在做一个农产品项目时,第一版页面只做了一堆列表页,然后项目演示时,评委老师顺嘴问了句:“你如果现在下单,通知农户发货的消息在你这个系统里能看到吗?”当时我突然意识到,项目最大的主流程没有闭环。所以后来我建议所有页面设计都要围着“用户能通过这个页面完成什么动作”来思考,而不是“为了展示数据而存在”。
5.2 联调:接口地址、Token传递和跨域
前后端联调是毕设项目中折磨人最多的阶段,尤其是跨域问题。前后端分离的项目,前端跑在5173端口,后端跑在8080,前端访问后端接口必然跨域。
解决方式有两种主流方案:
第一种,后端配置CORS。Spring Boot里加一个配置类,允许指定前端地址的跨域请求。这个方案代码最少,但配置放开了,安全性稍弱。
第二种,前端配置代理。Vite环境中在vite.config.js里配置:
javascript复制server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
这种方案在实际开发中最常用:前端代码里所有请求都写/api/user/...这种相对路径,本地开发通过代理转发到后端。好处是上线部署时,只需要改代理目标地址,不需要改业务代码。
Token的传递统一在请求拦截器里做。大部分同学用的是Axios,加一个拦截器:
javascript复制axios.interceptors.request.use(config => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
return config;
});
这个逻辑统一放在前端工具类里,所有接口自动携带token,不会出现有的接口要带、有的接口不带的情况,减少联调痛苦。
5.3 “模拟数据”要克制,数据库里必须灌真数据
很多同学为了页面效果好看,前端里写死一堆假数据,结果联调时发现接口返回的字段名和页面写死的数据结构对不上,改来改去耗时上瘾。我的建议是尽早把前端页面的数据绑定到后端的真实接口上,哪怕一开始接口不完整,也要先用Mock方式模拟真实的接口响应结构,保持字段命名和后端实体一致。
另一个问题是,数据库里必须提前插入一份真实、完整、有代入感的数据。商品名称别有“苹果1”“苹果2”“测试商品”,要填“烟台红富士苹果 5kg装”“广西百香果 中果 1kg”这种看起来正常的记录。用户、订单、评价数据也准备几条有逻辑关系的数据。演示的时候一打开APP首页,满屏产品和正常图片,观感完全不一样。这个细节很多团队都会掉链子——我是说,很多同学在答辩前夜才想起来“哦数据库里还是空的”,然后随手插了十行垃圾数据,一打开全是“aaa”“bbb”,那效果差得不是一点半点。
6. 论文撰写与答辩准备:毕设灵魂,千万别最后才动笔
6.1 论文结构建议:从引言到总结的章节设计
论文结构不用标新立异,但章节内部的组织逻辑要清晰。一个比较顺的标准结构是:
- 第一章 绪论:项目背景、农产品电商的发展现状、国内外同类系统对比、研究内容与目标。
- 第二章 相关技术:Spring Boot框架、Vue/小程序开发技术、MySQL数据库、JWT认证原理。
- 第三章 系统分析:可行性分析(技术、经济、操作)、需求分析(功能需求和非功能需求)、用例模型。
- 第四章 系统设计:总体架构设计、功能模块设计、数据库设计(一定要含ER图和主要表结构)、接口设计。
- 第五章 系统实现:按功能模块编排,每个模块先写实现思路,再放关键代码和运行截图。
- 第六章 系统测试:功能测试用例表、性能测试简单结论、测试结果分析。
- 第七章 总结与展望:成果总结、存在的不足和未来扩展方向。
最怕的写法是“第五章系统实现”变成一大段一大段的代码粘贴。全部是代码的论文,导师根本看都不想看,答辩老师也看不出任何逻辑。代码块只放核心的关键代码,其余用文字描述业务逻辑即可。案例代码长度控制在10到20行以内,作为说明辅助,而不是论文主体。
6.2 答辩演示的操作脚本设计
答辩只有10到15分钟,一定要提前排练至少三遍,并且准备一个不依赖网络的本地演示环境。演示脚本老老实实按顺序走:
- 启动系统,展示登录页,演示用户登录(也可以是二维码模拟登录)。
- 进入首页,展示商品分类、搜索功能(搜一个具体产地名,比如“烟台”)。
- 点开商品详情,加入购物车,提交订单,模拟支付,查看订单状态。
- 切换到管理端登录,查看订单列表,进行发货操作。
- 回到用户端,确认收货,填写评价。
- 最后展示管理端的数据看板,强调“销售趋势用聚合SQL查询出来了”。
每一步控制在1分钟内,整个演示大约8分钟,留出时间给老师提问。演示过程中最忌讳的,是手忙脚乱地切换窗口、等待接口响应、出现页面报错。所有接口提前多调几遍,确保网络顺畅、数据库有数据。
6.3 答辩常见问题预测与应答要点
老师提问基本围绕几个方向,提前准备就行:
关于技术栈:“为什么用JWT而不用Session登录?”答:JWT适合前后端分离架构,服务端不保存登录态,扩展部署更灵活,而且天然适配移动端。
关于数据库:“订单表为什么设计成主表和明细表两张表?”答:这是符合规范化设计的结构。一个订单对应多个商品,通过订单明细表描述商品明细信息,同时保存商品快照,避免商品信息变更影响历史订单。
关于安全:“用户密码是如何存储的?”答:采用BCrypt加密方式,密码字段存储的是加密摘要而不是明文,就算数据库泄露也不会直接暴露密码。
关于业务:“商品库存是怎么控制的?”答:采用数据库乐观锁,通过版本号机制防止并发减库存导致超卖。另外在更新语句里加库存数量条件,双重校验。
关于扩展:“系统有什么不足之处,未来怎么改进?”答:可以结合所有发送的模拟接口,将来可以对接实际第三方支付;缓存功能可以接入Redis,进一步提高高并发下的响应速度。
7. 实操问题排查:从代码到部署的常见坑与速查表
7.1 经典故障:“项目启动失败,端口被占用”
这个几乎每个同学都会遇到。启动Spring Boot时报Port 8080 was already in use,大概率是上一次运行没停干净。
排查步骤:
bash复制# Windows下查看端口占用
netstat -ano | findstr 8080
# 找到占用进程PID后,在任务管理器结束进程
# macOS/Linux下查看端口占用
lsof -i:8080
如果不想每次都处理端口的冲突,也可以把后端服务端口配置改成随机端口,开发阶段用随机端口。但注意前后端联调时前端代理目标要改成对应的实际地址,嫌麻烦就老老实实固定一个端口。
7.2 经典故障:数据库连接失败或中文乱码
Access denied for user 'root'@'localhost'是密码或用户权限问题,检查application.yml里的username和password有没有拼写错。
中文乱码要分两处排查:数据库连接URL加上characterEncoding=utf8&useSSL=false参数;建表语句使用DEFAULT CHARSET=utf8mb4。导入SQL脚本时,确认脚本编码格式为UTF-8,而不是ANSI。
7.3 经典故障:前端请求跨域报错
跨域报错通常长这样:Access to XMLHttpRequest at 'http://localhost:8080/api/...' from origin 'http://localhost:5173' has been blocked by CORS policy。
错误信息已经很明确了,就是前端页面所在地址和后端接口地址不是同一个源。如果你不想管跨域处理过程,就直接在后端工程里写一个全局CORS配置类,允许http://localhost:5173访问。如果你希望更接近真实项目开发的流程,就用上文的Vite代理方案。
7.4 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 后端启动时报找不到数据库 | MySQL没启动或连接配置错误 | 先启动MySQL服务,检查application.yml用户名密码和端口 |
查询接口返回404 |
接口路径写错或没有启动对应控制器 | 去数据库查一下Controller里@RequestMapping路径,和前端请求对比 |
登录接口报401 |
Token缺失、错误或过期 | 检查请求拦截器是否正确加了请求头,重新登录换新token |
| 提交订单一直失败 | 库存不足、事务没生效 | 打印日志看抛错位置,检查@Transactional有没有加在public方法上 |
| 前端运行报依赖缺失 | node_modules不完整 |
删除node_modules,重新执行依赖安装命令 |
| 页面图片全部加载不了 | 图片路径配置错误或静态资源问题 | 确认图片上传路径和WebMvc配置的静态资源映射是否一致 |
我这个列表只能覆盖高频的坑,真实项目里你会遇到更千奇百怪的情况。处理问题的通用思路是:先看后端日志,再看浏览器控制台(F12 Network里看哪个请求报错),最后定位是前端问题还是后端问题。千万不要遇到问题就猜哪边不对,拿日志说话,效率是最高的。
最后分享一点个人体会
做了这么多毕设项目辅导和带人调试,我最深的体会是:毕设项目本身并非越复杂越好,真正让它产生差距的,是你能不能把一条完整业务链跑出可用闭环,并在论文和汇报中讲清背后的设计与决策逻辑。基于Spring Boot的农产品管理与销售APP,它的优势恰恰在于场景清晰、主流程完整、技术栈通用。如果你选择它,也请一定把它当作一次真正的软件工程实践,而不是又一份交差作业。给它足够的耐心,它的回报也不仅仅是答辩通过这一次。另外最后再提醒一下:答辩前一定检查数据库初始化脚本里的演示账号是否还有效,密码经过BCrypt加密的,别临时在数据库里敲数字原文来登录——这个坑,我见过太多人跌进去了。
