# 校园二手platform **Repository Path**: M1ch/campus-second-hand-platform ## Basic Information - **Project Name**: 校园二手platform - **Description**: 基于 Spring Boot + MySQL + MyBatis-Plus + JWT(后端)与 Vue3 + Element Plus + Vite + Pinia(前端)的校园二手交易网站。地址http://47.108.157.214:8090 欢迎大家来fork,制作不易,喜欢的点点star哦~ - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: new-version - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-06-27 - **Last Updated**: 2026-07-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 四川师范大学二手交易平台 基于 **Spring Boot + MySQL + MyBatis-Plus + JWT**(后端)与 **Vue3 + Element Plus + Vite + Pinia**(前端)的四川师范大学校内二手交易平台。仅面向本校师生,凭学号登录核验身份,交易方式为**校内线下自提(成龙/狮子山/遂宁三校区),无线上支付**。 --- ## 一、技术栈 | 层 | 技术 | |---|---| | 后端 | Spring Boot 2.7、MyBatis-Plus 3.5、MySQL 8、JWT(jjwt)、BCrypt、Validation | | 前端 | Vue 3、Vue Router 4、Pinia、Element Plus 2.8、Axios、Vite 5 | | 认证 | JWT 无状态认证,前端 localStorage 持有 token | --- ## 二、目录结构 ``` campus-trade/ ├── backend/ # Spring Boot 后端 │ ├── pom.xml │ └── src/main/ │ ├── java/com/campus/trade/ │ │ ├── common/ # Result、异常处理、JWT、登录上下文、拦截器、注解 │ │ ├── config/ # Web/MyBatisPlus/密码 配置 │ │ ├── controller/ # 各模块接口 │ │ ├── dto/ # 请求参数对象(含校验注解) │ │ ├── entity/ # 数据库实体 │ │ ├── mapper/ # MyBatis-Plus Mapper │ │ ├── service/ # 业务逻辑 │ │ └── vo/ # 响应视图对象 │ └── resources/ │ ├── application.yml # 配置(数据库、上传、JWT) │ └── db/schema.sql # 建表 + 基础数据脚本 └── frontend/ # Vue3 前端 ├── package.json ├── vite.config.js └── src/ ├── api/ # 接口封装 ├── components/ # ProductCard、EmptyBlock 复用组件 ├── layout/ # 主布局(导航栏) ├── router/ # 路由 + 登录守卫 ├── store/ # Pinia 用户登录态 ├── utils/request.js # axios 实例 + 拦截器 └── views/ # 登录/集市/发布/详情/个人中心/聊天 页面 ``` --- ## 三、运行步骤 ### 1. 环境要求 - JDK 8+、Maven 3.6+ - MySQL 8.x(5.7 亦可) - Node.js 16+ ### 2. 启动数据库 1. 启动本地 MySQL。 2. 执行建表脚本 `backend/src/main/resources/db/schema.sql`(脚本会自动建库 `campus_trade`、建表并插入分类与测试账号)。 3. 按本地实际修改 `application.yml` 中的 `spring.datasource.username/password`。 4. 修改 `campus.upload.dir` 为本机存在的图片存储目录(默认 `C:/Users/TY/campus-trade/uploads/`)。 ### 3. 启动后端 ```bash cd backend mvn spring-boot:run ``` 后端运行在 `http://localhost:8080`,接口统一前缀 `/api`。 ### 4. 启动前端 ```bash cd frontend npm install npm run dev ``` 前端运行在 `http://localhost:5173`,已配置 `/api` 代理到后端。 ### 5. 默认账号 | 角色 | 学号 | 密码 | |---|---|---| | 管理员 | `admin` | `123456` | | 普通用户 | `2021001` | `123456` | > 注:前端可直接注册新用户体验完整流程。 --- ## 四、核心功能 | 页面 | 功能 | 边界处理 | |---|---|---| | 登录注册 | 学号核验、本地存储登录态、未登录拦截跳转 | 学号正则、密码长度、两次密码一致校验 | | 集市首页 | 分类导航、关键词/价格筛选、分页、收藏 | 价格区间合法性、空数据兜底、网络失败兜底 | | 商品发布 | 分类下拉、多图上传、提交进入待审核 | 价格非负、图片 jpg/png 且≤5MB、标题/描述长度、至少一张图 | | 商品详情 | 查看、收藏、跳转下单 | 未登录拦截敏感操作、不能买自己商品、非在售不可下单、商品不存在兜底 | | 个人中心 | 我的发布(下架/售出)、我的收藏、我的订单(完成/取消) | 仅本人可操作、订单状态守卫、各列表空数据兜底 | | 商品审核(管理员) | 待审核列表、通过、拒绝(填原因) | 仅 ADMIN 可见入口与接口、状态守卫、前后端角色双重校验 | | 私信聊天 | 发送消息、会话列表、聊天记录 | 双向消息、仅当事人可查看 | 边界校验为**前后端双重**:前端 Element 表单校验 + 后端 `@Valid` 注解 + Service 防御性校验。 --- ## 五、可裁剪拓展功能 以下功能**未在本期实现**,已在代码中标注并预留入口/占位,删减不影响核心交易闭环: | 功能 | 当前状态 | 说明 | |---|---|---| | 管理员后台-举报处理 | 未实现 | 需新增举报表 | | 管理员后台-交易数据统计 | 未实现 | 需订单/商品维度统计图表 | > ✅ **商品审核已实现**:用管理员账号 `admin` / `123456` 登录后,顶部导航出现"商品审核"入口,可对待审核商品执行通过/拒绝。审核通过后商品状态变为在售并出现在集市。 --- ## 六、构建验证说明 - **前端**:已在本机 `npm run build` 通过(Vite 构建成功,无报错)。 - **后端**:本机未安装 JDK/Maven,**未执行编译**。代码已按分层规范编写,依赖版本在 `pom.xml` 锁定,请在具备 Maven 环境处执行 `mvn clean package` 验证。 --- ## 七、测试用例 ### A. 注册 / 登录(身份核验) | 编号 | 用例 | 输入 | 预期 | |---|---|---|---| | A1 | 正常注册 | 学号 `2021999`、昵称 `测试`、密码 `123456` | 成功,提示去登录 | | A2 | 学号格式非法 | 学号 `ab`(<4位) | 前端拦截:"学号格式不正确" | | A3 | 重复学号 | 已存在的 `2021001` | 后端返回"该学号已注册" | | A4 | 密码过短 | 密码 `123` | 前端拦截:"密码长度需为6-20位" | | A5 | 两次密码不一致 | 密码 `123456`/确认 `654321` | 前端拦截:"两次输入的密码不一致" | | A6 | 正常登录 | `2021001`/`123456` | 成功,token 存入 localStorage | | A7 | 密码错误 | `2021001`/`wrong` | 返回"学号或密码错误" | | A8 | 校外人员 | 无合法学号无法注册 | 业务规则:无学号即无法进入系统 | ### B. 登录拦截 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | B1 | 未登录访问发布页 | 直接访问 `/publish` | 路由守卫跳转登录页并带 redirect | | B2 | 未登录收藏 | 集市点收藏 | 提示"请先登录再收藏" | | B3 | token 失效 | 篡改/过期 token 调接口 | 后端返回 401,前端清登录态跳登录 | | B4 | 未登录下单 | 详情页点下单 | 跳转登录页 | ### C. 商品发布(边界强制校验) | 编号 | 用例 | 输入 | 预期 | |---|---|---|---| | C1 | 正常发布 | 合法标题/描述/价格/分类/图片 | 成功,状态=待审核 | | C2 | 价格为负 | 价格 `-1` | 前端拦截 + 后端校验"价格不能为负数" | | C3 | 上传非 jpg/png | 上传 .gif/.bmp | 拦截"仅支持 jpg/png 格式图片" | | C4 | 图片超 5MB | 上传 6MB 图片 | 拦截"单张图片不能超过 5MB" | | C5 | 标题过短 | 标题 `a` | 前端拦截"标题长度需为2-50个字符" | | C6 | 描述超长 | >1000 字 | 输入框限制 + 校验拦截 | | C7 | 未传图片 | 不上传图片直接提交 | 提示"请至少上传一张商品图片" | | C8 | 未选分类 | 不选分类 | 前端拦截"请选择分类" | ### D. 集市浏览与筛选 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | D1 | 分类筛选 | 点击某分类 | 仅显示该分类在售商品 | | D2 | 关键词搜索 | 输入标题关键词 | 标题/描述模糊匹配结果 | | D3 | 价格区间 | 最低 10、最高 100 | 仅显示区间内商品 | | D4 | 价格区间非法 | 最低 100 > 最高 10 | 提示"最低价不能高于最高价" | | D5 | 分页 | 切换页码 | 正确翻页 | | D6 | 空数据 | 搜索不存在关键词 | 显示"暂无符合条件的商品" | ### E. 收藏 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | E1 | 收藏商品 | 卡片点收藏 | 成功,图标变红 | | E2 | 取消收藏 | 再次点击 | 取消成功 | | E3 | 重复收藏 | 已收藏再调收藏接口 | 幂等,不报错不重复 | | E4 | 我的收藏 | 个人中心查看 | 显示已收藏列表 | ### F. 下单(线下自提) | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | F1 | 正常下单 | 对他人在售商品下单 | 成功,商品转为已售出 | | F2 | 买自己商品 | 对自己发布的商品下单 | 拦截"不能购买自己发布的商品" | | F3 | 非在售商品 | 对已售出商品下单 | 拦截"商品已下架或已售出" | | F4 | 完成订单 | 待自提订单点完成 | 状态变已完成 | | F5 | 取消订单 | 待自提订单点取消 | 状态变已取消,商品恢复在售 | | F6 | 越权操作订单 | 操作非自己参与的订单 | 返回 403"无权操作该订单" | ### G. 个人中心商品管理 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | G1 | 我的发布 | 查看列表 | 显示各状态商品及状态标签 | | G2 | 下架 | 在售商品点下架 | 状态变已下架 | | G3 | 标记售出 | 在售商品点售出 | 状态变已售出 | | G4 | 越权操作 | 操作他人商品(接口层) | 返回 403"只能操作自己的商品" | ### H. 异常兜底 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | H1 | 网络失败 | 断开后端 | 前端 Toast"网络异常,请稍后重试" | | H2 | 商品不存在 | 访问不存在商品 id | 详情页显示"商品不存在或已下架" | | H3 | 服务端异常 | 触发未捕获异常 | 统一返回"服务器开小差了" | ### I. 管理员审核 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | I1 | 入口可见性 | 普通用户登录 | 导航栏无"商品审核"入口 | | I2 | 入口可见性 | admin 登录 | 导航栏出现"商品审核" | | I3 | 待审核列表 | 进入审核页 | 列出所有 status=0 商品 | | I4 | 通过 | 点"通过" | 商品转为在售,出现在集市 | | I5 | 拒绝 | 点"拒绝"并填原因 | 商品转为审核拒绝,卖家"我的发布"可见原因 | | I6 | 拒绝原因必填 | 拒绝时不填原因 | 前端拦截"请填写拒绝原因" | | I7 | 越权访问页面 | 普通用户直接访问 `/admin/review` | 路由守卫拦截,提示"无权访问"并回集市 | | I8 | 越权调接口 | 非管理员调 `/admin/**` | 后端返回 403 | | I9 | 重复审核 | 对已审核商品再次审核(接口层) | 返回"该商品不在待审核状态" | ### J. 私信聊天 | 编号 | 用例 | 操作 | 预期 | |---|---|---|---| | J1 | 发送消息 | 详情页点私信卖家 | 成功,跳转聊天页 | | J2 | 会话列表 | 个人中心查看 | 显示最近联系人列表 | | J3 | 查看记录 | 进入具体会话 | 显示历史消息 | | J4 | 未读消息数 | 导航栏显示 | 未读消息数量角标 | --- ## 许可证 本项目仅供学习交流使用,禁止商业用途。