904 lines
24 KiB
Markdown
904 lines
24 KiB
Markdown
|
|
# 活牛采购智能数字化系统 - 系统架构设计
|
|||
|
|
|
|||
|
|
## 版本历史
|
|||
|
|
| 版本 | 日期 | 作者 | 变更说明 |
|
|||
|
|
|------|------|------|----------|
|
|||
|
|
| 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日
|