Files
smart_grid_iot/.trae/documents/technical-architecture.md
T
andyesfly 3d7eb12103 feat: 初始化智能物联网设备管理系统前后端基础项目
完成项目整体结构搭建,包含:
1. 前端Vue3+TS+Vite+Antd项目基础配置与核心依赖
2. 后端MidwayJS+TypeORM+JWT权限认证框架
3. 完整的用户、角色、权限、日志数据库表结构
4. 核心业务模块API与基础服务实现
5. 全局样式、路由、状态管理配置
2026-05-28 16:23:15 +08:00

732 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智能物联网设备后台管理系统 - 技术架构文档
## 1. 架构设计
```mermaid
flowchart TB
subgraph Frontend [前端层 - Vue3]
A[Vue 3 + TypeScript]
B[Ant Design Vue]
C[Vuex/Pinia 状态管理]
D[Vue Router 路由]
E[Axios HTTP客户端]
end
subgraph Backend [后端层 - Midway.js]
F[Midway Controller]
G[Midway Service]
H[Middleware 中间件]
I[JWT 认证]
J[RBAC 权限控制]
end
subgraph Data [数据层]
K[(MySQL 数据库)]
L[Redis 缓存]
M[Sequelize ORM]
end
Frontend -->|HTTP/REST API| Backend
Backend -->|SQL/ORM| Data
K <--> L
```
## 2. 技术选型说明
### 前端技术栈
- **框架**:Vue 3 (Composition API) + TypeScript 5.x
- **UI组件库**:Ant Design Vue 4.x
- **构建工具**:Vite 5.x
- **状态管理**:Pinia (Vue官方推荐)
- **路由**:Vue Router 4.x
- **HTTP客户端**:Axios + 请求拦截器
- **图表库**:ECharts 5.x (用于仪表盘)
- **代码规范**:ESLint + Prettier
### 后端技术栈
- **框架**:Midway.js 3.x (基于Koa的企业级Node.js框架)
- **语言**:TypeScript
- **ORM**:Sequelize 6.x (MySQL)
- **认证**:jsonwebtoken (JWT)
- **加密**:bcryptjs (密码哈希)
- **验证**:class-validator + class-transformer
- **日志**:midway-logger
- **缓存**:ioredis (Redis)
### 数据存储
- **主数据库**:MySQL 8.0+
- **缓存数据库**:Redis 6.x
- **文件存储**:本地文件系统 / OSS(可选扩展)
### 开发工具
- **包管理器**:Yarn (遵循项目规则)
- **版本控制**:Git
- **代码规范**:Husky + lint-staged (Git钩子)
## 3. 项目目录结构
```
smart-grid-iot-admin/
├── client/ # 前端项目
│ ├── public/
│ │ └── favicon.ico
│ ├── src/
│ │ ├── api/ # API接口定义
│ │ │ ├── user.ts # 用户相关接口
│ │ │ ├── role.ts # 角色权限接口
│ │ │ └── system.ts # 系统设置接口
│ │ ├── assets/ # 静态资源
│ │ │ ├── images/
│ │ │ └── styles/
│ │ │ └── variables.less # 全局样式变量
│ │ ├── components/ # 公共组件
│ │ │ └── common/
│ │ ├── layouts/ # 布局组件
│ │ │ └── AdminLayout.vue # 后台主布局
│ │ ├── router/ # 路由配置
│ │ │ └── index.ts
│ │ ├── stores/ # Pinia状态管理
│ │ │ ├── user.ts # 用户状态
│ │ │ └── permission.ts # 权限状态
│ │ ├── utils/ # 工具函数
│ │ │ ├── request.ts # Axios封装
│ │ │ └── auth.ts # Token管理
│ │ ├── views/ # 页面视图
│ │ │ ├── login/ # 登录页
│ │ │ ├── dashboard/ # 仪表盘
│ │ │ ├── system/ # 系统管理
│ │ │ │ ├── user/ # 用户管理
│ │ │ │ └── role/ # 角色权限
│ │ │ └── settings/ # 系统设置
│ │ ├── App.vue
│ │ └── main.ts
│ ├── .env.development
│ ├── .env.production
│ ├── index.html
│ ├── package.json
│ ├── tsconfig.json
│ └── vite.config.ts
│
├── server/ # 后端项目
│ ├── src/
│ │ ├── config/ # 配置文件
│ │ │ ├── config.default.ts # 默认配置
│ │ │ └── config.prod.ts # 生产环境配置
│ │ ├── controller/ # 控制器层
│ │ │ ├── home.controller.ts
│ │ │ ├── user.controller.ts
│ │ │ ├── role.controller.ts
│ │ │ └── system.controller.ts
│ │ ├── service/ # 服务层
│ │ │ ├── user.service.ts
│ │ │ ├── role.service.ts
│ │ │ ├── auth.service.ts
│ │ │ └── system.service.ts
│ │ ├── middleware/ # 中间件
│ │ │ ├── auth.middleware.ts # JWT认证中间件
│ │ │ └── rbac.middleware.ts # RBAC权限中间件
│ │ ├── entity/ # 数据模型
│ │ │ ├── user.entity.ts
│ │ │ ├── role.entity.ts
│ │ │ ├── permission.entity.ts
│ │ │ └── log.entity.ts
│ │ ├── dto/ # 数据传输对象
│ │ │ ├── user.dto.ts
│ │ │ └── role.dto.ts
│ │ ├── interface/ # 类型定义
│ │ │ └── index.ts
│ │ ├── util/ # 工具函数
│ │ │ ├── crypto.ts
│ │ │ └── token.ts
│ │ └── configuration.ts # Midway入口
│ ├── package.json
│ ├── tsconfig.json
│ └── midway.bootstrap.ts
│
├── .gitignore
├── README.md
└── package.json # 根package.json (workspace)
```
## 4. 路由定义
### 前端路由
| 路径 | 组件 | 权限要求 | 说明 |
|------|------|----------|------|
| /login | views/login/index.vue | 无需认证 | 登录页 |
| / | layouts/AdminLayout.vue | 需认证 | 主布局 |
| /dashboard | views/dashboard/index.vue | 需认证 | 仪表盘 |
| /system/user | views/system/user/index.vue | user:list | 用户列表 |
| /system/user/:id | views/system/user/detail.vue | user:detail | 用户详情 |
| /system/role | views/system/role/index.vue | role:list | 角色列表 |
| /settings/basic | views/settings/basic.vue | system:settings | 基本设置 |
| /settings/security | views/settings/security.vue | system:security | 安全设置 |
| /log/operation | views/log/operation.vue | log:operation | 操作日志 |
### 后端API路由
| 方法 | 路径 | 控制器 | 说明 |
|------|------|--------|------|
| POST | /api/auth/login | AuthController | 用户登录 |
| POST | /api/auth/logout | AuthController | 用户登出 |
| GET | /api/user/list | UserController | 获取用户列表 |
| POST | /api/user/create | UserController | 创建用户 |
| PUT | /api/user/update/:id | UserController | 更新用户 |
| DELETE | /api/user/delete/:id | UserController | 删除用户 |
| GET | /api/role/list | RoleController | 获取角色列表 |
| GET | /api/role/:id/permissions | RoleController | 获取角色权限 |
| PUT | /api/role/:id/permissions | RoleController | 更新角色权限 |
| GET | /api/settings | SystemController | 获取系统设置 |
| PUT | /api/settings | SystemController | 更新系统设置 |
| GET | /api/dashboard/stats | HomeController | 仪表盘统计数据 |
| GET | /api/log/list | LogController | 获取操作日志 |
## 5. API接口定义
### 5.1 认证相关接口
#### POST /api/auth/login - 用户登录
**请求体**:
```typescript
interface LoginDTO {
username: string; // 用户名 (必填, 3-20字符)
password: string; // 密码 (必填, 6-20字符)
captcha?: string; // 验证码 (可选)
rememberMe?: boolean; // 记住我 (可选)
}
```
**响应**:
```typescript
interface LoginResponse {
code: number; // 状态码 200
message: string; // 提示信息
data: {
accessToken: string; // JWT Token
refreshToken?: string;
userInfo: {
id: number;
username: string;
nickname: string;
avatar?: string;
roles: string[]; // 角色标识数组
permissions: string[]; // 权限标识数组
};
};
}
```
#### POST /api/auth/logout - 用户登出
**响应**:
```typescript
interface LogoutResponse {
code: number;
message: string;
}
```
### 5.2 用户管理接口
#### GET /api/user/list - 获取用户列表
**查询参数**:
```typescript
interface UserQuery {
page: number; // 页码 (默认1)
pageSize: number; // 每页条数 (默认10)
keyword?: string; // 搜索关键词(用户名/昵称/手机号)
status?: number; // 状态 (0-禁用 1-启用)
roleId?: number; // 角色ID筛选
}
```
**响应**:
```typescript
interface UserListResponse {
code: number;
data: {
list: UserInfo[];
total: number;
page: number;
pageSize: number;
};
}
interface UserInfo {
id: number;
username: string;
nickname: string;
email?: string;
phone?: string;
avatar?: string;
status: number; // 0-禁用 1-启用
roles: RoleInfo[];
createdAt: Date;
updatedAt: Date;
}
```
#### POST /api/user/create - 创建用户
**请求体**:
```typescript
interface CreateUserDTO {
username: string; // 必填, 3-20字符
password: string; // 必填, 6-20字符
nickname: string; // 必填, 2-20字符
email?: string;
phone?: string;
roleIds: number[]; // 角色ID数组
status?: number; // 默认1-启用
}
```
#### PUT /api/user/update/:id - 更新用户
**请求体**:
```typescript
interface UpdateUserDTO {
nickname?: string;
email?: string;
phone?: string;
avatar?: string;
roleIds?: number[];
status?: number;
password?: string; // 可选,如需修改密码
}
```
#### DELETE /api/user/delete/:id - 删除用户
**响应**:
```typescript
interface DeleteResponse {
code: number;
message: string;
}
```
### 5.3 角色权限接口
#### GET /api/role/list - 获取角色列表
**响应**:
```typescript
interface RoleListResponse {
code: number;
data: RoleInfo[];
}
interface RoleInfo {
id: number;
name: string; // 角色名称
code: string; // 角色标识
description?: string;
permissions: PermissionTree[];
userCount: number; // 关联用户数
createdAt: Date;
}
```
#### GET /api/role/:id/permissions - 获取角色权限树
**响应**:
```typescript
interface PermissionTreeResponse {
code: number;
data: PermissionTree[];
}
interface PermissionTree {
id: number;
name: string; // 权限名称
code: string; // 权限标识
type: 'menu' | 'button' | 'api';
parentId?: number;
children?: PermissionTree[];
checked?: boolean; // 是否已选中
}
```
#### PUT /api/role/:id/permissions - 更新角色权限
**请求体**:
```typescript
interface UpdatePermissionDTO {
permissionIds: number[]; // 选中的权限ID数组
}
```
### 5.4 系统设置接口
#### GET /api/settings - 获取系统设置
**响应**:
```typescript
interface SettingsResponse {
code: number;
data: SystemSettings;
}
interface SystemSettings {
basic: {
siteName: string; // 站点名称
logo?: string; // Logo URL
sessionTimeout: number; // 会话超时(分钟)
};
security: {
passwordMinLength: number; // 密码最小长度
maxLoginAttempts: number; // 最大登录尝试次数
lockoutDuration: number; // 锁定时长(分钟)
ipWhitelist: string[]; // IP白名单
};
notification: {
enableEmail: boolean;
emailSmtpConfig?: object;
};
}
```
#### PUT /api/settings - 更新系统设置
**请求体**: 同SystemSettings结构
### 5.5 仪表盘接口
#### GET /api/dashboard/stats - 统计数据
**响应**:
```typescript
interface DashboardStatsResponse {
code: number;
data: {
deviceTotal: number;
deviceOnline: number;
alertToday: number;
activeUsers: number;
deviceTrend: TrendData[]; // 近7天设备趋势
deviceTypeDistribution: PieData[]; // 设备类型分布
recentAlerts: AlertItem[]; // 最近告警
recentActivities: ActivityItem[]; // 最近活动
};
}
```
### 5.6 操作日志接口
#### GET /api/log/list - 获取操作日志
**查询参数**:
```typescript
interface LogQuery {
page: number;
pageSize: number;
operator?: string; // 操作人
actionType?: string; // 操作类型
startTime?: Date;
endTime?: Date;
}
```
**响应**:
```typescript
interface LogListResponse {
code: number;
data: {
list: LogItem[];
total: number;
};
}
interface LogItem {
id: number;
userId: number;
username: string;
action: string; // 操作描述
module: string; // 操作模块
method: string; // 请求方法
url: string; // 请求URL
ipAddress: string;
userAgent?: string;
statusCode: number; // 响应状态码
duration: number; // 请求耗时(ms)
createdAt: Date;
}
```
## 6. 服务器架构图
```mermaid
flowchart LR
subgraph Client [客户端]
Request[HTTP请求]
end
subgraph Middleware [中间件层]
A[CORS跨域]
B[Body解析]
C[JWT认证]
D[RBAC权限]
E[参数校验]
F[日志记录]
end
subgraph Controller [控制器层]
G[AuthController]
H[UserController]
I[RoleController]
J[SystemController]
K[HomeController]
L[LogController]
end
subgraph Service [服务层业务逻辑]
M[AuthService]
N[UserService]
O[RoleService]
P[SystemService]
Q[DashboardService]
R[LogService]
end
subgraph Repository [数据访问层]
S[UserRepository]
T[RoleRepository]
U[PermissionRepository]
V[LogRepository]
end
subgraph Database [(数据库)]
W[(MySQL)]
X[(Redis)]
end
Request --> Middleware
A --> B --> C --> D --> E --> F
F --> G & H & I & J & K & L
G --> M
H --> N
I --> O
J --> P
K --> Q
L --> R
M & N & O & P & Q & R --> S & T & U & V
S & T & U & V --> W
M & N & O --> X
```
## 7. 数据模型设计
### 7.1 实体关系图 (ER Diagram)
```mermaid
erDiagram
USERS ||--o{ USER_ROLES : has
ROLES ||--o{ USER_ROLES : assigned_to
ROLES ||--o{ ROLE_PERMISSIONS : contains
PERMISSIONS ||--o{ ROLE_PERMISSIONS : belong_to
USERS ||--o{ OPERATION_LOGS : creates
USERS {
bigint id PK "主键"
varchar username UK "用户名(唯一)"
varchar password "加密密码"
varchar nickname "昵称"
varchar email "邮箱"
varchar phone "手机号"
varchar avatar "头像URL"
tinyint status "状态(0禁用/1启用)"
datetime created_at "创建时间"
datetime updated_at "更新时间"
}
ROLES {
bigint id PK "主键"
varchar name "角色名称"
varchar code UK "角色编码(唯一)"
varchar description "描述"
datetime created_at "创建时间"
datetime updated_at "更新时间"
}
PERMISSIONS {
bigint id PK "主键"
varchar name "权限名称"
varchar code UK "权限编码(唯一)"
varchar type "类型(menu/button/api)"
bigint parent_id FK "父权限ID"
int sort_order "排序"
varchar icon "图标"
varchar route "路由路径"
}
USER_ROLES {
bigint id PK "主键"
bigint user_id FK "用户ID"
bigint role_id FK "角色ID"
}
ROLE_PERMISSIONS {
bigint id PK "主键"
bigint role_id FK "角色ID"
bigint permission_id FK "权限ID"
}
OPERATION_LOGS {
bigint id PK "主键"
bigint user_id FK "操作用户ID"
varchar action "操作描述"
varchar module "操作模块"
varchar method "请求方法"
varchar url "请求URL"
varchar ip_address "IP地址"
varchar user_agent "浏览器UA"
int status_code "响应状态码"
int duration "请求耗时(ms)"
text request_params "请求参数"
text response_data "响应数据"
datetime created_at "操作时间"
}
```
### 7.2 数据定义语言 (DDL)
```sql
-- 用户表
CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL COMMENT '加密密码',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态: 0-禁用 1-启用',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 角色表
CREATE TABLE `roles` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) NOT NULL COMMENT '角色名称',
`code` varchar(50) NOT NULL COMMENT '角色编码',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 权限表
CREATE TABLE `permissions` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) NOT NULL COMMENT '权限名称',
`code` varchar(100) NOT NULL COMMENT '权限编码',
`type` enum('menu','button','api') NOT NULL DEFAULT 'menu' COMMENT '权限类型',
`parent_id` bigint DEFAULT NULL COMMENT '父权限ID',
`sort_order` int NOT NULL DEFAULT '0' COMMENT '排序',
`icon` varchar(50) DEFAULT NULL COMMENT '图标',
`route` varchar(255) DEFAULT NULL COMMENT '路由路径',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';
-- 用户-角色关联表
CREATE TABLE `user_roles` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint NOT NULL COMMENT '用户ID',
`role_id` bigint NOT NULL COMMENT '角色ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
-- 角色-权限关联表
CREATE TABLE `role_permissions` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`role_id` bigint NOT NULL COMMENT '角色ID',
`permission_id` bigint NOT NULL COMMENT '权限ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_permission` (`role_id`, `permission_id`),
KEY `idx_permission_id` (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';
-- 操作日志表
CREATE TABLE `operation_logs` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint DEFAULT NULL COMMENT '操作用户ID',
`action` varchar(255) NOT NULL COMMENT '操作描述',
`module` varchar(50) DEFAULT NULL COMMENT '操作模块',
`method` varchar(10) DEFAULT NULL COMMENT '请求方法',
`url` varchar(500) DEFAULT NULL COMMENT '请求URL',
`ip_address` varchar(45) DEFAULT NULL COMMENT 'IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '浏览器UA',
`status_code` int DEFAULT NULL COMMENT '响应状态码',
`duration` int DEFAULT NULL COMMENT '请求耗时(ms)',
`request_params` text COMMENT '请求参数(JSON)',
`response_data` text COMMENT '响应数据(JSON)',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
Key `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
-- 初始化管理员账户 (密码: admin123456, bcrypt加密)
INSERT INTO `users` (`username`, `password`, `nickname`, `status`) VALUES
('admin', '$2b$10$xxxxxxxxxxxxxxxxxxxxxxx', '超级管理员', 1);
-- 初始化角色
INSERT INTO `roles` (`name`, `code`, `description`) VALUES
('超级管理员', 'super_admin', '拥有系统所有权限'),
('普通管理员', 'admin', '拥有大部分管理权限'),
('运维人员', 'operator', '拥有设备管理和查看权限');
-- 初始化基础权限 (菜单权限)
INSERT INTO `permissions` (`name`, `code`, `type`, `parent_id`, `sort_order`, `route`) VALUES
('仪表盘', 'dashboard', 'menu', NULL, 1, '/dashboard'),
('系统管理', 'system', 'menu', NULL, 2, '/system'),
('用户管理', 'user:list', 'button', NULL, 3, NULL),
('角色管理', 'role:list', 'button', NULL, 4, NULL),
('系统设置', 'system:settings', 'button', NULL, 5, NULL);
```
## 8. 安全设计
### 8.1 认证机制
- **JWT Token**: Access Token (2小时有效) + Refresh Token (7天有效)
- **密码存储**: bcrypt加密 (saltRounds = 10)
- **登录保护**: 验证码(可选)、IP限制、账户锁定
### 8.2 权限控制
- **RBAC模型**: 用户 → 角色 → 权限 三层权限体系
- **前端路由守卫**: 根据权限动态生成可访问路由
- **后端接口鉴权**: 每个接口验证Token + 权限码
- **按钮级别控制**: 前端根据权限指令令牌控制按钮显隐
### 8.3 数据安全
- **SQL注入防护**: 使用ORM参数化查询
- **XSS防护**: 输入过滤 + 输出转义
- **CSRF防护**: SameSite Cookie + Token验证
- **敏感数据加密**: 手机号、邮箱脱敏显示
## 9. 性能优化策略
### 前端优化
- **路由懒加载**: 使用动态import()按需加载页面组件
- **组件按需加载**: Ant Design Vue按需引入
- **状态缓存**: keep-alive缓存常用页面
- **资源压缩**: Gzip/Brotli压缩
- **CDN加速**: 静态资源CDN分发
### 后端优化
- **Redis缓存**: 用户权限缓存、系统设置缓存、热点数据缓存
- **连接池**: MySQL连接池、Redis连接池
- **索引优化**: 数据库查询关键字段建立索引
- **分页查询**: 所有列表接口强制分页
- **日志异步**: 操作日志异步写入
## 10. 部署方案
### 开发环境
- **本地开发**: 前端Vite Dev Server + 后端Midway热重载
- **数据库**: 本地MySQL + Redis
- **代理配置**: Vite代理API请求到后端
### 生产环境
- **前端**: 构建静态文件 -> Nginx托管
- **后端**: PM2进程管理 -> Node.js运行
- **数据库**: 云数据库RDS + Redis云服务
- **反向代理**: Nginx负载均衡 + SSL证书