更新数据库配置为niumall,添加用户登出功能并集成axios
This commit is contained in:
904
docs/系统架构设计.md
Normal file
904
docs/系统架构设计.md
Normal file
@@ -0,0 +1,904 @@
|
||||
# 活牛采购智能数字化系统 - 系统架构设计
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 作者 | 变更说明 |
|
||||
|------|------|------|----------|
|
||||
| v1.0 | 2024-05-15 | 系统架构师 | 基于现有项目架构整理 |
|
||||
| v2.0 | 2024-12-20 | 系统架构师 | 重构架构文档,完善技术细节 |
|
||||
|
||||
## 1. 整体架构概览
|
||||
|
||||
### 1.1 系统架构图
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "用户层"
|
||||
A[采购人] --> B[小程序矩阵]
|
||||
C[供应商] --> B
|
||||
D[司机] --> B
|
||||
E[管理员] --> F[管理后台]
|
||||
G[访客] --> H[企业官网]
|
||||
end
|
||||
|
||||
subgraph "应用层"
|
||||
B[小程序矩阵<br/>Uni-app] --> I[API网关]
|
||||
F[管理后台<br/>Vue 3] --> I
|
||||
H[企业官网<br/>HTML5] --> J[静态资源]
|
||||
end
|
||||
|
||||
subgraph "服务层"
|
||||
I[API网关<br/>Nginx] --> K[认证服务]
|
||||
I --> L[业务服务集群]
|
||||
K[认证服务<br/>JWT] --> L
|
||||
L[业务服务<br/>Express.js] --> M[数据访问层]
|
||||
end
|
||||
|
||||
subgraph "数据层"
|
||||
M[数据访问层<br/>Sequelize ORM] --> N[MySQL主库]
|
||||
M --> O[MySQL从库]
|
||||
M --> P[Redis缓存]
|
||||
M --> Q[文件存储<br/>MinIO/OSS]
|
||||
end
|
||||
|
||||
subgraph "基础设施层"
|
||||
R[容器化部署<br/>Docker] --> S[负载均衡<br/>Nginx]
|
||||
S --> T[应用服务器]
|
||||
T --> U[数据库服务器]
|
||||
V[监控告警<br/>Prometheus] --> W[日志收集<br/>ELK]
|
||||
end
|
||||
```
|
||||
|
||||
### 1.2 架构分层说明
|
||||
|
||||
| 层级 | 职责 | 技术栈 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| **用户层** | 用户交互界面 | 浏览器、微信小程序 | 提供多端用户访问入口 |
|
||||
| **应用层** | 前端应用 | Vue 3、Uni-app、HTML5 | 负责用户界面展示和交互 |
|
||||
| **服务层** | 业务逻辑处理 | Express.js、JWT | 处理业务逻辑和数据处理 |
|
||||
| **数据层** | 数据存储管理 | MySQL、Redis、MinIO | 负责数据持久化和缓存 |
|
||||
| **基础设施层** | 运行环境支撑 | Docker、Nginx、监控 | 提供系统运行基础环境 |
|
||||
|
||||
## 2. 技术栈选型
|
||||
|
||||
### 2.1 前端技术栈
|
||||
|
||||
| 技术/框架 | 版本 | 用途 | 选型理由 |
|
||||
|-----------|------|------|----------|
|
||||
| **Vue 3** | 3.4+ | 管理后台框架 | 组合式API、更好的TypeScript支持、性能优化 |
|
||||
| **TypeScript** | 5.0+ | 类型系统 | 静态类型检查、提高代码质量和可维护性 |
|
||||
| **Element Plus** | 2.4+ | UI组件库 | Vue 3生态、组件丰富、文档完善 |
|
||||
| **Vite** | 5.0+ | 构建工具 | 极速开发体验、优化的构建性能 |
|
||||
| **Pinia** | 2.1+ | 状态管理 | Vue 3官方推荐、API简洁、性能优异 |
|
||||
| **Vue Router** | 4.2+ | 路由管理 | Vue 3官方路由、支持组合式API |
|
||||
| **Uni-app** | 3.8+ | 小程序框架 | 一套代码多端运行、降低开发维护成本 |
|
||||
|
||||
### 2.2 后端技术栈
|
||||
|
||||
| 技术/框架 | 版本 | 用途 | 选型理由 |
|
||||
|-----------|------|------|----------|
|
||||
| **Node.js** | 18+ | 运行环境 | 高性能、生态丰富、JavaScript全栈 |
|
||||
| **Express.js** | 4.18+ | Web框架 | 轻量灵活、中间件丰富、学习成本低 |
|
||||
| **Sequelize** | 6.35+ | ORM框架 | 支持多种数据库、简化数据库操作 |
|
||||
| **JWT** | 9.0+ | 身份认证 | 无状态认证、跨域支持 |
|
||||
| **Joi** | 17.11+ | 数据验证 | 强大的数据校验能力 |
|
||||
| **Multer** | 1.4+ | 文件上传 | Express文件上传中间件 |
|
||||
| **Socket.io** | 4.7+ | 实时通信 | WebSocket封装、实时数据推送 |
|
||||
|
||||
### 2.3 数据存储技术栈
|
||||
|
||||
| 技术 | 版本 | 用途 | 选型理由 |
|
||||
|------|------|------|----------|
|
||||
| **MySQL** | 8.0+ | 关系型数据库 | 成熟稳定、ACID特性、适合复杂业务关系 |
|
||||
| **Redis** | 7.0+ | 缓存数据库 | 高性能缓存、支持多种数据结构 |
|
||||
| **MinIO** | Latest | 对象存储 | S3兼容、私有化部署、适合文件存储 |
|
||||
|
||||
### 2.4 基础设施技术栈
|
||||
|
||||
| 技术 | 版本 | 用途 | 选型理由 |
|
||||
|------|------|------|----------|
|
||||
| **Docker** | 24.0+ | 容器化 | 环境一致性、部署便捷 |
|
||||
| **Nginx** | 1.24+ | 反向代理 | 高性能、负载均衡、静态资源服务 |
|
||||
| **PM2** | 5.3+ | 进程管理 | Node.js进程管理、自动重启 |
|
||||
| **Prometheus** | 2.47+ | 监控系统 | 时序数据库、强大的查询语言 |
|
||||
| **Grafana** | 10.2+ | 监控面板 | 可视化监控、丰富的图表 |
|
||||
|
||||
## 3. 系统模块设计
|
||||
|
||||
### 3.1 核心业务模块
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[用户管理模块] --> B[订单管理模块]
|
||||
B --> C[供应商管理模块]
|
||||
C --> D[运输管理模块]
|
||||
D --> E[质量管理模块]
|
||||
E --> F[财务管理模块]
|
||||
F --> G[通知管理模块]
|
||||
|
||||
H[权限管理] --> A
|
||||
I[文件管理] --> C
|
||||
I --> D
|
||||
I --> E
|
||||
J[日志管理] --> B
|
||||
J --> D
|
||||
J --> F
|
||||
```
|
||||
|
||||
#### 3.1.1 用户管理模块 (User Management)
|
||||
|
||||
**职责**:
|
||||
- 用户注册、登录、注销
|
||||
- 用户信息管理和维护
|
||||
- 角色权限分配和控制
|
||||
- 用户状态管理
|
||||
|
||||
**核心功能**:
|
||||
```javascript
|
||||
/**
|
||||
* 用户管理服务
|
||||
*/
|
||||
class UserService {
|
||||
// 用户注册
|
||||
async register(userData) { }
|
||||
|
||||
// 用户登录
|
||||
async login(phone, password) { }
|
||||
|
||||
// 获取用户信息
|
||||
async getUserInfo(userId) { }
|
||||
|
||||
// 更新用户信息
|
||||
async updateUser(userId, updateData) { }
|
||||
|
||||
// 用户权限验证
|
||||
async checkPermission(userId, permission) { }
|
||||
}
|
||||
```
|
||||
|
||||
**数据模型**:
|
||||
- User(用户基本信息)
|
||||
- Role(角色定义)
|
||||
- Permission(权限定义)
|
||||
- UserRole(用户角色关联)
|
||||
|
||||
#### 3.1.2 订单管理模块 (Order Management)
|
||||
|
||||
**职责**:
|
||||
- 订单创建、查询、更新
|
||||
- 订单状态流转管理
|
||||
- 订单审核和确认
|
||||
- 订单统计和分析
|
||||
|
||||
**核心功能**:
|
||||
```javascript
|
||||
/**
|
||||
* 订单管理服务
|
||||
*/
|
||||
class OrderService {
|
||||
// 创建订单
|
||||
async createOrder(orderData) { }
|
||||
|
||||
// 查询订单列表
|
||||
async getOrderList(filters, pagination) { }
|
||||
|
||||
// 获取订单详情
|
||||
async getOrderDetail(orderId) { }
|
||||
|
||||
// 更新订单状态
|
||||
async updateOrderStatus(orderId, status) { }
|
||||
|
||||
// 订单统计
|
||||
async getOrderStatistics(dateRange) { }
|
||||
}
|
||||
```
|
||||
|
||||
**状态流转**:
|
||||
```
|
||||
待确认 → 已确认 → 准备中 → 运输中 → 已到达 → 已验收 → 已完成
|
||||
```
|
||||
|
||||
#### 3.1.3 运输管理模块 (Transport Management)
|
||||
|
||||
**职责**:
|
||||
- 运输任务分配和管理
|
||||
- 实时位置跟踪
|
||||
- 运输状态监控
|
||||
- 异常情况处理
|
||||
|
||||
**核心功能**:
|
||||
```javascript
|
||||
/**
|
||||
* 运输管理服务
|
||||
*/
|
||||
class TransportService {
|
||||
// 创建运输任务
|
||||
async createTransportTask(taskData) { }
|
||||
|
||||
// 更新位置信息
|
||||
async updateLocation(taskId, locationData) { }
|
||||
|
||||
// 获取运输轨迹
|
||||
async getTransportTrack(taskId) { }
|
||||
|
||||
// 异常情况上报
|
||||
async reportException(taskId, exceptionData) { }
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 前端模块结构
|
||||
|
||||
#### 3.2.1 管理后台模块结构
|
||||
|
||||
```
|
||||
admin-system/src/
|
||||
├── components/ # 公共组件
|
||||
│ ├── Layout/ # 布局组件
|
||||
│ ├── Charts/ # 图表组件
|
||||
│ ├── Forms/ # 表单组件
|
||||
│ └── Tables/ # 表格组件
|
||||
├── views/ # 页面组件
|
||||
│ ├── dashboard/ # 数据驾驶舱
|
||||
│ ├── order/ # 订单管理
|
||||
│ ├── user/ # 用户管理
|
||||
│ ├── transport/ # 运输管理
|
||||
│ ├── finance/ # 财务管理
|
||||
│ └── system/ # 系统管理
|
||||
├── stores/ # 状态管理
|
||||
│ ├── user.ts # 用户状态
|
||||
│ ├── order.ts # 订单状态
|
||||
│ └── app.ts # 应用状态
|
||||
├── api/ # API接口
|
||||
│ ├── user.ts # 用户接口
|
||||
│ ├── order.ts # 订单接口
|
||||
│ └── transport.ts # 运输接口
|
||||
├── utils/ # 工具函数
|
||||
│ ├── request.ts # HTTP请求封装
|
||||
│ ├── auth.ts # 认证工具
|
||||
│ └── common.ts # 通用工具
|
||||
└── types/ # TypeScript类型定义
|
||||
├── user.ts # 用户类型
|
||||
├── order.ts # 订单类型
|
||||
└── api.ts # API类型
|
||||
```
|
||||
|
||||
#### 3.2.2 小程序模块结构
|
||||
|
||||
```
|
||||
mini_program/
|
||||
├── client-mp/ # 采购人小程序
|
||||
│ ├── pages/
|
||||
│ │ ├── index/ # 首页
|
||||
│ │ ├── order/ # 订单管理
|
||||
│ │ ├── transport/ # 运输跟踪
|
||||
│ │ └── profile/ # 个人中心
|
||||
│ ├── components/ # 组件
|
||||
│ ├── utils/ # 工具函数
|
||||
│ └── api/ # 接口调用
|
||||
├── supplier-mp/ # 供应商小程序
|
||||
├── driver-mp/ # 司机小程序
|
||||
└── staff-mp/ # 内部员工小程序
|
||||
```
|
||||
|
||||
## 4. 数据库设计
|
||||
|
||||
### 4.1 数据库架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[应用服务] --> B[读写分离中间件]
|
||||
B --> C[MySQL主库<br/>写操作]
|
||||
B --> D[MySQL从库1<br/>读操作]
|
||||
B --> E[MySQL从库2<br/>读操作]
|
||||
|
||||
A --> F[Redis集群<br/>缓存层]
|
||||
F --> G[Redis主节点]
|
||||
F --> H[Redis从节点]
|
||||
|
||||
A --> I[文件存储<br/>MinIO集群]
|
||||
```
|
||||
|
||||
### 4.2 核心数据表设计
|
||||
|
||||
#### 4.2.1 用户相关表
|
||||
|
||||
```sql
|
||||
-- 用户表
|
||||
CREATE TABLE users (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
phone VARCHAR(20) UNIQUE NOT NULL COMMENT '手机号',
|
||||
password VARCHAR(255) NOT NULL COMMENT '密码',
|
||||
name VARCHAR(100) NOT NULL COMMENT '姓名',
|
||||
role ENUM('client', 'supplier', 'driver', 'trader', 'admin') NOT NULL COMMENT '角色',
|
||||
status ENUM('active', 'inactive', 'banned') DEFAULT 'active' COMMENT '状态',
|
||||
avatar VARCHAR(500) COMMENT '头像URL',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_phone (phone),
|
||||
INDEX idx_role (role),
|
||||
INDEX idx_status (status)
|
||||
) COMMENT '用户表';
|
||||
|
||||
-- 用户详情表
|
||||
CREATE TABLE user_profiles (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
company_name VARCHAR(200) COMMENT '公司名称',
|
||||
business_license VARCHAR(500) COMMENT '营业执照',
|
||||
contact_address TEXT COMMENT '联系地址',
|
||||
emergency_contact VARCHAR(100) COMMENT '紧急联系人',
|
||||
emergency_phone VARCHAR(20) COMMENT '紧急联系电话',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
INDEX idx_user_id (user_id)
|
||||
) COMMENT '用户详情表';
|
||||
```
|
||||
|
||||
#### 4.2.2 订单相关表
|
||||
|
||||
```sql
|
||||
-- 订单表
|
||||
CREATE TABLE orders (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_no VARCHAR(50) UNIQUE NOT NULL COMMENT '订单号',
|
||||
client_id BIGINT NOT NULL COMMENT '采购人ID',
|
||||
trader_id BIGINT COMMENT '贸易商ID',
|
||||
supplier_id BIGINT COMMENT '供应商ID',
|
||||
cattle_type VARCHAR(50) NOT NULL COMMENT '牛只品种',
|
||||
quantity INT NOT NULL COMMENT '数量',
|
||||
weight_range VARCHAR(50) COMMENT '重量范围',
|
||||
unit_price DECIMAL(10,2) NOT NULL COMMENT '单价',
|
||||
total_amount DECIMAL(12,2) NOT NULL COMMENT '总金额',
|
||||
delivery_address TEXT NOT NULL COMMENT '交货地址',
|
||||
delivery_time DATETIME COMMENT '要求交货时间',
|
||||
status ENUM('pending', 'confirmed', 'preparing', 'transporting', 'arrived', 'accepted', 'completed', 'cancelled') DEFAULT 'pending',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (client_id) REFERENCES users(id),
|
||||
FOREIGN KEY (trader_id) REFERENCES users(id),
|
||||
FOREIGN KEY (supplier_id) REFERENCES users(id),
|
||||
INDEX idx_order_no (order_no),
|
||||
INDEX idx_client_id (client_id),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at)
|
||||
) COMMENT '订单表';
|
||||
|
||||
-- 订单状态变更记录表
|
||||
CREATE TABLE order_status_logs (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_id BIGINT NOT NULL,
|
||||
from_status VARCHAR(50) COMMENT '原状态',
|
||||
to_status VARCHAR(50) NOT NULL COMMENT '新状态',
|
||||
operator_id BIGINT COMMENT '操作人ID',
|
||||
remark TEXT COMMENT '备注',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (operator_id) REFERENCES users(id),
|
||||
INDEX idx_order_id (order_id),
|
||||
INDEX idx_created_at (created_at)
|
||||
) COMMENT '订单状态变更记录表';
|
||||
```
|
||||
|
||||
#### 4.2.3 运输相关表
|
||||
|
||||
```sql
|
||||
-- 运输任务表
|
||||
CREATE TABLE transport_tasks (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
task_no VARCHAR(50) UNIQUE NOT NULL COMMENT '任务号',
|
||||
order_id BIGINT NOT NULL COMMENT '订单ID',
|
||||
driver_id BIGINT NOT NULL COMMENT '司机ID',
|
||||
vehicle_no VARCHAR(20) NOT NULL COMMENT '车牌号',
|
||||
start_location VARCHAR(200) COMMENT '起始地点',
|
||||
end_location VARCHAR(200) COMMENT '目的地点',
|
||||
start_time DATETIME COMMENT '开始时间',
|
||||
end_time DATETIME COMMENT '结束时间',
|
||||
status ENUM('assigned', 'started', 'transporting', 'arrived', 'completed') DEFAULT 'assigned',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (order_id) REFERENCES orders(id),
|
||||
FOREIGN KEY (driver_id) REFERENCES users(id),
|
||||
INDEX idx_task_no (task_no),
|
||||
INDEX idx_order_id (order_id),
|
||||
INDEX idx_driver_id (driver_id),
|
||||
INDEX idx_status (status)
|
||||
) COMMENT '运输任务表';
|
||||
|
||||
-- 位置跟踪表
|
||||
CREATE TABLE location_tracks (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
task_id BIGINT NOT NULL COMMENT '任务ID',
|
||||
latitude DECIMAL(10,6) NOT NULL COMMENT '纬度',
|
||||
longitude DECIMAL(10,6) NOT NULL COMMENT '经度',
|
||||
address VARCHAR(500) COMMENT '地址',
|
||||
speed DECIMAL(5,2) COMMENT '速度',
|
||||
direction DECIMAL(5,2) COMMENT '方向',
|
||||
recorded_at TIMESTAMP NOT NULL COMMENT '记录时间',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (task_id) REFERENCES transport_tasks(id) ON DELETE CASCADE,
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_recorded_at (recorded_at)
|
||||
) COMMENT '位置跟踪表';
|
||||
```
|
||||
|
||||
### 4.3 数据库优化策略
|
||||
|
||||
#### 4.3.1 索引优化
|
||||
- **主键索引**:所有表使用自增主键
|
||||
- **唯一索引**:手机号、订单号等唯一字段
|
||||
- **复合索引**:常用查询条件组合
|
||||
- **覆盖索引**:减少回表查询
|
||||
|
||||
#### 4.3.2 分区策略
|
||||
```sql
|
||||
-- 按时间分区的位置跟踪表
|
||||
CREATE TABLE location_tracks (
|
||||
-- 字段定义...
|
||||
) PARTITION BY RANGE (YEAR(recorded_at)) (
|
||||
PARTITION p2024 VALUES LESS THAN (2025),
|
||||
PARTITION p2025 VALUES LESS THAN (2026),
|
||||
PARTITION p_future VALUES LESS THAN MAXVALUE
|
||||
);
|
||||
```
|
||||
|
||||
#### 4.3.3 读写分离
|
||||
- **主库**:处理所有写操作和实时性要求高的读操作
|
||||
- **从库**:处理统计查询、报表生成等读操作
|
||||
- **中间件**:自动路由读写请求
|
||||
|
||||
## 5. API设计规范
|
||||
|
||||
### 5.1 RESTful API设计原则
|
||||
|
||||
#### 5.1.1 URL设计规范
|
||||
```
|
||||
GET /api/v1/orders # 获取订单列表
|
||||
POST /api/v1/orders # 创建订单
|
||||
GET /api/v1/orders/:id # 获取订单详情
|
||||
PUT /api/v1/orders/:id # 更新订单
|
||||
DELETE /api/v1/orders/:id # 删除订单
|
||||
```
|
||||
|
||||
#### 5.1.2 HTTP状态码规范
|
||||
| 状态码 | 含义 | 使用场景 |
|
||||
|--------|------|----------|
|
||||
| 200 | OK | 请求成功 |
|
||||
| 201 | Created | 资源创建成功 |
|
||||
| 400 | Bad Request | 请求参数错误 |
|
||||
| 401 | Unauthorized | 未认证 |
|
||||
| 403 | Forbidden | 无权限 |
|
||||
| 404 | Not Found | 资源不存在 |
|
||||
| 500 | Internal Server Error | 服务器内部错误 |
|
||||
|
||||
#### 5.1.3 响应格式规范
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
// 响应数据
|
||||
},
|
||||
"timestamp": "2024-12-20T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 核心API接口设计
|
||||
|
||||
#### 5.2.1 用户认证接口
|
||||
```javascript
|
||||
// 用户登录
|
||||
POST /api/v1/auth/login
|
||||
{
|
||||
"phone": "13800138000",
|
||||
"password": "password123"
|
||||
}
|
||||
|
||||
// 响应
|
||||
{
|
||||
"code": 200,
|
||||
"message": "登录成功",
|
||||
"data": {
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"user": {
|
||||
"id": 1,
|
||||
"name": "张三",
|
||||
"role": "client",
|
||||
"avatar": "https://example.com/avatar.jpg"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2.2 订单管理接口
|
||||
```javascript
|
||||
// 创建订单
|
||||
POST /api/v1/orders
|
||||
{
|
||||
"cattleType": "西门塔尔",
|
||||
"quantity": 50,
|
||||
"weightRange": "400-500kg",
|
||||
"unitPrice": 28.5,
|
||||
"deliveryAddress": "北京市朝阳区...",
|
||||
"deliveryTime": "2024-12-25T10:00:00Z"
|
||||
}
|
||||
|
||||
// 获取订单列表
|
||||
GET /api/v1/orders?page=1&limit=20&status=pending
|
||||
|
||||
// 响应
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"list": [...],
|
||||
"total": 100,
|
||||
"page": 1,
|
||||
"limit": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 安全架构设计
|
||||
|
||||
### 6.1 认证与授权
|
||||
|
||||
#### 6.1.1 JWT认证机制
|
||||
```javascript
|
||||
/**
|
||||
* JWT Token结构
|
||||
*/
|
||||
{
|
||||
"header": {
|
||||
"alg": "HS256",
|
||||
"typ": "JWT"
|
||||
},
|
||||
"payload": {
|
||||
"userId": 1,
|
||||
"role": "client",
|
||||
"permissions": ["order:read", "order:create"],
|
||||
"exp": 1640995200,
|
||||
"iat": 1640908800
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 6.1.2 权限控制模型
|
||||
```javascript
|
||||
/**
|
||||
* RBAC权限控制
|
||||
*/
|
||||
const permissions = {
|
||||
'client': ['order:create', 'order:read', 'transport:read'],
|
||||
'supplier': ['order:read', 'order:update', 'cattle:manage'],
|
||||
'driver': ['transport:read', 'transport:update', 'location:report'],
|
||||
'admin': ['*'] // 所有权限
|
||||
};
|
||||
```
|
||||
|
||||
### 6.2 数据安全
|
||||
|
||||
#### 6.2.1 数据加密
|
||||
- **传输加密**:HTTPS/TLS 1.3
|
||||
- **存储加密**:敏感数据AES-256加密
|
||||
- **密码加密**:bcrypt哈希算法
|
||||
|
||||
#### 6.2.2 输入验证
|
||||
```javascript
|
||||
/**
|
||||
* 数据验证中间件
|
||||
*/
|
||||
const orderValidation = Joi.object({
|
||||
cattleType: Joi.string().required(),
|
||||
quantity: Joi.number().integer().min(1).max(1000).required(),
|
||||
unitPrice: Joi.number().positive().precision(2).required(),
|
||||
deliveryAddress: Joi.string().min(10).max(500).required()
|
||||
});
|
||||
```
|
||||
|
||||
### 6.3 安全防护
|
||||
|
||||
#### 6.3.1 防护措施
|
||||
- **SQL注入防护**:参数化查询、ORM框架
|
||||
- **XSS防护**:输入过滤、输出编码
|
||||
- **CSRF防护**:CSRF Token验证
|
||||
- **请求限流**:基于IP和用户的限流策略
|
||||
|
||||
#### 6.3.2 监控告警
|
||||
```javascript
|
||||
/**
|
||||
* 安全事件监控
|
||||
*/
|
||||
const securityEvents = {
|
||||
'login_failure': '登录失败次数过多',
|
||||
'permission_denied': '权限访问被拒绝',
|
||||
'sql_injection': 'SQL注入攻击尝试',
|
||||
'unusual_activity': '异常活动检测'
|
||||
};
|
||||
```
|
||||
|
||||
## 7. 性能优化策略
|
||||
|
||||
### 7.1 前端性能优化
|
||||
|
||||
#### 7.1.1 代码分割与懒加载
|
||||
```javascript
|
||||
// 路由懒加载
|
||||
const routes = [
|
||||
{
|
||||
path: '/order',
|
||||
component: () => import('@/views/order/OrderList.vue')
|
||||
}
|
||||
];
|
||||
|
||||
// 组件懒加载
|
||||
const LazyComponent = defineAsyncComponent(() =>
|
||||
import('@/components/HeavyComponent.vue')
|
||||
);
|
||||
```
|
||||
|
||||
#### 7.1.2 资源优化
|
||||
- **图片优化**:WebP格式、响应式图片
|
||||
- **代码压缩**:Gzip/Brotli压缩
|
||||
- **CDN加速**:静态资源CDN分发
|
||||
- **缓存策略**:浏览器缓存、Service Worker
|
||||
|
||||
### 7.2 后端性能优化
|
||||
|
||||
#### 7.2.1 数据库优化
|
||||
```javascript
|
||||
/**
|
||||
* 查询优化示例
|
||||
*/
|
||||
// 使用索引优化查询
|
||||
const orders = await Order.findAll({
|
||||
where: {
|
||||
status: 'pending',
|
||||
created_at: {
|
||||
[Op.gte]: new Date('2024-01-01')
|
||||
}
|
||||
},
|
||||
include: [{
|
||||
model: User,
|
||||
attributes: ['id', 'name'] // 只查询需要的字段
|
||||
}],
|
||||
limit: 20,
|
||||
offset: (page - 1) * 20
|
||||
});
|
||||
```
|
||||
|
||||
#### 7.2.2 缓存策略
|
||||
```javascript
|
||||
/**
|
||||
* Redis缓存策略
|
||||
*/
|
||||
class CacheService {
|
||||
// 用户信息缓存(30分钟)
|
||||
async getUserInfo(userId) {
|
||||
const cacheKey = `user:${userId}`;
|
||||
let user = await redis.get(cacheKey);
|
||||
|
||||
if (!user) {
|
||||
user = await User.findByPk(userId);
|
||||
await redis.setex(cacheKey, 1800, JSON.stringify(user));
|
||||
}
|
||||
|
||||
return JSON.parse(user);
|
||||
}
|
||||
|
||||
// 订单列表缓存(5分钟)
|
||||
async getOrderList(filters) {
|
||||
const cacheKey = `orders:${JSON.stringify(filters)}`;
|
||||
let orders = await redis.get(cacheKey);
|
||||
|
||||
if (!orders) {
|
||||
orders = await Order.findAll(filters);
|
||||
await redis.setex(cacheKey, 300, JSON.stringify(orders));
|
||||
}
|
||||
|
||||
return JSON.parse(orders);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7.3 系统性能监控
|
||||
|
||||
#### 7.3.1 关键性能指标
|
||||
| 指标 | 目标值 | 监控方式 |
|
||||
|------|--------|----------|
|
||||
| 页面加载时间 | < 2秒 | 前端性能监控 |
|
||||
| API响应时间 | < 1秒 | APM监控 |
|
||||
| 数据库查询时间 | < 100ms | 慢查询日志 |
|
||||
| 系统可用性 | > 99.9% | 健康检查 |
|
||||
|
||||
#### 7.3.2 性能监控工具
|
||||
- **前端监控**:Web Vitals、Performance API
|
||||
- **后端监控**:Prometheus + Grafana
|
||||
- **数据库监控**:MySQL Performance Schema
|
||||
- **日志分析**:ELK Stack
|
||||
|
||||
## 8. 部署架构
|
||||
|
||||
### 8.1 容器化部署
|
||||
|
||||
#### 8.1.1 Docker容器设计
|
||||
```dockerfile
|
||||
# Node.js应用容器
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 复制依赖文件
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
# 复制应用代码
|
||||
COPY . .
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 3000
|
||||
|
||||
# 启动应用
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
#### 8.1.2 Docker Compose编排
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DB_HOST=mysql
|
||||
- REDIS_HOST=redis
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
|
||||
MYSQL_DATABASE: ${DB_NAME}
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./ssl:/etc/nginx/ssl
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
redis_data:
|
||||
```
|
||||
|
||||
### 8.2 生产环境架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[负载均衡器<br/>Nginx] --> B[Web服务器1<br/>Node.js]
|
||||
A --> C[Web服务器2<br/>Node.js]
|
||||
A --> D[Web服务器3<br/>Node.js]
|
||||
|
||||
B --> E[MySQL主库]
|
||||
C --> E
|
||||
D --> E
|
||||
|
||||
B --> F[MySQL从库1]
|
||||
C --> F
|
||||
D --> F
|
||||
|
||||
B --> G[Redis集群]
|
||||
C --> G
|
||||
D --> G
|
||||
|
||||
H[文件存储<br/>MinIO] --> I[对象存储]
|
||||
|
||||
J[监控系统<br/>Prometheus] --> K[告警系统<br/>AlertManager]
|
||||
K --> L[通知渠道<br/>邮件/短信/钉钉]
|
||||
```
|
||||
|
||||
### 8.3 CI/CD流水线
|
||||
|
||||
#### 8.3.1 自动化部署流程
|
||||
```yaml
|
||||
# GitHub Actions配置
|
||||
name: Deploy to Production
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18'
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
- run: npm run lint
|
||||
|
||||
build:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build Docker image
|
||||
run: docker build -t niumall:${{ github.sha }} .
|
||||
- name: Push to registry
|
||||
run: docker push niumall:${{ github.sha }}
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to production
|
||||
run: |
|
||||
ssh user@server "docker pull niumall:${{ github.sha }}"
|
||||
ssh user@server "docker-compose up -d"
|
||||
```
|
||||
|
||||
## 9. 扩展性设计
|
||||
|
||||
### 9.1 水平扩展策略
|
||||
|
||||
#### 9.1.1 应用层扩展
|
||||
- **无状态设计**:应用服务器无状态,支持水平扩展
|
||||
- **负载均衡**:Nginx负载均衡,支持多实例部署
|
||||
- **会话管理**:Redis集中式会话存储
|
||||
|
||||
#### 9.1.2 数据层扩展
|
||||
- **读写分离**:主从复制,读写分离
|
||||
- **分库分表**:按业务模块或时间分片
|
||||
- **缓存集群**:Redis集群,提高缓存容量
|
||||
|
||||
### 9.2 微服务演进路径
|
||||
|
||||
#### 9.2.1 服务拆分策略
|
||||
```
|
||||
单体应用 → 模块化应用 → 微服务架构
|
||||
|
||||
Phase 1: 模块化重构
|
||||
- 按业务领域拆分模块
|
||||
- 统一数据访问层
|
||||
- 服务接口标准化
|
||||
|
||||
Phase 2: 服务化改造
|
||||
- 独立部署单元
|
||||
- 服务间通信机制
|
||||
- 配置中心建设
|
||||
|
||||
Phase 3: 微服务架构
|
||||
- 服务注册发现
|
||||
- 分布式链路追踪
|
||||
- 熔断降级机制
|
||||
```
|
||||
|
||||
#### 9.2.2 技术栈演进
|
||||
| 阶段 | 架构模式 | 技术栈 | 复杂度 |
|
||||
|------|---------|--------|--------|
|
||||
| 当前 | 单体应用 | Express.js + MySQL | 低 |
|
||||
| 中期 | 模块化应用 | Express.js + 微服务 | 中 |
|
||||
| 长期 | 微服务架构 | Spring Cloud + K8s | 高 |
|
||||
|
||||
---
|
||||
|
||||
**文档维护**:本文档由架构团队负责维护,重大架构变更时及时更新。
|
||||
|
||||
**最后更新时间**:2024年12月20日
|
||||
Reference in New Issue
Block a user