# 校园闲置物品交易平台 — 概要设计
## 1. 系统架构
采用前后端分离架构:
- **前端**:Vue3 + ElementPlus,Web 端适配移动端
- **后端**:SpringBoot + MyBatis + PageHelper
- **存储层**:关系型数据库 + 本地文件存储(`./upload`)
- **认证方案**:Session
```mermaid
graph TB
subgraph 客户端层
C[C端 买家/卖家
Vue3 + ElementPlus]
B[B端 后台管理员
Vue3 + ElementPlus]
end
subgraph 服务端层
API[API 接口层
SpringBoot]
US[用户服务]
IS[物品服务]
OS[订单服务]
MS[消息服务]
RS[审核服务]
end
subgraph 存储层
DB[(MySQL 数据库)]
FS[本地文件存储
./upload]
end
C --> API
B --> API
API --> US & IS & OS & MS & RS
US --> DB
IS --> DB & FS
OS --> DB
MS --> DB & FS
RS --> DB
```
---
## 2. 功能模块划分
### 2.1 用户模块
| 子功能 | 说明 |
|--------|------|
| 注册 | 学号 + 姓名 + 密码 + 校园卡照片上传 |
| 登录 | 学号 + 密码,Session 会话管理 |
| 个人资料管理 | 头像/昵称/个性签名修改 |
| 密码管理 | 修改密码(旧密码验证) |
| 认证状态 | 标记未认证/待审核/已认证 |
### 2.2 物品模块
| 子功能 | 说明 |
|--------|------|
| 物品发布 | 图片/标题/描述/价格/分类/交易方式(自提/送货上门) |
| 物品列表 | 首页按发布时间倒序展示,PageHelper 分页 |
| 物品搜索 | 按标题/描述模糊匹配 |
| 分类筛选 | 按分类查询物品 |
| 物品详情 | 图文/价格/卖家昵称/交易方式 |
| 物品状态 | 售卖中/已下架/已售出 |
| 我的发布 | 卖家查看和管理自己的发布(下架/删除) |
### 2.3 订单模块
| 子功能 | 说明 |
|--------|------|
| 生成订单 | 买家点击"我想要",继承卖家交易方式 |
| 订单状态机 | 待接单 → 待面交 → 已完成 / 已取消 |
| 卖家接单/拒单 | 确认接单或拒绝订单 |
| 卖家确认交货 | 线下面交完成后标记 |
| 买家确认收货 | 线下收到物品后确认 |
| 我的订单 | 双视角:我买到的 / 我卖出的 |
### 2.4 消息模块
| 子功能 | 说明 |
|--------|------|
| 站内私信 | 文本 + 图片 |
| 联系卖家 | 买家从物品详情页发起会话 |
### 2.5 审核模块(后台 Web)
| 子功能 | 说明 |
|--------|------|
| 实名认证审核 | 查看校园卡照片,通过/驳回(驳回需填原因) |
| 物品上架审核 | 通过上架/驳回下架 |
| 用户管理 | 封禁/解封用户 |
| 密码重置 | 管理员手动重置用户密码 |
| 分类管理 | 新增/修改/禁用物品分类 |
---
## 3. 数据库概念设计
### 3.1 核心实体关系
```mermaid
erDiagram
User ||--o{ Item : "发布"
User ||--o{ Order : "买家"
User ||--o{ Order : "卖家"
User ||--o{ Message : "发送"
User ||--o{ Message : "接收"
User ||--o{ Review : "审核对象"
User ||--o{ Review : "审核人"
Category ||--o{ Item : "属于"
Item ||--o{ Order : "生成"
Item ||--o{ Message : "关联"
```
### 3.2 主要数据表
> 所有外键均为 **逻辑外键**,不建立物理外键约束。
#### 用户表(user)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 用户ID |
| student_id | VARCHAR(20) UNIQUE | 学号 |
| name | VARCHAR(50) | 姓名 |
| password_hash | VARCHAR(255) | bcrypt 密码哈希 |
| nickname | VARCHAR(50) | 昵称 |
| avatar_url | VARCHAR(255) | 头像 URL(`/upload/...`) |
| signature | VARCHAR(200) | 个性签名 |
| campus_card_url | VARCHAR(255) | 校园卡照片 URL |
| auth_status | VARCHAR(20) | 未认证/待审核/已认证 |
| status | VARCHAR(20) | 正常/封禁 |
| role | VARCHAR(20) | 普通用户/管理员 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
#### 分类表(category)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 分类ID |
| name | VARCHAR(50) | 分类名称 |
| status | VARCHAR(20) | 启用/禁用 |
| sort_order | INT | 排序 |
| created_at | DATETIME | 创建时间 |
#### 物品表(item)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 物品ID |
| seller_id | BIGINT | 卖家ID(逻辑外键 → user.id) |
| category_id | BIGINT | 分类ID(逻辑外键 → category.id) |
| title | VARCHAR(100) | 标题 |
| description | TEXT | 描述 |
| price | DECIMAL(10,2) | 价格 |
| images | TEXT | 图片 URL 列表(JSON 或逗号分隔) |
| trade_method | VARCHAR(20) | 自提/送货上门 |
| status | VARCHAR(20) | 待审核/售卖中/已下架/已售出 |
| created_at | DATETIME | 发布时间 |
| updated_at | DATETIME | 更新时间 |
#### 订单表(order)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 订单ID |
| item_id | BIGINT | 物品ID(逻辑外键 → item.id) |
| buyer_id | BIGINT | 买家ID(逻辑外键 → user.id) |
| seller_id | BIGINT | 卖家ID(逻辑外键 → user.id) |
| trade_method | VARCHAR(20) | 自提/送货上门 |
| status | VARCHAR(20) | 待接单/待面交/已完成/已取消 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
#### 消息表(message)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 消息ID |
| from_user_id | BIGINT | 发送方(逻辑外键 → user.id) |
| to_user_id | BIGINT | 接收方(逻辑外键 → user.id) |
| item_id | BIGINT NULL | 关联物品(逻辑外键 → item.id) |
| content | TEXT | 文本内容 |
| image_url | VARCHAR(255) NULL | 图片 URL |
| is_read | TINYINT(1) | 是否已读 |
| created_at | DATETIME | 发送时间 |
#### 审核记录表(review)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 审核ID |
| admin_id | BIGINT | 管理员ID(逻辑外键 → user.id) |
| review_type | VARCHAR(20) | 实名认证/物品上架 |
| target_id | BIGINT | 关联ID(用户ID/物品ID) |
| result | VARCHAR(20) | 通过/驳回 |
| reason | VARCHAR(255) | 驳回原因 |
| created_at | DATETIME | 审核时间 |
---
## 4. 核心业务流程设计
### 4.1 用户认证流程
```mermaid
flowchart LR
A[填写注册信息
学号+姓名+密码+校园卡照片] --> B[提交注册]
B --> C[状态: 待审核]
C --> D{管理员审核}
D -->|通过| E[状态: 已认证]
D -->|驳回+原因| F[状态: 未认证
用户可重新提交]
```
### 4.2 物品发布与交易流程
```mermaid
flowchart TB
A[卖家发布闲置] --> B[状态: 待审核]
B --> C{管理员审核}
C -->|通过| D[状态: 售卖中]
C -->|驳回| E[状态: 已下架]
D --> F[买家浏览并点击"我想要"]
F --> G[生成订单 状态: 待接单]
G --> H{卖家处理}
H -->|接单| I[状态: 待面交]
H -->|拒单| J[状态: 已取消]
I --> K[线下交易完成
卖家确认交货]
K --> L[买家确认收货]
L --> M[状态: 已完成]
```
### 4.3 订单状态机
```mermaid
stateDiagram-v2
[*] --> 待接单: 买家下单
待接单 --> 待面交: 卖家接单
待接单 --> 已取消: 卖家拒单
待面交 --> 已完成: 卖家确认交货 + 买家确认收货
待面交 --> 已取消: 任意方取消
已完成 --> [*]
已取消 --> [*]
```
---
## 5. 前端页面结构
### 5.1 C端(买家/卖家)— Vue3 + ElementPlus
| 页面 | 路由 | 说明 |
|------|------|------|
| 登录页 | /login | 学号+密码登录,Session 会话 |
| 注册页 | /register | 学号+姓名+密码+校园卡上传 |
| 首页 | /home | 物品列表(时间倒序,ElementPlus 分页组件) |
| 物品详情 | /item/:id | 图文详情、联系卖家、我想要 |
| 物品搜索 | /search | 关键词搜索+分类筛选 |
| 物品发布 | /publish | 发布闲置表单(ElementPlus 表单组件) |
| 我的发布 | /my/items | 售卖中/已下架/已售出 Tab 切换 |
| 我的订单 | /my/orders | 我买到的/我卖出的双视角 |
| 订单详情 | /order/:id | 订单操作按钮 |
| 消息列表 | /messages | 会话列表 |
| 消息聊天 | /messages/:userId | 聊天界面 |
| 个人资料 | /profile | 查看/编辑资料 |
| 修改密码 | /profile/password | 旧密码+新密码 |
### 5.2 B端(后台Web端)— Vue3 + ElementPlus
| 页面 | 路由 | 说明 |
|------|------|------|
| 登录 | /admin/login | 管理员登录 |
| 实名审核 | /admin/review/user | 待审核列表+通过/驳回操作 |
| 物品审核 | /admin/review/item | 物品上架审核 |
| 用户管理 | /admin/users | 封禁/解封/密码重置 |
| 分类管理 | /admin/categories | 新增/修改/禁用分类 |
---
## 6. API 接口概览
### 用户相关
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/auth/register | 注册 |
| POST | /api/auth/login | 登录(创建 Session) |
| POST | /api/auth/logout | 登出(销毁 Session) |
| POST | /api/auth/change-password | 修改密码 |
| GET | /api/user/profile | 获取个人资料 |
| PUT | /api/user/profile | 修改个人资料 |
### 物品相关
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/items | 首页物品列表(PageHelper 分页+时间倒序) |
| GET | /api/items/search | 关键词搜索 |
| GET | /api/items/category/{id} | 分类筛选 |
| GET | /api/items/{id} | 物品详情 |
| POST | /api/items | 发布物品 |
| GET | /api/items/my | 我的发布列表 |
| PUT | /api/items/{id}/offline | 下架物品 |
| DELETE | /api/items/{id} | 删除物品 |
### 订单相关
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/orders | 生成订单 |
| GET | /api/orders/bought | 我买到的(PageHelper 分页) |
| GET | /api/orders/sold | 我卖出的(PageHelper 分页) |
| PUT | /api/orders/{id}/accept | 卖家接单 |
| PUT | /api/orders/{id}/reject | 卖家拒单 |
| PUT | /api/orders/{id}/deliver | 卖家确认交货 |
| PUT | /api/orders/{id}/confirm | 买家确认收货 |
### 消息相关
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/messages/conversations | 会话列表 |
| GET | /api/messages/{userId} | 聊天记录 |
| POST | /api/messages | 发送消息 |
### 管理员相关
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/admin/review/users | 待审核用户列表 |
| POST | /api/admin/review/user/{id} | 用户审核(通过/驳回) |
| GET | /api/admin/review/items | 待审核物品列表 |
| POST | /api/admin/review/item/{id} | 物品审核(通过/驳回) |
| GET | /api/admin/users | 用户管理列表 |
| PUT | /api/admin/users/{id}/ban | 封禁用户 |
| PUT | /api/admin/users/{id}/unban | 解封用户 |
| POST | /api/admin/users/{id}/reset-password | 密码重置 |
| GET | /api/admin/categories | 分类列表 |
| POST | /api/admin/categories | 新增分类 |
| PUT | /api/admin/categories/{id} | 修改分类 |
| PUT | /api/admin/categories/{id}/status | 启用/禁用分类 |
---
## 7. 非功能性设计要点
| 方面 | 方案 |
|------|------|
| 图片存储 | 本地 `./upload` 目录,URL 为 `/upload/{filename}` |
| 密码安全 | bcrypt 哈希存储 |
| 认证鉴权 | Session + Cookie |
| 分页 | PageHelper 插件,统一分页参数(pageNum, pageSize) |
| 接口规范 | 统一响应格式 `{ code, message, data }` |
| 状态码 | HTTP 200 + 业务 code(如 401 未登录,403 无权限) |
---
## 8. 后端项目结构(SpringBoot + MyBatis)
```
src/main/java/com/campus/trade
├── config
│ ├── WebMvcConfig.java # 静态资源配置(/upload 映射)
│ ├── SessionConfig.java # Session 配置
│ └── MyBatisConfig.java # MyBatis + PageHelper 配置
├── controller
│ ├── AuthController.java
│ ├── UserController.java
│ ├── ItemController.java
│ ├── OrderController.java
│ ├── MessageController.java
│ └── admin
│ ├── ReviewController.java
│ ├── UserManageController.java
│ └── CategoryController.java
├── service
│ ├── AuthService.java
│ ├── UserService.java
│ ├── ItemService.java
│ ├── OrderService.java
│ ├── MessageService.java
│ └── admin
│ ├── ReviewService.java
│ ├── UserManageService.java
│ └── CategoryService.java
├── mapper
│ ├── UserMapper.java
│ ├── ItemMapper.java
│ ├── OrderMapper.java
│ ├── MessageMapper.java
│ ├── ReviewMapper.java
│ └── CategoryMapper.java
├── entity
│ ├── User.java
│ ├── Item.java
│ ├── Order.java
│ ├── Message.java
│ ├── Review.java
│ └── Category.java
├── dto
│ ├── LoginRequest.java
│ ├── RegisterRequest.java
│ ├── ItemPublishRequest.java
│ └── PageResult.java
├── interceptor
│ └── AuthInterceptor.java # Session 登录校验拦截器
├── common
│ ├── Result.java # 统一响应体
│ ├── StatusCode.java # 业务状态码枚举
│ └── FileUploadUtil.java # 本地文件上传工具类
```
---
## 9. 前端项目结构(Vue3 + ElementPlus)
```
src
├── api
│ ├── auth.js
│ ├── user.js
│ ├── item.js
│ ├── order.js
│ ├── message.js
│ └── admin.js
├── views
│ ├── Login.vue
│ ├── Register.vue
│ ├── Home.vue
│ ├── ItemDetail.vue
│ ├── Search.vue
│ ├── Publish.vue
│ ├── MyItems.vue
│ ├── MyOrders.vue
│ ├── OrderDetail.vue
│ ├── Messages.vue
│ ├── Chat.vue
│ ├── Profile.vue
│ ├── ChangePassword.vue
│ └── admin
│ ├── Login.vue
│ ├── ReviewUser.vue
│ ├── ReviewItem.vue
│ ├── UserManage.vue
│ └── CategoryManage.vue
├── router
│ └── index.js
├── stores
│ └── user.js # Pinia 用户状态管理
├── utils
│ └── request.js # Axios 封装(携带 Session Cookie)
├── App.vue
└── main.js
```