基于 SpringBoot + Vue2 + ElementUI + MySQL 实现的极简版校园二手交易系统,覆盖用户注册、商品发布、订单创建三大核心功能,包含详细的实战踩坑记录与解决方案,适合前后端分离入门学习/面试项目展示。
- 全链路闭环:从前端页面交互→后端接口开发→数据库持久化,完整实现核心业务流程;
- 踩坑实战导向:解决开发中常见的前后端联调问题(参数传递、响应处理、数据库关键字冲突等);
- 规范开发:包含全局异常处理、参数校验、密码加密、.gitignore配置等企业级开发规范;
- 易于扩展:基础架构清晰,可快速扩展商品图片上传、订单状态管理、个人中心等功能。
| 分层 | 技术选型 | 作用 |
|---|---|---|
| 后端框架 | SpringBoot 2.7.x | 快速搭建后端项目,简化配置 |
| ORM框架 | MyBatis-Plus 3.5.x | 简化CRUD操作,减少手写SQL |
| 前端框架 | Vue2 + ElementUI | 快速搭建前端页面,组件化开发 |
| 网络请求 | Axios | 前端与后端接口交互 |
| 数据库 | MySQL 8.0 | 存储用户/商品/订单关联数据 |
| 其他工具 | Lombok、MD5 | 简化实体类、密码加密 |
- 🔹 用户注册:支持用户名/密码/手机号录入,密码MD5加密存储;
- 🔹 唯一性校验:注册前校验用户名是否重复,避免数据库唯一索引冲突;
- 🔹 参数校验:手机号格式(11位纯数字)、用户名/密码长度校验。
- 🔹 商品发布:录入标题/价格/描述/卖家ID,发布后状态默认为「在售」;
- 🔹 状态管理:创建订单后,商品状态自动更新为「已售出」。
- 🔹 订单创建:关联商品ID/买家ID,自动获取商品价格、卖家ID;
- 🔹 数据一致性:创建订单前校验商品状态,仅在售商品可创建订单。
- JDK 8+
- MySQL 8.0+
- Node.js 14+(前端运行)
- 新建数据库:
school_second_hand; - 执行仓库中
sql/secondhand.sql脚本,自动创建user/goods/tb_order表; - 修改后端
application.yml中的数据库账号/密码(改为你的本地MySQL信息)。
- 进入后端项目根目录;
- 方式1:IDE中直接运行
SecondHandApplication.java; - 方式2:Maven打包运行:
mvn clean package java -jar target/secondhand-0.0.1-SNAPSHOT.jar
- 后端启动成功后,接口地址:http://localhost:8080/api。
- 进入前端项目目录(如 frontend/secondhand-frontend);
- 安装依赖:
npm install
- 启动前端:
npm run serve
- 访问前端页面:http://localhost:8081。
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 接口 400 错误:参数解析失败 | 前端未设置 Content-Type=application/json | 配置 Axios 全局请求头,后端用 @RequestBody 接收 |
| SQL 报错:order 是关键字 | 订单表名使用 MySQL 关键字 | 表名改为 tb_order,实体类指定 @TableName |
| 提示文案矛盾:“发布失败:发布成功” | 前端响应判断逻辑错误(code=200 判为失败) | 统一判断逻辑:code=200 弹成功,否则弹失败 |
| 数据库报错:phone 字段长度超限 | 未校验手机号长度,超出 VARCHAR (11) 限制 | 前端添加手机号格式正则校验 |
| 前端按钮点击无响应 | ElementUI el-form 的 submit 事件失效 | 改用 @click 触发方法 |
- ✅ 全局异常处理:统一拦截 SQL / 参数 / 系统异常,返回友好提示;
- ✅ JSR303 参数校验:替代手动 if 判断,注解式校验更优雅;
- ✅ 分页功能:基于 MyBatis-Plus 实现商品列表分页。
- 📌 商品图片上传:对接阿里云 OSS,实现图片上传 / 回显;
- 📌 订单状态管理:支持 “待付款→已付款→已完成” 状态流转;
- 📌 个人中心:实现 “我的发布 / 我的订单” 查询功能;
- 📌 登录功能:扩展用户名密码登录,整合 JWT 令牌。
A:当前通过业务逻辑校验:创建订单前先查询商品状态,仅 “在售” 商品可创建;高并发场景可引入数据库乐观锁(添加 version 字段)或分布式锁,避免并发修改。
A:MyBatis-Plus 是 MyBatis 增强工具,核心优势:① 内置通用 CRUD 方法,无需手写 XML;② 条件构造器简化复杂查询;③ 内置分页插件,一行代码实现分页。
A:核心难点是参数 / 响应格式的一致性。解决方案:① 统一请求头(Content-Type=application/json);② 封装全局响应类 Result,前端按 code 统一处理;③ 前端封装 Axios 请求拦截器,后端统一异常处理。