做毕设或练手项目碰上“基于SpringBoot的二手交易平台”,其实是个很有意思的信号。它既要求你熟悉常规CURD,又逼着你把交易流程、订单状态、数据一致性这些真实业务问题落到代码里。我见过不少同学拿这类题,最后只做出一个“能发帖、能留言”的展示系统,答辩时老师一问“用户下单之后库存怎么扣”“你这个订单状态谁在维护”,场面往往就冷场了。这篇文章我想拿这套题作为范本,从系统拆解、数据库设计、后端落地再到联调排查,完整过一遍。
它能帮你什么?
- 想找SpringBoot项目练手但不知从哪里入手的后端初学者
- 需要完成一个结构完整、能讲出设计深度的毕业设计/课程设计
- 做前后端分离项目时,对权限、订单状态、图片上传等模块还有疑问的开发者
我会对着实际开发过程来讲,尽量少讲教科书空话,多给能直接抄作业的表结构、状态定义和核心代码,也会把“为什么这样设计”掰开来说清楚。
1. 项目整体设计与思路拆解
1.1 这类系统的核心考察点
先把题目定位清楚。一个二手交易平台,说白了包含三个最核心的场景:卖家发布商品、买家搜索浏览、买卖双方完成交易。商品模块看起来不难,谁都会写增删改查;订单模块才是真正拉开差距的地方,比如买家下单时商品还被别人买走了怎么办、订单状态怎么流转、超时不付款是否需要取消。
所以我做系统设计时,第一件事不是打开IDEA直接建表,而是把业务闭环画清楚。前台用户侧支持注册登录、商品浏览、搜索筛选、发布商品、下单付款、查看订单;后台管理侧则保留商品审核、用户管理、订单管理、举报处理这些能力。
真正推荐的最小闭环如下:
- 注册登录 → JWT签发令牌,后端统一鉴权
- 卖家发布闲置 → 包含商品图片、描述、价格和库存数量
- 买家浏览搜索 → 分类、关键字、价格区间筛选
- 买家下单 → 锁定商品库存,生成待付款订单
- 买家确认状态 → 模拟支付或直接标记已付款,交易完成
能把上面这五步做利索,项目的内容量和逻辑深度就已经超过市面上很多“半成品”系统了。
1.2 技术栈方案怎么选
这套系统我建议采用SpringBoot + Vue加MySQL,走前后端分离结构。SpringBoot只做纯后端接口,前端用Vue框架单独起一个工程。选择前后端分离不是赶时髦,而是从项目可扩展性和开发并行度出发做的决定,后端同学只需要把接口文档维护好就行。
SpringBoot版本这块多说一句。很多刚入门的朋友一上来就跟着最新文档搭了SpringBoot 3.x,结果发现JDK版本不对、有的starter包没适配,直接把自己劝退。做毕设或课程项目,如果不是对新技术有特别强烈的执念,我推荐先用稳定且资料铺天盖地的SpringBoot 2.7.x。它在JDK8下跑得非常好,MyBatis、PageHelper、SpringDoc这些生态也早就适配完了,能少踩一半的坑。
至于ORM框架,MyBatis-Plus比原生MyBatis更适合这种业务型管理项目。单表CURD直接用内置方法,复杂一点的手写Mapper就行。一个中型的二手交易平台,90%的查询都是单表操作,只有订单详情之类需要联表查询,没必要为了炫技引入复杂框架。
技术栈整体可以照下面这张表来:
| 层级 | 技术选择 | 用途说明 |
|---|---|---|
| 后端基础 | SpringBoot 2.7.x | 项目脚手架、依赖管理 |
| ORM层 | MyBatis-Plus 3.5.x | 简化数据访问 |
| 数据库 | MySQL 8.x | 数据存储 |
| 接口文档 | SpringDoc + knife4j | 生成OpenAPI3接口文档 |
| 安全认证 | JWT + 拦截器 | 无状态登录鉴权 |
| 文件上传 | 本地磁盘 + 资源映射 | 存储商图文图 |
| 前端 | Vue3 + Element Plus | 页面搭建与交互 |
我没有把Redis和RabbitMQ写进去,并不是因为它们没有价值,而是做课设或毕设时,如果基础代码还hold不住,强行上一个消息中间件很容易变成“为用而用”。先把单体业务做扎实,后续扩展是水到渠成的事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与业务状态模型
2.1 核心表结构怎么规划
数据库设计直接决定了整个后端代码写起来顺不顺手。二手交易平台我建议至少拆出下面这些表:用户表、商品表、订单表、订单明细表、收藏表,如果后台需要做审核,就再加一个商品审核状态字段。下面是商品表和订单表参考结构:
sql复制CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`seller_id` bigint NOT NULL COMMENT '卖家ID',
`title` varchar(100) NOT NULL COMMENT '商品标题',
`description` text COMMENT '商品描述',
`category` varchar(32) DEFAULT NULL COMMENT '商品分类:数码/图书/生活用品等',
`price` decimal(10,2) NOT NULL COMMENT '售价',
`original_price` decimal(10,2) DEFAULT NULL COMMENT '原价或入手价',
`stock` int NOT NULL DEFAULT 1 COMMENT '库存数量,二手通常是1',
`cover_image` varchar(255) DEFAULT NULL COMMENT '封面图URL',
`images` text COMMENT
