2025-08-21 02:41:28 +08:00
|
|
|
# 结伴客系统详细设计文档
|
|
|
|
|
|
2025-08-30 14:33:49 +08:00
|
|
|
## 2.3 数据库配置
|
|
|
|
|
|
|
|
|
|
### 2.3.1 测试环境
|
|
|
|
|
- **主机**: 192.168.0.240 (MySQL主机地址)
|
|
|
|
|
- **端口**: 3306 (MySQL端口)
|
|
|
|
|
- **用户名**: root
|
|
|
|
|
- **密码**: aiot$Aiot123
|
|
|
|
|
- **数据库**: jiebandata
|
|
|
|
|
|
|
|
|
|
### 2.3.2 生产环境
|
|
|
|
|
- **主机**: 129.211.213.226
|
|
|
|
|
- **端口**: 9527
|
|
|
|
|
- **用户名**: root
|
|
|
|
|
- **密码**: aiotAiot123!
|
|
|
|
|
- **数据库**: jiebandata
|
2025-08-21 02:41:28 +08:00
|
|
|
## 1. 数据库设计
|
|
|
|
|
|
|
|
|
|
### 1.1 ER图
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
erDiagram
|
|
|
|
|
USERS ||--o{ TRAVEL_PLANS : creates
|
|
|
|
|
USERS ||--o{ ANIMAL_CLAIMS : claims
|
|
|
|
|
USERS ||--o{ MESSAGES : sends
|
|
|
|
|
USERS ||--o{ ORDERS : places
|
|
|
|
|
USERS ||--o{ REVIEWS : writes
|
|
|
|
|
|
|
|
|
|
MERCHANTS ||--o{ PRODUCTS : sells
|
|
|
|
|
MERCHANTS ||--o{ ORDERS : processes
|
|
|
|
|
MERCHANTS ||--o{ ACTIVITIES : organizes
|
|
|
|
|
MERCHANTS ||--o{ ANIMALS : manages
|
|
|
|
|
|
|
|
|
|
TRAVEL_PLANS ||--o{ TRAVEL_MATCHES : matches
|
|
|
|
|
|
|
|
|
|
ANIMALS ||--o{ ANIMAL_CLAIMS : claimed
|
|
|
|
|
ANIMALS ||--o{ ANIMAL_UPDATES : updates
|
|
|
|
|
|
|
|
|
|
PRODUCTS ||--o{ ORDER_ITEMS : contains
|
|
|
|
|
|
|
|
|
|
ORDERS ||--o{ ORDER_ITEMS : contains
|
|
|
|
|
ORDERS ||--o{ PAYMENTS : has
|
|
|
|
|
|
|
|
|
|
ACTIVITIES ||--o{ ACTIVITY_REGISTRATIONS : registers
|
|
|
|
|
|
|
|
|
|
USERS {
|
|
|
|
|
int id PK
|
|
|
|
|
string openid
|
|
|
|
|
string nickname
|
|
|
|
|
string avatar
|
|
|
|
|
string gender
|
|
|
|
|
date birthday
|
|
|
|
|
string phone
|
|
|
|
|
string email
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MERCHANTS {
|
|
|
|
|
int id PK
|
|
|
|
|
int user_id FK
|
|
|
|
|
string merchant_type
|
|
|
|
|
string business_name
|
|
|
|
|
string business_license
|
|
|
|
|
string contact_person
|
|
|
|
|
string contact_phone
|
|
|
|
|
string address
|
|
|
|
|
string description
|
|
|
|
|
string status
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TRAVEL_PLANS {
|
|
|
|
|
int id PK
|
|
|
|
|
int user_id FK
|
|
|
|
|
string destination
|
|
|
|
|
date start_date
|
|
|
|
|
date end_date
|
|
|
|
|
decimal budget
|
|
|
|
|
string interests
|
|
|
|
|
string visibility
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TRAVEL_MATCHES {
|
|
|
|
|
int id PK
|
|
|
|
|
int plan_id FK
|
|
|
|
|
int matched_plan_id FK
|
|
|
|
|
decimal match_score
|
|
|
|
|
datetime created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ANIMALS {
|
|
|
|
|
int id PK
|
|
|
|
|
int merchant_id FK
|
|
|
|
|
string name
|
|
|
|
|
string species
|
|
|
|
|
string breed
|
|
|
|
|
date birth_date
|
|
|
|
|
string personality
|
|
|
|
|
string farm_location
|
|
|
|
|
decimal price
|
|
|
|
|
string status
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ANIMAL_CLAIMS {
|
|
|
|
|
int id PK
|
|
|
|
|
int user_id FK
|
|
|
|
|
int animal_id FK
|
|
|
|
|
decimal price_paid
|
|
|
|
|
string agreement_url
|
|
|
|
|
string status
|
|
|
|
|
datetime claimed_at
|
|
|
|
|
datetime ended_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ANIMAL_UPDATES {
|
|
|
|
|
int id PK
|
|
|
|
|
int animal_id FK
|
|
|
|
|
string update_type
|
|
|
|
|
string content
|
|
|
|
|
string media_url
|
|
|
|
|
datetime created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PRODUCTS {
|
|
|
|
|
int id PK
|
|
|
|
|
int merchant_id FK
|
|
|
|
|
string name
|
|
|
|
|
string description
|
|
|
|
|
decimal price
|
|
|
|
|
string image_url
|
|
|
|
|
string category
|
|
|
|
|
string status
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ORDERS {
|
|
|
|
|
int id PK
|
|
|
|
|
int user_id FK
|
|
|
|
|
int merchant_id FK
|
|
|
|
|
string order_number
|
|
|
|
|
decimal total_amount
|
|
|
|
|
string status
|
|
|
|
|
string delivery_address
|
|
|
|
|
datetime ordered_at
|
|
|
|
|
datetime completed_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ORDER_ITEMS {
|
|
|
|
|
int id PK
|
|
|
|
|
int order_id FK
|
|
|
|
|
int product_id FK
|
|
|
|
|
int quantity
|
|
|
|
|
decimal unit_price
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PAYMENTS {
|
|
|
|
|
int id PK
|
|
|
|
|
int order_id FK
|
|
|
|
|
string payment_method
|
|
|
|
|
string transaction_id
|
|
|
|
|
decimal amount
|
|
|
|
|
string status
|
|
|
|
|
datetime paid_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MESSAGES {
|
|
|
|
|
int id PK
|
|
|
|
|
int sender_id FK
|
|
|
|
|
int receiver_id FK
|
|
|
|
|
string content
|
|
|
|
|
string status
|
|
|
|
|
datetime sent_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
REVIEWS {
|
|
|
|
|
int id PK
|
|
|
|
|
int user_id FK
|
|
|
|
|
int merchant_id FK
|
|
|
|
|
int order_id FK
|
|
|
|
|
int rating
|
|
|
|
|
string comment
|
|
|
|
|
datetime created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACTIVITIES {
|
|
|
|
|
int id PK
|
|
|
|
|
int merchant_id FK
|
|
|
|
|
string title
|
|
|
|
|
string description
|
|
|
|
|
string activity_type
|
|
|
|
|
datetime start_time
|
|
|
|
|
datetime end_time
|
|
|
|
|
string location
|
|
|
|
|
decimal fee
|
|
|
|
|
int max_participants
|
|
|
|
|
string status
|
|
|
|
|
datetime created_at
|
|
|
|
|
datetime updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACTIVITY_REGISTRATIONS {
|
|
|
|
|
int id PK
|
|
|
|
|
int activity_id FK
|
|
|
|
|
int user_id FK
|
|
|
|
|
string status
|
|
|
|
|
datetime registered_at
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 1.2 核心表结构设计
|
|
|
|
|
|
|
|
|
|
#### 用户表 (users)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 用户ID |
|
|
|
|
|
| openid | VARCHAR(64) | UNIQUE, NOT NULL | 微信openid |
|
|
|
|
|
| nickname | VARCHAR(50) | NOT NULL | 用户昵称 |
|
|
|
|
|
| avatar | VARCHAR(255) | | 用户头像URL |
|
|
|
|
|
| gender | ENUM('male', 'female', 'other') | | 性别 |
|
|
|
|
|
| birthday | DATE | | 生日 |
|
|
|
|
|
| phone | VARCHAR(20) | UNIQUE | 手机号码 |
|
|
|
|
|
| email | VARCHAR(100) | UNIQUE | 邮箱地址 |
|
|
|
|
|
| created_at | DATETIME | NOT NULL | 创建时间 |
|
|
|
|
|
| updated_at | DATETIME | NOT NULL | 更新时间 |
|
|
|
|
|
|
2025-08-31 00:45:46 +08:00
|
|
|
### 管理员相关表
|
|
|
|
|
|
|
|
|
|
#### ROLES 表(角色表)
|
|
|
|
|
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 角色ID |
|
|
|
|
|
| name | VARCHAR(50) | UNIQUE, NOT NULL | 角色名称 |
|
|
|
|
|
| description | TEXT | | 角色描述 |
|
|
|
|
|
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
|
| updated_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
|
|
|
|
|
|
|
|
|
|
**数据示例**:
|
|
|
|
|
- super_admin: 超级管理员,拥有系统所有权限
|
|
|
|
|
- admin: 普通管理员,拥有部分管理权限
|
|
|
|
|
- content_manager: 内容管理员,负责内容审核和管理
|
|
|
|
|
|
|
|
|
|
#### PERMISSIONS 表(权限表)
|
|
|
|
|
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 权限ID |
|
|
|
|
|
| name | VARCHAR(100) | UNIQUE, NOT NULL | 权限名称 |
|
|
|
|
|
| description | TEXT | | 权限描述 |
|
|
|
|
|
| module | VARCHAR(50) | NOT NULL | 所属模块 |
|
|
|
|
|
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
|
| updated_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
|
|
|
|
|
|
|
|
|
|
**权限列表**:
|
|
|
|
|
- user:manage - 用户管理权限
|
|
|
|
|
- role:manage - 角色管理权限
|
|
|
|
|
- permission:manage - 权限管理权限
|
|
|
|
|
- content:review - 内容审核权限
|
|
|
|
|
- content:publish - 内容发布权限
|
|
|
|
|
- data:view - 数据查看权限
|
|
|
|
|
- data:export - 数据导出权限
|
|
|
|
|
- system:config - 系统配置权限
|
|
|
|
|
|
|
|
|
|
#### ROLE_PERMISSIONS 表(角色权限关联表)
|
|
|
|
|
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 关联ID |
|
|
|
|
|
| role_id | INT | FOREIGN KEY REFERENCES roles(id) | 角色ID |
|
|
|
|
|
| permission_id | INT | FOREIGN KEY REFERENCES permissions(id) | 权限ID |
|
|
|
|
|
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
|
|
|
|
|
|
#### USER_ROLES 表(用户角色关联表)
|
|
|
|
|
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 关联ID |
|
|
|
|
|
| user_id | BIGINT | FOREIGN KEY REFERENCES users(id) | 用户ID |
|
|
|
|
|
| role_id | INT | FOREIGN KEY REFERENCES roles(id) | 角色ID |
|
|
|
|
|
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
|
|
|
|
|
|
### 权限分配关系
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
erDiagram
|
|
|
|
|
USERS ||--o{ USER_ROLES : has
|
|
|
|
|
ROLES ||--o{ USER_ROLES : assigned_to
|
|
|
|
|
ROLES ||--o{ ROLE_PERMISSIONS : has
|
|
|
|
|
PERMISSIONS ||--o{ ROLE_PERMISSIONS : granted_to
|
|
|
|
|
|
|
|
|
|
USERS {
|
|
|
|
|
bigint id
|
|
|
|
|
varchar username
|
|
|
|
|
varchar email
|
|
|
|
|
enum status
|
|
|
|
|
timestamp created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ROLES {
|
|
|
|
|
int id
|
|
|
|
|
varchar name
|
|
|
|
|
text description
|
|
|
|
|
timestamp created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PERMISSIONS {
|
|
|
|
|
int id
|
|
|
|
|
varchar name
|
|
|
|
|
varchar module
|
|
|
|
|
text description
|
|
|
|
|
timestamp created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
USER_ROLES {
|
|
|
|
|
bigint id
|
|
|
|
|
bigint user_id
|
|
|
|
|
int role_id
|
|
|
|
|
timestamp created_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ROLE_PERMISSIONS {
|
|
|
|
|
bigint id
|
|
|
|
|
int role_id
|
|
|
|
|
int permission_id
|
|
|
|
|
timestamp created_at
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 管理员功能说明
|
|
|
|
|
|
|
|
|
|
1. **用户管理模块**: 查看用户列表、管理用户状态、用户数据分析
|
|
|
|
|
2. **内容管理模块**: 内容审核、内容发布管理、违规内容处理
|
|
|
|
|
3. **数据统计模块**: 系统数据查看、数据导出、运营报表生成
|
|
|
|
|
4. **权限管理模块**: 角色管理、权限分配、用户权限设置
|
|
|
|
|
|
|
|
|
|
### 安全设计
|
|
|
|
|
|
|
|
|
|
- 管理员登录采用JWT令牌认证
|
|
|
|
|
- 接口权限基于RBAC模型控制
|
|
|
|
|
- 敏感操作记录审计日志
|
|
|
|
|
- 密码采用bcrypt加密存储
|
|
|
|
|
|
2025-08-21 02:41:28 +08:00
|
|
|
#### 商家表 (merchants)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 商家ID |
|
|
|
|
|
| user_id | INT | FOREIGN KEY, NOT NULL | 关联的用户ID |
|
|
|
|
|
| merchant_type | ENUM('flower_shop', 'activity_organizer', 'farm_owner') | NOT NULL | 商家类型 |
|
|
|
|
|
| business_name | VARCHAR(100) | NOT NULL | 商家名称 |
|
|
|
|
|
| business_license | VARCHAR(255) | | 营业执照图片URL |
|
|
|
|
|
| contact_person | VARCHAR(50) | NOT NULL | 联系人 |
|
|
|
|
|
| contact_phone | VARCHAR(20) | NOT NULL | 联系电话 |
|
|
|
|
|
| address | VARCHAR(255) | | 地址 |
|
|
|
|
|
| description | TEXT | | 商家介绍 |
|
|
|
|
|
| status | ENUM('pending', 'approved', 'rejected', 'suspended') | NOT NULL | 商家状态 |
|
|
|
|
|
| created_at | DATETIME | NOT NULL | 创建时间 |
|
|
|
|
|
| updated_at | DATETIME | NOT NULL | 更新时间 |
|
|
|
|
|
|
|
|
|
|
#### 旅行计划表 (travel_plans)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 计划ID |
|
|
|
|
|
| user_id | INT | FOREIGN KEY, NOT NULL | 用户ID |
|
|
|
|
|
| destination | VARCHAR(100) | NOT NULL | 目的地 |
|
|
|
|
|
| start_date | DATE | NOT NULL | 开始日期 |
|
|
|
|
|
| end_date | DATE | NOT NULL | 结束日期 |
|
|
|
|
|
| budget | DECIMAL(10,2) | NOT NULL | 预算 |
|
|
|
|
|
| interests | TEXT | | 兴趣偏好 |
|
|
|
|
|
| visibility | ENUM('public', 'friends', 'private') | NOT NULL | 可见范围 |
|
|
|
|
|
| created_at | DATETIME | NOT NULL | 创建时间 |
|
|
|
|
|
| updated_at | DATETIME | NOT NULL | 更新时间 |
|
|
|
|
|
|
|
|
|
|
#### 动物表 (animals)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 动物ID |
|
|
|
|
|
| merchant_id | INT | FOREIGN KEY, NOT NULL | 关联的农场商家ID |
|
|
|
|
|
| name | VARCHAR(50) | NOT NULL | 动物名称 |
|
|
|
|
|
| species | VARCHAR(50) | NOT NULL | 动物种类 |
|
|
|
|
|
| breed | VARCHAR(50) | | 品种 |
|
|
|
|
|
| birth_date | DATE | | 出生日期 |
|
|
|
|
|
| personality | TEXT | | 性格特点 |
|
|
|
|
|
| farm_location | VARCHAR(255) | | 农场位置 |
|
|
|
|
|
| price | DECIMAL(10,2) | NOT NULL | 认领价格 |
|
|
|
|
|
| status | ENUM('available', 'claimed', 'unavailable') | NOT NULL | 状态 |
|
|
|
|
|
| created_at | DATETIME | NOT NULL | 创建时间 |
|
|
|
|
|
| updated_at | DATETIME | NOT NULL | 更新时间 |
|
|
|
|
|
|
|
|
|
|
#### 动物认领表 (animal_claims)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 认领ID |
|
|
|
|
|
| user_id | INT | FOREIGN KEY, NOT NULL | 用户ID |
|
|
|
|
|
| animal_id | INT | FOREIGN KEY, NOT NULL | 动物ID |
|
|
|
|
|
| price_paid | DECIMAL(10,2) | NOT NULL | 支付金额 |
|
|
|
|
|
| agreement_url | VARCHAR(255) | | 电子协议URL |
|
|
|
|
|
| status | ENUM('active', 'ended', 'cancelled') | NOT NULL | 认领状态 |
|
|
|
|
|
| claimed_at | DATETIME | NOT NULL | 认领时间 |
|
|
|
|
|
| ended_at | DATETIME | | 结束时间 |
|
|
|
|
|
|
2025-08-31 00:45:46 +08:00
|
|
|
#### 管理员操作日志表 (admin_operation_logs)
|
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|
|
|
|--------|------|------|------|
|
|
|
|
|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 日志ID |
|
|
|
|
|
| admin_id | BIGINT | FOREIGN KEY REFERENCES users(id), NOT NULL | 管理员ID |
|
|
|
|
|
| admin_name | VARCHAR(50) | NOT NULL | 管理员姓名 |
|
|
|
|
|
| module | VARCHAR(50) | NOT NULL | 操作模块 |
|
|
|
|
|
| operation | VARCHAR(100) | NOT NULL | 操作类型 |
|
|
|
|
|
| target_id | VARCHAR(100) | | 目标对象ID |
|
|
|
|
|
| target_type | VARCHAR(50) | | 目标对象类型 |
|
|
|
|
|
| request_method | VARCHAR(10) | | 请求方法 |
|
|
|
|
|
| request_url | VARCHAR(500) | | 请求URL |
|
|
|
|
|
| request_params | TEXT | | 请求参数 |
|
|
|
|
|
| ip_address | VARCHAR(45) | | IP地址 |
|
|
|
|
|
| user_agent | VARCHAR(500) | | 用户代理 |
|
|
|
|
|
| status | ENUM('success', 'failed') | NOT NULL | 操作状态 |
|
|
|
|
|
| error_message | TEXT | | 错误信息 |
|
|
|
|
|
| execution_time | INT | | 执行时间(ms) |
|
|
|
|
|
| created_at | DATETIME | NOT NULL | 创建时间 |
|
|
|
|
|
|
|
|
|
|
**操作类型示例**:
|
|
|
|
|
- user:create - 创建用户
|
|
|
|
|
- user:update - 更新用户
|
|
|
|
|
- user:delete - 删除用户
|
|
|
|
|
- role:create - 创建角色
|
|
|
|
|
- role:update - 更新角色
|
|
|
|
|
- role:delete - 删除角色
|
|
|
|
|
- permission:assign - 分配权限
|
|
|
|
|
- content:review - 内容审核
|
|
|
|
|
- content:publish - 内容发布
|
|
|
|
|
- data:export - 数据导出
|
|
|
|
|
- system:config - 系统配置
|
|
|
|
|
|
|
|
|
|
**目标对象类型示例**:
|
|
|
|
|
- user - 用户
|
|
|
|
|
- role - 角色
|
|
|
|
|
- permission - 权限
|
|
|
|
|
- content - 内容
|
|
|
|
|
- merchant - 商家
|
|
|
|
|
- animal - 动物
|
|
|
|
|
- travel_plan - 旅行计划
|
|
|
|
|
- order - 订单
|
|
|
|
|
|
2025-08-21 02:41:28 +08:00
|
|
|
## 2. API设计
|
|
|
|
|
|
|
|
|
|
### 2.1 用户服务API
|
|
|
|
|
|
|
|
|
|
#### 用户登录
|
|
|
|
|
- **URL**: `POST /api/v1/users/login`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": "微信登录凭证"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"token": "用户token",
|
|
|
|
|
"user": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"openid": "openid",
|
|
|
|
|
"nickname": "用户昵称",
|
|
|
|
|
"avatar": "头像URL"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取用户信息
|
|
|
|
|
- **URL**: `GET /api/v1/users/profile`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"openid": "openid",
|
|
|
|
|
"nickname": "用户昵称",
|
|
|
|
|
"avatar": "头像URL",
|
|
|
|
|
"gender": "male",
|
|
|
|
|
"birthday": "1990-01-01",
|
|
|
|
|
"phone": "13800138000",
|
|
|
|
|
"email": "user@example.com"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 更新用户信息
|
|
|
|
|
- **URL**: `PUT /api/v1/users/profile`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"nickname": "新昵称",
|
|
|
|
|
"gender": "female",
|
|
|
|
|
"birthday": "1995-01-01",
|
|
|
|
|
"phone": "13900139000",
|
|
|
|
|
"email": "new@example.com"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.2 旅行服务API
|
|
|
|
|
|
|
|
|
|
#### 创建旅行计划
|
|
|
|
|
- **URL**: `POST /api/v1/travels/plans`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"destination": "目的地",
|
|
|
|
|
"start_date": "2023-10-01",
|
|
|
|
|
"end_date": "2023-10-07",
|
|
|
|
|
"budget": 5000.00,
|
|
|
|
|
"interests": "徒步,摄影",
|
|
|
|
|
"visibility": "public"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 1,
|
|
|
|
|
"destination": "目的地",
|
|
|
|
|
"start_date": "2023-10-01",
|
|
|
|
|
"end_date": "2023-10-07",
|
|
|
|
|
"budget": 5000.00,
|
|
|
|
|
"interests": "徒步,摄影",
|
|
|
|
|
"visibility": "public",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取旅行计划列表
|
|
|
|
|
- **URL**: `GET /api/v1/travels/plans`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `page=1&size=10&visibility=public`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 1,
|
|
|
|
|
"destination": "目的地",
|
|
|
|
|
"start_date": "2023-10-01",
|
|
|
|
|
"end_date": "2023-10-07",
|
|
|
|
|
"budget": 5000.00,
|
|
|
|
|
"interests": "徒步,摄影",
|
|
|
|
|
"visibility": "public",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 匹配旅行伙伴
|
|
|
|
|
- **URL**: `GET /api/v1/travels/matches`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `plan_id=1&page=1&size=10`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 2,
|
|
|
|
|
"user_id": 2,
|
|
|
|
|
"destination": "目的地",
|
|
|
|
|
"start_date": "2023-10-02",
|
|
|
|
|
"end_date": "2023-10-08",
|
|
|
|
|
"budget": 4500.00,
|
|
|
|
|
"interests": "徒步,美食",
|
|
|
|
|
"match_score": 0.85
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.3 动物认领服务API
|
|
|
|
|
|
|
|
|
|
#### 获取可认领动物列表
|
|
|
|
|
- **URL**: `GET /api/v1/animals`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `page=1&size=10&species=羊驼`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"merchant_id": 1,
|
|
|
|
|
"name": "小羊驼",
|
|
|
|
|
"species": "羊驼",
|
|
|
|
|
"breed": "苏利羊驼",
|
|
|
|
|
"birth_date": "2020-01-01",
|
|
|
|
|
"personality": "温顺可爱",
|
|
|
|
|
"farm_location": "XX农场",
|
|
|
|
|
"price": 1000.00,
|
|
|
|
|
"status": "available"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 认领动物
|
|
|
|
|
- **URL**: `POST /api/v1/animals/{id}/claim`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"price_paid": 1000.00
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 1,
|
|
|
|
|
"animal_id": 1,
|
|
|
|
|
"price_paid": 1000.00,
|
|
|
|
|
"agreement_url": "https://example.com/agreement.pdf",
|
|
|
|
|
"status": "active",
|
|
|
|
|
"claimed_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取认领记录
|
|
|
|
|
- **URL**: `GET /api/v1/animals/claims`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `page=1&size=10&status=active`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 1,
|
|
|
|
|
"animal_id": 1,
|
|
|
|
|
"animal_name": "小羊驼",
|
|
|
|
|
"price_paid": 1000.00,
|
|
|
|
|
"status": "active",
|
|
|
|
|
"claimed_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.4 商家服务API
|
|
|
|
|
|
|
|
|
|
#### 商家注册
|
|
|
|
|
- **URL**: `POST /api/v1/merchants/register`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"merchant_type": "farm_owner",
|
|
|
|
|
"business_name": "XX农场",
|
|
|
|
|
"business_license": "https://example.com/license.jpg",
|
|
|
|
|
"contact_person": "张三",
|
|
|
|
|
"contact_phone": "13800138000",
|
|
|
|
|
"address": "北京市朝阳区XX路XX号",
|
|
|
|
|
"description": "专业养殖羊驼的农场"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 1,
|
|
|
|
|
"merchant_type": "farm_owner",
|
|
|
|
|
"business_name": "XX农场",
|
|
|
|
|
"business_license": "https://example.com/license.jpg",
|
|
|
|
|
"contact_person": "张三",
|
|
|
|
|
"contact_phone": "13800138000",
|
|
|
|
|
"address": "北京市朝阳区XX路XX号",
|
|
|
|
|
"description": "专业养殖羊驼的农场",
|
|
|
|
|
"status": "pending",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 发布商品/服务
|
|
|
|
|
- **URL**: `POST /api/v1/merchants/products`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"name": "羊驼认领体验",
|
|
|
|
|
"description": "提供一个月的羊驼认领体验服务",
|
|
|
|
|
"price": 1000.00,
|
|
|
|
|
"image_url": "https://example.com/product.jpg",
|
|
|
|
|
"category": "animal_claim",
|
|
|
|
|
"status": "available"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"merchant_id": 1,
|
|
|
|
|
"name": "羊驼认领体验",
|
|
|
|
|
"description": "提供一个月的羊驼认领体验服务",
|
|
|
|
|
"price": 1000.00,
|
|
|
|
|
"image_url": "https://example.com/product.jpg",
|
|
|
|
|
"category": "animal_claim",
|
|
|
|
|
"status": "available",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取商家订单
|
|
|
|
|
- **URL**: `GET /api/v1/merchants/orders`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `page=1&size=10&status=paid`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 2,
|
|
|
|
|
"order_number": "ORD202309010001",
|
|
|
|
|
"total_amount": 1000.00,
|
|
|
|
|
"status": "paid",
|
|
|
|
|
"ordered_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.5 官网系统API
|
|
|
|
|
|
|
|
|
|
#### 提交商家入驻申请
|
|
|
|
|
- **URL**: `POST /api/v1/website/merchant/apply`
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"business_name": "XX农场",
|
|
|
|
|
"contact_person": "张三",
|
|
|
|
|
"contact_phone": "13800138000",
|
|
|
|
|
"email": "zhangsan@example.com",
|
|
|
|
|
"description": "专业养殖羊驼的农场"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"id": 1,
|
|
|
|
|
"business_name": "XX农场",
|
|
|
|
|
"contact_person": "张三",
|
|
|
|
|
"contact_phone": "13800138000",
|
|
|
|
|
"email": "zhangsan@example.com",
|
|
|
|
|
"description": "专业养殖羊驼的农场",
|
|
|
|
|
"status": "pending",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取成功案例列表
|
|
|
|
|
- **URL**: `GET /api/v1/website/cases`
|
|
|
|
|
- **查询参数**: `page=1&size=10`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"title": "XX农场成功入驻案例",
|
|
|
|
|
"description": "XX农场通过平台实现了数字化转型",
|
|
|
|
|
"image_url": "https://example.com/case1.jpg",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
"image_url": "https://example.com/product.jpg",
|
|
|
|
|
"category": "animal_claim",
|
|
|
|
|
"status": "available",
|
|
|
|
|
"created_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 获取商家订单
|
|
|
|
|
- **URL**: `GET /api/v1/merchants/orders`
|
|
|
|
|
- **请求头**: `Authorization: Bearer {token}`
|
|
|
|
|
- **查询参数**: `page=1&size=10&status=paid`
|
|
|
|
|
- **响应**:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"code": 0,
|
|
|
|
|
"message": "success",
|
|
|
|
|
"data": {
|
|
|
|
|
"list": [
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"user_id": 2,
|
|
|
|
|
"order_number": "ORD202309010001",
|
|
|
|
|
"total_amount": 1000.00,
|
|
|
|
|
"status": "paid",
|
|
|
|
|
"ordered_at": "2023-09-01T12:00:00Z"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"pagination": {
|
|
|
|
|
"page": 1,
|
|
|
|
|
"size": 10,
|
|
|
|
|
"total": 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3. 核心业务逻辑设计
|
|
|
|
|
|
|
|
|
|
### 3.1 旅行结伴流程
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant U as 用户
|
|
|
|
|
participant TP as 旅行计划服务
|
|
|
|
|
participant TM as 旅行匹配服务
|
|
|
|
|
participant N as 通知服务
|
|
|
|
|
|
|
|
|
|
U->>TP: 创建旅行计划
|
|
|
|
|
TP->>TP: 保存计划
|
|
|
|
|
TP-->>U: 返回计划详情
|
|
|
|
|
|
|
|
|
|
U->>TM: 请求匹配旅行伙伴
|
|
|
|
|
TM->>TM: 根据条件匹配
|
|
|
|
|
TM-->>U: 返回匹配结果
|
|
|
|
|
|
|
|
|
|
U->>U: 选择合适的伙伴
|
|
|
|
|
U->>N: 发送结伴邀请
|
|
|
|
|
N->>N: 发送通知给被邀请用户
|
|
|
|
|
|
|
|
|
|
Note over U,N: 被邀请用户接受邀请后,
|
|
|
|
|
Note over U,N: 系统创建结伴关系
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.2 动物认领流程
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant U as 用户
|
|
|
|
|
participant A as 动物服务
|
|
|
|
|
participant M as 商家服务
|
|
|
|
|
participant P as 支付服务
|
|
|
|
|
participant N as 通知服务
|
|
|
|
|
|
|
|
|
|
U->>A: 浏览可认领动物
|
|
|
|
|
A-->>U: 返回动物列表
|
|
|
|
|
|
|
|
|
|
U->>A: 选择动物并认领
|
|
|
|
|
A->>P: 创建支付订单
|
|
|
|
|
P-->>U: 返回支付信息
|
|
|
|
|
|
|
|
|
|
U->>P: 完成支付
|
|
|
|
|
P->>P: 验证支付结果
|
|
|
|
|
P->>A: 通知支付成功
|
|
|
|
|
|
|
|
|
|
A->>A: 更新动物状态为已认领
|
|
|
|
|
A->>M: 通知商家有新认领
|
|
|
|
|
A->>N: 发送认领成功通知给用户
|
|
|
|
|
|
|
|
|
|
M->>M: 更新商家统计信息
|
|
|
|
|
N->>N: 发送通知
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.3 商家服务流程
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant U as 用户
|
|
|
|
|
participant M as 商家服务
|
|
|
|
|
participant P as 商品服务
|
|
|
|
|
participant O as 订单服务
|
|
|
|
|
participant Pay as 支付服务
|
|
|
|
|
participant N as 通知服务
|
|
|
|
|
|
|
|
|
|
U->>M: 申请成为商家
|
|
|
|
|
M->>M: 审核商家资质
|
|
|
|
|
M-->>U: 返回审核结果
|
|
|
|
|
|
|
|
|
|
alt 审核通过
|
|
|
|
|
U->>P: 发布商品/服务
|
|
|
|
|
P->>P: 保存商品信息
|
|
|
|
|
P-->>U: 返回商品详情
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
U->>P: 浏览商品
|
|
|
|
|
P-->>U: 返回商品列表
|
|
|
|
|
|
|
|
|
|
U->>O: 下单购买
|
|
|
|
|
O->>Pay: 创建支付订单
|
|
|
|
|
Pay-->>U: 返回支付信息
|
|
|
|
|
|
|
|
|
|
U->>Pay: 完成支付
|
|
|
|
|
Pay->>Pay: 验证支付结果
|
|
|
|
|
Pay->>O: 通知支付成功
|
|
|
|
|
|
|
|
|
|
O->>O: 更新订单状态
|
|
|
|
|
O->>M: 通知商家有新订单
|
|
|
|
|
O->>N: 发送购买成功通知给用户
|
|
|
|
|
|
|
|
|
|
M->>M: 处理订单
|
|
|
|
|
N->>N: 发送通知
|
|
|
|
|
```
|