refactor: 重构数据库配置为SQLite开发环境并移除冗余文档
This commit is contained in:
597
docs/architecture/后端架构文档.md
Normal file
597
docs/architecture/后端架构文档.md
Normal file
@@ -0,0 +1,597 @@
|
||||
# 后端架构文档
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 作者 | 变更说明 |
|
||||
|------|------|------|----------|
|
||||
| 1.0 | 2024-01-20 | 后端团队 | 初始版本 |
|
||||
|
||||
## 1. 后端架构概述
|
||||
|
||||
### 1.1 架构目标
|
||||
- **高性能**:支持高并发请求处理
|
||||
- **高可用**:99.9%以上的服务可用性
|
||||
- **可扩展**:支持水平和垂直扩展
|
||||
- **易维护**:模块化设计,便于开发和维护
|
||||
- **安全性**:完善的安全防护机制
|
||||
|
||||
### 1.2 技术栈
|
||||
- **运行环境**:Node.js 18.x LTS
|
||||
- **Web框架**:Express.js 4.x
|
||||
- **开发语言**:TypeScript 5.x
|
||||
- **ORM框架**:Sequelize 6.x (MySQL) + Mongoose 7.x (MongoDB)
|
||||
- **缓存**:Redis 6.x
|
||||
- **消息队列**:Redis Pub/Sub + Bull Queue
|
||||
- **文件存储**:阿里云OSS
|
||||
- **监控**:Winston + Prometheus
|
||||
|
||||
## 2. 系统架构设计
|
||||
|
||||
### 2.1 分层架构
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Controller Layer │
|
||||
│ (路由控制层) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Service Layer │
|
||||
│ (业务逻辑层) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Repository Layer │
|
||||
│ (数据访问层) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Model Layer │
|
||||
│ (数据模型层) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 微服务架构
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ API Gateway │
|
||||
│ (Nginx + Kong) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
┌─────────────┬─────────────┬─────────────┬─────────────────┐
|
||||
│ 用户服务 │ 养殖服务 │ 交易服务 │ 通知服务 │
|
||||
│ user-service│farm-service │trade-service│notify-service │
|
||||
│ :3001 │ :3002 │ :3003 │ :3004 │
|
||||
└─────────────┴─────────────┴─────────────┴─────────────────┘
|
||||
```
|
||||
|
||||
## 3. 核心服务设计
|
||||
|
||||
### 3.1 用户服务 (User Service)
|
||||
**端口**: 3001
|
||||
**职责**: 用户管理、认证授权、权限控制
|
||||
|
||||
**核心模块**:
|
||||
- **认证模块**: JWT Token生成和验证
|
||||
- **用户管理**: 用户注册、登录、信息管理
|
||||
- **权限管理**: RBAC权限控制
|
||||
- **微信集成**: 微信小程序授权登录
|
||||
|
||||
**API设计**:
|
||||
```typescript
|
||||
// 用户注册
|
||||
POST /api/v1/users/register
|
||||
// 用户登录
|
||||
POST /api/v1/users/login
|
||||
// 获取用户信息
|
||||
GET /api/v1/users/profile
|
||||
// 更新用户信息
|
||||
PUT /api/v1/users/profile
|
||||
```
|
||||
|
||||
### 3.2 养殖服务 (Farm Service)
|
||||
**端口**: 3002
|
||||
**职责**: 养殖场管理、动物管理、饲料管理
|
||||
|
||||
**核心模块**:
|
||||
- **养殖场管理**: 养殖场信息、环境监控
|
||||
- **动物管理**: 动物档案、健康记录、生长数据
|
||||
- **饲料管理**: 饲料库存、投喂记录、营养分析
|
||||
- **数据统计**: 养殖数据分析和报表
|
||||
|
||||
**API设计**:
|
||||
```typescript
|
||||
// 养殖场管理
|
||||
GET /api/v1/farms
|
||||
POST /api/v1/farms
|
||||
PUT /api/v1/farms/:id
|
||||
DELETE /api/v1/farms/:id
|
||||
|
||||
// 动物管理
|
||||
GET /api/v1/animals
|
||||
POST /api/v1/animals
|
||||
PUT /api/v1/animals/:id
|
||||
```
|
||||
|
||||
### 3.3 交易服务 (Trade Service)
|
||||
**端口**: 3003
|
||||
**职责**: 订单管理、支付管理、物流管理
|
||||
|
||||
**核心模块**:
|
||||
- **订单管理**: 订单创建、状态跟踪、订单历史
|
||||
- **支付管理**: 微信支付、支付宝支付集成
|
||||
- **物流管理**: 物流信息、配送跟踪
|
||||
- **财务管理**: 收支记录、财务报表
|
||||
|
||||
**API设计**:
|
||||
```typescript
|
||||
// 订单管理
|
||||
GET /api/v1/orders
|
||||
POST /api/v1/orders
|
||||
PUT /api/v1/orders/:id/status
|
||||
|
||||
// 支付管理
|
||||
POST /api/v1/payments/wechat
|
||||
POST /api/v1/payments/alipay
|
||||
GET /api/v1/payments/:id/status
|
||||
```
|
||||
|
||||
### 3.4 通知服务 (Notify Service)
|
||||
**端口**: 3004
|
||||
**职责**: 消息推送、邮件发送、短信通知
|
||||
|
||||
**核心模块**:
|
||||
- **推送管理**: 小程序消息推送
|
||||
- **邮件服务**: 邮件模板、批量发送
|
||||
- **短信服务**: 验证码、通知短信
|
||||
- **消息队列**: 异步消息处理
|
||||
|
||||
## 4. 数据库设计
|
||||
|
||||
### 4.1 MySQL数据库
|
||||
**用途**: 核心业务数据存储
|
||||
|
||||
**数据库分片策略**:
|
||||
- **用户库**: 按用户ID分片
|
||||
- **业务库**: 按业务类型分库
|
||||
- **日志库**: 按时间分表
|
||||
|
||||
**主要数据表**:
|
||||
```sql
|
||||
-- 用户表
|
||||
CREATE TABLE users (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
phone VARCHAR(20),
|
||||
email VARCHAR(100),
|
||||
status TINYINT DEFAULT 1,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 养殖场表
|
||||
CREATE TABLE farms (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
address TEXT,
|
||||
area DECIMAL(10,2),
|
||||
type VARCHAR(50),
|
||||
status TINYINT DEFAULT 1,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id)
|
||||
);
|
||||
```
|
||||
|
||||
### 4.2 Redis缓存
|
||||
**用途**: 缓存热点数据、会话存储、分布式锁
|
||||
|
||||
**缓存策略**:
|
||||
- **用户会话**: `session:{token}` (TTL: 7天)
|
||||
- **用户信息**: `user:{id}` (TTL: 1小时)
|
||||
- **热点数据**: `hot:{type}:{id}` (TTL: 30分钟)
|
||||
- **分布式锁**: `lock:{resource}` (TTL: 30秒)
|
||||
|
||||
### 4.3 MongoDB文档库
|
||||
**用途**: 日志数据、统计数据、非结构化数据
|
||||
|
||||
**集合设计**:
|
||||
```javascript
|
||||
// 操作日志
|
||||
{
|
||||
_id: ObjectId,
|
||||
userId: Number,
|
||||
action: String,
|
||||
resource: String,
|
||||
details: Object,
|
||||
ip: String,
|
||||
userAgent: String,
|
||||
timestamp: Date
|
||||
}
|
||||
|
||||
// 统计数据
|
||||
{
|
||||
_id: ObjectId,
|
||||
type: String, // daily, weekly, monthly
|
||||
date: Date,
|
||||
metrics: {
|
||||
userCount: Number,
|
||||
orderCount: Number,
|
||||
revenue: Number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 中间件设计
|
||||
|
||||
### 5.1 认证中间件
|
||||
```typescript
|
||||
export const authMiddleware = async (req: Request, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const token = req.headers.authorization?.replace('Bearer ', '');
|
||||
if (!token) {
|
||||
return res.status(401).json({ error: 'Token required' });
|
||||
}
|
||||
|
||||
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
|
||||
req.user = decoded;
|
||||
next();
|
||||
} catch (error) {
|
||||
return res.status(401).json({ error: 'Invalid token' });
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 5.2 权限中间件
|
||||
```typescript
|
||||
export const permissionMiddleware = (permission: string) => {
|
||||
return async (req: Request, res: Response, next: NextFunction) => {
|
||||
const userPermissions = await getUserPermissions(req.user.id);
|
||||
if (!userPermissions.includes(permission)) {
|
||||
return res.status(403).json({ error: 'Permission denied' });
|
||||
}
|
||||
next();
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### 5.3 限流中间件
|
||||
```typescript
|
||||
export const rateLimitMiddleware = rateLimit({
|
||||
windowMs: 15 * 60 * 1000, // 15分钟
|
||||
max: 100, // 最多100次请求
|
||||
message: 'Too many requests',
|
||||
standardHeaders: true,
|
||||
legacyHeaders: false,
|
||||
});
|
||||
```
|
||||
|
||||
## 6. API设计规范
|
||||
|
||||
### 6.1 RESTful API规范
|
||||
- **URL设计**: 使用名词复数形式,如 `/api/v1/users`
|
||||
- **HTTP方法**: GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
|
||||
- **状态码**: 200(成功)、201(创建)、400(参数错误)、401(未授权)、403(禁止)、404(未找到)、500(服务器错误)
|
||||
|
||||
### 6.2 响应格式
|
||||
```typescript
|
||||
// 成功响应
|
||||
{
|
||||
"success": true,
|
||||
"data": {},
|
||||
"message": "操作成功"
|
||||
}
|
||||
|
||||
// 错误响应
|
||||
{
|
||||
"success": false,
|
||||
"error": {
|
||||
"code": "USER_NOT_FOUND",
|
||||
"message": "用户不存在"
|
||||
}
|
||||
}
|
||||
|
||||
// 分页响应
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"items": [],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"limit": 20,
|
||||
"total": 100,
|
||||
"pages": 5
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.3 参数验证
|
||||
```typescript
|
||||
import Joi from 'joi';
|
||||
|
||||
const userSchema = Joi.object({
|
||||
username: Joi.string().min(3).max(30).required(),
|
||||
password: Joi.string().min(6).required(),
|
||||
email: Joi.string().email().optional(),
|
||||
phone: Joi.string().pattern(/^1[3-9]\d{9}$/).optional()
|
||||
});
|
||||
|
||||
export const validateUser = (req: Request, res: Response, next: NextFunction) => {
|
||||
const { error } = userSchema.validate(req.body);
|
||||
if (error) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: {
|
||||
code: 'VALIDATION_ERROR',
|
||||
message: error.details[0].message
|
||||
}
|
||||
});
|
||||
}
|
||||
next();
|
||||
};
|
||||
```
|
||||
|
||||
## 7. 错误处理机制
|
||||
|
||||
### 7.1 全局错误处理
|
||||
```typescript
|
||||
export const errorHandler = (err: Error, req: Request, res: Response, next: NextFunction) => {
|
||||
logger.error('Unhandled error:', err);
|
||||
|
||||
if (err instanceof ValidationError) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: {
|
||||
code: 'VALIDATION_ERROR',
|
||||
message: err.message
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (err instanceof AuthenticationError) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
error: {
|
||||
code: 'AUTHENTICATION_ERROR',
|
||||
message: '认证失败'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 默认服务器错误
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: {
|
||||
code: 'INTERNAL_SERVER_ERROR',
|
||||
message: '服务器内部错误'
|
||||
}
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
### 7.2 自定义错误类
|
||||
```typescript
|
||||
export class BusinessError extends Error {
|
||||
constructor(
|
||||
public code: string,
|
||||
public message: string,
|
||||
public statusCode: number = 400
|
||||
) {
|
||||
super(message);
|
||||
this.name = 'BusinessError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ValidationError extends BusinessError {
|
||||
constructor(message: string) {
|
||||
super('VALIDATION_ERROR', message, 400);
|
||||
}
|
||||
}
|
||||
|
||||
export class AuthenticationError extends BusinessError {
|
||||
constructor(message: string = '认证失败') {
|
||||
super('AUTHENTICATION_ERROR', message, 401);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 8. 日志系统
|
||||
|
||||
### 8.1 日志配置
|
||||
```typescript
|
||||
import winston from 'winston';
|
||||
|
||||
const logger = winston.createLogger({
|
||||
level: process.env.LOG_LEVEL || 'info',
|
||||
format: winston.format.combine(
|
||||
winston.format.timestamp(),
|
||||
winston.format.errors({ stack: true }),
|
||||
winston.format.json()
|
||||
),
|
||||
transports: [
|
||||
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
|
||||
new winston.transports.File({ filename: 'logs/combined.log' }),
|
||||
new winston.transports.Console({
|
||||
format: winston.format.simple()
|
||||
})
|
||||
]
|
||||
});
|
||||
```
|
||||
|
||||
### 8.2 日志中间件
|
||||
```typescript
|
||||
export const loggerMiddleware = (req: Request, res: Response, next: NextFunction) => {
|
||||
const start = Date.now();
|
||||
|
||||
res.on('finish', () => {
|
||||
const duration = Date.now() - start;
|
||||
logger.info('HTTP Request', {
|
||||
method: req.method,
|
||||
url: req.url,
|
||||
statusCode: res.statusCode,
|
||||
duration,
|
||||
userAgent: req.get('User-Agent'),
|
||||
ip: req.ip
|
||||
});
|
||||
});
|
||||
|
||||
next();
|
||||
};
|
||||
```
|
||||
|
||||
## 9. 缓存策略
|
||||
|
||||
### 9.1 多级缓存
|
||||
- **L1缓存**: 内存缓存 (Node.js进程内)
|
||||
- **L2缓存**: Redis缓存 (分布式缓存)
|
||||
- **L3缓存**: 数据库查询缓存
|
||||
|
||||
### 9.2 缓存更新策略
|
||||
- **Cache Aside**: 应用程序管理缓存
|
||||
- **Write Through**: 写入时同步更新缓存
|
||||
- **Write Behind**: 异步更新缓存
|
||||
|
||||
### 9.3 缓存实现
|
||||
```typescript
|
||||
class CacheService {
|
||||
private redis: Redis;
|
||||
private localCache: Map<string, any>;
|
||||
|
||||
async get(key: string): Promise<any> {
|
||||
// 先查本地缓存
|
||||
if (this.localCache.has(key)) {
|
||||
return this.localCache.get(key);
|
||||
}
|
||||
|
||||
// 再查Redis缓存
|
||||
const value = await this.redis.get(key);
|
||||
if (value) {
|
||||
this.localCache.set(key, JSON.parse(value));
|
||||
return JSON.parse(value);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
async set(key: string, value: any, ttl: number = 3600): Promise<void> {
|
||||
// 更新本地缓存
|
||||
this.localCache.set(key, value);
|
||||
|
||||
// 更新Redis缓存
|
||||
await this.redis.setex(key, ttl, JSON.stringify(value));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 10. 性能优化
|
||||
|
||||
### 10.1 数据库优化
|
||||
- **连接池**: 使用连接池管理数据库连接
|
||||
- **索引优化**: 合理创建索引提升查询性能
|
||||
- **查询优化**: 避免N+1查询,使用JOIN优化
|
||||
- **分页优化**: 使用游标分页替代OFFSET
|
||||
|
||||
### 10.2 API优化
|
||||
- **响应压缩**: 启用Gzip压缩
|
||||
- **静态资源**: CDN加速静态资源
|
||||
- **异步处理**: 耗时操作异步处理
|
||||
- **批量操作**: 支持批量API操作
|
||||
|
||||
### 10.3 内存优化
|
||||
- **内存监控**: 监控内存使用情况
|
||||
- **垃圾回收**: 优化垃圾回收策略
|
||||
- **内存泄漏**: 定期检查内存泄漏
|
||||
|
||||
## 11. 安全设计
|
||||
|
||||
### 11.1 输入验证
|
||||
- **参数校验**: 严格校验所有输入参数
|
||||
- **SQL注入**: 使用ORM防止SQL注入
|
||||
- **XSS防护**: 输出内容转义处理
|
||||
|
||||
### 11.2 认证安全
|
||||
- **密码加密**: bcrypt加密存储密码
|
||||
- **Token安全**: JWT Token + 刷新机制
|
||||
- **会话管理**: 安全的会话管理
|
||||
|
||||
### 11.3 传输安全
|
||||
- **HTTPS**: 强制使用HTTPS传输
|
||||
- **CORS**: 配置跨域资源共享
|
||||
- **CSP**: 内容安全策略
|
||||
|
||||
## 12. 监控与运维
|
||||
|
||||
### 12.1 健康检查
|
||||
```typescript
|
||||
app.get('/health', (req, res) => {
|
||||
res.json({
|
||||
status: 'ok',
|
||||
timestamp: new Date().toISOString(),
|
||||
uptime: process.uptime(),
|
||||
memory: process.memoryUsage(),
|
||||
version: process.env.npm_package_version
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 12.2 性能监控
|
||||
- **响应时间**: 监控API响应时间
|
||||
- **错误率**: 监控错误发生率
|
||||
- **吞吐量**: 监控请求处理量
|
||||
- **资源使用**: 监控CPU、内存使用
|
||||
|
||||
### 12.3 告警机制
|
||||
- **阈值告警**: 基于指标阈值告警
|
||||
- **异常告警**: 异常情况实时告警
|
||||
- **趋势告警**: 基于趋势变化告警
|
||||
|
||||
## 13. 部署架构
|
||||
|
||||
### 13.1 容器化部署
|
||||
```dockerfile
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
### 13.2 Kubernetes部署
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: backend-service
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: backend-service
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: backend-service
|
||||
spec:
|
||||
containers:
|
||||
- name: backend
|
||||
image: backend-service:latest
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
env:
|
||||
- name: NODE_ENV
|
||||
value: "production"
|
||||
```
|
||||
|
||||
## 14. 扩展性设计
|
||||
|
||||
### 14.1 水平扩展
|
||||
- **无状态设计**: 服务无状态,便于扩展
|
||||
- **负载均衡**: 支持多实例负载均衡
|
||||
- **数据分片**: 支持数据库分片扩展
|
||||
|
||||
### 14.2 垂直扩展
|
||||
- **资源配置**: 支持动态调整资源配置
|
||||
- **性能调优**: 支持性能参数调优
|
||||
- **容量规划**: 基于业务增长规划容量
|
||||
727
docs/architecture/小程序架构文档.md
Normal file
727
docs/architecture/小程序架构文档.md
Normal file
@@ -0,0 +1,727 @@
|
||||
# 小程序架构文档
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 作者 | 变更说明 |
|
||||
|------|------|------|----------|
|
||||
| 1.0 | 2024-01-20 | 前端团队 | 初始版本 |
|
||||
|
||||
## 1. 小程序架构概述
|
||||
|
||||
### 1.1 项目背景
|
||||
本小程序是养殖管理平台的移动端应用,主要面向养殖户和经销商,提供养殖管理、交易管理、数据查看等核心功能。
|
||||
|
||||
### 1.2 架构目标
|
||||
- **用户体验**:流畅的交互体验和快速的页面响应
|
||||
- **性能优化**:小程序包体积控制和运行性能优化
|
||||
- **可维护性**:清晰的代码结构和组件化开发
|
||||
- **扩展性**:支持功能模块的快速扩展
|
||||
- **稳定性**:异常处理和容错机制完善
|
||||
|
||||
### 1.3 技术栈
|
||||
- **开发框架**:微信小程序原生开发
|
||||
- **开发语言**:TypeScript + JavaScript
|
||||
- **UI框架**:WeUI + 自定义组件
|
||||
- **状态管理**:MobX + 本地存储
|
||||
- **网络请求**:wx.request + 请求封装
|
||||
- **图表组件**:ECharts for 微信小程序
|
||||
- **地图服务**:腾讯地图 + 微信地图
|
||||
|
||||
## 2. 系统架构设计
|
||||
|
||||
### 2.1 整体架构
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 视图层 (View) │
|
||||
│ Pages + Components │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 逻辑层 (Logic) │
|
||||
│ Service + Store + Utils │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 数据层 (Data) │
|
||||
│ API + Storage + Cache │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 微信小程序框架 │
|
||||
│ WeChat Mini Program │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 目录结构
|
||||
```
|
||||
mini-program/
|
||||
├── pages/ # 页面目录
|
||||
│ ├── index/ # 首页
|
||||
│ ├── farm/ # 养殖管理
|
||||
│ ├── trade/ # 交易管理
|
||||
│ ├── profile/ # 个人中心
|
||||
│ └── ...
|
||||
├── components/ # 组件目录
|
||||
│ ├── common/ # 通用组件
|
||||
│ ├── business/ # 业务组件
|
||||
│ └── charts/ # 图表组件
|
||||
├── services/ # 服务层
|
||||
│ ├── api/ # API接口
|
||||
│ ├── auth/ # 认证服务
|
||||
│ └── storage/ # 存储服务
|
||||
├── stores/ # 状态管理
|
||||
│ ├── user.ts # 用户状态
|
||||
│ ├── farm.ts # 养殖状态
|
||||
│ └── trade.ts # 交易状态
|
||||
├── utils/ # 工具函数
|
||||
│ ├── request.ts # 网络请求
|
||||
│ ├── validator.ts # 数据验证
|
||||
│ └── formatter.ts # 数据格式化
|
||||
├── styles/ # 样式文件
|
||||
│ ├── common.wxss # 通用样式
|
||||
│ └── variables.wxss # 样式变量
|
||||
├── static/ # 静态资源
|
||||
│ ├── images/ # 图片资源
|
||||
│ └── icons/ # 图标资源
|
||||
├── app.ts # 应用入口
|
||||
├── app.json # 应用配置
|
||||
├── app.wxss # 全局样式
|
||||
└── project.config.json # 项目配置
|
||||
```
|
||||
|
||||
## 3. 核心模块设计
|
||||
|
||||
### 3.1 用户认证模块
|
||||
**功能**: 微信授权登录、用户信息管理、权限控制
|
||||
|
||||
**核心组件**:
|
||||
- **登录页面**: 微信授权登录界面
|
||||
- **用户信息**: 用户资料展示和编辑
|
||||
- **权限管理**: 基于角色的功能权限控制
|
||||
|
||||
**实现方案**:
|
||||
```typescript
|
||||
// 用户认证服务
|
||||
class AuthService {
|
||||
// 微信登录
|
||||
async wxLogin(): Promise<LoginResult> {
|
||||
const { code } = await wx.login();
|
||||
const { userInfo } = await wx.getUserProfile({
|
||||
desc: '用于完善用户资料'
|
||||
});
|
||||
|
||||
return this.apiLogin(code, userInfo);
|
||||
}
|
||||
|
||||
// API登录
|
||||
async apiLogin(code: string, userInfo: any): Promise<LoginResult> {
|
||||
const response = await request.post('/auth/wx-login', {
|
||||
code,
|
||||
userInfo
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
await this.setToken(response.data.token);
|
||||
await this.setUserInfo(response.data.user);
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 养殖管理模块
|
||||
**功能**: 养殖场管理、动物管理、数据统计
|
||||
|
||||
**核心页面**:
|
||||
- **养殖场列表**: 展示用户的养殖场信息
|
||||
- **养殖场详情**: 养殖场详细信息和管理功能
|
||||
- **动物管理**: 动物档案、健康记录、生长数据
|
||||
- **数据统计**: 养殖数据图表和分析报告
|
||||
|
||||
**状态管理**:
|
||||
```typescript
|
||||
// 养殖状态管理
|
||||
class FarmStore {
|
||||
@observable farms: Farm[] = [];
|
||||
@observable currentFarm: Farm | null = null;
|
||||
@observable animals: Animal[] = [];
|
||||
|
||||
@action
|
||||
async loadFarms() {
|
||||
const response = await farmService.getFarms();
|
||||
if (response.success) {
|
||||
this.farms = response.data;
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
async selectFarm(farmId: string) {
|
||||
const farm = this.farms.find(f => f.id === farmId);
|
||||
this.currentFarm = farm || null;
|
||||
|
||||
if (farm) {
|
||||
await this.loadAnimals(farmId);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 交易管理模块
|
||||
**功能**: 订单管理、支付管理、物流跟踪
|
||||
|
||||
**核心页面**:
|
||||
- **商品列表**: 展示可交易的商品信息
|
||||
- **订单管理**: 订单创建、查看、状态跟踪
|
||||
- **支付页面**: 微信支付集成
|
||||
- **物流跟踪**: 订单物流信息查看
|
||||
|
||||
**支付集成**:
|
||||
```typescript
|
||||
// 支付服务
|
||||
class PaymentService {
|
||||
async wxPay(orderId: string): Promise<PaymentResult> {
|
||||
// 1. 获取支付参数
|
||||
const payParams = await this.getPayParams(orderId);
|
||||
|
||||
// 2. 调起微信支付
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.requestPayment({
|
||||
...payParams,
|
||||
success: (res) => {
|
||||
resolve({ success: true, data: res });
|
||||
},
|
||||
fail: (err) => {
|
||||
reject({ success: false, error: err });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 数据可视化模块
|
||||
**功能**: 图表展示、数据分析、报表生成
|
||||
|
||||
**图表组件**:
|
||||
- **折线图**: 展示趋势数据
|
||||
- **柱状图**: 展示对比数据
|
||||
- **饼图**: 展示占比数据
|
||||
- **仪表盘**: 展示关键指标
|
||||
|
||||
**ECharts集成**:
|
||||
```typescript
|
||||
// 图表组件
|
||||
Component({
|
||||
properties: {
|
||||
chartData: Object,
|
||||
chartType: String
|
||||
},
|
||||
|
||||
data: {
|
||||
ec: null
|
||||
},
|
||||
|
||||
ready() {
|
||||
this.initChart();
|
||||
},
|
||||
|
||||
methods: {
|
||||
initChart() {
|
||||
this.createSelectorQuery()
|
||||
.select('#chart')
|
||||
.fields({ node: true, size: true })
|
||||
.exec((res) => {
|
||||
const canvas = res[0].node;
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
||||
canvas.width = res[0].width * dpr;
|
||||
canvas.height = res[0].height * dpr;
|
||||
ctx.scale(dpr, dpr);
|
||||
|
||||
echarts.setCanvasCreator(() => canvas);
|
||||
|
||||
const chart = echarts.init(canvas, null, {
|
||||
width: res[0].width,
|
||||
height: res[0].height,
|
||||
devicePixelRatio: dpr
|
||||
});
|
||||
|
||||
chart.setOption(this.getChartOption());
|
||||
this.setData({ ec: { chart } });
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 4. 网络层设计
|
||||
|
||||
### 4.1 请求封装
|
||||
```typescript
|
||||
// 网络请求封装
|
||||
class RequestService {
|
||||
private baseURL = 'https://api.example.com';
|
||||
private timeout = 10000;
|
||||
|
||||
async request(options: RequestOptions): Promise<ApiResponse> {
|
||||
const token = await storage.getToken();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.request({
|
||||
url: `${this.baseURL}${options.url}`,
|
||||
method: options.method || 'GET',
|
||||
data: options.data,
|
||||
header: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': token ? `Bearer ${token}` : '',
|
||||
...options.header
|
||||
},
|
||||
timeout: this.timeout,
|
||||
success: (res) => {
|
||||
if (res.statusCode === 200) {
|
||||
resolve(res.data);
|
||||
} else {
|
||||
this.handleError(res);
|
||||
reject(res);
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
this.handleError(err);
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private handleError(error: any) {
|
||||
console.error('Request error:', error);
|
||||
|
||||
// 统一错误处理
|
||||
if (error.statusCode === 401) {
|
||||
// Token过期,跳转登录
|
||||
this.redirectToLogin();
|
||||
} else if (error.statusCode >= 500) {
|
||||
// 服务器错误
|
||||
wx.showToast({
|
||||
title: '服务器错误,请稍后重试',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 API接口管理
|
||||
```typescript
|
||||
// API接口定义
|
||||
class ApiService {
|
||||
// 用户相关接口
|
||||
user = {
|
||||
login: (data: LoginData) => request.post('/auth/login', data),
|
||||
profile: () => request.get('/user/profile'),
|
||||
updateProfile: (data: UserProfile) => request.put('/user/profile', data)
|
||||
};
|
||||
|
||||
// 养殖相关接口
|
||||
farm = {
|
||||
list: (params: FarmListParams) => request.get('/farms', params),
|
||||
detail: (id: string) => request.get(`/farms/${id}`),
|
||||
create: (data: FarmData) => request.post('/farms', data),
|
||||
update: (id: string, data: FarmData) => request.put(`/farms/${id}`, data)
|
||||
};
|
||||
|
||||
// 交易相关接口
|
||||
trade = {
|
||||
orders: (params: OrderListParams) => request.get('/orders', params),
|
||||
createOrder: (data: OrderData) => request.post('/orders', data),
|
||||
payOrder: (orderId: string) => request.post(`/orders/${orderId}/pay`)
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 数据存储设计
|
||||
|
||||
### 5.1 本地存储策略
|
||||
```typescript
|
||||
// 存储服务
|
||||
class StorageService {
|
||||
// 同步存储
|
||||
setSync(key: string, value: any): void {
|
||||
try {
|
||||
wx.setStorageSync(key, JSON.stringify(value));
|
||||
} catch (error) {
|
||||
console.error('Storage set error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
getSync(key: string): any {
|
||||
try {
|
||||
const value = wx.getStorageSync(key);
|
||||
return value ? JSON.parse(value) : null;
|
||||
} catch (error) {
|
||||
console.error('Storage get error:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 异步存储
|
||||
async set(key: string, value: any): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.setStorage({
|
||||
key,
|
||||
data: JSON.stringify(value),
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async get(key: string): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.getStorage({
|
||||
key,
|
||||
success: (res) => {
|
||||
try {
|
||||
resolve(JSON.parse(res.data));
|
||||
} catch (error) {
|
||||
resolve(res.data);
|
||||
}
|
||||
},
|
||||
fail: () => resolve(null)
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 缓存管理
|
||||
```typescript
|
||||
// 缓存管理
|
||||
class CacheService {
|
||||
private cache = new Map<string, CacheItem>();
|
||||
private defaultTTL = 5 * 60 * 1000; // 5分钟
|
||||
|
||||
set(key: string, value: any, ttl?: number): void {
|
||||
const expireTime = Date.now() + (ttl || this.defaultTTL);
|
||||
this.cache.set(key, {
|
||||
value,
|
||||
expireTime
|
||||
});
|
||||
}
|
||||
|
||||
get(key: string): any {
|
||||
const item = this.cache.get(key);
|
||||
if (!item) return null;
|
||||
|
||||
if (Date.now() > item.expireTime) {
|
||||
this.cache.delete(key);
|
||||
return null;
|
||||
}
|
||||
|
||||
return item.value;
|
||||
}
|
||||
|
||||
clear(): void {
|
||||
this.cache.clear();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 组件化设计
|
||||
|
||||
### 6.1 通用组件
|
||||
```typescript
|
||||
// 列表组件
|
||||
Component({
|
||||
properties: {
|
||||
items: Array,
|
||||
loading: Boolean,
|
||||
hasMore: Boolean
|
||||
},
|
||||
|
||||
data: {
|
||||
refreshing: false
|
||||
},
|
||||
|
||||
methods: {
|
||||
onRefresh() {
|
||||
this.setData({ refreshing: true });
|
||||
this.triggerEvent('refresh');
|
||||
},
|
||||
|
||||
onLoadMore() {
|
||||
if (!this.data.loading && this.data.hasMore) {
|
||||
this.triggerEvent('loadmore');
|
||||
}
|
||||
},
|
||||
|
||||
onItemTap(e: any) {
|
||||
const { item, index } = e.currentTarget.dataset;
|
||||
this.triggerEvent('itemtap', { item, index });
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 6.2 业务组件
|
||||
```typescript
|
||||
// 养殖场卡片组件
|
||||
Component({
|
||||
properties: {
|
||||
farm: Object
|
||||
},
|
||||
|
||||
methods: {
|
||||
onTap() {
|
||||
const { farm } = this.properties;
|
||||
wx.navigateTo({
|
||||
url: `/pages/farm/detail?id=${farm.id}`
|
||||
});
|
||||
},
|
||||
|
||||
onEdit() {
|
||||
const { farm } = this.properties;
|
||||
this.triggerEvent('edit', { farm });
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 7. 性能优化
|
||||
|
||||
### 7.1 包体积优化
|
||||
- **代码分包**: 使用小程序分包加载
|
||||
- **图片优化**: 使用WebP格式,压缩图片大小
|
||||
- **代码压缩**: 启用代码压缩和混淆
|
||||
- **按需加载**: 组件和页面按需加载
|
||||
|
||||
### 7.2 运行时优化
|
||||
- **数据预加载**: 关键数据提前加载
|
||||
- **图片懒加载**: 长列表图片懒加载
|
||||
- **防抖节流**: 频繁操作防抖节流处理
|
||||
- **内存管理**: 及时清理不用的数据和监听器
|
||||
|
||||
### 7.3 渲染优化
|
||||
```typescript
|
||||
// 长列表优化
|
||||
Component({
|
||||
data: {
|
||||
visibleItems: [],
|
||||
scrollTop: 0
|
||||
},
|
||||
|
||||
methods: {
|
||||
onScroll(e: any) {
|
||||
const { scrollTop } = e.detail;
|
||||
this.updateVisibleItems(scrollTop);
|
||||
},
|
||||
|
||||
updateVisibleItems(scrollTop: number) {
|
||||
const itemHeight = 100;
|
||||
const containerHeight = 600;
|
||||
const startIndex = Math.floor(scrollTop / itemHeight);
|
||||
const endIndex = startIndex + Math.ceil(containerHeight / itemHeight) + 1;
|
||||
|
||||
const visibleItems = this.data.allItems.slice(startIndex, endIndex);
|
||||
this.setData({ visibleItems });
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 8. 错误处理
|
||||
|
||||
### 8.1 全局错误处理
|
||||
```typescript
|
||||
// 应用级错误处理
|
||||
App({
|
||||
onError(error: string) {
|
||||
console.error('App Error:', error);
|
||||
|
||||
// 错误上报
|
||||
this.reportError(error);
|
||||
|
||||
// 用户提示
|
||||
wx.showToast({
|
||||
title: '程序出现异常',
|
||||
icon: 'none'
|
||||
});
|
||||
},
|
||||
|
||||
onUnhandledRejection(res: any) {
|
||||
console.error('Unhandled Promise Rejection:', res);
|
||||
this.reportError(res.reason);
|
||||
},
|
||||
|
||||
reportError(error: any) {
|
||||
// 上报错误到服务器
|
||||
wx.request({
|
||||
url: 'https://api.example.com/errors',
|
||||
method: 'POST',
|
||||
data: {
|
||||
error: error.toString(),
|
||||
stack: error.stack,
|
||||
timestamp: Date.now(),
|
||||
userAgent: wx.getSystemInfoSync()
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 8.2 页面级错误处理
|
||||
```typescript
|
||||
// 页面错误处理
|
||||
Page({
|
||||
data: {
|
||||
error: null,
|
||||
loading: false
|
||||
},
|
||||
|
||||
async onLoad() {
|
||||
try {
|
||||
this.setData({ loading: true });
|
||||
await this.loadData();
|
||||
} catch (error) {
|
||||
this.handleError(error);
|
||||
} finally {
|
||||
this.setData({ loading: false });
|
||||
}
|
||||
},
|
||||
|
||||
handleError(error: any) {
|
||||
console.error('Page Error:', error);
|
||||
|
||||
this.setData({
|
||||
error: {
|
||||
message: error.message || '加载失败',
|
||||
code: error.code
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onRetry() {
|
||||
this.setData({ error: null });
|
||||
this.onLoad();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 9. 安全设计
|
||||
|
||||
### 9.1 数据安全
|
||||
- **敏感数据加密**: 本地存储敏感数据加密
|
||||
- **传输安全**: HTTPS传输,防止中间人攻击
|
||||
- **输入验证**: 严格验证用户输入数据
|
||||
|
||||
### 9.2 权限控制
|
||||
```typescript
|
||||
// 权限检查
|
||||
class PermissionService {
|
||||
async checkPermission(permission: string): Promise<boolean> {
|
||||
const userInfo = await storage.get('userInfo');
|
||||
if (!userInfo || !userInfo.permissions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return userInfo.permissions.includes(permission);
|
||||
}
|
||||
|
||||
async requirePermission(permission: string): Promise<void> {
|
||||
const hasPermission = await this.checkPermission(permission);
|
||||
if (!hasPermission) {
|
||||
throw new Error('权限不足');
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 10. 测试策略
|
||||
|
||||
### 10.1 单元测试
|
||||
```typescript
|
||||
// 工具函数测试
|
||||
describe('Validator', () => {
|
||||
test('should validate phone number', () => {
|
||||
expect(validator.isPhone('13800138000')).toBe(true);
|
||||
expect(validator.isPhone('1380013800')).toBe(false);
|
||||
});
|
||||
|
||||
test('should validate email', () => {
|
||||
expect(validator.isEmail('test@example.com')).toBe(true);
|
||||
expect(validator.isEmail('invalid-email')).toBe(false);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 10.2 集成测试
|
||||
- **API测试**: 测试与后端API的集成
|
||||
- **支付测试**: 测试微信支付流程
|
||||
- **授权测试**: 测试微信授权登录
|
||||
|
||||
### 10.3 用户体验测试
|
||||
- **真机测试**: 在不同设备上测试
|
||||
- **网络测试**: 测试不同网络环境下的表现
|
||||
- **性能测试**: 测试页面加载和响应性能
|
||||
|
||||
## 11. 发布与运维
|
||||
|
||||
### 11.1 版本管理
|
||||
- **版本号规范**: 遵循语义化版本号
|
||||
- **发布流程**: 开发 → 测试 → 预发布 → 正式发布
|
||||
- **回滚机制**: 支持快速回滚到上一版本
|
||||
|
||||
### 11.2 监控告警
|
||||
- **性能监控**: 监控页面加载时间和API响应时间
|
||||
- **错误监控**: 监控JavaScript错误和API错误
|
||||
- **用户行为**: 统计用户使用行为和路径
|
||||
|
||||
### 11.3 数据统计
|
||||
```typescript
|
||||
// 埋点统计
|
||||
class AnalyticsService {
|
||||
track(event: string, properties?: any) {
|
||||
const data = {
|
||||
event,
|
||||
properties: {
|
||||
...properties,
|
||||
timestamp: Date.now(),
|
||||
page: getCurrentPages().pop()?.route
|
||||
}
|
||||
};
|
||||
|
||||
// 发送统计数据
|
||||
wx.request({
|
||||
url: 'https://analytics.example.com/track',
|
||||
method: 'POST',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
trackPageView(page: string) {
|
||||
this.track('page_view', { page });
|
||||
}
|
||||
|
||||
trackUserAction(action: string, target?: string) {
|
||||
this.track('user_action', { action, target });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 12. 扩展性设计
|
||||
|
||||
### 12.1 插件化架构
|
||||
- **功能模块**: 支持功能模块的插拔
|
||||
- **主题系统**: 支持多主题切换
|
||||
- **配置化**: 支持功能开关配置
|
||||
|
||||
### 12.2 多端适配
|
||||
- **响应式设计**: 适配不同屏幕尺寸
|
||||
- **平台兼容**: 兼容不同版本的微信客户端
|
||||
- **设备适配**: 适配不同性能的设备
|
||||
|
||||
## 13. 未来规划
|
||||
|
||||
### 13.1 技术升级
|
||||
- **框架升级**: 考虑使用Taro等跨端框架
|
||||
- **TypeScript**: 全面使用TypeScript开发
|
||||
- **组件库**: 构建统一的组件库
|
||||
|
||||
### 13.2 功能扩展
|
||||
- **离线功能**: 支持离线数据查看
|
||||
- **实时通信**: 集成WebSocket实时通信
|
||||
- **AI功能**: 集成AI智能分析功能
|
||||
259
docs/architecture/整个项目的架构文档.md
Normal file
259
docs/architecture/整个项目的架构文档.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# 整个项目的架构文档
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 作者 | 变更说明 |
|
||||
|------|------|------|----------|
|
||||
| 1.0 | 2024-01-20 | 产品团队 | 初始版本 |
|
||||
| 1.1 | 2024-09-21 | 产品团队 | 更新项目结构,与实际代码结构保持一致 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
本项目是一个综合性的养殖管理平台,旨在为养殖户、经销商和管理员提供全方位的数字化解决方案。
|
||||
|
||||
### 1.2 架构目标
|
||||
- **高可用性**:系统可用性达到99.9%以上
|
||||
- **高性能**:支持并发用户数10,000+
|
||||
- **可扩展性**:支持水平扩展和垂直扩展
|
||||
- **安全性**:符合数据安全和隐私保护要求
|
||||
- **易维护性**:模块化设计,便于开发和维护
|
||||
|
||||
## 2. 系统架构概览
|
||||
|
||||
### 2.1 整体架构
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 用户层 │
|
||||
├─────────────────┬─────────────────┬─────────────────────────┤
|
||||
│ 小程序端 │ 管理后台 │ 官网 │
|
||||
│ (mini-program) │ (admin-system) │ (website) │
|
||||
└─────────────────┴─────────────────┴─────────────────────────┘
|
||||
│
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 网关层 │
|
||||
│ API Gateway │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 业务服务层 │
|
||||
├─────────────┬─────────────┬─────────────┬─────────────────┤
|
||||
│ 用户服务 │ 养殖服务 │ 交易服务 │ 其他服务 │
|
||||
│ UserService │ FarmService │TradeService │ ...Service │
|
||||
└─────────────┴─────────────┴─────────────┴─────────────────┘
|
||||
│
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 数据层 │
|
||||
├─────────────┬─────────────┬─────────────┬─────────────────┤
|
||||
│ MySQL │ Redis │ MongoDB │ 文件存储 │
|
||||
│ (主数据库) │ (缓存) │ (日志数据) │ (OSS) │
|
||||
└─────────────┴─────────────┴─────────────┴─────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 技术架构
|
||||
- **前端技术栈**:Vue.js 3.x + Element Plus + Vite
|
||||
- **小程序技术栈**:微信小程序原生开发 + 支付宝小程序
|
||||
- **后端技术栈**:Node.js + Express + MySQL
|
||||
- **数据库**:MySQL 8.0 + Redis (缓存)
|
||||
- **部署架构**:Docker + Nginx + 云服务器
|
||||
|
||||
### 2.3 实际项目结构
|
||||
```
|
||||
xlxumu/
|
||||
├── README.md # 项目入口文档
|
||||
├── docs/ # 文档目录
|
||||
│ ├── requirements/ # 需求文档
|
||||
│ ├── architecture/ # 架构文档
|
||||
│ ├── design/ # 详细设计文档
|
||||
│ ├── development/ # 开发文档
|
||||
│ └── operations/ # 运维文档
|
||||
├── admin-system/ # 管理后台系统
|
||||
│ ├── dashboard/ # 数据看板
|
||||
│ ├── farming-management/ # 养殖管理
|
||||
│ ├── cattle-trading/ # 牲畜交易
|
||||
│ ├── bank-supervision/ # 银行监管
|
||||
│ ├── insurance-supervision/ # 保险监管
|
||||
│ ├── government-platform/ # 政府平台
|
||||
│ └── mall-management/ # 商城管理
|
||||
├── mini_program/ # 小程序应用
|
||||
│ ├── farming-manager/ # 养殖管理小程序
|
||||
│ ├── cattle-trading/ # 交易平台小程序
|
||||
│ ├── beef-mall/ # 牛肉商城小程序
|
||||
│ ├── bank-supervision/ # 银行监管小程序
|
||||
│ └── insurance-supervision/ # 保险监管小程序
|
||||
├── backend/ # 后端服务
|
||||
│ ├── api/ # API服务
|
||||
│ ├── database/ # 数据库管理
|
||||
│ ├── services/ # 业务服务
|
||||
│ └── utils/ # 工具类
|
||||
├── website/ # 官方网站
|
||||
├── scripts/ # 脚本工具
|
||||
└── deployment/ # 部署配置
|
||||
```
|
||||
|
||||
## 3. 系统分层架构
|
||||
|
||||
### 3.1 表现层 (Presentation Layer)
|
||||
- **小程序端**:面向养殖户和经销商的移动端应用
|
||||
- **管理后台**:面向管理员的Web管理界面
|
||||
- **官网**:面向公众的企业官方网站
|
||||
|
||||
### 3.2 业务逻辑层 (Business Logic Layer)
|
||||
- **用户管理服务**:用户注册、登录、权限管理
|
||||
- **养殖管理服务**:养殖场管理、动物管理、饲料管理
|
||||
- **交易管理服务**:订单管理、支付管理、物流管理
|
||||
- **数据分析服务**:报表生成、数据统计、趋势分析
|
||||
|
||||
### 3.3 数据访问层 (Data Access Layer)
|
||||
- **ORM框架**:Sequelize (MySQL) + Mongoose (MongoDB)
|
||||
- **缓存层**:Redis 缓存策略
|
||||
- **文件存储**:阿里云OSS对象存储
|
||||
|
||||
### 3.4 基础设施层 (Infrastructure Layer)
|
||||
- **容器化**:Docker容器部署
|
||||
- **编排**:Kubernetes集群管理
|
||||
- **监控**:Prometheus + Grafana
|
||||
- **日志**:ELK Stack (Elasticsearch + Logstash + Kibana)
|
||||
|
||||
## 4. 核心组件设计
|
||||
|
||||
### 4.1 API网关
|
||||
- **功能**:路由转发、负载均衡、限流、认证
|
||||
- **技术选型**:Nginx + Kong
|
||||
- **特性**:
|
||||
- 统一入口管理
|
||||
- JWT Token验证
|
||||
- API版本控制
|
||||
- 请求限流和熔断
|
||||
|
||||
### 4.2 微服务架构
|
||||
- **服务拆分原则**:按业务领域拆分
|
||||
- **服务通信**:RESTful API + 消息队列
|
||||
- **服务发现**:Consul
|
||||
- **配置管理**:Apollo配置中心
|
||||
|
||||
### 4.3 数据库设计
|
||||
- **主数据库**:MySQL 8.0 (用户数据、业务数据)
|
||||
- **缓存数据库**:Redis 6.x (会话、热点数据)
|
||||
- **文档数据库**:MongoDB 4.x (日志、统计数据)
|
||||
- **数据同步**:Canal + Kafka
|
||||
|
||||
## 5. 安全架构
|
||||
|
||||
### 5.1 认证与授权
|
||||
- **认证方式**:JWT Token + 微信授权
|
||||
- **权限模型**:RBAC (基于角色的访问控制)
|
||||
- **会话管理**:Redis存储会话信息
|
||||
|
||||
### 5.2 数据安全
|
||||
- **数据加密**:敏感数据AES加密存储
|
||||
- **传输安全**:HTTPS + SSL证书
|
||||
- **数据备份**:定时备份 + 异地容灾
|
||||
|
||||
### 5.3 接口安全
|
||||
- **参数验证**:输入参数严格校验
|
||||
- **SQL注入防护**:ORM框架 + 参数化查询
|
||||
- **XSS防护**:输出内容转义处理
|
||||
|
||||
## 6. 性能架构
|
||||
|
||||
### 6.1 缓存策略
|
||||
- **多级缓存**:浏览器缓存 + CDN缓存 + Redis缓存
|
||||
- **缓存更新**:主动更新 + 过期策略
|
||||
- **缓存穿透**:布隆过滤器防护
|
||||
|
||||
### 6.2 数据库优化
|
||||
- **读写分离**:主从复制架构
|
||||
- **分库分表**:按业务和数据量分片
|
||||
- **索引优化**:合理创建索引提升查询性能
|
||||
|
||||
### 6.3 负载均衡
|
||||
- **前端负载均衡**:Nginx反向代理
|
||||
- **服务负载均衡**:Kubernetes Service
|
||||
- **数据库负载均衡**:MySQL Proxy
|
||||
|
||||
## 7. 部署架构
|
||||
|
||||
### 7.1 环境规划
|
||||
- **开发环境**:本地Docker开发
|
||||
- **测试环境**:Kubernetes测试集群
|
||||
- **生产环境**:Kubernetes生产集群
|
||||
|
||||
### 7.2 容器化部署
|
||||
- **镜像管理**:Harbor私有镜像仓库
|
||||
- **容器编排**:Kubernetes + Helm
|
||||
- **服务网格**:Istio (可选)
|
||||
|
||||
### 7.3 CI/CD流程
|
||||
- **代码管理**:Git + GitLab
|
||||
- **持续集成**:GitLab CI/CD
|
||||
- **自动部署**:Kubernetes Rolling Update
|
||||
|
||||
## 8. 监控与运维
|
||||
|
||||
### 8.1 系统监控
|
||||
- **基础监控**:Prometheus + Grafana
|
||||
- **应用监控**:APM工具 (如:SkyWalking)
|
||||
- **日志监控**:ELK Stack
|
||||
|
||||
### 8.2 告警机制
|
||||
- **告警规则**:基于阈值和趋势的告警
|
||||
- **告警通道**:邮件 + 短信 + 钉钉
|
||||
- **告警处理**:自动恢复 + 人工介入
|
||||
|
||||
### 8.3 运维自动化
|
||||
- **自动扩缩容**:HPA (Horizontal Pod Autoscaler)
|
||||
- **故障自愈**:健康检查 + 自动重启
|
||||
- **备份恢复**:定时备份 + 一键恢复
|
||||
|
||||
## 9. 技术选型说明
|
||||
|
||||
### 9.1 前端技术选型
|
||||
- **Vue.js 3.x**:组件化开发,生态完善
|
||||
- **Element Plus**:成熟的UI组件库
|
||||
- **TypeScript**:类型安全,提升开发效率
|
||||
|
||||
### 9.2 后端技术选型
|
||||
- **Node.js**:高并发处理能力,JavaScript全栈
|
||||
- **Express**:轻量级Web框架
|
||||
- **TypeScript**:类型安全,便于维护
|
||||
|
||||
### 9.3 数据库选型
|
||||
- **MySQL**:成熟稳定,ACID特性
|
||||
- **Redis**:高性能缓存,丰富数据结构
|
||||
- **MongoDB**:文档存储,适合日志数据
|
||||
|
||||
## 10. 扩展性设计
|
||||
|
||||
### 10.1 水平扩展
|
||||
- **无状态服务**:服务设计为无状态,便于扩展
|
||||
- **数据分片**:支持数据库水平分片
|
||||
- **缓存集群**:Redis集群模式
|
||||
|
||||
### 10.2 垂直扩展
|
||||
- **资源配置**:支持CPU、内存动态调整
|
||||
- **存储扩展**:支持存储容量在线扩展
|
||||
- **网络优化**:支持带宽升级
|
||||
|
||||
## 11. 风险评估
|
||||
|
||||
### 11.1 技术风险
|
||||
- **单点故障**:通过集群部署和冗余设计规避
|
||||
- **性能瓶颈**:通过压力测试和性能优化预防
|
||||
- **数据丢失**:通过备份策略和容灾方案保障
|
||||
|
||||
### 11.2 业务风险
|
||||
- **并发冲突**:通过分布式锁和事务控制
|
||||
- **数据一致性**:通过分布式事务和最终一致性
|
||||
- **安全漏洞**:通过安全审计和渗透测试
|
||||
|
||||
## 12. 未来规划
|
||||
|
||||
### 12.1 技术演进
|
||||
- **微服务治理**:引入Service Mesh
|
||||
- **云原生**:全面拥抱云原生技术
|
||||
- **AI集成**:集成机器学习和人工智能
|
||||
|
||||
### 12.2 业务扩展
|
||||
- **多租户**:支持多租户SaaS模式
|
||||
- **国际化**:支持多语言和多地区
|
||||
- **生态集成**:与第三方系统深度集成
|
||||
1599
docs/architecture/管理后台架构文档.md
Normal file
1599
docs/architecture/管理后台架构文档.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user