docs(readme): 重构README并补充详细文档内容

This commit is contained in:
曾文豪
2026-04-29 11:20:18 +08:00
parent 67066d69d6
commit 523cc777f8
29 changed files with 15437 additions and 22 deletions

View File

@@ -0,0 +1,688 @@
# API 参考手册
<cite>
**本文档引用的文件**
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [版本兼容性与迁移](#版本兼容性与迁移)
10. [结论](#结论)
## 简介
npm-tool 是一个功能丰富的 JavaScript 工具包,专为现代 Web 应用开发而设计。该工具包提供了完整的 HTTP 请求处理、数据加密解密、本地存储管理、通用工具函数等功能模块,旨在简化开发者在日常开发中的重复工作。
本工具包的核心特性包括:
- 完整的 HTTP 请求封装,支持 GET、POST、表单提交等多种请求方式
- 基于 SM4 算法的安全数据加密解密功能
- 智能的本地存储管理,支持自动序列化和反序列化
- 丰富的通用工具函数,涵盖字符串处理、数据验证等常用操作
- 灵活的全局配置系统,支持运行时动态配置
## 项目结构
npm-tool 采用模块化的文件组织结构,主要分为以下几个核心目录:
```mermaid
graph TB
subgraph "项目根目录"
A[index.js]
B[package.json]
C[README.md]
end
subgraph "源代码目录 (src/)"
D[src/utils/]
E[src/https/]
end
subgraph "工具模块 (src/utils/)"
F[TsCommon.js]
G[TsStorage.js]
H[TsCrypto.js]
I[TsSM4.js]
J[TsGlobalConfig.js]
end
subgraph "HTTP模块 (src/https/)"
K[TsHttpUtil.js]
end
A --> D
A --> E
D --> F
D --> G
D --> H
D --> I
D --> J
E --> K
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
npm-tool 工具包由六个主要模块组成,每个模块都提供特定的功能领域:
### 主要模块概览
| 模块名称 | 文件路径 | 功能描述 |
|---------|----------|----------|
| TsHttpUtil | src/https/TsHttpUtil.js | HTTP 请求处理和网络通信 |
| TsCommon | src/utils/TsCommon.js | 通用工具函数集合 |
| TsStorage | src/utils/TsStorage.js | 本地存储管理 |
| TsCrypto | src/utils/TsCrypto.js | 数据加密解密服务 |
| TsSM4 | src/utils/TsSM4.js | SM4 算法实现 |
| TsGlobalConfig | src/utils/TsGlobalConfig.js | 全局配置管理 |
### 版本信息
- **包名**: @tiesheng/npm-tool
- **当前版本**: 2.0.6
- **主要依赖**:
- base64-js: 1.5.1 (Base64 编码解码)
- umi-request: 1.4.0 (HTTP 请求封装)
**章节来源**
- [package.json:1-24](file://package.json#L1-L24)
- [index.js:8-15](file://index.js#L8-L15)
## 架构概览
npm-tool 采用了清晰的分层架构设计,各模块之间通过明确的接口进行交互:
```mermaid
graph TB
subgraph "应用层"
APP[业务应用]
end
subgraph "HTTP 层"
HTTP[TsHttpUtil]
CONFIG[TsGlobalConfig]
end
subgraph "加密层"
CRYPTO[TsCrypto]
SM4[TsSM4]
end
subgraph "存储层"
STORAGE[TsStorage]
COMMON[TsCommon]
end
subgraph "外部依赖"
UMI[umi-request]
BASE64[base64-js]
end
APP --> HTTP
HTTP --> CONFIG
HTTP --> STORAGE
HTTP --> CRYPTO
CRYPTO --> SM4
STORAGE --> COMMON
HTTP --> UMI
CRYPTO --> BASE64
SM4 --> BASE64
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### 组件交互流程
```mermaid
sequenceDiagram
participant Client as 应用客户端
participant HttpUtil as HTTP工具
participant Crypto as 加密服务
participant Storage as 存储服务
participant Config as 配置服务
Client->>HttpUtil : 发起HTTP请求
HttpUtil->>Config : 获取全局配置
HttpUtil->>Storage : 获取用户令牌
HttpUtil->>Crypto : 加密请求数据(可选)
HttpUtil->>HttpUtil : 发送网络请求
HttpUtil->>Crypto : 解密响应数据(可选)
HttpUtil->>Storage : 更新状态信息
HttpUtil-->>Client : 返回处理后的结果
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
## 详细组件分析
### HTTP 请求处理模块 (TsHttpUtil)
HTTP 请求处理模块是整个工具包的核心,提供了完整的网络通信能力。
#### 主要功能
1. **HTTP 请求封装**: 支持 GET、POST、表单提交等多种请求方式
2. **数据加密**: 可选的请求体加密功能
3. **响应处理**: 统一的响应数据处理和错误处理
4. **配置管理**: 灵活的全局配置系统
#### API 接口定义
##### get 方法
- **功能**: 发送 GET 请求
- **参数**:
- url: string - 请求的 URL 地址
- params: object - 查询参数对象 (可选)
- options: object - 请求选项 (可选)
- **返回值**: Promise<object> - 包含 data 和 recordsTotal 的响应对象
- **使用场景**: 获取数据列表、查询详情等
##### post 方法
- **功能**: 发送 POST 请求
- **参数**:
- url: string - 请求的 URL 地址
- data: object - 请求体数据 (可选)
- options: object - 请求选项 (可选)
- **返回值**: Promise<object> - 包含 data 和 recordsTotal 的响应对象
- **使用场景**: 创建数据、更新数据、登录认证等
##### form 方法
- **功能**: 发送表单提交请求
- **参数**:
- url: string - 请求的 URL 地址
- data: object - 表单数据 (可选)
- options: object - 请求选项 (可选)
- **返回值**: Promise<object> - 包含 data 和 recordsTotal 的响应对象
- **使用场景**: 文件上传、表单提交等
##### req 方法
- **功能**: 基础请求方法,其他方法的底层实现
- **参数**:
- url: string - 请求的 URL 地址
- options: object - 请求选项
- **返回值**: Promise<object> - 统一的响应对象
- **使用场景**: 自定义请求配置
#### 错误处理机制
```mermaid
flowchart TD
Start([请求开始]) --> CheckPrefix["检查URL前缀"]
CheckPrefix --> AddHeaders["添加请求头信息"]
AddHeaders --> SendRequest["发送HTTP请求"]
SendRequest --> CheckResponse{"检查响应状态"}
CheckResponse --> |状态码为200| CheckEncrypt{"检查是否需要解密"}
CheckResponse --> |状态码非200| HandleError["调用错误处理器"]
CheckEncrypt --> |需要解密| DecryptData["解密响应数据"]
CheckEncrypt --> |不需要解密| ReturnData["直接返回数据"]
DecryptData --> ParseJSON["解析JSON数据"]
ParseJSON --> ReturnData
HandleError --> CallErrorHandler["调用全局错误处理器"]
CallErrorHandler --> ReturnError["返回错误对象"]
ReturnData --> End([请求结束])
ReturnError --> End
```
**图表来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
**章节来源**
- [TsHttpUtil.js:142-165](file://src/https/TsHttpUtil.js#L142-L165)
### 数据加密解密模块 (TsCrypto)
数据加密解密模块提供了基于 SM4 算法的安全数据保护功能。
#### 主要功能
1. **SM4 加密**: 使用 SM4 算法对数据进行加密
2. **SM4 解密**: 对加密数据进行解密
3. **密钥管理**: 基于 Base64 的密钥处理
4. **模式支持**: 支持 ECB 和 CBC 两种加密模式
#### API 接口定义
##### encrypt 方法
- **功能**: 加密输入内容
- **参数**:
- content: string | object - 需要加密的内容
- **返回值**: string - 加密后的 Base64 字符串
- **使用场景**: 敏感数据传输、API 参数加密
##### decrypt 方法
- **功能**: 解密输入内容
- **参数**:
- base64: string - Base64 编码的加密数据
- **返回值**: string - 解密后的原始内容
- **使用场景**: 处理服务器返回的加密数据
#### 加密算法实现
```mermaid
classDiagram
class TsCrypto {
-sm4 : SM4
+constructor()
+encrypt(content) string
+decrypt(base64) string
}
class SM4 {
-key : Uint8Array
-iv : Uint8Array
-mode : string
-cipherType : string
-encryptRoundKeys : Uint32Array
-decryptRoundKeys : Uint32Array
+constructor(config)
+encrypt(plaintext) string
+decrypt(ciphertext) string
-padding(buffer) Uint8Array
-dePadding(buffer) Uint8Array
-doBlockCrypt(blockData, roundKeys) Uint32Array
}
TsCrypto --> SM4 : "组合关系"
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
**章节来源**
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
### 本地存储模块 (TsStorage)
本地存储模块提供了便捷的本地数据管理功能。
#### 主要功能
1. **通用存储**: 支持任意类型的对象存储
2. **用户令牌管理**: 专门的用户认证令牌存储
3. **加密开关**: 控制请求体是否加密
4. **数据序列化**: 自动处理 JSON 序列化和反序列化
#### API 接口定义
##### save 方法
- **功能**: 保存数据到本地存储
- **参数**:
- key: string - 存储键名
- value: any - 需要存储的值
- **返回值**: void
- **使用场景**: 保存用户偏好设置、临时数据等
##### get 方法
- **功能**: 从本地存储获取数据
- **参数**:
- key: string - 存储键名
- def: any - 默认值 (可选)
- **返回值**: any - 存储的值或默认值
- **使用场景**: 读取用户配置、应用状态等
##### saveUserToken 方法
- **功能**: 保存用户认证令牌
- **参数**:
- token: string - 用户令牌
- **返回值**: void
- **使用场景**: 登录后保存用户身份信息
##### getUserToken 方法
- **功能**: 获取用户认证令牌
- **参数**: 无
- **返回值**: string - 用户令牌或空字符串
- **使用场景**: 每次请求时添加认证信息
##### saveEncryptBody 方法
- **功能**: 设置是否启用请求体加密
- **参数**:
- bool: boolean - 加密开关 (默认 true)
- **返回值**: void
- **使用场景**: 控制数据传输安全性
##### getEncryptBody 方法
- **功能**: 获取请求体加密状态
- **参数**: 无
- **返回值**: boolean - 加密状态
- **使用场景**: 检查当前加密配置
**章节来源**
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
### 通用工具模块 (TsCommon)
通用工具模块提供了常用的辅助函数。
#### 主要功能
1. **字符串处理**: URL 参数解析、字符串替换等
2. **数据验证**: 空值检查、JSON 解析等
3. **环境检测**: 开发环境判断
4. **数组操作**: 字符串分割等
#### API 接口定义
##### getParamFormUrl 方法
- **功能**: 从 URL 中提取指定参数
- **参数**:
- key: string - 参数键名
- host: string - URL 字符串 (可选)
- **返回值**: string - 参数值或空字符串
- **使用场景**: 解析页面 URL 参数
##### isEmpty 方法
- **功能**: 检查值是否为空
- **参数**:
- value: any - 需要检查的值
- **返回值**: boolean - 是否为空
- **使用场景**: 数据验证、条件判断
##### parseJSON 方法
- **功能**: 安全地解析 JSON 字符串
- **参数**:
- value: string - JSON 字符串
- def: any - 默认值 (可选)
- **返回值**: any - 解析后的对象或默认值
- **使用场景**: 安全地解析存储的数据
##### split 方法
- **功能**: 分割字符串为数组
- **参数**:
- obj: string - 需要分割的字符串
- seq: string - 分隔符 (默认 ',')
- **返回值**: string[] - 分割后的数组
- **使用场景**: 处理逗号分隔的配置项
##### isDevelopment 方法
- **功能**: 检查是否为开发环境
- **参数**: 无
- **返回值**: boolean - 是否为开发环境
- **使用场景**: 条件性执行开发相关逻辑
##### replaceAll 方法
- **功能**: 替换字符串中所有匹配的部分
- **参数**:
- string: string - 原始字符串
- **返回值**: string - 处理后的字符串
- **使用场景**: 文本处理、格式化
##### endWith 方法
- **功能**: 检查字符串是否以指定后缀结尾
- **参数**:
- string: string - 原始字符串
- endStr: string - 检查的后缀
- **返回值**: boolean - 是否以指定后缀结尾
- **使用场景**: 文件扩展名检查、路径处理
**章节来源**
- [TsCommon.js:4-87](file://src/utils/TsCommon.js#L4-L87)
### 全局配置模块 (TsGlobalConfig)
全局配置模块提供了灵活的配置管理系统。
#### 主要功能
1. **默认配置**: 提供合理的默认配置值
2. **配置合并**: 支持运行时配置覆盖
3. **动态配置**: 支持函数形式的动态配置
4. **错误处理**: 自定义 HTTP 错误处理逻辑
#### API 接口定义
##### getConfig 方法
- **功能**: 获取当前配置
- **参数**: 无
- **返回值**: object - 当前配置对象
- **使用场景**: 读取全局配置信息
##### setConfig 方法
- **功能**: 设置或更新配置
- **参数**:
- obj: object - 需要更新的配置项
- **返回值**: void
- **使用场景**: 应用启动时初始化配置
#### 默认配置项
| 配置项 | 类型 | 默认值 | 描述 |
|-------|------|--------|------|
| base64Key | string | "WmdUzPJXbngVNiaSsQrihg==" | SM4 加密密钥 |
| prefix | string/function | "" | API 请求前缀 |
| onHttpError | function | 空函数 | HTTP 错误处理回调 |
| httpParams | function | 空函数 | 额外请求参数生成器 |
**章节来源**
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
## 依赖关系分析
npm-tool 工具包的依赖关系清晰明确,遵循了模块化设计原则:
```mermaid
graph TB
subgraph "核心模块"
A[TsHttpUtil]
B[TsCrypto]
C[TsStorage]
D[TsCommon]
E[TsGlobalConfig]
F[TsSM4]
end
subgraph "外部依赖"
G[umi-request]
H[base64-js]
end
subgraph "应用集成"
I[业务应用]
end
I --> A
A --> B
A --> C
A --> D
A --> E
A --> G
B --> F
B --> H
C --> D
E --> I
```
**图表来源**
- [index.js:1-6](file://index.js#L1-L6)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
### 模块耦合度分析
- **低耦合**: 各模块职责明确,相互独立
- **单向依赖**: 依赖关系呈树状结构,避免循环依赖
- **接口清晰**: 模块间通过明确定义的接口进行交互
### 性能特征
- **内存使用**: 模块化设计减少不必要的内存占用
- **加载时间**: 按需加载,首屏加载时间短
- **运行效率**: 原生 JavaScript 实现,性能优异
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
## 性能考虑
### 内存优化
1. **模块懒加载**: 通过 require 方式实现按需加载
2. **对象复用**: 复用加密解密过程中的中间对象
3. **内存清理**: 及时释放不再使用的变量
### 网络性能
1. **连接复用**: 基于 umi-request 的连接池管理
2. **请求缓存**: 支持 Cookie 自动携带
3. **超时控制**: 可配置的请求超时时间
### 加密性能
1. **算法优化**: SM4 算法实现经过优化
2. **批量处理**: 支持批量数据处理
3. **内存管理**: 合理的内存分配策略
## 故障排除指南
### 常见问题及解决方案
#### HTTP 请求失败
**问题症状**: 请求返回错误状态码或抛出异常
**可能原因**:
1. 网络连接问题
2. 服务器端错误
3. 认证信息缺失
4. 请求参数格式错误
**解决步骤**:
1. 检查网络连接状态
2. 验证服务器地址和端口
3. 确认用户令牌有效性
4. 查看浏览器开发者工具中的网络请求
#### 数据加密失败
**问题症状**: 加密或解密操作抛出异常
**可能原因**:
1. 密钥长度不正确
2. IV 向量配置错误
3. 数据格式不符合要求
**解决步骤**:
1. 验证密钥长度为 16 字节
2. 检查 IV 向量配置
3. 确认输入数据格式
#### 存储数据丢失
**问题症状**: 本地存储的数据无法读取
**可能原因**:
1. 浏览器存储空间不足
2. 浏览器隐私模式限制
3. 存储键名冲突
**解决步骤**:
1. 检查浏览器存储空间
2. 尝试在普通模式下使用
3. 使用唯一的存储键名
### 错误处理最佳实践
```mermaid
flowchart TD
Start([开始处理]) --> TryRequest["尝试执行操作"]
TryRequest --> Success{"操作成功?"}
Success --> |是| Complete["完成处理"]
Success --> |否| CatchError["捕获错误"]
CatchError --> CheckErrorType{"检查错误类型"}
CheckErrorType --> |网络错误| HandleNetwork["处理网络错误"]
CheckErrorType --> |数据错误| HandleData["处理数据错误"]
CheckErrorType --> |配置错误| HandleConfig["处理配置错误"]
HandleNetwork --> LogError["记录错误日志"]
HandleData --> LogError
HandleConfig --> LogError
LogError --> Retry{"需要重试?"}
Retry --> |是| RetryOperation["重试操作"]
Retry --> |否| NotifyUser["通知用户"]
RetryOperation --> TryRequest
NotifyUser --> End([结束])
Complete --> End
```
**图表来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 版本兼容性与迁移
### 版本历史
根据 package.json 显示,当前版本为 2.0.6,这是一个稳定的发布版本。
### 兼容性信息
- **Node.js 版本**: 支持 Node.js 12+ 版本
- **浏览器兼容性**: 支持现代浏览器 (Chrome 60+, Firefox 55+, Safari 12+)
- **ESLint 规范**: 遵循 ES6+ 语法规范
### 迁移指南
#### 从旧版本升级
1. **备份现有配置**: 在升级前备份所有自定义配置
2. **检查依赖版本**: 确保依赖包版本符合要求
3. **测试关键功能**: 升级后重点测试 HTTP 请求和加密功能
4. **更新导入方式**: 确保正确的模块导入语法
#### API 变更注意事项
1. **命名规范**: 保持一致的 API 命名约定
2. **参数验证**: 新增参数时提供合理的默认值
3. **错误处理**: 统一错误处理机制
4. **文档同步**: 及时更新 API 文档
### 最佳实践建议
1. **版本锁定**: 在生产环境中锁定具体版本号
2. **持续监控**: 监控工具包的使用情况和性能指标
3. **定期更新**: 定期检查新版本的安全补丁和功能更新
4. **测试覆盖**: 为关键功能编写单元测试
## 结论
npm-tool 工具包是一个设计精良、功能完备的 JavaScript 工具集。它通过模块化的设计理念,将复杂的网络通信、数据处理、安全加密等功能封装成易于使用的 API 接口。
### 主要优势
1. **功能全面**: 涵盖了现代 Web 开发的常见需求
2. **设计优雅**: 清晰的模块划分和接口设计
3. **性能优秀**: 原生 JavaScript 实现,运行效率高
4. **易于使用**: 简洁的 API 设计,学习成本低
### 适用场景
- 快速原型开发
- 中小型 Web 应用
- 移动端 Hybrid 应用
- 微信小程序开发
### 发展方向
随着前端技术的不断发展npm-tool 工具包将继续演进,计划增加的功能包括:
- 更多的加密算法支持
- 更完善的错误处理机制
- 更丰富的配置选项
- 更好的 TypeScript 支持

View File

@@ -0,0 +1,393 @@
# HTTP 请求 API
<cite>
**本文引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 HTTP 请求模块的完整 API 参考文档聚焦于四个核心方法req、get、post、form。内容涵盖
- 方法签名与参数类型url、params、data、options
- 返回值结构与错误处理
- 请求前缀处理、参数自动转换分页器、equals、加密开关
- 响应处理、状态码映射与异常情况说明
- 与全局配置的集成方式与自定义选项
- 实际使用场景示例GET 查询、POST 提交、表单上传)
## 项目结构
该模块以“工具类 + HTTP 封装”的方式组织,核心入口通过 index.js 暴露统一导出HTTP 请求封装位于 src/https/TsHttpUtil.js配合全局配置、存储、通用工具与加解密实现。
```mermaid
graph TB
subgraph "入口与导出"
IDX["index.js"]
end
subgraph "HTTP 封装层"
HTTP["TsHttpUtil.js<br/>req/get/post/form"]
end
subgraph "配置与存储"
CFG["TsGlobalConfig.js<br/>setConfig/getConfig"]
STO["TsStorage.js<br/>getUserToken/saveEncryptBody/getEncryptBody"]
end
subgraph "通用与加解密"
COM["TsCommon.js<br/>isEmpty/parseJSON 等"]
CRY["TsCrypto.js<br/>encrypt/decrypt"]
SM4["TsSM4.js<br/>SM4 实现"]
end
IDX --> HTTP
HTTP --> CFG
HTTP --> STO
HTTP --> COM
HTTP --> CRY
CRY --> SM4
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- HTTP 封装与请求调度req、get、post、form
- 全局配置setConfig/getConfig支持 prefix、onHttpError、httpParams、base64Key 等
- 存储与加密开关getUserToken、saveEncryptBody/getEncryptBody
- 通用工具isEmpty、parseJSON 等
- 加解密:基于 SM4 的 TsCrypto内部使用 TsSM4
章节来源
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 架构总览
下图展示了从调用到响应的整体流程,包括请求前缀拼接、参数转换、加密开关、响应解密与错误处理。
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Http as "TsHttpUtil.req"
participant Ext as "umi-request.extend"
participant Cfg as "TsGlobalConfig"
participant Sto as "TsStorage"
participant Cph as "TsCrypto"
participant Com as "TsCommon"
Caller->>Http : "调用 req(url, options)"
Http->>Cfg : "读取 prefix/onHttpError/httpParams/base64Key"
Http->>Http : "拼接前缀 url = prefix + url"
Http->>Http : "dealParamsBody(params/data/equals/pagination)"
Http->>Sto : "读取 token"
Http->>Ext : "request(url, {headers : {token}, ...})"
Ext-->>Http : "Promise.then(res)"
Http->>Http : "根据 rawResponse/encrypt 判定"
Http->>Cph : "若 encrypt 则 decrypt 并 parseJSON"
Http-->>Caller : "resolve({data, recordsTotal}) 或 reject(res)"
Ext-->>Http : "Promise.catch(err)"
Http-->>Caller : "reject({code, message})"
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
## 详细组件分析
### 方法概览与签名
- req(url, options)
- 参数
- url: 字符串,可带查询参数
- options: 对象,支持 method、params、data、headers、rawResponse、requestType 等
- 返回
- Promise成功解析为 {data, recordsTotal};失败解析为 {code, message}
- get(url, params = {}, options = {})
- 参数
- url: 字符串
- params: 查询参数对象
- options: 自定义选项
- 返回
- Promise成功解析为 {data, recordsTotal}
- post(url, data = {}, options = {})
- 参数
- url: 字符串
- data: 请求体对象
- options: 自定义选项
- 返回
- Promise成功解析为 {data, recordsTotal}
- form(url, data = {}, options = {})
- 参数
- url: 字符串
- data: 表单数据
- options: 自定义选项requestType 默认为 form
- 返回
- Promise成功解析为 {data, recordsTotal}
章节来源
- [TsHttpUtil.js:136-165](file://src/https/TsHttpUtil.js#L136-L165)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
### 请求前缀处理
- 支持字符串或函数形式的 prefix
- 若 prefix 为函数,则以 url 作为入参计算前缀
- 最终拼接为 prefix + url
章节来源
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsGlobalConfig.js:19-21](file://src/utils/TsGlobalConfig.js#L19-L21)
### 参数自动转换
- 分页器转换
- 将 options.params.pagination 转换为 pageSize 和 pageNum并删除 pagination
- equals 转换
- 将 options.params.equals 对象转为逗号分隔的键值对字符串
- 额外参数注入
- GET 请求:合并 GlobalConfig.httpParams 返回的对象到 params
- 非 GET 且非 form合并 GlobalConfig.httpParams 返回的对象到 data
- 加密开关
- 当 Storage.getEncryptBody() 为真时,将 data 包裹为 {encryptData: 加密结果},否则按原样透传
章节来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsStorage.js:21-23](file://src/utils/TsStorage.js#L21-L23)
### 加密与解密
- 加密
- 使用 TsCrypto.encrypt 对 data 进行 SM4 加密ECB 模式),密钥来自 GlobalConfig.base64Key
- 解密
- 若响应标记为加密res.encrypt则使用 TsCrypto.decrypt 解密,并尝试 parseJSON
- 密钥
- base64Key 来源于 GlobalConfig初始化时转换为字节数组
章节来源
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
### 响应处理与错误映射
- 成功路径
- 当 res.code === 200 时,提取 data若 res.encrypt 为真,执行解密与 parseJSON
- 返回 {data, recordsTotal}
- 失败路径
- 调用 GlobalConfig.onHttpError(res),并 reject(res)
- 异常路径
- Promise.catch 捕获后,返回 {code: status, message: error}
章节来源
- [TsHttpUtil.js:117-132](file://src/https/TsHttpUtil.js#L117-L132)
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsGlobalConfig.js:8-12](file://src/utils/TsGlobalConfig.js#L8-L12)
### 请求头与认证
- 自动注入 token
- 从 Storage.getUserToken() 读取并写入 headers.token
- 默认行为
- credentials: include携带 cookie
- requestType: json用于 form 提交)
章节来源
- [TsHttpUtil.js:109-112](file://src/https/TsHttpUtil.js#L109-L112)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
### API 定义与使用示例
#### req(url, options)
- 功能:发起通用请求,支持 GET/POST 等方法与自定义选项
- 关键点
- 自动拼接前缀、参数转换、加密开关、响应解密
- 支持 rawResponse 直接返回原始响应
- 示例(路径)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
章节来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
#### get(url, params, options)
- 功能:发起 GET 请求
- 关键点
- 自动合并 GlobalConfig.httpParams 到 params
- 支持 equals 与 pagination 转换
- 示例(路径)
- [TsHttpUtil.js:142-144](file://src/https/TsHttpUtil.js#L142-L144)
章节来源
- [TsHttpUtil.js:142-144](file://src/https/TsHttpUtil.js#L142-L144)
#### post(url, data, options)
- 功能:发起 POST 请求JSON
- 关键点
- 非 form 时合并 GlobalConfig.httpParams 到 data
- 可启用加密开关
- 示例(路径)
- [TsHttpUtil.js:152-154](file://src/https/TsHttpUtil.js#L152-L154)
章节来源
- [TsHttpUtil.js:152-154](file://src/https/TsHttpUtil.js#L152-L154)
#### form(url, data, options)
- 功能发起表单提交POST
- 关键点
- requestType 设为 form适合上传文件或表单数据
- 示例(路径)
- [TsHttpUtil.js:163-165](file://src/https/TsHttpUtil.js#L163-L165)
章节来源
- [TsHttpUtil.js:163-165](file://src/https/TsHttpUtil.js#L163-L165)
### 错误处理与状态码映射
- 内置状态码映射codeMessage
- 200、201、202、204、400、401、403、404、406、410、422、500、502、503、504
- errorHandler
- 统一捕获 umi-request 抛出的错误,返回 {code, message}
- onHttpError
- 在非 200 时触发,便于业务侧统一处理
章节来源
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:125](file://src/https/TsHttpUtil.js#L125)
- [TsGlobalConfig.js:8-12](file://src/utils/TsGlobalConfig.js#L8-L12)
### 与全局配置的集成
- setConfig(obj)
- 合并 window.httpConfig 与默认配置
- 支持字段prefix、onHttpError、httpParams、base64Key
- getConfig()
- 返回当前配置对象
章节来源
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 自定义选项与扩展
- options 支持
- method、params、data、headers、rawResponse、requestType
- 与 Storage 的交互
- 读取/设置 token、加密开关
- 与 Common 的交互
- isEmpty、parseJSON 等工具
章节来源
- [TsHttpUtil.js:108-112](file://src/https/TsHttpUtil.js#L108-L112)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
- [TsCommon.js:25-44](file://src/utils/TsCommon.js#L25-L44)
## 依赖关系分析
```mermaid
graph LR
A["TsHttpUtil.js"] --> B["TsGlobalConfig.js"]
A --> C["TsStorage.js"]
A --> D["TsCommon.js"]
A --> E["TsCrypto.js"]
E --> F["TsSM4.js"]
G["index.js"] --> A
```
图表来源
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [index.js:1-6](file://index.js#L1-L6)
章节来源
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [index.js:1-6](file://index.js#L1-L6)
## 性能考量
- 参数转换与加密
- equals 与 pagination 转换为 O(n) 操作,通常开销较小
- 加密/解密涉及 SM4 计算,建议仅在必要时开启加密开关
- 请求头与 cookies
- credentials: include 会携带 Cookie注意跨域与安全策略
- 响应处理
- 解密与 parseJSON 仅在 res.encrypt 为真时执行,避免不必要的 CPU 开销
## 故障排查指南
- 常见问题
- 未设置 tokenheaders.token 为空,可能导致鉴权失败
- 加密开关未生效:确认 Storage.getEncryptBody() 返回 true
- 前缀无效prefix 为函数时需确保返回有效字符串
- 参数未合并GlobalConfig.httpParams 必须返回对象
- 排查步骤
- 打印 options 与最终请求 URL确认前缀拼接正确
- 检查 params/data 是否经过 equals/pagination 转换
- 观察响应是否包含 encrypt 字段,确认解密逻辑是否执行
- 使用 rawResponse 查看原始响应,定位业务错误码与消息
章节来源
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsHttpUtil.js:75-88](file://src/https/TsHttpUtil.js#L75-L88)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
## 结论
本模块提供了简洁一致的 HTTP 请求抽象,具备以下特性:
- 统一的请求前缀、参数转换与加密开关
- 明确的成功/失败响应结构与错误映射
- 与全局配置、存储、通用工具与加解密的深度集成
- 适用于 GET 查询、POST 提交与表单上传等多种场景
## 附录
### API 完整签名与参数说明
- req(url, options)
- url: 字符串
- options.method: GET/POST 等
- options.params: 查询参数对象
- options.data: 请求体对象
- options.headers: 自定义头部
- options.rawResponse: 是否返回原始响应
- options.requestType: json/form
- get(url, params = {}, options = {})
- params: 查询参数对象(支持 equals、pagination
- post(url, data = {}, options = {})
- data: 请求体对象(支持 httpParams 注入与加密)
- form(url, data = {}, options = {})
- data: 表单数据requestType 默认为 form
章节来源
- [TsHttpUtil.js:136-165](file://src/https/TsHttpUtil.js#L136-L165)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
### 使用示例(路径)
- GET 查询
- [TsHttpUtil.js:142-144](file://src/https/TsHttpUtil.js#L142-L144)
- POST 数据提交
- [TsHttpUtil.js:152-154](file://src/https/TsHttpUtil.js#L152-L154)
- 表单上传
- [TsHttpUtil.js:163-165](file://src/https/TsHttpUtil.js#L163-L165)
- 全局配置与加密
- [README.md:17-26](file://README.md#L17-L26)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)

View File

@@ -0,0 +1,375 @@
# SM4 算法 API
<cite>
**本文引用的文件**
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与安全考量](#性能与安全考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 SM4 对称加密算法模块的完整 API 参考文档,覆盖以下内容:
- 方法签名与参数类型明文、密钥、IV 向量、输出类型)
- 返回值类型与数据格式
- CBC 与 ECB 两种加密模式支持
- 自动填充与去填充机制
- 字节序与位运算处理细节
- 与 Base64 编解码的集成方式与数据格式转换
- 安全性考虑、性能特征与适用场景
- 扩展与自定义方法建议
## 项目结构
该工具包通过统一入口导出多个工具模块,其中 SM4 模块位于 src/utils/TsSM4.js并在 index.js 中集中导出。
```mermaid
graph TB
A["index.js<br/>统一导出入口"] --> B["TsSM4.js<br/>SM4 实现"]
A --> C["TsCrypto.js<br/>基于 SM4 的加密器封装"]
A --> D["TsGlobalConfig.js<br/>全局配置含 base64Key"]
E["package.json<br/>依赖声明"] --> F["base64-js@1.5.1"]
B --> F
C --> B
C --> D
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [package.json:1-24](file://package.json#L1-L24)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- TsSM4SM4 对称加密算法实现,支持 CBC/ECB 模式、PKCS#7 填充、Base64 文本输出。
- Crypt字符串与字节数组、Base64 之间的编解码辅助工具。
- TsCrypto基于 SM4 的应用层加密器,使用全局配置中的 base64Key 初始化。
章节来源
- [TsSM4.js:96-455](file://src/utils/TsSM4.js#L96-L455)
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsGlobalConfig.js:5-33](file://src/utils/TsGlobalConfig.js#L5-L33)
## 架构总览
SM4 模块以面向对象的方式组织,内部包含:
- 常量表S 盒、轮常数 CK、初始常数 FK
- 工具类 CryptUTF-8 字符串与 Uint8Array 的互转、Base64 与 Uint8Array 的互转
- 主类 TsSM4密钥展开、轮函数、填充/去填充、CBC/ECB 加解密流程
```mermaid
classDiagram
class Crypt {
+stringToArrayBufferInUtf8(str) Uint8Array
+utf8ArrayBufferToString(buf) String
+arrayBufferToBase64(buf) String
+base64ToArrayBuffer(str) Uint8Array
}
class TsSM4 {
+Uint8Array key
+Uint8Array iv
+String mode
+String cipherType
+Uint32Array encryptRoundKeys
+Uint32Array decryptRoundKeys
+constructor(config)
+doBlockCrypt(blockData, roundKeys) Uint32Array
+spawnEncryptRoundKeys() void
+rotateLeft(x, y) Number
+linearTransform1(b) Number
+linearTransform2(b) Number
+tauTransform(a) Number
+tTransform1(z) Number
+tTransform2(z) Number
+padding(originalBuffer) Uint8Array
+dePadding(paddedBuffer) Uint8Array
+uint8ToUint32Block(uint8Array, baseIndex) Uint32Array
+encrypt(plaintext) String
+decrypt(ciphertext) String
}
TsSM4 --> Crypt : "使用"
```
图表来源
- [TsSM4.js:39-94](file://src/utils/TsSM4.js#L39-L94)
- [TsSM4.js:96-455](file://src/utils/TsSM4.js#L96-L455)
## 详细组件分析
### 类TsSM4SM4 算法主类)
- 职责
- 密钥展开与轮密钥生成
- 轮函数与线性变换
- PKCS#7 填充与去填充
- CBC/ECB 模式加解密
- 输出类型Base64 或 UTF-8 文本)
- 关键成员
- key16 字节密钥Uint8Array
- iv16 字节 IVUint8ArrayCBC 模式必需
- mode'cbc' 或 'ecb'
- cipherType'base64' 或 'text'
- encryptRoundKeys / decryptRoundKeys32 轮密钥数组Uint32Array
- 关键方法
- constructor(config)
- 参数config.keyBuffer必填16 字节、config.iv可选16 字节、config.mode'cbc'|'ecb'、config.outType'base64'|'text'
- 行为:校验长度、初始化轮密钥、准备正向/逆向轮密钥
- encrypt(plaintext: String): String
- 行为UTF-8 编码 -> PKCS#7 填充 -> 分块处理 -> CBC/ECB -> 输出类型转换
- 返回Base64 字符串或 UTF-8 文本
- decrypt(ciphertext: String): String
- 行为:根据 cipherType 解码 -> 分块处理 -> CBC/ECB -> 去填充 -> UTF-8 解码
- 返回:明文字符串
- 数据流与算法要点
- 字节序大端序MSB 在前),按 4 字节组合为 Uint32
- 轮函数32 轮迭代,使用 S 盒替换与线性变换
- CBC 链接:前一分组密文作为下一分组的 IV
- 填充:按 16 字节对齐,填充长度为填充字节数
章节来源
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:158-180](file://src/utils/TsSM4.js#L158-L180)
- [TsSM4.js:189-207](file://src/utils/TsSM4.js#L189-L207)
- [TsSM4.js:217-241](file://src/utils/TsSM4.js#L217-L241)
- [TsSM4.js:250-277](file://src/utils/TsSM4.js#L250-L277)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
- [TsSM4.js:322-329](file://src/utils/TsSM4.js#L322-L329)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
### 类Crypt编解码工具
- 字符串与字节数组
- stringToArrayBufferInUtf8(str: String): Uint8Array
- utf8ArrayBufferToString(buf: Uint8Array): String
- Base64 与字节数组
- arrayBufferToBase64(buf: Uint8Array): String
- base64ToArrayBuffer(str: String): Uint8Array
章节来源
- [TsSM4.js:39-94](file://src/utils/TsSM4.js#L39-L94)
### 类TsCrypto应用层封装
- 使用全局配置中的 base64Key 初始化 SM4ECB 模式,输出 Base64
- 提供 encrypt/content 和 decrypt/base64 接口
章节来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsGlobalConfig.js:5-33](file://src/utils/TsGlobalConfig.js#L5-L33)
### API 规范与使用示例
- 构造函数
- 名称TsSM4(config)
- 参数:
- keyBuffer: Uint8Array必须16 字节)
- iv?: String可选16 字节CBC 模式必需)
- mode?: 'cbc'|'ecb'(默认 'cbc'
- outType?: 'base64'|'text'(默认 'base64'
- 返回TsSM4 实例
- 异常:当 keyBuffer 长度不为 16 或 iv 长度不为 16 时抛出错误
- 加密
- 名称encrypt(plaintext: String): String
- 输入明文字符串UTF-8
- 处理:填充 -> 分块 -> CBC/ECB -> 输出类型转换
- 输出Base64 字符串或 UTF-8 文本(取决于 outType
- 解密
- 名称decrypt(ciphertext: String): String
- 输入密文字符串Base64 或 UTF-8取决于 outType
- 处理:解码 -> 分块 -> CBC/ECB -> 去填充 -> UTF-8
- 输出:明文字符串
- 示例(路径)
- CBC 模式加密:[TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- ECB 模式加密:[TsSM4.js:368-378](file://src/utils/TsSM4.js#L368-L378)
- CBC 模式解密:[TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
- ECB 模式解密:[TsSM4.js:434-447](file://src/utils/TsSM4.js#L434-L447)
- 应用层封装使用:[TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
章节来源
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:338-452](file://src/utils/TsSM4.js#L338-L452)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
### 流程图CBC 模式加密
```mermaid
flowchart TD
Start(["开始"]) --> Encode["UTF-8 编码明文"]
Encode --> Pad["PKCS#7 填充到 16 字节倍数"]
Pad --> InitChain["初始化链寄存器为 IVCBC"]
InitChain --> Loop{"遍历每个 16 字节块"}
Loop --> |是| Xor["与上一密文块异或CBC"]
Xor --> Round["32 轮加密轮函数+S 盒+线性变换"]
Round --> Save["保存当前密文块"]
Save --> Next["下一个明文块"]
Next --> Loop
Loop --> |否| OutType["根据 outType 输出Base64 或文本"]
OutType --> End(["结束"])
```
图表来源
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
### 流程图ECB 模式解密
```mermaid
flowchart TD
Start(["开始"]) --> Decode["根据 outType 解码Base64 或文本"]
Decode --> Blocks["按 16 字节分块"]
Blocks --> DecryptLoop{"遍历每个 16 字节块"}
DecryptLoop --> |是| Round["32 轮解密逆序轮密钥"]
Round --> Save["保存明文块"]
Save --> Next["下一个块"]
Next --> DecryptLoop
DecryptLoop --> |否| Depad["去填充移除 PKCS#7"]
Depad --> Utf8["UTF-8 解码"]
Utf8 --> End(["结束"])
```
图表来源
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
### 序列图:应用层加密调用
```mermaid
sequenceDiagram
participant App as "应用"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Config as "TsGlobalConfig"
App->>Crypto : "new TsCrypto()"
Crypto->>Config : "getConfig()"
Config-->>Crypto : "{base64Key}"
Crypto->>Crypto : "base64Key -> Uint8Array"
Crypto->>SM4 : "new TsSM4({keyBuffer, mode : 'ecb', outType : 'base64'})"
App->>Crypto : "encrypt(明文)"
Crypto->>SM4 : "encrypt(明文)"
SM4-->>Crypto : "密文(Base64)"
Crypto-->>App : "密文(Base64)"
```
图表来源
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
## 依赖关系分析
- 内部依赖
- TsCrypto 依赖 TsSM4 与 TsGlobalConfig
- TsSM4 依赖 Crypt 与 base64-js
- 外部依赖
- base64-js@1.5.1Base64 编解码
- umi-request@1.4.0HTTP 请求(在 https 模块中使用)
```mermaid
graph LR
TsCrypto["TsCrypto.js"] --> TsSM4["TsSM4.js"]
TsCrypto --> TsGlobalConfig["TsGlobalConfig.js"]
TsSM4 --> Base64["base64-js@1.5.1"]
Package["package.json"] --> Base64
```
图表来源
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [package.json:19-22](file://package.json#L19-L22)
章节来源
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [package.json:19-22](file://package.json#L19-L22)
## 性能与安全考量
- 性能特征
- 32 轮迭代,每块 16 字节,适合小批量数据快速加解密
- 使用 TypedArray 进行位运算,避免频繁装箱开销
- Base64 编解码在浏览器与 Node 环境均可用
- 安全性考虑
- CBC 模式需要随机且唯一的 IV若 IV 固定,会降低安全性
- 密钥长度固定为 16 字节,需确保密钥熵足够
- 填充采用 PKCS#7,需确保去填充逻辑正确
- 适用场景
- 小型数据加密(如配置项、令牌、短消息)
- 与 HTTP 加密传输结合使用(参考 README 中的 HttpUtil 配置)
章节来源
- [TsSM4.js:343-378](file://src/utils/TsSM4.js#L343-L378)
- [TsSM4.js:408-447](file://src/utils/TsSM4.js#L408-L447)
- [README.md:12-26](file://README.md#L12-L26)
## 故障排查指南
- 常见错误
- 密钥长度不为 16 字节:构造函数抛错
- IV 非空但长度不为 16 字节CBC 模式抛错
- 输出类型与输入不匹配:解密失败或结果异常
- 排查步骤
- 确认密钥与 IV 均为 16 字节
- 确认 outType 与实际输入一致
- 检查 Base64 编码是否完整
- 核对 CBC/ECB 模式选择与业务需求一致
章节来源
- [TsSM4.js:102-105](file://src/utils/TsSM4.js#L102-L105)
- [TsSM4.js:116-122](file://src/utils/TsSM4.js#L116-L122)
- [TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)
- [TsSM4.js:410-412](file://src/utils/TsSM4.js#L410-L412)
## 结论
本模块提供了完整的 SM4 对称加密能力,支持 CBC/ECB 模式与 PKCS#7 填充,具备良好的跨平台兼容性(浏览器/Node。通过 TsCrypto 可直接用于业务场景,推荐在 CBC 模式下使用随机 IV并严格管理密钥与输出类型以确保安全性与一致性。
## 附录
### API 一览(方法签名与参数)
- TsSM4(config)
- config.keyBuffer: Uint8Array16 字节)
- config.iv?: String16 字节CBC 必需)
- config.mode?: 'cbc'|'ecb'
- config.outType?: 'base64'|'text'
- encrypt(plaintext: String): String
- decrypt(ciphertext: String): String
章节来源
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:338-452](file://src/utils/TsSM4.js#L338-L452)
### 数据格式与转换
- 字节序大端序MSB 在前)
- 填充PKCS#71-16 字节)
- 输出类型:
- 'base64'Base64 字符串
- 'text'UTF-8 文本(浏览器/Node 环境均支持)
章节来源
- [TsSM4.js:322-329](file://src/utils/TsSM4.js#L322-L329)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
- [TsSM4.js:381-386](file://src/utils/TsSM4.js#L381-L386)
- [TsSM4.js:398-404](file://src/utils/TsSM4.js#L398-L404)
### 扩展与自定义
- 支持自定义 IVCBC 模式)
- 支持自定义输出类型Base64 或文本)
- 可在应用层封装更多模式(如 GCM/CTR但当前实现仅支持 CBC/ECB
章节来源
- [TsSM4.js:115-141](file://src/utils/TsSM4.js#L115-L141)
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)

View File

@@ -0,0 +1,415 @@
# 加密解密 API
<cite>
**本文档引用的文件**
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本项目是一个基于 SM4 对称加密算法的 JavaScript 加密解密工具包。该工具包提供了完整的加密解密功能,支持 ECB 和 CBC 两种加密模式,内置 Base64 编解码处理,并集成了 HTTP 请求加密传输功能。系统采用模块化设计,通过 TsCrypto 类封装 SM4 加密算法,通过 TsSM4 类实现具体的 SM4 算法逻辑,通过 TsHttpUtil 类实现 HTTP 请求的自动加密功能。
## 项目结构
该项目采用模块化组织结构,主要包含以下核心模块:
```mermaid
graph TB
subgraph "核心模块"
Crypto[TsCrypto.js<br/>加密器封装]
SM4[TsSM4.js<br/>SM4算法实现]
Config[TsGlobalConfig.js<br/>全局配置]
end
subgraph "工具模块"
Http[TsHttpUtil.js<br/>HTTP请求工具]
Storage[TsStorage.js<br/>本地存储]
Common[TsCommon.js<br/>通用工具]
end
subgraph "外部依赖"
Base64[base64-js<br/>Base64编解码]
UmiRequest[umi-request<br/>HTTP请求库]
end
Crypto --> SM4
Crypto --> Config
Http --> Crypto
Http --> Storage
Http --> Config
SM4 --> Base64
Http --> UmiRequest
```
**图表来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 核心组件
### TsCrypto 加密器
TsCrypto 是整个加密系统的核心封装类,负责提供简化的加密解密接口。它内部使用 TsSM4 类来执行实际的加密解密操作。
**主要特性:**
- 基于 SM4 算法的对称加密
- 内置 Base64 编解码处理
- 支持 ECB 和 CBC 模式配置
- 自动密钥管理
**章节来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
### TsSM4 SM4 算法实现
TsSM4 类实现了完整的 SM4 对称加密算法,包括密钥扩展、加密轮函数、填充和去填充等功能。
**核心功能:**
- 完整的 SM4 算法实现
- 支持 ECB 和 CBC 两种模式
- 自动填充和去填充机制
- Base64 和文本两种输出格式
**章节来源**
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
### TsGlobalConfig 全局配置
提供全局配置管理功能支持动态设置和获取加密密钥、HTTP 前缀等配置项。
**配置选项:**
- base64Key: Base64 编码的密钥字符串
- prefix: HTTP 请求前缀
- onHttpError: HTTP 错误回调函数
- httpParams: HTTP 参数处理函数
**章节来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
## 架构概览
系统采用分层架构设计,从上到下分为应用层、工具层、算法层和依赖层:
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
end
subgraph "工具层"
HttpUtil[TsHttpUtil<br/>HTTP请求工具]
Crypto[TsCrypto<br/>加密器]
Storage[TsStorage<br/>存储工具]
end
subgraph "算法层"
SM4[TsSM4<br/>SM4算法]
Crypt[TsCrypt<br/>编解码工具]
end
subgraph "依赖层"
Base64[base64-js]
UmiRequest[umi-request]
end
App --> HttpUtil
App --> Crypto
HttpUtil --> Crypto
Crypto --> SM4
SM4 --> Crypt
SM4 --> Base64
HttpUtil --> UmiRequest
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 详细组件分析
### TsCrypto 类详细分析
TsCrypto 类提供了简洁的加密解密接口,内部封装了复杂的加密细节。
#### 类结构图
```mermaid
classDiagram
class TsCrypto {
-sm4 : SM4
+constructor()
+encrypt(content) : string
+decrypt(base64) : string
}
class SM4 {
-key : Uint8Array
-iv : Uint8Array
-mode : string
-cipherType : string
-encryptRoundKeys : Uint32Array
-decryptRoundKeys : Uint32Array
+constructor(config)
+encrypt(plaintext) : string
+decrypt(ciphertext) : string
}
class Crypt {
+stringToArrayBufferInUtf8(str) : Uint8Array
+utf8ArrayBufferToString(buffer) : string
+arrayBufferToBase64(buffer) : string
+base64ToArrayBuffer(base64) : Uint8Array
}
TsCrypto --> SM4 : "组合"
SM4 --> Crypt : "使用"
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
#### 加密流程序列图
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Crypt as "Crypt"
Client->>Crypto : encrypt(明文)
Crypto->>SM4 : encrypt(明文)
SM4->>Crypt : stringToArrayBufferInUtf8(明文)
Crypt-->>SM4 : Uint8Array
SM4->>SM4 : padding(填充)
SM4->>SM4 : doBlockCrypt(加密块)
SM4->>Crypt : arrayBufferToBase64(密文)
Crypt-->>SM4 : Base64字符串
SM4-->>Crypto : Base64密文
Crypto-->>Client : 返回密文
```
**图表来源**
- [TsCrypto.js:19-21](file://src/utils/TsCrypto.js#L19-L21)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
**章节来源**
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
### TsSM4 类详细分析
TsSM4 类实现了完整的 SM4 算法,包括密钥扩展、加密轮函数和填充机制。
#### 算法流程图
```mermaid
flowchart TD
Start([开始加密]) --> ValidateKey["验证密钥长度(16字节)"]
ValidateKey --> CheckMode{"检查加密模式"}
CheckMode --> |CBC| InitIV["初始化IV(16字节)"]
CheckMode --> |ECB| NoIV["无IV模式"]
InitIV --> PadData["数据填充(PKCS7)"]
NoIV --> PadData
PadData --> SplitBlocks["分割为16字节块"]
SplitBlocks --> EncryptLoop{"遍历每个数据块"}
EncryptLoop --> |CBC模式| CBCProcess["CBC处理:<br/>异或链+加密"]
EncryptLoop --> |ECB模式| ECBProcess["ECB处理:<br/>直接加密"]
CBCProcess --> NextBlock{"还有下一个块?"}
ECBProcess --> NextBlock
NextBlock --> |是| EncryptLoop
NextBlock --> |否| EncodeOutput["编码输出(Base64)"]
EncodeOutput --> End([结束])
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:343-378](file://src/utils/TsSM4.js#L343-L378)
#### 关键算法实现
**密钥扩展算法:**
- 使用 FK 常量和 CK 数组
- 生成 32 轮加密密钥
- 每轮密钥长度 32 位
**加密轮函数:**
- 实现 τ 变换和线性变换
- 包含 S 盒替换
- 支持 32 轮加密
**填充机制:**
- 使用 PKCS7 填充标准
- 自动处理任意长度数据
- 支持去填充操作
**章节来源**
- [TsSM4.js:189-207](file://src/utils/TsSM4.js#L189-L207)
- [TsSM4.js:250-278](file://src/utils/TsSM4.js#L250-L278)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
### HTTP 加密传输集成
TsHttpUtil 类集成了加密功能,实现了 HTTP 请求的自动加密传输。
#### 加密传输流程
```mermaid
sequenceDiagram
participant App as "应用"
participant HttpUtil as "TsHttpUtil"
participant Crypto as "TsCrypto"
participant Server as "服务器"
App->>HttpUtil : post(url, data)
HttpUtil->>HttpUtil : dealParamsBody()
HttpUtil->>HttpUtil : 检查是否启用加密
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto-->>HttpUtil : Base64密文
HttpUtil->>Server : POST /api/data {encryptData : 密文}
Server-->>HttpUtil : {code : 200, data : 明文}
HttpUtil->>HttpUtil : 检查响应是否加密
HttpUtil->>Crypto : decrypt(响应数据)
Crypto-->>HttpUtil : 明文数据
HttpUtil-->>App : 返回解析后的数据
```
**图表来源**
- [TsHttpUtil.js:82-87](file://src/https/TsHttpUtil.js#L82-L87)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
**章节来源**
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 依赖关系分析
### 外部依赖
项目的主要外部依赖包括:
| 依赖包 | 版本 | 用途 |
|--------|------|------|
| base64-js | 1.5.1 | Base64 编解码处理 |
| umi-request | 1.4.0 | HTTP 请求库 |
### 内部模块依赖
```mermaid
graph LR
index[index.js<br/>入口文件] --> TsCrypto[TsCrypto.js]
index --> TsSM4[TsSM4.js]
index --> TsGlobalConfig[TsGlobalConfig.js]
index --> TsHttpUtil[TsHttpUtil.js]
TsCrypto --> TsSM4
TsCrypto --> TsGlobalConfig
TsHttpUtil --> TsCrypto
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCommon
TsHttpUtil --> TsGlobalConfig
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 加密性能优化
1. **内存管理**
- 使用 TypedArray 进行高效的数据处理
- 避免不必要的数据拷贝
- 合理使用缓冲区复用
2. **算法优化**
- 采用 32 位整数运算提高性能
- 使用预计算的 S 盒表
- 优化循环结构减少开销
3. **I/O 优化**
- Base64 编解码使用高效的库实现
- 批量处理数据块避免频繁调用
### 安全性最佳实践
1. **密钥管理**
- 密钥必须为 16 字节长度
- 建议使用安全的随机数生成器
- 定期更换密钥
2. **模式选择**
- CBC 模式提供更好的安全性
- ECB 模式仅适用于相同明文的场景
- IV 必须随机且唯一
3. **填充安全**
- 使用标准的 PKCS7 填充
- 验证去填充结果的有效性
## 故障排除指南
### 常见错误及解决方案
**密钥长度错误**
- 错误信息:`key should be a 16 bytes string`
- 解决方案:确保密钥为 16 字节长度的 Base64 编码
**IV 初始化错误**
- 错误信息:`iv error`
- 解决方案:在 CBC 模式下提供 16 字节长度的 IV
**数据解密失败**
- 可能原因:密钥不匹配、数据损坏
- 解决方案:验证密钥正确性,检查数据完整性
**Base64 编码问题**
- 可能原因:输入数据格式不正确
- 解决方案:确保输入为有效的字符串或 Buffer
### 调试技巧
1. **启用开发模式**
```javascript
// 在开发环境中启用详细日志
const isDev = TsCommon.isDevelopment();
```
2. **验证加密结果**
```javascript
const original = "测试数据";
const encrypted = TsCrypto.encrypt(original);
const decrypted = TsCrypto.decrypt(encrypted);
console.assert(original === decrypted, "加密解密结果不匹配");
```
**章节来源**
- [TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
- [TsSM4.js:119-121](file://src/utils/TsSM4.js#L119-L121)
- [TsSM4.js:346](file://src/utils/TsSM4.js#L346)
## 结论
本加密解密模块提供了完整的 SM4 对称加密解决方案,具有以下特点:
1. **功能完整**:支持 ECB 和 CBC 两种加密模式,提供 Base64 编解码
2. **易于使用**:提供简洁的 API 接口,便于集成到现有项目中
3. **安全可靠**:采用标准的 SM4 算法和 PKCS7 填充机制
4. **性能优化**:使用高效的 TypedArray 和优化的算法实现
该模块特别适合需要数据加密传输和存储的应用场景,如 API 数据传输、用户敏感信息存储等。通过合理的配置和使用,可以有效提升应用程序的安全性。

View File

@@ -0,0 +1,310 @@
# 存储管理 API
<cite>
**本文引用的文件**
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [index.js](file://index.js)
- [README.md](file://README.md)
- [package.json](file://package.json)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与可靠性](#性能与可靠性)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为“存储管理”模块的完整 API 参考文档,聚焦于基于 localStorage 的数据持久化能力,并结合加密工具链实现敏感数据的安全存储。内容涵盖:
- 接口规范:方法签名、参数类型、返回值结构与典型用法
- 数据持久化机制localStorage 的键值存取、默认值回退策略
- 用户 token 管理:专用的 token 保存与读取
- 加密开关控制:通过全局配置与布尔开关控制是否对请求体进行加密
- 序列化与反序列化:统一采用 JSON 序列化/反序列化,支持复杂对象
- 错误处理与兼容性:解析失败的兜底、浏览器环境差异处理
- 最佳实践:数据迁移与备份建议
## 项目结构
该工具包通过入口文件聚合导出各子模块,存储管理位于 utils/TsStorage.js配合通用工具 TsCommon.js 提供 JSON 解析兜底以及加密工具链TsCrypto.js + TsSM4.js用于请求体加密。
```mermaid
graph TB
entry["index.js<br/>入口聚合导出"] --> storage["TsStorage.js<br/>存储模块"]
entry --> common["TsCommon.js<br/>通用工具"]
entry --> crypto["TsCrypto.js<br/>加密器"]
entry --> sm4["TsSM4.js<br/>SM4 实现"]
entry --> gconf["TsGlobalConfig.js<br/>全局配置"]
entry --> httpu["TsHttpUtil.js<br/>HTTP 工具外部模块"]
storage --> common
crypto --> sm4
crypto --> gconf
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- 存储模块TsStorage提供通用的保存/读取接口,以及用户 token 和加密开关的专用接口。
- 通用工具TsCommon提供 JSON 解析兜底函数,确保从 localStorage 读取时的健壮性。
- 加密工具TsCrypto + TsSM4基于 SM4 算法的加密封装,支持 ECB 模式与 base64 输出。
- 全局配置TsGlobalConfig提供 base64Key 等配置项,供加密模块初始化使用。
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:29-44](file://src/utils/TsCommon.js#L29-L44)
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
## 架构总览
存储模块围绕 localStorage 构建,所有数据以 JSON 字符串形式保存,读取时进行 JSON 解析并提供默认值兜底。加密开关通过布尔值控制是否对请求体进行加密,加密密钥来自全局配置。
```mermaid
sequenceDiagram
participant App as "应用"
participant Storage as "TsStorage"
participant Local as "localStorage"
participant Common as "TsCommon"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant GConf as "TsGlobalConfig"
App->>Storage : save(key, value)
Storage->>Local : setItem(key, JSON.stringify({data : value}))
Local-->>Storage : ok
App->>Storage : get(key, def?)
Storage->>Local : getItem(key)
Local-->>Storage : 字符串或null
Storage->>Common : parseJSON(字符串, {data : def})
Common-->>Storage : 对象或默认值
Storage-->>App : 返回 data 字段
App->>Storage : saveEncryptBody(true/false)
App->>Storage : getEncryptBody()
App->>Crypto : encrypt(body) 或 decrypt(cipher)
Crypto->>GConf : getConfig().base64Key
Crypto->>SM4 : encrypt()/decrypt()
SM4-->>Crypto : 密文/明文
Crypto-->>App : 返回结果
```
图表来源
- [TsStorage.js:26-43](file://src/utils/TsStorage.js#L26-L43)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-452](file://src/utils/TsSM4.js#L338-L452)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 详细组件分析
### 存储模块 API 规范
- 方法概览
- save(key, value)
- 参数
- key: 字符串,存储键名
- value: 任意可 JSON 序列化对象或原始值
- 返回值:无(写入 localStorage
- 行为:将 value 包装为 {data: value} 并 JSON 序列化后写入 localStorage
- get(key, def="")
- 参数
- key: 字符串,存储键名
- def: 可选,默认值,当读取失败或空时返回
- 返回值:任意类型(由 JSON 反序列化后的 data 字段决定)
- 行为:从 localStorage 读取字符串,使用 parseJSON 解析并返回 data 字段;失败或不存在则返回 def
- saveUserToken(token)
- 参数
- token: 字符串或可序列化对象
- 返回值:无
- 行为:内部调用 save("token", token),键固定为 "token"
- getUserToken()
- 参数:无
- 返回值:字符串
- 行为:内部调用 get("token"),默认空字符串
- saveEncryptBody(bool=true)
- 参数
- bool: 布尔值true 表示启用加密
- 返回值:无
- 行为:保存布尔开关到键 "encrypt_body"
- getEncryptBody()
- 参数:无
- 返回值:布尔值
- 行为:读取 "encrypt_body",默认 true
- 使用示例(路径引用)
- 保存对象并读取
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- [README.md:28-41](file://README.md#L28-L41)
- 保存用户 token
- [TsStorage.js:9-15](file://src/utils/TsStorage.js#L9-L15)
- 设置/获取加密开关
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- 数据序列化与反序列化
- 写入:统一使用 JSON.stringify({data: value}),保证读取时有 data 字段
- 读取:使用 parseJSON 将字符串解析为对象,若失败或为空则返回默认对象 {data: def}
- 类型支持:任何可 JSON 序列化的类型均可保存;读取后按原类型返回
- 错误处理
- get 中的 parseJSON 失败时返回默认值,避免抛错
- getUserToken 默认空字符串,避免未设置 token 时的异常
- 浏览器兼容性
- localStorage 在现代浏览器中广泛支持;在隐私模式或禁用 localStorage 的情况下可能不可用
- 建议在生产环境中增加 try/catch 包裹并降级处理
章节来源
- [TsStorage.js:26-54](file://src/utils/TsStorage.js#L26-L54)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [README.md:28-41](file://README.md#L28-L41)
### 加密模块与加密开关
- 加密开关
- 通过 saveEncryptBody/getEncryptBody 控制是否对请求体进行加密
- 默认开启true可在业务层根据需要关闭
- 加密实现
- TsCrypto 基于 SM4 算法ECB 模式,输出 base64
- 初始化时从 TsGlobalConfig 获取 base64Key并转换为 16 字节密钥缓冲区
- 支持 encrypt(content) 与 decrypt(base64) 两个核心方法
- 关键流程图(加密/解密)
```mermaid
flowchart TD
Start(["开始"]) --> GetCfg["读取全局配置<br/>base64Key"]
GetCfg --> InitSM4["初始化 SM4<br/>ECB 模式, base64 输出"]
InitSM4 --> Encrypt{"是否加密?"}
Encrypt --> |是| DoEnc["encrypt(content)"]
Encrypt --> |否| Skip["跳过加密"]
DoEnc --> OutEnc["返回 base64 密文"]
Skip --> OutPlain["返回明文"]
OutEnc --> End(["结束"])
OutPlain --> End
```
图表来源
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
章节来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
### 入口导出与集成
- 入口文件 index.js 将各模块聚合导出,便于统一引入
- README.md 展示了存储模块的基本用法与加密开关的配置思路
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [README.md:28-41](file://README.md#L28-L41)
## 依赖关系分析
- TsStorage 依赖 TsCommon 的 JSON 解析兜底
- TsCrypto 依赖 TsSM4 与 TsGlobalConfig
- index.js 统一导出各模块README.md 提供使用示例
```mermaid
graph LR
Storage["TsStorage"] --> Common["TsCommon"]
Crypto["TsCrypto"] --> SM4["TsSM4"]
Crypto --> GConf["TsGlobalConfig"]
Entry["index.js"] --> Storage
Entry --> Common
Entry --> Crypto
Entry --> SM4
Entry --> GConf
```
图表来源
- [TsStorage.js:1](file://src/utils/TsStorage.js#L1)
- [TsCommon.js:1](file://src/utils/TsCommon.js#L1)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [TsGlobalConfig.js:1-3](file://src/utils/TsGlobalConfig.js#L1-L3)
- [index.js:1-16](file://index.js#L1-L16)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 性能与可靠性
- 性能特性
- localStorage 为同步 API适合小规模轻量数据大对象频繁序列化/反序列化会带来开销
- 建议仅保存必要数据,避免超大对象
- 可靠性
- get 中的 parseJSON 提供失败兜底,降低异常传播风险
- 建议在业务层增加 try/catch 并记录错误日志
- 安全性
- 本地存储非加密,敏感数据建议仅在传输阶段加密(请求体加密)
- 密钥管理需遵循最小暴露原则,避免硬编码
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 读取不到数据
- 检查键名是否一致;确认是否使用 save 保存而非直接 setItem
- 若数据为空get 会返回默认值;检查 def 参数是否被覆盖
- JSON 解析失败
- parseJSON 会在异常时返回默认对象;检查存储值是否为合法 JSON
- token 为空
- getUserToken 默认返回空字符串;确认是否已调用 saveUserToken 保存
- 加密异常
- 确认 TsGlobalConfig 中 base64Key 配置正确且可转换为 16 字节
- 确认加密开关状态saveEncryptBody/getEncryptBody
章节来源
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 结论
存储管理模块提供了简洁可靠的 localStorage 访问接口,并通过 JSON 序列化/反序列化保障复杂对象的持久化。结合加密开关与 SM4 加密工具,可在传输阶段保护敏感数据。建议在生产环境中增强错误处理与降级策略,并遵循最小暴露原则管理密钥。
[本节为总结性内容,不直接分析具体文件]
## 附录
### API 一览表
- 通用存取
- save(key, value): 保存任意可序列化对象
- get(key, def=""): 读取并返回 data 字段,失败或空时返回默认值
- 用户 token
- saveUserToken(token): 保存 token
- getUserToken(): 读取 token默认空字符串
- 加密开关
- saveEncryptBody(bool=true): 设置加密开关
- getEncryptBody(): 读取加密开关,默认 true
章节来源
- [TsStorage.js:26-54](file://src/utils/TsStorage.js#L26-L54)
### 数据迁移与备份最佳实践
- 迁移策略
- 新版本字段变更时,读取旧键并迁移至新键,再删除旧键
- 迁移前先备份当前 localStorage 快照
- 备份建议
- 定期导出关键键集合的 JSON 文本,离线保存
- 对敏感键(如 token单独加密备份
- 清理与安全
- 定期清理过期键,避免累积膨胀
- 对外发布前移除调试用键或敏感键
[本节为通用指导,不直接分析具体文件]

View File

@@ -0,0 +1,937 @@
# 通用工具 API
<cite>
**本文档引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
这是一个功能丰富的 JavaScript 工具包,提供了多种实用的工具函数和组件,主要用于 Web 应用开发中的常见需求。该工具包包含了字符串处理、数据类型检查、URL 操作、加密解密、存储管理、HTTP 请求等功能模块。
主要特性:
- **字符串处理工具**URL 参数解析、空值判断、JSON 解析、字符串替换、结尾判断等
- **加密解密功能**:基于 SM4 算法的加密解密工具
- **存储管理**:本地存储封装,支持对象序列化
- **HTTP 请求工具**:基于 umi-request 的网络请求封装
- **全局配置管理**:统一的配置管理和环境检测
## 项目结构
该项目采用模块化的组织方式,主要分为以下目录结构:
```mermaid
graph TB
subgraph "项目根目录"
Root[index.js<br/>主入口文件]
Package[package.json<br/>项目配置]
Readme[README.md<br/>使用说明]
end
subgraph "src/ 工具源码目录"
Utils[src/utils/<br/>通用工具模块]
Https[src/https/<br/>HTTP 工具模块]
end
subgraph "Utils 模块"
Common[TsCommon.js<br/>通用工具]
Crypto[TsCrypto.js<br/>加密工具]
SM4[TsSM4.js<br/>SM4 算法实现]
Storage[TsStorage.js<br/>存储工具]
Config[TsGlobalConfig.js<br/>全局配置]
end
subgraph "Https 模块"
HttpUtil[TsHttpUtil.js<br/>HTTP 请求工具]
end
Root --> Utils
Root --> Https
Utils --> Common
Utils --> Crypto
Utils --> SM4
Utils --> Storage
Utils --> Config
Https --> HttpUtil
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
该工具包的核心由六个主要模块组成,每个模块都提供特定的功能领域:
### 主要模块概览
| 模块名称 | 文件路径 | 功能描述 |
|---------|----------|----------|
| TsCommon | src/utils/TsCommon.js | 通用工具函数集合 |
| TsCrypto | src/utils/TsCrypto.js | 加密解密工具 |
| TsSM4 | src/utils/TsSM4.js | SM4 算法实现 |
| TsStorage | src/utils/TsStorage.js | 本地存储管理 |
| TsGlobalConfig | src/utils/TsGlobalConfig.js | 全局配置管理 |
| TsHttpUtil | src/https/TsHttpUtil.js | HTTP 请求封装 |
### 模块依赖关系
```mermaid
graph LR
subgraph "外部依赖"
Umi[umi-request<br/>网络请求库]
Base64[base64-js<br/>Base64 编解码]
end
subgraph "内部模块"
Common[TsCommon]
Crypto[TsCrypto]
SM4[TsSM4]
Storage[TsStorage]
Config[TsGlobalConfig]
HttpUtil[TsHttpUtil]
end
HttpUtil --> Storage
HttpUtil --> Common
HttpUtil --> Crypto
HttpUtil --> Config
Crypto --> SM4
Crypto --> Config
Storage --> Common
SM4 --> Base64
HttpUtil --> Umi
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:8-15](file://index.js#L8-L15)
## 架构概览
该工具包采用了分层架构设计,将不同功能领域的工具函数分离到独立的模块中,通过清晰的依赖关系实现松耦合的设计。
### 整体架构图
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
end
subgraph "工具层"
HttpLayer[HTTP 层<br/>TsHttpUtil]
CryptoLayer[加密层<br/>TsCrypto + TsSM4]
StorageLayer[存储层<br/>TsStorage]
CommonLayer[通用层<br/>TsCommon]
end
subgraph "基础设施层"
Network[umi-request]
CryptoLib[SM4 算法]
StorageAPI[localStorage]
Encoding[base64-js]
end
App --> HttpLayer
HttpLayer --> CryptoLayer
HttpLayer --> StorageLayer
HttpLayer --> CommonLayer
CryptoLayer --> CryptoLib
CryptoLayer --> Encoding
StorageLayer --> StorageAPI
HttpLayer --> Network
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
### 数据流处理流程
```mermaid
sequenceDiagram
participant Client as 应用客户端
participant HttpUtil as HTTP 工具
participant Crypto as 加密模块
participant Storage as 存储模块
participant Server as 服务器
Client->>HttpUtil : 发送请求
HttpUtil->>Storage : 获取用户令牌
Storage-->>HttpUtil : 返回令牌
HttpUtil->>HttpUtil : 处理请求参数
HttpUtil->>Crypto : 加密数据(可选)
Crypto-->>HttpUtil : 返回加密结果
HttpUtil->>Server : 发送 HTTP 请求
Server-->>HttpUtil : 返回响应
HttpUtil->>Crypto : 解密响应(可选)
Crypto-->>HttpUtil : 返回解密结果
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
## 详细组件分析
### TsCommon 通用工具模块
TsCommon 模块提供了基础的工具函数涵盖了字符串处理、数据类型检查、URL 操作等多个方面。
#### 核心 API 接口
##### getParamFormUrl - URL 参数解析
**方法签名**: `getParamFormUrl(key, host)`
**参数说明**:
- `key`: string - 要获取的 URL 参数键名
- `host`: string (可选) - 目标 URL 字符串,默认使用当前页面 URL
**返回值**: string - 匹配参数的值,未找到时返回空字符串
**使用场景**:
- 从 URL 中提取查询参数
- 处理页面分享链接中的参数
- 解析路由参数
**参数验证规则**:
- 支持任意字符串作为参数键
- host 参数可选,不传入时使用当前页面 URL
**边界条件处理**:
- URL 中无问号或无查询参数时返回空字符串
- 参数值包含特殊字符时自动解码
- URL 格式不正确时捕获异常并返回空字符串
##### isEmpty - 空值判断
**方法签名**: `isEmpty(value)`
**参数说明**:
- `value`: any - 要检查的值
**返回值**: boolean - 值为 undefined、null 或空字符串时返回 true
**使用场景**:
- 表单验证
- 数据预处理
- 条件判断
**参数验证规则**:
- 接受任意类型的参数
- 严格比较空值类型
##### parseJSON - JSON 解析
**方法签名**: `parseJSON(value, def)`
**参数说明**:
- `value`: string - 要解析的 JSON 字符串
- `def`: any (可选) - 默认返回值,默认为空对象 {}
**返回值**: any - 解析后的对象或默认值
**使用场景**:
- 安全地解析 JSON 字符串
- 处理可能损坏的 JSON 数据
- 提供默认值机制
**参数验证规则**:
- 第二个参数为可选,默认值为空对象
- 解析失败时返回默认值
**边界条件处理**:
- JSON 格式错误时捕获异常
- 解析结果为空时使用默认值
##### split - 字符串分割
**方法签名**: `split(obj, seq)`
**参数说明**:
- `obj`: string - 要分割的字符串
- `seq`: string (可选) - 分隔符,默认为逗号
**返回值**: string[] - 分割后的字符串数组
**使用场景**:
- 处理逗号分隔的列表
- 解析配置字符串
- 数据格式转换
**参数验证规则**:
- 支持任意字符串作为输入
- 分隔符可自定义
**边界条件处理**:
- 输入为 falsy 值时返回空数组
- 空字符串返回包含空字符串的数组
##### isDevelopment - 环境检测
**方法签名**: `isDevelopment()`
**参数说明**: 无
**返回值**: boolean - 当前环境为 development 时返回 true
**使用场景**:
- 开发模式下的调试输出
- 环境相关的功能开关
- 测试环境配置
**参数验证规则**:
- 依赖 Node.js 的环境变量
##### replaceAll - 全部替换
**方法签名**: `replaceAll(string, s1, s2)`
**参数说明**:
- `string`: string - 原始字符串
- `s1`: string - 要替换的子字符串
- `s2`: string - 替换后的字符串
**返回值**: string - 替换后的字符串
**使用场景**:
- 批量字符串替换
- 文本格式化
- 数据清洗
**参数验证规则**:
- 支持正则表达式的特殊字符
- 使用全局标志进行完全替换
##### endWith - 结尾判断
**方法签名**: `endWith(string, endStr)`
**参数说明**:
- `string`: string - 要检查的字符串
- `endStr`: string - 结尾字符串
**返回值**: boolean - 字符串以指定结尾时返回 true
**使用场景**:
- 文件扩展名检查
- URL 路径处理
- 字符串格式验证
**参数验证规则**:
- 支持空字符串作为输入
- 不区分大小写
**章节来源**
- [TsCommon.js:4-18](file://src/utils/TsCommon.js#L4-L18)
- [TsCommon.js:25-27](file://src/utils/TsCommon.js#L25-L27)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsCommon.js:51-56](file://src/utils/TsCommon.js#L51-L56)
- [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
- [TsCommon.js:74-76](file://src/utils/TsCommon.js#L74-L76)
- [TsCommon.js:84-87](file://src/utils/TsCommon.js#L84-L87)
### TsCrypto 加密工具模块
TsCrypto 模块提供了基于 SM4 算法的加密解密功能,封装了底层的加密细节。
#### 核心 API 接口
##### 构造函数
**方法签名**: `new TsCrypto()`
**参数说明**: 无
**初始化过程**:
- 从全局配置获取 Base64 密钥
- 创建 SM4 实例ECB 模式)
- 设置密文类型为 Base64
##### encrypt - 数据加密
**方法签名**: `encrypt(content)`
**参数说明**:
- `content`: string | any - 要加密的内容
**返回值**: string - 加密后的 Base64 字符串
**使用场景**:
- 敏感数据传输加密
- API 请求体加密
- 数据安全存储
**参数验证规则**:
- 自动将非字符串内容转换为 JSON 字符串
- 依赖 SM4 算法进行加密
##### decrypt - 数据解密
**方法签名**: `decrypt(base64)`
**参数说明**:
- `base64`: string - Base64 编码的密文
**返回值**: string - 解密后的原始内容
**使用场景**:
- 解密服务器返回的加密数据
- 数据恢复和验证
- 安全通信
**参数验证规则**:
- 接收 Base64 编码的密文
- 返回原始明文内容
**章节来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
### TsSM4 SM4 算法实现
TsSM4 是一个完整的 SM4 对称加密算法实现,支持 ECB 和 CBC 两种工作模式。
#### 核心 API 接口
##### 构造函数
**方法签名**: `new TsSM4(config)`
**参数说明**:
- `config`: object - 配置对象
- `keyBuffer`: Uint8Array - 16 字节密钥缓冲区
- `mode`: string - 加密模式,'cbc' 或 'ecb',默认 'cbc'
- `outType`: string - 输出类型,'base64' 或 'text',默认 'base64'
**参数验证规则**:
- 密钥长度必须为 16 字节
- IV初始化向量长度必须为 16 字节CBC 模式)
- 支持的模式:'cbc'、'ecb'
- 支持的输出类型:'base64'、'text'
##### encrypt - 数据加密
**方法签名**: `encrypt(plaintext)`
**参数说明**:
- `plaintext`: string - 要加密的明文
**返回值**: string - 加密后的密文
**使用场景**:
- 数据加密传输
- 密钥生成和管理
- 安全通信协议
**参数验证规则**:
- 自动进行 PKCS#7 填充
- 支持 UTF-8 编码
- 根据模式选择加密算法
##### decrypt - 数据解密
**方法签名**: `decrypt(ciphertext)`
**参数说明**:
- `ciphertext`: string - 要解密的密文
**返回值**: string - 解密后的明文
**使用场景**:
- 数据解密和验证
- 安全通信解码
- 数据恢复
**参数验证规则**:
- 支持 Base64 和文本两种输入格式
- 自动移除 PKCS#7 填充
- 支持 UTF-8 编码
#### SM4 算法流程图
```mermaid
flowchart TD
Start([开始加密]) --> Prepare["准备明文字节流<br/>UTF-8 编码"]
Prepare --> Padding["PKCS#7 填充<br/>16 字节对齐"]
Padding --> Mode{"选择模式"}
Mode --> |CBC| CBCInit["CBC 模式初始化<br/>IV = 16 字节"]
Mode --> |ECB| ECBInit["ECB 模式初始化<br/>无 IV"]
CBCInit --> BlockLoop["按块处理<br/>16 字节/块"]
ECBInit --> BlockLoop
BlockLoop --> XOR["与前一块密文异或<br/>(CBC)"]
XOR --> Round["32 轮加密循环"]
Round --> Output["输出密文字节流"]
Output --> Type{"输出类型"}
Type --> |Base64| Base64["Base64 编码"]
Type --> |Text| Text["UTF-8 解码"]
Base64 --> End([结束])
Text --> End
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
**章节来源**
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
### TsStorage 存储工具模块
TsStorage 模块提供了本地存储的封装,支持对象的序列化和反序列化。
#### 核心 API 接口
##### save - 保存数据
**方法签名**: `save(key, value)`
**参数说明**:
- `key`: string - 存储键名
- `value`: any - 要保存的值
**返回值**: void
**使用场景**:
- 用户偏好设置保存
- 临时数据缓存
- 应用状态持久化
**参数验证规则**:
- 键名必须为字符串
- 值会被 JSON 序列化
##### get - 获取数据
**方法签名**: `get(key, def)`
**参数说明**:
- `key`: string - 存储键名
- `def`: any (可选) - 默认返回值,默认为空字符串
**返回值**: any - 存储的值或默认值
**使用场景**:
- 用户数据读取
- 应用状态恢复
- 配置信息获取
**参数验证规则**:
- 键名必须为字符串
- 支持默认值机制
##### saveUserToken - 保存用户令牌
**方法签名**: `saveUserToken(token)`
**参数说明**:
- `token`: string - 用户令牌
**返回值**: void
**使用场景**:
- 用户登录状态管理
- 认证信息存储
- 会话管理
##### getUserToken - 获取用户令牌
**方法签名**: `getUserToken()`
**参数说明**: 无
**返回值**: string - 用户令牌或空字符串
**使用场景**:
- 请求头认证
- 用户状态检查
- 权限验证
##### saveEncryptBody - 设置加密开关
**方法签名**: `saveEncryptBody(bool)`
**参数说明**:
- `bool`: boolean - 加密开关,默认 true
**返回值**: void
**使用场景**:
- 加密功能配置
- 安全策略设置
- 性能权衡
##### getEncryptBody - 获取加密开关
**方法签名**: `getEncryptBody()`
**参数说明**: 无
**返回值**: boolean - 加密开关状态
**使用场景**:
- 加密功能状态检查
- 请求前状态确认
- 安全策略验证
**章节来源**
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
### TsGlobalConfig 全局配置模块
TsGlobalConfig 模块提供了统一的配置管理功能,支持运行时配置更新。
#### 核心 API 接口
##### getConfig - 获取配置
**方法签名**: `getConfig()`
**参数说明**: 无
**返回值**: object - 当前配置对象
**配置项说明**:
- `base64Key`: string - Base64 编码的密钥,默认值为 "WmdUzPJXbngVNiaSsQrihg=="
- `prefix`: string | function - API 前缀,可以是字符串或函数
- `onHttpError`: function - HTTP 错误回调函数
- `httpParams`: function - HTTP 参数处理器
##### setConfig - 设置配置
**方法签名**: `setConfig(obj)`
**参数说明**:
- `obj`: object - 要合并的配置对象
**返回值**: void
**使用场景**:
- 应用启动时的配置初始化
- 运行时配置动态更新
- 环境相关的配置切换
**参数验证规则**:
- 支持部分配置项的更新
- 使用对象合并的方式更新配置
**章节来源**
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
### TsHttpUtil HTTP 请求工具
TsHttpUtil 模块基于 umi-request 提供了增强的 HTTP 请求功能,集成了加密解密、参数处理、错误处理等功能。
#### 核心 API 接口
##### req - 通用请求方法
**方法签名**: `req(url, options)`
**参数说明**:
- `url`: string - 请求地址
- `options`: object - 请求选项
- `method`: string - HTTP 方法,默认 'GET'
- `params`: object - 查询参数
- `data`: object - 请求体数据
- `headers`: object - 请求头
- `rawResponse`: boolean - 是否返回原始响应
**返回值**: Promise<object> - 处理后的响应数据
**使用场景**:
- 统一的 HTTP 请求入口
- 复杂请求的参数处理
- 响应数据的统一格式化
##### get - GET 请求
**方法签名**: `get(url, params, options)`
**参数说明**:
- `url`: string - 请求地址
- `params`: object - 查询参数,默认 {}
- `options`: object - 请求选项,默认 {}
**返回值**: Promise<object> - 响应数据
**使用场景**:
- 数据获取请求
- 列表查询
- 资源读取
##### post - POST 请求
**方法签名**: `post(url, data, options)`
**参数说明**:
- `url`: string - 请求地址
- `data`: object - 请求体数据,默认 {}
- `options`: object - 请求选项,默认 {}
**返回值**: Promise<object> - 响应数据
**使用场景**:
- 数据创建
- 表单提交
- 资源更新
##### form - 表单提交
**方法签名**: `form(url, data, options)`
**参数说明**:
- `url`: string - 请求地址
- `data`: object - 表单数据,默认 {}
- `options`: object - 请求选项,默认 {}
**返回值**: Promise<object> - 响应数据
**使用场景**:
- 文件上传
- 表单数据提交
- 多部分数据传输
#### HTTP 请求处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as HTTP 工具
participant Config as 配置管理
participant Storage as 存储模块
participant Crypto as 加密模块
participant Request as 网络请求
Client->>HttpUtil : 发送请求
HttpUtil->>Config : 获取配置前缀
Config-->>HttpUtil : 返回前缀
HttpUtil->>HttpUtil : 处理分页参数
HttpUtil->>HttpUtil : 处理相等条件
HttpUtil->>Config : 获取额外参数
Config-->>HttpUtil : 返回额外参数
HttpUtil->>Storage : 获取用户令牌
Storage-->>HttpUtil : 返回令牌
HttpUtil->>Crypto : 加密请求体(可选)
Crypto-->>HttpUtil : 返回加密结果
HttpUtil->>Request : 发送网络请求
Request-->>HttpUtil : 返回响应
HttpUtil->>HttpUtil : 检查响应状态
HttpUtil->>Crypto : 解密响应(可选)
Crypto-->>HttpUtil : 返回解密结果
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
**章节来源**
- [TsHttpUtil.js:99-171](file://src/https/TsHttpUtil.js#L99-L171)
## 依赖分析
该工具包的依赖关系相对简单,主要依赖于两个外部库和内部模块间的协作。
### 外部依赖
| 依赖名称 | 版本 | 用途 |
|---------|------|------|
| base64-js | 1.5.1 | Base64 编解码 |
| umi-request | 1.4.0 | HTTP 请求封装 |
### 内部模块依赖
```mermaid
graph TD
subgraph "主入口"
Index[index.js]
end
subgraph "工具模块"
Common[TsCommon]
Crypto[TsCrypto]
SM4[TsSM4]
Storage[TsStorage]
Config[TsGlobalConfig]
end
subgraph "HTTP 模块"
HttpUtil[TsHttpUtil]
end
Index --> Common
Index --> Crypto
Index --> SM4
Index --> Storage
Index --> Config
Index --> HttpUtil
HttpUtil --> Storage
HttpUtil --> Common
HttpUtil --> Crypto
HttpUtil --> Config
Crypto --> SM4
Crypto --> Config
Storage --> Common
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
### 依赖关系分析
该工具包采用了清晰的模块化设计,各模块职责明确:
1. **TsCommon** 作为基础工具模块,被其他所有模块依赖
2. **TsCrypto** 依赖 **TsSM4****TsGlobalConfig** 进行加密操作
3. **TsStorage** 依赖 **TsCommon** 进行 JSON 解析
4. **TsHttpUtil** 依赖所有其他模块进行完整的 HTTP 请求处理
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
在使用该工具包时,需要考虑以下几个方面的性能影响:
### 字符串处理性能
- **URL 参数解析**: 使用正则表达式进行匹配,对于大量参数的 URL 可能影响性能
- **字符串替换**: `replaceAll` 使用全局正则表达式,复杂字符串可能影响性能
- **JSON 解析**: 大对象的序列化和反序列化可能成为性能瓶颈
### 加密解密性能
- **SM4 算法**: 32 轮加密循环,对于大文本加密会有明显的时间开销
- **Base64 编解码**: 大数据量的编码解码会影响性能
- **内存使用**: 加密解密过程中会产生中间缓冲区
### 存储性能
- **localStorage 操作**: 大对象序列化会影响存储性能
- **频繁读写**: 高频的存储操作可能影响页面响应性
### HTTP 请求优化
- **请求合并**: 合理设计 API 接口,避免不必要的请求
- **缓存策略**: 利用浏览器缓存减少重复请求
- **批量操作**: 将多个小请求合并为批量请求
## 故障排除指南
### 常见问题及解决方案
#### 1. 加密密钥错误
**问题症状**: 加密或解密时报错,提示密钥长度不正确
**解决方案**:
- 确保密钥长度为 16 字节
- 检查 Base64 编码是否正确
- 验证密钥格式符合要求
#### 2. URL 参数解析失败
**问题症状**: `getParamFormUrl` 返回空字符串
**解决方案**:
- 检查 URL 格式是否正确
- 确认参数键名拼写正确
- 验证 URL 中是否包含查询参数
#### 3. JSON 解析异常
**问题症状**: `parseJSON` 抛出异常或返回默认值
**解决方案**:
- 检查 JSON 字符串格式
- 验证字符编码是否正确
- 确认字符串不是 null 或 undefined
#### 4. HTTP 请求失败
**问题症状**: 网络请求返回错误状态
**解决方案**:
- 检查网络连接状态
- 验证 API 地址和参数
- 查看服务器响应状态码
- 检查跨域配置
#### 5. 存储数据丢失
**问题症状**: `get` 方法返回默认值而非预期数据
**解决方案**:
- 检查浏览器存储容量限制
- 验证键名是否一致
- 确认数据格式正确
- 检查浏览器隐私模式设置
### 调试技巧
1. **启用开发模式**: 使用 `isDevelopment()` 检测当前环境
2. **日志输出**: 在关键位置添加调试信息
3. **错误捕获**: 使用 try-catch 包装敏感操作
4. **单元测试**: 为关键函数编写测试用例
**章节来源**
- [TsSM4.js:103-122](file://src/utils/TsSM4.js#L103-L122)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 结论
该通用工具包提供了完整的 JavaScript 工具函数集合,具有以下特点:
### 优势
1. **模块化设计**: 清晰的功能划分,便于维护和扩展
2. **安全性**: 内置加密解密功能,支持敏感数据保护
3. **易用性**: 简洁的 API 设计,易于集成到现有项目
4. **完整性**: 覆盖了 Web 开发中的常见需求
### 使用建议
1. **合理选择加密模式**: 根据安全需求选择合适的加密算法和模式
2. **注意性能影响**: 大数据量处理时要考虑性能开销
3. **错误处理**: 建立完善的错误处理机制
4. **版本兼容**: 关注依赖库的版本更新和兼容性
### 扩展方向
1. **更多加密算法**: 可以添加 AES、RSA 等其他加密算法
2. **缓存机制**: 实现更高效的缓存策略
3. **监控功能**: 添加性能监控和错误追踪
4. **国际化支持**: 支持多语言错误消息
该工具包为 JavaScript 开发提供了坚实的基础工具集,能够有效提升开发效率和代码质量。

View File

@@ -0,0 +1,412 @@
# 配置管理 API
<cite>
**本文档引用的文件**
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
配置管理模块是 npm-tool 包的核心基础设施,负责管理系统级的全局配置。该模块提供了统一的配置存储、读取和更新机制,支持运行时动态配置管理。通过配置管理,开发者可以灵活地控制网络请求行为、加密参数、错误处理策略等关键功能。
本模块采用单例模式设计,使用浏览器全局对象 `window.httpConfig` 作为配置存储容器,确保配置在整个应用生命周期内的持久性和一致性。配置系统支持多种配置项类型,包括基础数据类型、函数类型和回调函数类型,为不同场景提供灵活的配置选项。
## 项目结构
npm-tool 包采用模块化设计,配置管理相关的核心文件位于 `src/utils/` 目录下:
```mermaid
graph TB
subgraph "配置管理模块"
TsGlobalConfig[TsGlobalConfig.js<br/>全局配置管理]
TsCrypto[TsCrypto.js<br/>加密工具]
TsSM4[TsSM4.js<br/>SM4算法实现]
end
subgraph "HTTP 请求模块"
TsHttpUtil[TsHttpUtil.js<br/>HTTP 请求封装]
end
subgraph "存储模块"
TsStorage[TsStorage.js<br/>本地存储]
end
subgraph "工具模块"
TsCommon[TsCommon.js<br/>通用工具]
end
subgraph "入口文件"
Index[index.js<br/>模块导出]
Package[package.json<br/>包配置]
end
TsGlobalConfig --> TsHttpUtil
TsCrypto --> TsSM4
TsCrypto --> TsGlobalConfig
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCommon
Index --> TsGlobalConfig
Index --> TsHttpUtil
Index --> TsCrypto
Index --> TsStorage
Index --> TsCommon
```
**图表来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
### 全局配置系统
全局配置系统是整个模块的核心,提供了配置的存储、读取和更新功能。系统采用默认配置与用户配置相结合的设计模式,确保在任何情况下都有可用的配置。
#### 配置项类型定义
| 配置项名称 | 类型 | 默认值 | 描述 |
|-----------|------|--------|------|
| base64Key | string | "WmdUzPJXbngVNiaSsQrihg==" | SM4 加密算法的 Base64 密钥 |
| prefix | string/function | "" | API 前缀,可为字符串或函数 |
| onHttpError | function | `(res) => {}` | HTTP 错误处理回调函数 |
| httpParams | function | `(res) => {}` | HTTP 请求参数处理函数 |
#### 配置优先级机制
配置系统采用以下优先级顺序:
1. **用户配置**:通过 `setConfig()` 设置的最新配置
2. **全局配置**:存储在 `window.httpConfig` 中的配置
3. **默认配置**:硬编码在代码中的默认值
**章节来源**
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 架构概览
配置管理模块采用分层架构设计,确保各组件之间的松耦合和高内聚:
```mermaid
graph TB
subgraph "配置管理层"
ConfigManager[配置管理器]
DefaultConfig[默认配置]
UserConfig[用户配置]
end
subgraph "应用层"
HttpUtil[HTTP 工具]
Crypto[加密工具]
Storage[存储工具]
end
subgraph "外部依赖"
Window[window.httpConfig]
UmiRequest[umi-request]
Base64Js[base64-js]
end
ConfigManager --> DefaultConfig
ConfigManager --> UserConfig
ConfigManager --> Window
HttpUtil --> ConfigManager
Crypto --> ConfigManager
HttpUtil --> UmiRequest
Crypto --> Base64Js
```
**图表来源**
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsHttpUtil.js:100-134](file://src/https/TsHttpUtil.js#L100-L134)
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
### 配置更新流程
```mermaid
sequenceDiagram
participant Client as 客户端代码
participant Config as 配置管理器
participant Window as window.httpConfig
participant HttpUtil as HTTP工具
Client->>Config : setConfig(新配置)
Config->>Window : 合并配置
Window-->>Config : 更新后的配置
Config-->>Client : 返回更新结果
HttpUtil->>Config : getConfig()
Config->>Window : 获取当前配置
Window-->>Config : 返回配置对象
Config-->>HttpUtil : 返回配置
HttpUtil->>HttpUtil : 使用配置执行请求
```
**图表来源**
- [TsGlobalConfig.js:27-29](file://src/utils/TsGlobalConfig.js#L27-L29)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
## 详细组件分析
### 配置管理器 (TsGlobalConfig)
配置管理器是整个系统的核心组件,负责管理全局配置的生命周期。
#### 方法签名
```javascript
// 获取当前配置
function getConfig(): ConfigObject
// 设置配置
function setConfig(obj?: Partial<ConfigObject>): void
```
#### 配置对象结构
```mermaid
classDiagram
class ConfigObject {
+string base64Key
+string|function prefix
+function onHttpError
+function httpParams
}
class DefaultConfig {
+string base64Key = "WmdUzPJXbngVNiaSsQrihg=="
+string prefix = ""
+function onHttpError
+function httpParams
}
class GlobalConfig {
+getConfig() : ConfigObject
+setConfig(obj) : void
}
ConfigObject <|-- DefaultConfig
GlobalConfig --> ConfigObject : uses
```
**图表来源**
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
#### 配置验证规则
配置系统实现了以下验证机制:
1. **类型验证**:确保配置项符合预期类型
2. **函数验证**:验证回调函数的可调用性
3. **密钥验证**:验证加密密钥的有效性
**章节来源**
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### HTTP 工具集成
HTTP 工具通过配置管理器获取运行时配置,实现动态配置管理。
#### 配置使用流程
```mermaid
flowchart TD
Start([开始请求]) --> GetConfig[获取配置]
GetConfig --> CheckPrefix{检查前缀类型}
CheckPrefix --> |函数| CallPrefix[调用前缀函数]
CheckPrefix --> |字符串| UsePrefix[使用字符串前缀]
CallPrefix --> BuildURL[构建完整URL]
UsePrefix --> BuildURL
BuildURL --> AddParams[添加额外参数]
AddParams --> EncryptCheck{检查加密开关}
EncryptCheck --> |启用| EncryptData[加密数据]
EncryptCheck --> |禁用| SendRequest[发送请求]
EncryptData --> SendRequest
SendRequest --> HandleResponse[处理响应]
HandleResponse --> End([结束])
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
#### 配置项详细说明
| 配置项 | 类型 | 默认值 | 作用域 | 说明 |
|--------|------|--------|--------|------|
| base64Key | string | "WmdUzPJXbngVNiaSsQrihg==" | 全局 | SM4 加密算法密钥,用于数据加解密 |
| prefix | string/function | "" | HTTP 请求 | API 基础路径,支持动态函数生成 |
| onHttpError | function | `(res) => {}` | HTTP 请求 | 自定义错误处理逻辑 |
| httpParams | function | `(res) => {}` | HTTP 请求 | 动态添加请求参数 |
**章节来源**
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsHttpUtil.js:100-134](file://src/https/TsHttpUtil.js#L100-L134)
### 加密模块集成
加密模块通过配置管理器获取密钥信息,实现安全的数据传输。
#### 加密配置流程
```mermaid
sequenceDiagram
participant Crypto as 加密模块
participant Config as 配置管理器
participant SM4 as SM4算法
participant Window as window对象
Crypto->>Config : getConfig()
Config->>Window : 获取base64Key
Window-->>Config : 返回密钥
Config-->>Crypto : 返回配置
Crypto->>SM4 : 初始化加密器
SM4->>Crypto : 加密器实例
Crypto-->>SM4 : 执行加密
SM4-->>Crypto : 返回加密结果
```
**图表来源**
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsSM4.js:102-156](file://src/utils/TsSM4.js#L102-L156)
**章节来源**
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsSM4.js:102-156](file://src/utils/TsSM4.js#L102-L156)
## 依赖关系分析
配置管理模块与其他模块的依赖关系如下:
```mermaid
graph LR
subgraph "核心依赖"
TsGlobalConfig[TsGlobalConfig.js]
TsHttpUtil[TsHttpUtil.js]
TsCrypto[TsCrypto.js]
end
subgraph "外部依赖"
umi_request[umi-request]
base64_js[base64-js]
end
subgraph "内部依赖"
TsStorage[TsStorage.js]
TsCommon[TsCommon.js]
TsSM4[TsSM4.js]
end
TsGlobalConfig --> TsHttpUtil
TsGlobalConfig --> TsCrypto
TsHttpUtil --> umi_request
TsCrypto --> base64_js
TsCrypto --> TsSM4
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCommon
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsCrypto.js:1-4](file://src/utils/TsCrypto.js#L1-L4)
### 模块导出结构
```mermaid
classDiagram
class ExportModule {
+TsHttpUtil
+TsCommon
+TsStorage
+TsSM4
+TsCrypto
+TsGlobalConfig
}
class TsGlobalConfig {
+setConfig(obj)
+getConfig()
}
class TsHttpUtil {
+req(url, options)
+get(url, params, options)
+post(url, data, options)
+form(url, data, options)
}
ExportModule --> TsGlobalConfig
ExportModule --> TsHttpUtil
```
**图表来源**
- [index.js:8-15](file://index.js#L8-L15)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 性能考虑
配置管理模块在设计时充分考虑了性能优化:
### 缓存机制
- 配置读取采用缓存策略,避免重复的对象合并操作
- 加密器实例化后复用,减少内存分配开销
### 异步处理
- 配置更新采用异步方式,不影响主线程执行
- HTTP 请求处理支持 Promise 异步模式
### 内存管理
- 配置对象采用浅拷贝策略,减少内存占用
- 及时清理不再使用的配置引用
## 故障排除指南
### 常见配置问题
#### 配置不生效
**症状**:设置配置后,系统仍然使用默认配置
**解决方案**
1. 确认配置对象的键名正确
2. 检查配置值的类型是否符合要求
3. 验证配置更新时机是否正确
#### 加密失败
**症状**:数据加密或解密过程中出现错误
**解决方案**
1. 验证 base64Key 的长度是否为 16 字节
2. 检查密钥格式是否正确
3. 确认加密模式配置正确
#### HTTP 请求异常
**症状**:网络请求失败或返回错误
**解决方案**
1. 检查 prefix 配置是否正确
2. 验证 onHttpError 回调函数逻辑
3. 确认 httpParams 函数返回正确的参数对象
**章节来源**
- [TsSM4.js:103-122](file://src/utils/TsSM4.js#L103-L122)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 结论
配置管理模块为 npm-tool 包提供了强大而灵活的配置管理能力。通过统一的配置接口,开发者可以轻松地定制各种系统行为,包括网络请求、数据加密、错误处理等关键功能。
模块设计遵循了以下原则:
- **单一职责**:配置管理专注于配置的存储和读取
- **松耦合**:通过接口抽象降低模块间的依赖
- **可扩展性**:支持动态配置和运行时更新
- **安全性**:提供加密配置和参数验证机制
未来可以考虑的功能增强:
- 配置版本管理
- 配置热重载机制
- 更完善的配置验证和错误提示
- 配置持久化到本地存储

View File

@@ -0,0 +1,831 @@
# 快速开始
<cite>
**本文档引用的文件**
- [package.json](file://package.json)
- [README.md](file://README.md)
- [index.js](file://index.js)
- [src/utils/TsCommon.js](file://src/utils/TsCommon.js)
- [src/utils/TsStorage.js](file://src/utils/TsStorage.js)
- [src/https/TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [src/utils/TsCrypto.js](file://src/utils/TsCrypto.js)
- [src/utils/TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [src/utils/TsSM4.js](file://src/utils/TsSM4.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [安装与配置](#安装与配置)
4. [核心模块详解](#核心模块详解)
5. [第一个应用示例](#第一个应用示例)
6. [使用模式与最佳实践](#使用模式与最佳实践)
7. [常见问题与解决方案](#常见问题与解决方案)
8. [架构概览](#架构概览)
9. [故障排除指南](#故障排除指南)
10. [总结](#总结)
## 简介
npm-tool 是一个功能丰富的 JavaScript 工具包,专为现代 Web 应用开发而设计。该工具包提供了网络请求、数据存储、加密解密、通用工具函数等核心功能,旨在简化开发者的工作流程并提高开发效率。
本工具包的主要特性包括:
- **HTTP 请求管理**:基于 umi-request 的强大网络请求库
- **本地存储管理**:安全的对象序列化存储
- **数据加密解密**:支持 SM4 对称加密算法
- **通用工具函数**:字符串处理、参数解析、环境检测等
- **全局配置管理**:灵活的配置系统支持
## 项目结构
npm-tool 工具包采用模块化的组织方式,主要分为以下几个核心目录:
```mermaid
graph TB
subgraph "npm-tool 工具包"
A[index.js 主入口]
subgraph "src/utils 工具模块"
B[TsCommon.js 通用工具]
C[TsStorage.js 存储管理]
D[TsCrypto.js 加密解密]
E[TsGlobalConfig.js 全局配置]
F[TsSM4.js SM4算法实现]
end
subgraph "src/https 网络模块"
G[TsHttpUtil.js HTTP工具]
end
subgraph "依赖包"
H[umi-request 网络请求]
I[base64-js 编码转换]
end
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
G --> H
D --> I
D --> F
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:1-24](file://package.json#L1-L24)
- [index.js:1-16](file://index.js#L1-L16)
## 安装与配置
### 系统要求
- Node.js 版本:>= 12.0.0
- 包管理器npm 或 yarn
- 浏览器兼容性现代浏览器Chrome、Firefox、Safari、Edge
### 安装步骤
1. **通过 npm 安装**
```bash
npm install @tiesheng/npm-tool
```
2. **通过 yarn 安装**
```bash
yarn add @tiesheng/npm-tool
```
3. **验证安装**
```bash
npm list @tiesheng/npm-tool
```
### 基础配置
#### 全局配置设置
在使用任何功能之前,需要先配置全局参数:
```javascript
import { HttpUtil } from '@tiesheng/npm-tool';
// 设置全局配置
HttpUtil.setConfig({
prefix: 'https://api.example.com',
base64Key: 'WmdUzPJXbngVNiaSsQrihg==',
onHttpError: (res) => {
console.error('HTTP 错误:', res);
},
httpParams: () => ({
version: '1.0',
platform: 'web'
})
});
```
#### 环境变量配置
```javascript
// 开发环境配置
process.env.NODE_ENV = 'development';
// 生产环境配置
process.env.NODE_ENV = 'production';
```
**章节来源**
- [README.md:12-26](file://README.md#L12-L26)
- [src/utils/TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
## 核心模块详解
### HttpUtil 模块
HttpUtil 是整个工具包的核心网络请求模块,基于 umi-request 构建,提供了完整的 HTTP 请求功能。
#### 主要功能
1. **GET 请求**
```javascript
import { HttpUtil } from '@tiesheng/npm-tool';
const response = await HttpUtil.get('/users', {
params: { page: 1, limit: 10 }
});
```
2. **POST 请求**
```javascript
const response = await HttpUtil.post('/users', {
name: 'John Doe',
email: 'john@example.com'
});
```
3. **表单提交**
```javascript
const formData = new FormData();
formData.append('file', fileInput.files[0]);
const response = await HttpUtil.form('/upload', formData);
```
#### 高级配置
```javascript
// 启用数据加密
import { Storage } from '@tiesheng/npm-tool';
Storage.saveEncryptBody(true);
// 设置自定义头部
const response = await HttpUtil.post('/secure-endpoint', data, {
headers: {
'Authorization': 'Bearer token'
}
});
```
**图表来源**
- [src/https/TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
**章节来源**
- [src/https/TsHttpUtil.js:136-165](file://src/https/TsHttpUtil.js#L136-L165)
- [README.md:12-26](file://README.md#L12-L26)
### Storage 模块
Storage 模块提供了安全的对象存储功能,基于 localStorage 实现,并自动处理 JSON 序列化。
#### 主要功能
1. **保存数据**
```javascript
import { Storage } from '@tiesheng/npm-tool';
// 保存对象
Storage.save('userData', {
id: 1,
name: 'John Doe',
preferences: { theme: 'dark' }
});
// 保存简单值
Storage.save('username', 'johndoe');
```
2. **获取数据**
```javascript
// 获取对象
const userData = Storage.get('userData');
console.log(userData.name); // John Doe
// 获取简单值
const username = Storage.get('username', 'defaultUser');
```
3. **用户认证存储**
```javascript
// 保存用户令牌
Storage.saveUserToken('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
// 获取用户令牌
const token = Storage.getUserToken();
```
**图表来源**
- [src/utils/TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
**章节来源**
- [src/utils/TsStorage.js:26-43](file://src/utils/TsStorage.js#L26-L43)
- [README.md:28-41](file://README.md#L28-L41)
### Common 模块
Common 模块提供了常用的工具函数,涵盖了字符串处理、参数解析、环境检测等功能。
#### 主要功能
1. **参数解析**
```javascript
import { Common } from '@tiesheng/npm-tool';
// 解析 URL 参数
const userId = Common.getParamFormUrl('userId');
const token = Common.getParamFormUrl('token');
// JSON 解析
const jsonString = '{"name":"John","age":30}';
const obj = Common.parseJSON(jsonString, {});
```
2. **字符串处理**
```javascript
// 检查空值
if (Common.isEmpty(value)) {
console.log('值为空');
}
// 字符串替换
const text = Common.replaceAll('Hello world', 'world', 'JavaScript');
// 结尾检查
if (Common.endWith('hello.txt', '.txt')) {
console.log('文件是文本文件');
}
```
3. **环境检测**
```javascript
// 检查开发环境
if (Common.isDevelopment()) {
console.log('当前是开发环境');
}
```
**章节来源**
- [src/utils/TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
### Crypto 模块
Crypto 模块基于 SM4 对称加密算法,提供了数据加密和解密功能。
#### 主要功能
1. **加密数据**
```javascript
import { Crypto } from '@tiesheng/npm-tool';
const originalData = { sensitive: 'confidential' };
const encryptedData = Crypto.encrypt(JSON.stringify(originalData));
```
2. **解密数据**
```javascript
const decryptedData = Crypto.decrypt(encryptedData);
const originalObject = JSON.parse(decryptedData);
```
#### 配置要求
```javascript
// 在全局配置中设置加密密钥
HttpUtil.setConfig({
base64Key: 'WmdUzPJXbngVNiaSsQrihg==' // 16字节 Base64 密钥
});
```
**章节来源**
- [src/utils/TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [src/utils/TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
## 第一个应用示例
下面是一个完整的应用示例,展示了如何从零开始创建一个使用 npm-tool 的应用程序。
### 项目初始化
1. **创建项目目录**
```bash
mkdir my-npm-tool-app
cd my-npm-tool-app
npm init -y
```
2. **安装依赖**
```bash
npm install @tiesheng/npm-tool
```
3. **创建主文件**
```javascript
// app.js
import { HttpUtil, Storage, Common } from '@tiesheng/npm-tool';
// 设置全局配置
HttpUtil.setConfig({
prefix: 'https://api.example.com',
onHttpError: (res) => {
console.error(`请求失败: ${res.message}`);
}
});
// 初始化应用
async function initApp() {
try {
// 1. 检查用户登录状态
const token = Storage.getUserToken();
if (!token) {
console.log('用户未登录');
return;
}
// 2. 获取用户信息
const userInfo = await HttpUtil.get('/user/profile');
console.log('用户信息:', userInfo.data);
// 3. 更新用户偏好设置
const preferences = {
theme: 'dark',
notifications: true
};
const updateResponse = await HttpUtil.post('/user/preferences', preferences);
console.log('更新结果:', updateResponse.data);
// 4. 保存到本地存储
Storage.save('lastVisit', new Date().toISOString());
console.log('应用初始化完成!');
} catch (error) {
console.error('应用初始化失败:', error);
}
}
initApp();
```
### 运行应用
1. **启动开发服务器**
```bash
node app.js
```
2. **查看输出**
```
用户信息: {id: 1, name: "John Doe"}
更新结果: {success: true}
应用初始化完成!
```
### 错误处理示例
```javascript
// 错误处理的最佳实践
async function safeApiCall() {
try {
const response = await HttpUtil.get('/api/data');
return response.data;
} catch (error) {
if (error.code === 401) {
// 处理未授权错误
Storage.saveUserToken(''); // 清除无效令牌
redirectToLogin();
} else if (error.code === 500) {
// 处理服务器错误
showErrorMessage('服务器暂时不可用,请稍后重试');
} else {
// 处理其他错误
console.error('API 调用失败:', error.message);
}
throw error;
}
}
```
**章节来源**
- [README.md:1-43](file://README.md#L1-L43)
## 使用模式与最佳实践
### 1. 模块导入模式
推荐使用解构导入的方式:
```javascript
// 推荐:解构导入
import { HttpUtil, Storage, Common } from '@tiesheng/npm-tool';
// 不推荐:逐个导入
import * as TsHttpUtil from '@tiesheng/npm-tool';
import * as TsStorage from '@tiesheng/npm-tool';
```
### 2. 配置管理最佳实践
```javascript
// 创建配置文件 config.js
export const AppConfig = {
// 基础配置
baseURL: process.env.API_BASE_URL || 'https://api.example.com',
timeout: 10000,
// 加密配置
encryptionEnabled: true,
// 错误处理
onError: (error) => {
console.error('应用错误:', error);
// 可以添加错误上报逻辑
}
};
// 在应用启动时应用配置
HttpUtil.setConfig(AppConfig);
```
### 3. 数据流管理
```javascript
// 推荐的数据流模式
class DataManager {
constructor() {
this.cache = new Map();
this.loadingStates = new Map();
}
async getData(key, apiEndpoint, params = {}) {
// 1. 检查缓存
if (this.cache.has(key)) {
return this.cache.get(key);
}
// 2. 设置加载状态
this.loadingStates.set(key, true);
try {
// 3. 发送请求
const response = await HttpUtil.get(apiEndpoint, params);
// 4. 更新缓存
this.cache.set(key, response.data);
return response.data;
} finally {
// 5. 清理加载状态
this.loadingStates.set(key, false);
}
}
}
```
### 4. 错误处理策略
```javascript
// 统一错误处理装饰器
function withErrorHandler(target, propertyName, descriptor) {
const method = descriptor.value;
descriptor.value = async function(...args) {
try {
return await method.apply(this, args);
} catch (error) {
// 记录错误
console.error(`方法 ${propertyName} 执行失败:`, error);
// 触发全局错误处理
if (HttpUtil.setConfig) {
const config = HttpUtil.setConfig.getConfig();
if (config.onHttpError) {
config.onHttpError(error);
}
}
throw error;
}
};
return descriptor;
}
```
### 5. 性能优化建议
```javascript
// 请求去重
const requestCache = new Map();
async function getCachedData(url, params) {
const cacheKey = `${url}_${JSON.stringify(params)}`;
if (requestCache.has(cacheKey)) {
return requestCache.get(cacheKey);
}
const promise = HttpUtil.get(url, params);
requestCache.set(cacheKey, promise);
try {
const result = await promise;
return result;
} finally {
// 移除已完成的请求
requestCache.delete(cacheKey);
}
}
```
## 常见问题与解决方案
### 1. 安装问题
**问题npm install 失败**
```bash
npm ERR! peer dep missing: umi-request@^1.4.0
```
**解决方案:**
```bash
# 清理缓存
npm cache clean --force
# 删除 node_modules 和 package-lock.json
rm -rf node_modules package-lock.json
# 重新安装
npm install @tiesheng/npm-tool
```
### 2. 配置问题
**问题HttpUtil.get 报错 'prefix' 未定义**
```javascript
// 错误的配置
HttpUtil.setConfig({});
// 正确的配置
HttpUtil.setConfig({
prefix: 'https://api.example.com',
base64Key: 'WmdUzPJXbngVNiaSsQrihg=='
});
```
### 3. 加密问题
**问题Crypto.encrypt 返回 undefined**
```javascript
// 错误:未设置加密密钥
Crypto.encrypt('data');
// 正确:先设置全局配置
HttpUtil.setConfig({
base64Key: 'WmdUzPJXbngVNiaSsQrihg=='
});
```
### 4. 存储问题
**问题Storage.get 返回空值**
```javascript
// 检查存储是否正常工作
console.log('localStorage 支持:', typeof Storage !== 'undefined');
console.log('存储内容:', localStorage.getItem('test'));
// 使用默认值
const data = Storage.get('key', 'defaultValue');
```
### 5. 环境问题
**问题Common.isDevelopment() ststus 返回 false**
```javascript
// 在 Node.js 环境中
process.env.NODE_ENV = 'development';
// 在浏览器环境中
// 通过构建工具设置环境变量
```
### 6. 跨域问题
**问题CORS 错误**
```javascript
// 在 HttpUtil 配置中添加自定义头部
HttpUtil.setConfig({
prefix: 'https://api.example.com',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
```
**章节来源**
- [src/utils/TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [src/utils/TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
## 架构概览
npm-tool 工具包采用了清晰的分层架构设计,确保了模块间的低耦合和高内聚。
```mermaid
graph TB
subgraph "应用层"
A[业务应用]
B[控制器层]
end
subgraph "服务层"
C[HttpUtil 网络服务]
D[Storage 存储服务]
E[Crypto 加密服务]
end
subgraph "工具层"
F[Common 通用工具]
G[GlobalConfig 全局配置]
H[SM4 加密算法]
end
subgraph "基础设施"
I[umi-request 网络库]
J[base64-js 编码库]
K[localStorage 本地存储]
end
A --> C
A --> D
A --> E
B --> C
B --> D
B --> E
C --> F
C --> G
C --> I
D --> F
D --> K
E --> H
E --> J
H --> J
```
**图表来源**
- [index.js:8-15](file://index.js#L8-L15)
- [src/https/TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
### 数据流图
```mermaid
sequenceDiagram
participant App as 应用程序
participant HttpUtil as HttpUtil
participant Request as umi-request
participant Crypto as Crypto
participant Storage as Storage
App->>HttpUtil : 发送请求
HttpUtil->>Storage : 获取用户令牌
Storage-->>HttpUtil : 返回令牌
HttpUtil->>HttpUtil : 处理请求参数
HttpUtil->>Crypto : 加密数据(可选)
Crypto-->>HttpUtil : 返回加密数据
HttpUtil->>Request : 发送网络请求
Request-->>HttpUtil : 返回响应
HttpUtil->>Crypto : 解密数据(可选)
Crypto-->>HttpUtil : 返回解密数据
HttpUtil-->>App : 返回处理后的数据
```
**图表来源**
- [src/https/TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [src/utils/TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
## 故障排除指南
### 1. 调试技巧
```javascript
// 启用详细日志
HttpUtil.setConfig({
onHttpError: (res) => {
console.error('HTTP 错误详情:', {
code: res.code,
message: res.message,
url: res.url,
timestamp: new Date()
});
}
});
// 检查网络请求状态
const response = await HttpUtil.get('/test');
console.log('响应状态:', response);
```
### 2. 性能监控
```javascript
// 请求性能监控
function monitorRequest(url, startTime) {
return (response) => {
const duration = Date.now() - startTime;
console.log(`请求 ${url} 耗时: ${duration}ms`);
if (duration > 5000) {
console.warn(`请求 ${url} 可能存在性能问题`);
}
return response;
};
}
// 使用监控
const startTime = Date.now();
const response = await HttpUtil.get('/slow-endpoint')
.then(monitorRequest('/slow-endpoint', startTime));
```
### 3. 内存泄漏预防
```javascript
// 正确清理定时器和事件监听器
class ApiClient {
constructor() {
this.timers = [];
this.listeners = [];
}
cleanup() {
// 清理定时器
this.timers.forEach(timer => clearTimeout(timer));
this.timers = [];
// 清理事件监听器
this.listeners.forEach(listener => listener.remove());
this.listeners = [];
}
}
```
### 4. 错误恢复策略
```javascript
// 自动重试机制
async function retryableRequest(requestFn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await requestFn();
} catch (error) {
if (i === maxRetries - 1) throw error;
// 指数退避
const delay = Math.pow(2, i) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
// 使用重试机制
const data = await retryableRequest(() => HttpUtil.get('/api/data'));
```
**章节来源**
- [src/https/TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [src/utils/TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
## 总结
npm-tool 工具包为现代 JavaScript 应用开发提供了完整的基础设施支持。通过本文档的学习,您应该能够:
1. **快速上手**:正确安装和配置工具包
2. **掌握核心功能**:熟练使用 HttpUtil、Storage、Common 等模块
3. **最佳实践**:遵循推荐的使用模式和配置策略
4. **故障排除**:有效解决常见问题和异常情况
### 下一步建议
1. **深入学习**:研究每个模块的完整 API 文档
2. **实际应用**:在真实项目中应用这些工具
3. **性能优化**:根据项目需求调整配置参数
4. **扩展功能**:基于现有架构添加自定义功能
记住好的工具包不仅要有强大的功能更重要的是要易于使用和维护。npm-tool 正是朝着这个方向努力的工具包,希望它能为您的开发工作带来便利。

View File

@@ -0,0 +1,715 @@
# 加密解密问题
<cite>
**本文引用的文件**
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本指南专注于该代码库中的加密解密功能特别是SM4算法的实现和使用。该工具包提供了完整的加密解密解决方案包括密钥管理、数据加密、HTTP请求加密传输等功能。本文档将详细说明如何诊断和解决加密解密过程中可能遇到的各种问题。
## 项目结构
该项目采用模块化设计,主要包含以下核心模块:
```mermaid
graph TB
subgraph "核心模块"
Crypto[TsCrypto<br/>加密器]
SM4[TsSM4<br/>SM4算法实现]
HttpUtil[TsHttpUtil<br/>HTTP工具]
end
subgraph "配置管理"
GlobalConfig[TsGlobalConfig<br/>全局配置]
Storage[TsStorage<br/>本地存储]
end
subgraph "工具函数"
Common[TsCommon<br/>通用工具]
end
Crypto --> SM4
HttpUtil --> Crypto
HttpUtil --> GlobalConfig
HttpUtil --> Storage
Crypto --> GlobalConfig
Storage --> Common
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
### 加密器 (TsCrypto)
加密器是整个加密系统的核心负责协调SM4算法和密钥管理
```mermaid
classDiagram
class TsCrypto {
-sm4 : SM4
+constructor()
+encrypt(content) : String
+decrypt(base64) : String
}
class SM4 {
-key : Uint8Array
-iv : Uint8Array
-mode : String
-cipherType : String
-encryptRoundKeys : Uint32Array
-decryptRoundKeys : Uint32Array
+constructor(config)
+encrypt(plaintext) : String
+decrypt(ciphertext) : String
}
TsCrypto --> SM4 : 使用
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
### HTTP加密传输
HTTP工具实现了端到端的加密传输机制
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as HTTP工具
participant Crypto as 加密器
participant Server as 服务器
Client->>HttpUtil : 发送请求(启用加密)
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto->>Crypto : SM4加密
Crypto-->>HttpUtil : 返回加密数据
HttpUtil->>Server : POST /api (encryptData)
Server->>Server : 解密响应数据
Server-->>HttpUtil : 返回加密响应
HttpUtil->>Crypto : decrypt(response.data)
Crypto-->>HttpUtil : 返回明文数据
HttpUtil-->>Client : 返回解析后的数据
```
**图表来源**
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构概览
该系统的加密架构遵循分层设计原则:
```mermaid
graph TD
subgraph "应用层"
App[业务应用]
end
subgraph "HTTP层"
HttpUtil[HTTP工具]
EncryptSwitch[加密开关]
end
subgraph "加密层"
Crypto[加密器]
SM4[SM4算法]
Padding[填充算法]
end
subgraph "配置层"
Config[全局配置]
KeyStore[密钥存储]
end
subgraph "传输层"
Network[网络传输]
Base64[Base64编码]
end
App --> HttpUtil
HttpUtil --> EncryptSwitch
EncryptSwitch --> Crypto
Crypto --> SM4
SM4 --> Padding
Crypto --> Config
Config --> KeyStore
SM4 --> Base64
Base64 --> Network
```
**图表来源**
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
## 详细组件分析
### SM4算法实现
SM4是中国国家密码标准的对称加密算法具有以下特点
#### 核心算法特性
- **块大小**: 128位 (16字节)
- **密钥长度**: 128位 (16字节)
- **支持模式**: ECB和CBC两种工作模式
- **填充方式**: PKCS#7填充
- **输出格式**: Base64编码
#### 关键实现细节
```mermaid
flowchart TD
Start([开始加密]) --> Convert["转换字符串为UTF-8字节数组"]
Convert --> Pad["执行PKCS#7填充"]
Pad --> Mode{"选择加密模式"}
Mode --> |CBC| CBCInit["初始化IV链"]
Mode --> |ECB| ECBInit["直接处理块"]
CBCInit --> BlockLoop["遍历每个16字节块"]
ECBInit --> BlockLoop
BlockLoop --> XOR{"CBC模式需要XOR"}
XOR --> |是| XORCalc["与前一块结果XOR"]
XOR --> |否| DirectCrypt["直接加密"]
XORCalc --> SM4Crypt["SM4算法加密"]
DirectCrypt --> SM4Crypt
SM4Crypt --> Output{"输出格式"}
Output --> |Base64| Base64Encode["Base64编码"]
Output --> |Text| TextEncode["UTF-8编码"]
Base64Encode --> End([完成])
TextEncode --> End
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
**章节来源**
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
### 加密器配置
加密器通过全局配置管理密钥和加密参数:
#### 配置参数说明
| 参数名 | 类型 | 必需 | 默认值 | 描述 |
|--------|------|------|--------|------|
| base64Key | String | 是 | WmdUzPJXbngVNiaSsQrihg== | Base64编码的16字节密钥 |
| mode | String | 否 | ecb | 加密模式 (ecb/cbc) |
| cipherType | String | 否 | base64 | 输出格式 (base64/text) |
**章节来源**
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
### HTTP加密传输机制
HTTP工具实现了透明的加密传输
```mermaid
sequenceDiagram
participant App as 应用
participant Storage as 存储
participant HttpUtil as HTTP工具
participant Crypto as 加密器
participant Server as 服务器
App->>Storage : getEncryptBody()
Storage-->>App : true/false
App->>HttpUtil : post(url, data)
HttpUtil->>Storage : 检查加密开关
alt 加密开启
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto->>Crypto : SM4加密
Crypto-->>HttpUtil : 加密结果
HttpUtil->>Server : POST encryptData
else 加密关闭
HttpUtil->>Server : POST 原始数据
end
Server-->>HttpUtil : 返回响应
HttpUtil->>Crypto : decrypt(response.data)
Crypto-->>HttpUtil : 明文数据
HttpUtil-->>App : 解析后的数据
```
**图表来源**
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
**章节来源**
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 依赖关系分析
项目依赖关系清晰明确,主要依赖如下:
```mermaid
graph LR
subgraph "外部依赖"
Base64[base64-js@1.5.1]
UmiRequest[umi-request@1.4.0]
end
subgraph "内部模块"
TsCrypto[TsCrypto.js]
TsSM4[TsSM4.js]
TsHttpUtil[TsHttpUtil.js]
TsGlobalConfig[TsGlobalConfig.js]
TsStorage[TsStorage.js]
end
Base64 --> TsCrypto
Base64 --> TsSM4
UmiRequest --> TsHttpUtil
TsCrypto --> TsSM4
TsHttpUtil --> TsCrypto
TsHttpUtil --> TsGlobalConfig
TsHttpUtil --> TsStorage
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
## 性能考虑
### 加密性能特征
1. **算法复杂度**: SM4算法的时间复杂度为O(n)其中n为数据块数量
2. **内存使用**: 主要受数据大小影响每个块16字节
3. **CPU消耗**: 对称加密算法CPU开销相对较小
### 优化建议
1. **批量处理**: 对于大量小数据,考虑合并处理以减少开销
2. **缓存策略**: 对于重复的加密操作,可以考虑结果缓存
3. **异步处理**: 在大数据量场景下使用异步处理避免阻塞
## 故障排除指南
### SM4加密失败
#### 常见错误及解决方案
**错误1: 密钥长度不正确**
- **错误信息**: "key should be a 16 bytes string"
- **原因**: 密钥必须是16字节(128位)
- **解决方案**:
1. 验证密钥长度是否为16字节
2. 确认Base64密钥解码后长度为16
3. 检查密钥是否被意外截断或修改
**错误2: IV参数错误**
- **错误信息**: "iv error"
- **原因**: CBC模式下IV必须存在且长度为16字节
- **解决方案**:
1. 确保在CBC模式下提供正确的IV
2. 验证IV长度为16字节
3. 检查IV是否与加密端一致
**错误3: 数据格式问题**
- **错误信息**: 解密时抛出异常
- **原因**: 输入数据格式不符合预期
- **解决方案**:
1. 确认输入数据为正确的Base64字符串
2. 验证数据完整性
3. 检查是否有额外的空白字符
#### 排查流程
```mermaid
flowchart TD
Start([开始排查]) --> CheckKey["检查密钥配置"]
CheckKey --> KeyOK{"密钥有效?"}
KeyOK --> |否| FixKey["修复密钥配置"]
KeyOK --> |是| CheckMode["检查加密模式"]
FixKey --> CheckMode
CheckMode --> ModeOK{"模式正确?"}
ModeOK --> |否| FixMode["修正加密模式"]
ModeOK --> |是| CheckData["验证数据格式"]
FixMode --> CheckData
CheckData --> DataOK{"数据格式正确?"}
DataOK --> |否| FixData["修正数据格式"]
DataOK --> |是| TestEncrypt["测试加密功能"]
FixData --> TestEncrypt
TestEncrypt --> Success{"问题解决?"}
Success --> |否| ContactSupport["联系技术支持"]
Success --> |是| End([完成])
```
**图表来源**
- [TsSM4.js:103-122](file://src/utils/TsSM4.js#L103-L122)
- [TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)
### 解密错误
#### 常见解密问题
**问题1: 解密结果为空或乱码**
- **症状**: 解密后返回空字符串或不可读字符
- **可能原因**:
1. 密钥不匹配
2. 数据在传输过程中被篡改
3. 编码格式不一致
**问题2: 解密抛出异常**
- **症状**: 程序直接崩溃
- **可能原因**:
1. Base64字符串无效
2. 数据长度不是16字节的倍数
3. 填充数据损坏
**问题3: 解密速度慢**
- **症状**: 解密过程耗时较长
- **可能原因**:
1. 数据量过大
2. 系统资源不足
3. 算法实现效率问题
#### 解决方案
**步骤1: 验证密钥配置**
1. 检查全局配置中的base64Key
2. 确认密钥解码后长度为16字节
3. 验证密钥与服务器端一致
**步骤2: 检查数据完整性**
1. 验证Base64字符串格式
2. 确认数据未被截断
3. 检查是否有额外字符
**步骤3: 测试解密流程**
```javascript
// 示例测试代码
try {
const testData = "your_base64_data_here";
const decrypted = crypto.decrypt(testData);
console.log("解密结果:", decrypted);
} catch (error) {
console.error("解密失败:", error.message);
}
```
### Base64编码问题
#### 常见Base64问题
**问题1: 编码后数据长度异常**
- **现象**: Base64编码后的数据长度不符合预期
- **原因**: 字符串编码问题或数据截断
**问题2: 解码失败**
- **现象**: Base64解码时报错
- **原因**: 包含非法字符或格式错误
**问题3: 中文字符显示异常**
- **现象**: 中文字符在Base64中显示为乱码
- **原因**: 编码/解码时未使用UTF-8
#### 排查方法
**方法1: 验证编码一致性**
1. 确保使用UTF-8编码
2. 检查Base64字符集
3. 验证填充字符处理
**方法2: 测试编码流程**
```javascript
// 编码测试
const original = "测试数据";
const encoded = base64js.fromByteArray(utf8Encode(original));
const decoded = utf8Decode(base64js.toByteArray(encoded));
if (original === decoded) {
console.log("编码解码正常");
} else {
console.log("编码解码异常");
}
```
### 密钥配置错误
#### 配置检查清单
**检查项1: 密钥格式**
- Base64密钥必须为44个字符(16字节)
- 不包含任何空白字符
- 符合Base64字符集
**检查项2: 密钥内容**
- 确认密钥未被修改
- 验证密钥与服务器端一致
- 检查是否有特殊字符
**检查项3: 配置加载**
- 确认全局配置正确加载
- 验证window.httpConfig设置
- 检查配置优先级
#### 修复步骤
1. **重新生成密钥**: 使用安全的随机源生成新的16字节密钥
2. **更新配置**: 将新密钥设置到全局配置中
3. **同步服务器**: 更新服务器端的密钥配置
4. **测试验证**: 执行完整的加解密测试
### 加密模式选择不当
#### ECB vs CBC模式对比
| 特性 | ECB模式 | CBC模式 |
|------|---------|---------|
| 安全性 | 较低,相同明文产生相同密文 | 较高,引入随机性 |
| 性能 | 稍快 | 稍慢 |
| 实现复杂度 | 简单 | 需要IV |
| 适用场景 | 短小、独立的数据 | 一般数据传输 |
**选择建议**:
- **CBC模式**: 推荐用于大多数场景
- **ECB模式**: 仅适用于特殊需求或测试
### 填充算法不匹配
#### PKCS#7填充规则
PKCS#7填充确保数据长度为16字节的倍数
- 填充值 = 16 - (明文字节长度 % 16)
- 最少填充1字节最多填充16字节
**常见问题**:
1. 填充长度计算错误
2. 填充字节值不正确
3. 去填充逻辑错误
**解决方案**:
1. 严格遵循PKCS#7标准
2. 验证填充字节的数值
3. 确保去填充时正确处理边界情况
### 加密开关状态检查
#### 开关状态验证
**检查点1: 存储状态**
```javascript
// 检查加密开关状态
const encryptStatus = Storage.getEncryptBody();
console.log("加密开关状态:", encryptStatus);
```
**检查点2: 请求流程**
```javascript
// 验证加密请求
const options = {
method: 'POST',
data: {key: 'value'}
};
// 检查是否被加密
if (Storage.getEncryptBody()) {
console.log("数据将被加密传输");
}
```
**检查点3: 响应处理**
```javascript
// 验证解密响应
const response = await HttpUtil.post('/api', data);
console.log("响应数据:", response.data);
```
### 密钥存储位置验证
#### 存储验证方法
**验证1: 全局配置检查**
```javascript
const globalConfig = GlobalConfig.getConfig();
console.log("当前密钥:", globalConfig.base64Key);
```
**验证2: 环境变量检查**
```javascript
// 检查运行环境
console.log("NODE_ENV:", process.env.NODE_ENV);
console.log("浏览器环境:", typeof window !== 'undefined');
```
**验证3: 配置优先级**
```javascript
// 验证配置覆盖
const config = GlobalConfig.getConfig();
console.log("最终配置:", config);
```
### 加密数据格式验证
#### 数据格式检查
**检查1: 输入数据格式**
```javascript
// 验证输入数据
function validateInput(data) {
if (typeof data !== 'object') {
throw new Error('输入必须是对象');
}
const jsonStr = JSON.stringify(data);
if (jsonStr.length === 0) {
throw new Error('输入数据为空');
}
return jsonStr;
}
```
**检查2: 输出数据格式**
```javascript
// 验证输出格式
function validateOutput(data) {
if (typeof data !== 'string') {
throw new Error('输出必须是字符串');
}
// 检查Base64格式
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
if (!base64Regex.test(data)) {
throw new Error('输出不是有效的Base64格式');
}
return true;
}
```
**检查3: 数据完整性**
```javascript
// 验证数据完整性
function verifyIntegrity(original, decrypted) {
return original === decrypted;
}
```
### 错误信息解读
#### 常见错误类型
**类型1: 配置错误**
- **错误**: "key should be a 16 bytes string"
- **含义**: 密钥长度不正确
- **处理**: 检查密钥配置和Base64解码
**类型2: 模式错误**
- **错误**: "iv error"
- **含义**: CBC模式缺少或错误的IV
- **处理**: 提供正确的16字节IV
**类型3: 数据格式错误**
- **错误**: 解码异常
- **含义**: Base64数据格式不正确
- **处理**: 验证数据格式和完整性
**类型4: 算法错误**
- **错误**: 加密/解密失败
- **含义**: 算法实现或参数配置问题
- **处理**: 检查算法参数和实现
### 性能问题诊断
#### 性能监控
**监控指标**:
1. **加密时间**: 单次加密耗时
2. **解密时间**: 单次解密耗时
3. **内存使用**: 加密过程中的内存占用
4. **CPU使用率**: 加密操作的CPU消耗
**诊断步骤**:
1. **基准测试**: 测量不同数据大小下的性能
2. **瓶颈识别**: 使用性能分析工具定位瓶颈
3. **优化实施**: 根据分析结果进行优化
#### 优化建议
**建议1: 批处理优化**
```javascript
// 批量处理多个数据
function batchEncrypt(dataList) {
return dataList.map(data => crypto.encrypt(JSON.stringify(data)));
}
```
**建议2: 缓存策略**
```javascript
// 缓存常用数据
const cache = new Map();
function cachedEncrypt(data) {
const key = JSON.stringify(data);
if (cache.has(key)) {
return cache.get(key);
}
const result = crypto.encrypt(JSON.stringify(data));
cache.set(key, result);
return result;
}
```
**建议3: 异步处理**
```javascript
// 异步处理大数据
async function asyncEncrypt(data) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
const result = crypto.encrypt(data);
resolve(result);
} catch (error) {
reject(error);
}
}, 0);
});
}
```
## 结论
该加密解密系统提供了完整的SM4加密解决方案具有以下特点
1. **安全性**: 采用国家标准的SM4算法支持ECB和CBC两种模式
2. **易用性**: 提供简单的API接口支持自动加密传输
3. **可配置性**: 支持多种配置选项,满足不同需求
4. **可靠性**: 完善的错误处理和验证机制
在使用过程中,重点关注密钥配置、数据格式、加密模式选择等方面的问题。通过本文档提供的故障排除指南,可以快速定位和解决大部分加密解密相关问题。
对于生产环境部署,建议:
- 使用强随机源生成密钥
- 定期轮换密钥
- 实施完善的日志记录
- 进行定期的安全审计
- 建立应急响应机制

View File

@@ -0,0 +1,652 @@
# 存储访问问题
<cite>
**本文档引用的文件**
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [存储访问故障排除指南](#存储访问故障排除指南)
7. [依赖关系分析](#依赖关系分析)
8. [性能考虑](#性能考虑)
9. [故障排除指南](#故障排除指南)
10. [结论](#结论)
## 简介
本指南专注于存储访问相关的故障排除涵盖localStorage访问失败、数据读取错误、存储空间不足、数据格式异常等问题的诊断和解决方法。该工具包提供了完整的本地存储解决方案包括数据序列化、加密存储、错误处理等功能。
## 项目结构
该项目采用模块化设计,主要包含以下核心模块:
```mermaid
graph TB
subgraph "主入口"
Index[index.js]
end
subgraph "存储模块"
Storage[TsStorage.js]
Common[TsCommon.js]
end
subgraph "网络模块"
HttpUtil[TsHttpUtil.js]
Crypto[TsCrypto.js]
SM4[TsSM4.js]
Config[TsGlobalConfig.js]
end
subgraph "外部依赖"
UmiRequest[umi-request]
Base64[base64-js]
end
Index --> Storage
Index --> HttpUtil
Index --> Crypto
Index --> Config
Storage --> Common
HttpUtil --> Storage
HttpUtil --> Crypto
Crypto --> SM4
Crypto --> Config
HttpUtil --> UmiRequest
Crypto --> Base64
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
### 存储管理器 (TsStorage)
存储管理器提供了完整的localStorage操作接口支持数据的保存、读取和用户令牌管理。
**主要功能特性:**
- 数据序列化和反序列化
- 用户令牌存储和获取
- 加密开关控制
- 错误处理和默认值机制
### 通用工具 (TsCommon)
提供了基础的JavaScript工具函数特别是JSON解析和数据验证功能。
**关键功能:**
- 安全的JSON解析
- 空值检测
- 字符串处理工具
### 网络请求 (TsHttpUtil)
集成了存储功能的HTTP客户端支持自动数据加密和令牌管理。
**核心特性:**
- 自动令牌注入
- 条件数据加密
- 统一错误处理
- 配置化参数处理
## 架构概览
```mermaid
sequenceDiagram
participant Client as 客户端应用
participant Storage as 存储管理器
participant Common as 通用工具
participant Crypto as 加密模块
participant HTTP as HTTP客户端
Client->>Storage : 保存数据
Storage->>Storage : 序列化数据
Storage->>Storage : 写入localStorage
Client->>Storage : 读取数据
Storage->>Storage : 从localStorage读取
Storage->>Common : 解析JSON
Common-->>Storage : 返回数据
Storage-->>Client : 返回结果
Client->>HTTP : 发送请求
HTTP->>Storage : 获取用户令牌
Storage-->>HTTP : 返回令牌
HTTP->>Crypto : 加密数据(可选)
Crypto-->>HTTP : 返回加密结果
HTTP-->>Client : 返回响应
```
**图表来源**
- [TsStorage.js:26-43](file://src/utils/TsStorage.js#L26-L43)
- [TsCommon.js:29-44](file://src/utils/TsCommon.js#L29-L44)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 详细组件分析
### 存储组件深度分析
```mermaid
classDiagram
class TsStorage {
+save(key, value) void
+get(key, def) string
+saveUserToken(token) void
+getUserToken() string
+saveEncryptBody(bool) void
+getEncryptBody() boolean
}
class TsCommon {
+parseJSON(value, def) Object
+isEmpty(value) boolean
+getParamFormUrl(key, host) string
+isDevelopment() boolean
}
class TsHttpUtil {
+req(url, options) Promise
+get(url, params, options) Promise
+post(url, data, options) Promise
+form(url, data, options) Promise
}
class TsCrypto {
+encrypt(content) string
+decrypt(base64) string
}
class TsSM4 {
+encrypt(plaintext) string
+decrypt(ciphertext) string
}
TsStorage --> TsCommon : 使用
TsHttpUtil --> TsStorage : 依赖
TsHttpUtil --> TsCrypto : 使用
TsCrypto --> TsSM4 : 使用
```
**图表来源**
- [TsStorage.js:26-54](file://src/utils/TsStorage.js#L26-L54)
- [TsCommon.js:89-97](file://src/utils/TsCommon.js#L89-L97)
- [TsHttpUtil.js:168-170](file://src/https/TsHttpUtil.js#L168-L170)
- [TsCrypto.js:5-33](file://src/utils/TsCrypto.js#L5-L33)
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 存储访问故障排除指南
### 常见存储问题诊断
#### 1. localStorage 访问失败
**症状表现:**
- 页面加载时报错提示localStorage不可用
- 数据无法保存或读取
- 浏览器控制台出现安全错误
**诊断步骤:**
1. 检查浏览器隐私模式设置
2. 验证跨域访问权限
3. 确认浏览器扩展程序影响
4. 检查HTTPS环境要求
**解决方案:**
```javascript
// 检查localStorage可用性
function checkLocalStorage() {
try {
const test = 'test';
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch (e) {
return false;
}
}
// 降级方案使用sessionStorage
if (!checkLocalStorage()) {
console.warn('localStorage不可用使用sessionStorage作为替代');
}
```
#### 2. 数据读取错误
**症状表现:**
- 读取到空值或undefined
- JSON解析失败
- 数据类型不匹配
**诊断流程:**
```mermaid
flowchart TD
Start([开始诊断]) --> CheckKey["检查键名是否存在"]
CheckKey --> KeyExists{"键存在?"}
KeyExists --> |否| CreateDefault["创建默认值"]
KeyExists --> |是| CheckFormat["检查数据格式"]
CheckFormat --> FormatOK{"格式正确?"}
FormatOK --> |否| ParseError["JSON解析错误"]
FormatOK --> |是| DataType["检查数据类型"]
DataType --> TypeOK{"类型匹配?"}
TypeOK --> |否| ConvertData["转换数据类型"]
TypeOK --> |是| Success["诊断完成"]
CreateDefault --> Success
ParseError --> FixParse["修复JSON格式"]
FixParse --> Success
ConvertData --> Success
```
**图表来源**
- [TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
**解决方案:**
1. 实施默认值机制
2. 添加数据类型验证
3. 实现错误边界处理
#### 3. 存储空间不足
**症状表现:**
- 保存数据时报错
- 随机数据丢失
- 性能明显下降
**诊断方法:**
1. 检查localStorage使用量
2. 分析数据增长趋势
3. 识别大体积数据项
**优化策略:**
```javascript
// 存储容量监控
function checkStorageCapacity() {
const storage = localStorage;
let totalSize = 0;
for (let key in storage) {
if (storage.hasOwnProperty(key)) {
totalSize += storage[key].length;
}
}
return totalSize;
}
// 清理过期数据
function cleanupExpiredData() {
const now = Date.now();
const maxAge = 7 * 24 * 60 * 60 * 1000; // 7天
for (let key in localStorage) {
if (localStorage.hasOwnProperty(key)) {
try {
const item = JSON.parse(localStorage.getItem(key));
if (item.timestamp && (now - item.timestamp) > maxAge) {
localStorage.removeItem(key);
}
} catch (e) {
// 忽略格式错误的数据
}
}
}
}
```
#### 4. 数据格式异常
**症状表现:**
- JSON解析抛出异常
- 数据损坏或不完整
- 版本升级后数据不兼容
**诊断步骤:**
1. 验证数据完整性
2. 检查版本兼容性
3. 分析数据结构变化
**修复方法:**
```javascript
// 安全的数据读取
function safeGet(key, defaultValue = null) {
try {
const item = localStorage.getItem(key);
if (!item) return defaultValue;
const parsed = JSON.parse(item);
return parsed.data || defaultValue;
} catch (error) {
console.error(`读取存储项 ${key} 失败:`, error);
return defaultValue;
}
}
// 数据格式验证
function validateDataStructure(data) {
const requiredFields = ['data'];
return requiredFields.every(field => data.hasOwnProperty(field));
}
```
### 浏览器兼容性问题
#### 1. 不同浏览器的差异
**问题类型:**
- Safari隐私模式限制
- IE/Edge兼容性问题
- 移动端存储限制
**解决方案:**
```javascript
// 跨浏览器兼容性检查
function isStorageSupported() {
const testKey = '__storage_test__';
try {
if ('localStorage' in window && window['localStorage'] !== null) {
localStorage.setItem(testKey, testKey);
localStorage.removeItem(testKey);
return true;
}
return false;
} catch (e) {
return false;
}
}
// 功能检测而非浏览器检测
function getStorageImplementation() {
if (isStorageSupported()) {
return localStorage;
} else if (typeof sessionStorage !== 'undefined') {
return sessionStorage;
} else {
// 无存储支持,使用内存存储
return createMemoryStorage();
}
}
```
#### 2. 存储权限限制
**常见场景:**
- 第三方Cookie限制
- HTTPS环境要求
- 用户隐私设置
**处理策略:**
```javascript
// 权限检查和降级
function handleStoragePermissions() {
const permissions = {
localStorage: false,
sessionStorage: false,
cookies: false
};
// 检查localStorage
try {
localStorage.setItem('permission_test', 'test');
localStorage.removeItem('permission_test');
permissions.localStorage = true;
} catch (e) {
permissions.localStorage = false;
}
// 检查cookies
try {
document.cookie = 'permission_test=test';
permissions.cookies = true;
} catch (e) {
permissions.cookies = false;
}
return permissions;
}
```
### 数据序列化失败
#### 1. JSON序列化问题
**常见原因:**
- 循环引用
- 函数和undefined
- 复杂对象类型
**诊断方法:**
```mermaid
flowchart TD
Start([序列化开始]) --> CheckCircular["检查循环引用"]
CheckCircular --> HasCircular{"存在循环引用?"}
HasCircular --> |是| RemoveCircular["移除循环引用"]
HasCircular --> |否| CheckTypes["检查数据类型"]
CheckTypes --> HasInvalid{"包含无效类型?"}
HasInvalid --> |是| FilterInvalid["过滤无效类型"]
HasInvalid --> |否| SafeStringify["安全字符串化"]
RemoveCircular --> SafeStringify
FilterInvalid --> SafeStringify
SafeStringify --> Complete["序列化完成"]
```
**图表来源**
- [TsStorage.js:31-33](file://src/utils/TsStorage.js#L31-L33)
**解决方案:**
```javascript
// 安全的JSON序列化
function safeStringify(obj) {
const seen = new WeakSet();
return JSON.stringify(obj, (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return "[Circular Reference]";
}
seen.add(value);
}
return value;
});
}
// 自定义序列化器
function customSerializer(data) {
return {
data: data,
timestamp: Date.now(),
version: "1.0"
};
}
```
## 依赖关系分析
```mermaid
graph LR
subgraph "核心依赖"
A[umi-request] --> B[TsHttpUtil]
C[base64-js] --> D[TsCrypto]
end
subgraph "内部模块"
E[TsStorage] --> F[TsCommon]
B --> E
B --> G[TsCrypto]
G --> H[TsSM4]
G --> I[TsGlobalConfig]
end
J[index.js] --> E
J --> B
J --> G
J --> I
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
**章节来源**
- [package.json:1-24](file://package.json#L1-L24)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 存储性能优化
1. **批量操作优化**
- 合并多个存储操作
- 使用事务性操作
- 避免频繁的读写
2. **数据压缩**
- 对大对象进行压缩
- 实现增量更新
- 使用索引优化查询
3. **缓存策略**
- 实现内存缓存
- 设置合理的过期时间
- 支持LRU淘汰算法
### 数据迁移最佳实践
```mermaid
flowchart TD
Start([开始迁移]) --> CheckVersion["检查当前版本"]
CheckVersion --> VersionOK{"版本兼容?"}
VersionOK --> |是| DirectCopy["直接复制数据"]
VersionOK --> |否| TransformData["转换数据格式"]
TransformData --> ValidateData["验证数据完整性"]
DirectCopy --> ValidateData
ValidateData --> MigrationOK{"迁移成功?"}
MigrationOK --> |是| UpdateVersion["更新版本号"]
MigrationOK --> |否| Rollback["回滚操作"]
UpdateVersion --> Complete["迁移完成"]
Rollback --> Complete
```
**图表来源**
- [TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
## 故障排除指南
### 常见错误信息解读
| 错误类型 | 可能原因 | 解决方案 |
|---------|---------|---------|
| SecurityError | 跨域访问限制 | 检查域名和协议一致性 |
| QuotaExceededError | 存储空间不足 | 清理旧数据或使用压缩 |
| InvalidStateError | 存储状态异常 | 重启浏览器或清除缓存 |
| TypeError | 数据格式错误 | 实施数据验证和转换 |
### 诊断工具和方法
```javascript
// 存储状态检查
function diagnoseStorage() {
const diagnostics = {
localStorage: false,
sessionStorage: false,
quota: 0,
items: 0,
totalSize: 0
};
// 检查localStorage
try {
localStorage.setItem('diagnostics', 'test');
localStorage.removeItem('diagnostics');
diagnostics.localStorage = true;
} catch (e) {
diagnostics.localStorage = false;
}
// 检查存储配额和使用情况
if (navigator.webkitTemporaryStorage) {
navigator.webkitTemporaryStorage.queryUsageAndQuota(
(usage, quota) => {
diagnostics.quota = quota;
diagnostics.used = usage;
}
);
}
// 统计存储项数量和大小
for (let key in localStorage) {
if (localStorage.hasOwnProperty(key)) {
diagnostics.items++;
diagnostics.totalSize += key.length + localStorage[key].length;
}
}
return diagnostics;
}
// 数据完整性验证
function validateStorageIntegrity() {
const errors = [];
const keys = Object.keys(localStorage);
keys.forEach(key => {
try {
JSON.parse(localStorage.getItem(key));
} catch (e) {
errors.push({
key: key,
error: e.message,
value: localStorage.getItem(key)
});
}
});
return errors;
}
```
### 最佳实践建议
1. **错误处理**
- 实施全面的try-catch包装
- 提供优雅降级机制
- 记录详细的错误日志
2. **数据保护**
- 实施数据备份策略
- 使用版本控制
- 定期数据健康检查
3. **性能监控**
- 监控存储使用率
- 跟踪访问模式
- 优化热点数据
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 结论
存储访问问题的解决需要系统性的方法和完善的监控机制。通过实施本文档提供的诊断流程、故障排除方法和最佳实践,可以有效预防和解决大多数存储相关问题。关键在于建立完善的错误处理机制、实施数据验证和转换、以及持续监控存储状态。
建议在生产环境中:
- 实施多层次的错误处理
- 建立存储使用监控
- 定期进行数据完整性检查
- 制定数据迁移和备份策略
这样可以确保应用程序的稳定性和可靠性,为用户提供更好的体验。

View File

@@ -0,0 +1,647 @@
# 故障排除
<cite>
**本文引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
npm-tool 是一个企业级的 JavaScript 工具包,提供了网络请求、数据加密解密、本地存储、通用工具函数等功能。该工具包采用模块化设计,支持多种加密模式和灵活的配置选项,适用于各种 Web 应用场景。
本指南旨在帮助开发者快速识别和解决使用 npm-tool 时可能遇到的各种问题,提供系统性的调试方法和最佳实践建议。
## 项目结构
```mermaid
graph TB
subgraph "项目根目录"
A[index.js]
B[package.json]
C[README.md]
end
subgraph "src/utils"
D[TsCommon.js]
E[TsCrypto.js]
F[TsSM4.js]
G[TsStorage.js]
H[TsGlobalConfig.js]
end
subgraph "src/https"
I[TsHttpUtil.js]
end
A --> D
A --> E
A --> F
A --> G
A --> H
A --> I
E --> F
E --> H
I --> G
I --> D
I --> E
I --> H
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
npm-tool 包含以下核心组件:
### 网络请求组件 (TsHttpUtil)
- 基于 umi-request 的 HTTP 客户端
- 支持 GET、POST、表单提交等多种请求方式
- 内置加密解密功能
- 统一的错误处理机制
### 数据加密组件 (TsCrypto)
- 基于 SM4 算法的对称加密
- 支持 ECB 和 CBC 模式
- Base64 编码支持
### 存储组件 (TsStorage)
- 基于 localStorage 的数据持久化
- 支持用户 Token 管理
- 加密开关控制
### 通用工具组件 (TsCommon)
- URL 参数解析
- 数据类型判断
- JSON 解析工具
- 环境检测
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
## 架构概览
```mermaid
graph TD
subgraph "应用层"
APP[业务应用]
end
subgraph "HTTP 层"
HTTP[TsHttpUtil]
CONFIG[TsGlobalConfig]
STORAGE[TsStorage]
end
subgraph "加密层"
CRYPTO[TsCrypto]
SM4[TsSM4]
end
subgraph "工具层"
COMMON[TsCommon]
end
subgraph "外部依赖"
UMI[umi-request]
BASE64[base64-js]
end
APP --> HTTP
HTTP --> CONFIG
HTTP --> STORAGE
HTTP --> CRYPTO
CRYPTO --> SM4
HTTP --> COMMON
HTTP --> UMI
CRYPTO --> BASE64
SM4 --> BASE64
HTTP -.->|错误处理| APP
HTTP -.->|回调函数| APP
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
## 详细组件分析
### 网络请求组件 (TsHttpUtil)
#### 请求流程图
```mermaid
sequenceDiagram
participant Client as 应用客户端
participant HttpUtil as TsHttpUtil
participant Config as TsGlobalConfig
participant Storage as TsStorage
participant Crypto as TsCrypto
participant Request as umi-request
participant Server as 服务器
Client->>HttpUtil : 发送请求
HttpUtil->>Config : 获取全局配置
HttpUtil->>Storage : 获取用户Token
HttpUtil->>HttpUtil : 处理请求参数
alt 需要加密
HttpUtil->>Crypto : 加密请求数据
Crypto-->>HttpUtil : 返回加密结果
end
HttpUtil->>Request : 发送HTTP请求
Request->>Server : 执行请求
Server-->>Request : 返回响应
Request-->>HttpUtil : 返回响应数据
HttpUtil->>HttpUtil : 处理响应数据
alt 响应需要解密
HttpUtil->>Crypto : 解密响应数据
Crypto-->>HttpUtil : 返回解密结果
end
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
#### 错误处理机制
```mermaid
flowchart TD
Start([请求开始]) --> CheckParams["检查请求参数"]
CheckParams --> ParamsValid{"参数有效?"}
ParamsValid --> |否| ReturnError["返回参数错误"]
ParamsValid --> |是| SendRequest["发送HTTP请求"]
SendRequest --> ReceiveResponse["接收响应"]
ReceiveResponse --> ResponseType{"响应类型"}
ResponseType --> |成功| CheckCode["检查状态码"]
ResponseType --> |网络错误| NetworkError["网络错误处理"]
ResponseType --> |服务器错误| ServerError["服务器错误处理"]
CheckCode --> CodeValid{"状态码200?"}
CodeValid --> |是| CheckEncrypt{"需要解密?"}
CodeValid --> |否| HttpError["HTTP错误处理"]
CheckEncrypt --> |是| DecryptData["解密数据"]
CheckEncrypt --> |否| ReturnData["返回数据"]
DecryptData --> ParseJSON["解析JSON"]
ParseJSON --> ReturnData
ReturnError --> End([结束])
NetworkError --> End
ServerError --> End
HttpError --> End
ReturnData --> End
```
**图表来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
### 加密解密组件 (TsCrypto)
#### 加密算法流程
```mermaid
flowchart TD
Input[输入明文] --> ConvertUTF8["转换为UTF-8字节数组"]
ConvertUTF8 --> Padding["PKCS7填充"]
Padding --> SplitBlocks["分割为16字节块"]
SplitBlocks --> ModeSelect{"选择加密模式"}
ModeSelect --> |CBC模式| CBCProcess["CBC加密处理"]
ModeSelect --> |ECB模式| ECBProcess["ECB加密处理"]
CBCProcess --> XORChain["异或链式处理"]
XORChain --> BlockCrypt["块加密"]
BlockCrypt --> Output[输出密文]
ECBProcess --> BlockCrypt
BlockCrypt --> Output
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:408-452](file://src/utils/TsSM4.js#L408-L452)
#### 关键配置参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---------|------|--------|------|
| keyBuffer | Uint8Array | 从base64Key转换而来 | 16字节密钥缓冲区 |
| mode | string | "ecb" | 加密模式 (cbc/ecb) |
| cipherType | string | "base64" | 输出类型 (base64/text) |
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
### 存储组件 (TsStorage)
#### 数据存储流程
```mermaid
flowchart TD
SaveRequest[保存请求] --> CheckValue["检查值类型"]
CheckValue --> Serialize["序列化JSON"]
Serialize --> Store["localStorage存储"]
Store --> Success[存储成功]
GetRequest[获取请求] --> Load["从localStorage加载"]
Load --> ParseJSON["解析JSON"]
ParseJSON --> CheckResult{"解析成功?"}
CheckResult --> |是| ReturnData["返回数据"]
CheckResult --> |否| ReturnDefault["返回默认值"]
```
**图表来源**
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
## 依赖关系分析
```mermaid
graph LR
subgraph "核心模块"
A[index.js]
B[TsHttpUtil]
C[TsCrypto]
D[TsSM4]
E[TsStorage]
F[TsCommon]
G[TsGlobalConfig]
end
subgraph "外部依赖"
H[umi-request]
I[base64-js]
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
B --> C
B --> E
B --> F
B --> G
B --> H
C --> D
C --> G
C --> I
D --> I
E --> F
G --> H
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
## 性能考虑
### 网络请求性能优化
1. **请求缓存策略**
- 对于重复的 GET 请求,建议在应用层实现缓存机制
- 合理设置请求头以利用浏览器缓存
2. **批量请求处理**
- 对于多个相关的请求,考虑合并为单个请求
- 使用并发请求时注意避免过度并发导致的性能问题
3. **数据传输优化**
- 启用压缩传输gzip/deflate
- 减少不必要的数据传输量
### 加密性能优化
1. **加密算法选择**
- SM4 算法相对 AES 更快,适合大量数据加密场景
- 对于小数据量,加密开销可能超过数据本身大小
2. **内存管理**
- 注意大对象加密时的内存使用情况
- 及时释放不再使用的加密对象
3. **异步处理**
- 对于耗时的加密操作,考虑使用 Web Workers
- 避免阻塞主线程
### 存储性能优化
1. **localStorage 限制**
- 单个域名下约 5-10MB 存储空间
- 大量数据存储时考虑分片策略
2. **序列化开销**
- 复杂对象的 JSON 序列化可能影响性能
- 对频繁读取的数据考虑缓存策略
## 故障排除指南
### 网络请求故障排除
#### 常见错误类型及解决方案
**1. CORS 跨域问题**
- **症状**: 控制台出现跨域错误,请求被阻止
- **原因**: 服务器未正确配置 CORS 头部
- **解决方案**:
- 确认服务器已设置正确的 Access-Control-Allow-Origin
- 检查预检请求的处理逻辑
- 验证凭据设置 (credentials: 'include')
**2. 认证失败**
- **症状**: HTTP 401 错误,用户无权限
- **原因**: Token 过期或无效
- **解决方案**:
- 检查用户 Token 是否正确存储
- 实现 Token 刷新机制
- 验证服务器认证配置
**3. 请求超时**
- **症状**: 网络请求长时间无响应
- **原因**: 服务器响应慢或网络问题
- **解决方案**:
- 设置合理的超时时间
- 实现重试机制
- 检查服务器性能
**4. 数据格式错误**
- **症状**: JSON 解析失败或数据格式不匹配
- **原因**: 服务器返回数据格式不符合预期
- **解决方案**:
- 检查服务器响应格式
- 实现数据验证和转换
- 添加容错处理
#### 调试步骤
```mermaid
flowchart TD
Problem[发现网络问题] --> CheckConsole["检查浏览器控制台"]
CheckConsole --> VerifyNetwork["验证网络连接"]
VerifyNetwork --> TestEndpoint["测试目标端点"]
TestEndpoint --> InspectHeaders["检查请求/响应头"]
InspectHeaders --> ValidateData["验证数据格式"]
ValidateData --> CheckAuth["检查认证信息"]
CheckAuth --> ReviewLogs["查看服务器日志"]
ReviewLogs --> FixIssue["修复问题"]
FixIssue --> VerifyFix["验证修复效果"]
```
**章节来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### 加密解密故障排除
#### 常见加密问题
**1. 密钥长度错误**
- **症状**: 抛出 "key should be a 16 bytes string" 错误
- **原因**: 密钥不是 16 字节长度
- **解决方案**:
- 确保 base64Key 正确且长度为 24 字节(对应 16 字节二进制)
- 验证密钥格式和编码
**2. IV 初始化向量错误**
- **症状**: 抛出 "iv error" 错误
- **原因**: CBC 模式下的 IV 不是 16 字节
- **解决方案**:
- 确保 IV 参数存在且长度为 16 字节
- 检查 IV 的生成和传递过程
**3. 加密数据解密失败**
- **症状**: 解密后得到乱码或抛出异常
- **原因**: 数据被篡改或密钥不匹配
- **解决方案**:
- 验证数据完整性
- 确认使用相同的密钥和模式
- 检查 Base64 编码/解码过程
#### 加密调试流程
```mermaid
flowchart TD
Start[开始加密调试] --> CheckKey["检查密钥配置"]
CheckKey --> KeyValid{"密钥有效?"}
KeyValid --> |否| FixKey["修复密钥配置"]
KeyValid --> |是| CheckMode["检查加密模式"]
CheckMode --> ModeValid{"模式正确?"}
ModeValid --> |否| FixMode["修复模式配置"]
ModeValid --> |是| TestEncrypt["测试加密功能"]
TestEncrypt --> EncryptSuccess{"加密成功?"}
EncryptSuccess --> |否| DebugEncrypt["调试加密过程"]
EncryptSuccess --> |是| TestDecrypt["测试解密功能"]
TestDecrypt --> DecryptSuccess{"解密成功?"}
DecryptSuccess --> |否| DebugDecrypt["调试解密过程"]
DecryptSuccess --> |是| Complete[完成调试]
DebugEncrypt --> FixEncrypt["修复加密问题"]
DebugDecrypt --> FixDecrypt["修复解密问题"]
FixKey --> CheckKey
FixMode --> CheckMode
FixEncrypt --> TestEncrypt
FixDecrypt --> TestDecrypt
```
**章节来源**
- [TsSM4.js:102-123](file://src/utils/TsSM4.js#L102-L123)
- [TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)
- [TsSM4.js:410-412](file://src/utils/TsSM4.js#L410-L412)
### 存储访问异常
#### 常见存储问题
**1. localStorage 访问失败**
- **症状**: 抛出 SecurityError 或 QuotaExceededError
- **原因**: 浏览器安全策略或存储配额限制
- **解决方案**:
- 检查浏览器隐私设置
- 清理过期的存储数据
- 实现存储容量监控
**2. 数据序列化失败**
- **症状**: JSON.stringify 抛出异常
- **原因**: 循环引用或不可序列化对象
- **解决方案**:
- 避免存储循环引用的对象
- 使用自定义序列化方法
- 过滤不可序列化的属性
**3. 数据获取为空**
- **症状**: Storage.get 返回空值或默认值
- **原因**: 数据未正确存储或键名不匹配
- **解决方案**:
- 验证存储键名的一致性
- 检查存储前的数据格式
- 实现数据完整性检查
#### 存储调试方法
```mermaid
flowchart TD
StorageError[存储问题] --> CheckBrowser["检查浏览器兼容性"]
CheckBrowser --> VerifyStorage["验证存储可用性"]
VerifyStorage --> TestWrite["测试写入功能"]
TestWrite --> WriteSuccess{"写入成功?"}
WriteSuccess --> |否| FixWrite["修复写入问题"]
WriteSuccess --> |是| TestRead["测试读取功能"]
TestRead --> ReadSuccess{"读取成功?"}
ReadSuccess --> |否| FixRead["修复读取问题"]
ReadSuccess --> |是| CheckData["检查数据完整性"]
CheckData --> Complete[问题解决]
FixWrite --> VerifyStorage
FixRead --> TestWrite
```
**章节来源**
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
### 配置相关问题
#### 全局配置故障排除
**1. 配置项缺失**
- **症状**: 配置获取失败或返回默认值
- **原因**: window.httpConfig 未正确初始化
- **解决方案**:
- 确保在应用启动时调用 setConfig
- 验证配置对象的完整性
- 检查配置项的命名一致性
**2. 动态配置更新失败**
- **症状**: 配置更新后仍使用旧值
- **原因**: 配置缓存或作用域问题
- **解决方案**:
- 确保使用最新的配置对象
- 验证配置更新的时机
- 检查配置的作用域范围
**章节来源**
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 日志记录和监控最佳实践
#### 日志记录策略
1. **错误日志**
- 记录完整的错误堆栈信息
- 包含请求参数和响应数据
- 添加时间戳和上下文信息
2. **性能日志**
- 记录请求耗时和响应大小
- 监控加密解密性能
- 跟踪存储操作的性能
3. **调试日志**
- 在开发环境中启用详细日志
- 区分不同级别的日志信息
- 提供可配置的日志级别
#### 监控指标
1. **网络请求指标**
- 请求成功率和失败率
- 平均响应时间和最大响应时间
- 错误类型分布统计
2. **加密性能指标**
- 加密/解密耗时统计
- 数据大小与处理时间的关系
- 内存使用情况监控
3. **存储性能指标**
- 存储操作成功率
- 数据读取/写入延迟
- 存储空间使用率
### 性能问题诊断和优化
#### 网络性能诊断
1. **请求分析**
- 使用浏览器开发者工具分析网络请求
- 检查请求头和响应头的大小
- 识别慢请求和异常请求
2. **缓存策略**
- 实现合理的缓存策略
- 避免不必要的重复请求
- 优化缓存失效机制
3. **连接池管理**
- 合理管理 HTTP 连接
- 避免连接泄漏
- 优化并发请求数量
#### 加密性能优化
1. **算法选择**
- 根据数据大小选择合适的加密算法
- 考虑硬件加速支持
- 评估加密强度与性能的平衡
2. **内存管理**
- 及时释放加密相关的内存
- 避免内存泄漏
- 监控内存使用情况
3. **批处理优化**
- 对大量数据进行批处理
- 减少加密调用次数
- 实现异步处理机制
#### 存储性能优化
1. **数据组织**
- 合理组织存储的数据结构
- 避免过大的单个存储项
- 实现数据分片存储
2. **访问模式优化**
- 优化数据的读取和写入模式
- 实现缓存机制
- 减少存储操作的频率
3. **容量管理**
- 监控存储空间使用情况
- 实现自动清理机制
- 提供存储容量预警
## 结论
npm-tool 工具包提供了完整的前端开发基础设施,涵盖了网络请求、数据加密解密、本地存储和通用工具等多个方面。通过本文档提供的故障排除指南和最佳实践建议,开发者可以更有效地识别和解决使用过程中遇到的各种问题。
关键要点包括:
- 建立系统性的调试流程和方法
- 理解各组件之间的依赖关系和交互方式
- 实施适当的性能监控和优化策略
- 建立完善的错误处理和日志记录机制
对于复杂问题,建议按照本文档提供的诊断流程逐步排查,从最简单的配置问题开始,逐步深入到复杂的算法和性能问题。同时,结合实际应用场景的特点,制定相应的预防措施和应急方案。

View File

@@ -0,0 +1,446 @@
# 网络请求问题
<cite>
**本文引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与可靠性考虑](#性能与可靠性考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南聚焦于网络请求相关的故障排除,结合仓库中网络请求封装与工具模块,系统梳理常见 HTTP 错误(如 401/403、404、500、502、503、504、跨域问题、请求超时、参数与 URL 前缀配置错误、Cookie 传递问题以及加解密与全局配置的影响因素。文档提供可落地的排查步骤、调试工具使用建议与日志分析流程,帮助快速定位与解决问题。
## 项目结构
该工具包以“网络请求封装 + 工具模块”为核心,对外通过统一入口导出,便于在业务层集中管理请求行为与全局配置。
```mermaid
graph TB
A["index.js<br/>统一导出"] --> B["src/https/TsHttpUtil.js<br/>请求封装与错误处理"]
A --> C["src/utils/TsGlobalConfig.js<br/>全局配置"]
A --> D["src/utils/TsStorage.js<br/>本地存储与Token/Cookie相关"]
A --> E["src/utils/TsCommon.js<br/>通用工具"]
A --> F["src/utils/TsCrypto.js<br/>加密/解密"]
F --> G["src/utils/TsSM4.js<br/>SM4实现"]
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- 请求封装与错误处理:基于 umi-request 的扩展,统一设置默认参数(携带 Cookie、JSON 请求体),内置错误映射与兜底处理。
- 全局配置提供前缀、额外参数注入、HTTP 错误回调等可插拔配置项。
- 存储与 Token负责用户 Token 的读取与持久化,以及是否启用请求体加密的开关。
- 加密模块:基于 SM4 的加解密实现,支持 ECB 模式与 Base64 输出。
- 通用工具空值判断、JSON 解析、URL 参数解析等基础能力。
章节来源
- [TsHttpUtil.js:7-35](file://src/https/TsHttpUtil.js#L7-L35)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsCommon.js:25-44](file://src/utils/TsCommon.js#L25-L44)
## 架构总览
下图展示从调用方到网络层的关键交互路径,以及错误处理与加解密的插入点。
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Http as "TsHttpUtil.req"
participant Conf as "TsGlobalConfig"
participant Store as "TsStorage"
participant Crypto as "TsCrypto"
participant Umi as "umi-request"
participant Srv as "后端服务"
Caller->>Http : "发起请求(get/post/form)"
Http->>Conf : "读取全局配置(prefix/httpParams/onHttpError)"
Http->>Store : "读取用户Token"
Http->>Http : "组装参数/附加额外参数/可选加密"
Http->>Umi : "执行请求(携带Cookie/JSON)"
Umi-->>Http : "响应/错误"
Http->>Crypto : "若响应标记加密则解密"
Http-->>Caller : "返回标准化结果或抛出错误"
Http->>Conf : "非200时触发onHttpError(res)"
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
## 详细组件分析
### 请求封装与错误处理TsHttpUtil
- 默认行为
- 默认携带 Cookiecredentials: include确保跨子域与第三方 Cookie 场景可用。
- 默认 JSON 请求体requestType: jsonPOST 表单需显式选择 form。
- 统一错误处理:将响应状态映射为可读消息,未捕获时兜底为“参数错误或服务器异常”。
- 参数处理
- 支持分页参数转换pagination -> pageNum/pageSize
- 支持 equals 对象转逗号分隔字符串。
- 支持全局额外参数注入GET 合并 params非表单 POST 合并 data
- 可选请求体加密:当开启 encrypt_body 时,将 data 包装为 encryptData 并加密。
- URL 前缀
- prefix 支持字符串或函数,函数形式可按 URL 动态决定前缀,避免硬编码。
- 响应处理
- 当 rawResponse 为真时直接返回原始响应;否则仅返回 data 与 recordsTotal。
- 若响应标记加密,自动解密并解析 JSON。
- 非 200 时触发 onHttpError 回调,同时 reject 标准化错误对象。
```mermaid
flowchart TD
Start(["进入 req"]) --> Prefix["读取全局配置prefix"]
Prefix --> HasPrefix{"prefix存在"}
HasPrefix --> |是| Join["拼接url = prefix + url"]
HasPrefix --> |否| Skip["保持原url"]
Join --> Params["dealParamsBody处理参数/附加额外参数/可选加密"]
Skip --> Params
Params --> Headers["合并headers并注入用户Token"]
Headers --> Send["umi-request发送请求"]
Send --> Resp{"rawResponse"}
Resp --> |是| ReturnRaw["返回原始响应"]
Resp --> |否| Code{"响应码=200"}
Code --> |是| Decrypt{"响应标记加密?"}
Decrypt --> |是| Dec["解密+JSON解析"] --> ReturnData["返回{data,recordsTotal}"]
Decrypt --> |否| ReturnData
Code --> |否| Hook["触发onHttpError(res)"] --> Reject["reject标准化错误"]
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
章节来源
- [TsHttpUtil.js:7-35](file://src/https/TsHttpUtil.js#L7-L35)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
### 全局配置TsGlobalConfig
- 关键配置项
- base64Key用于初始化加密模块的密钥缓冲区。
- prefix统一请求前缀支持函数按 URL 动态生成。
- onHttpError非 200 时的回调钩子,便于统一处理错误。
- httpParams返回额外参数对象GET 合并到 paramsPOST 合并到 data。
- 读写方式
- 通过 window.httpConfig 注入全局配置setConfig 支持增量合并。
章节来源
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 存储与 TokenTsStorage
- 用户 Token
- 读取getUserToken 从本地存储获取,为空时返回空字符串。
- 写入saveUserToken 将 Token 持久化。
- 请求体加密开关
- getEncryptBody/getSaveEncryptBody 控制是否对请求体进行加密包装。
- Cookie 传递
- 默认 credentials: include配合后端 SameSite/Cross-Origin 策略使用。
章节来源
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
### 加密模块TsCrypto 与 TsSM4
- 初始化
- 使用 base64Key 生成 16 字节密钥缓冲区,构造 SM4 实例。
- 加密/解密
- encrypt对明文进行 SM4 加密ECB 模式Base64 输出)。
- decrypt对密文进行 SM4 解密。
- 注意事项
- ECB 模式无 IV适合小块数据CBC 需要 IV当前实现未使用 IV。
- cipherType 默认 Base64与前端期望一致。
章节来源
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
## 依赖关系分析
- TsHttpUtil 依赖
- TsGlobalConfig读取 prefix、httpParams、onHttpError。
- TsStorage读取用户 Token、加密开关。
- TsCrypto在开启加密时对请求体进行加密。
- TsCommon参数处理与空值判断。
- TsCrypto 依赖
- TsGlobalConfig读取 base64Key。
- TsSM4SM4 算法实现。
- 外部依赖
- umi-requestHTTP 请求库。
- base64-jsBase64 编解码。
```mermaid
graph LR
Http["TsHttpUtil"] --> Conf["TsGlobalConfig"]
Http --> Store["TsStorage"]
Http --> Crypto["TsCrypto"]
Http --> Common["TsCommon"]
Crypto --> SM4["TsSM4"]
Http --> Umi["umi-request"]
Crypto --> Base64["base64-js"]
```
图表来源
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsCrypto.js:1-4](file://src/utils/TsCrypto.js#L1-L4)
- [package.json:19-22](file://package.json#L19-L22)
章节来源
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsCrypto.js:1-4](file://src/utils/TsCrypto.js#L1-L4)
- [package.json:19-22](file://package.json#L19-L22)
## 性能与可靠性考虑
- 请求并发与重试
- 当前未内置重试机制,建议在上层业务根据错误类型(如 502/503/504进行指数退避重试。
- 超时控制
- 可通过 umi-request 的 timeout 配置项在扩展层增加超时控制,避免长时间阻塞。
- 日志与监控
- 在 onHttpError 中接入埋点或上报记录状态码、URL、耗时、Token 状态等,便于后续分析。
- 加密开销
- 对大体量请求体加密会带来 CPU 开销,建议仅对敏感数据启用加密。
[本节为通用建议,不直接分析具体文件]
## 故障排除指南
### 一、常见 HTTP 错误与处理策略
- 200 成功
- 正常流程,无需处理。
- 201/202/204
- 业务状态正常,关注业务语义与后续处理。
- 400 客户端参数错误
- 排查请求体格式、必填字段、分页参数转换逻辑pageNum/pageSize
- 401 未认证/令牌无效
- 检查 Token 是否存在、是否过期、是否正确写入存储。
- 确认请求头是否注入了 Token。
- 403 权限不足
- 检查用户角色与接口权限,确认 Token 有效但无访问权限。
- 404 资源不存在
- 检查 URL 是否正确、前缀是否匹配、路径参数是否缺失。
- 406/410/422
- 406请求格式不可得410资源永久删除422创建对象时验证错误。
- 500 服务器内部错误
- 记录请求上下文,联系后端排查。
- 502/503/504 网关/服务不可用/网关超时
- 建议重试与降级策略,必要时提示用户稍后再试。
章节来源
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### 二、跨域请求失败排查
- 关键点
- 浏览器同源策略限制,需后端设置正确的 Access-Control-Allow-*。
- 若携带 Cookie需确保
- credentials: include 生效(默认已开启)。
- 后端允许 CredentialsAccess-Control-Allow-Credentials: true
- 前端指定具体 Origin而非通配符后端允许该 Origin。
- 建议
- 使用浏览器开发者工具 Network 面板查看预检请求与响应头。
- 确认域名、协议、端口一致或后端明确放行。
章节来源
- [TsHttpUtil.js:42](file://src/https/TsHttpUtil.js#L42)
### 三、请求超时
- 现状
- 当前未设置超时时间,可能出现长时间等待。
- 建议
- 在扩展层增加 timeout 配置,或在上层业务做超时控制。
- 对长耗时接口采用分页/分批策略。
[本节为通用建议,不直接分析具体文件]
### 四、401/403 权限错误
- 常见原因
- Token 不存在或为空。
- Token 过期或被撤销。
- 请求头未注入 Token。
- 排查步骤
- 检查存储中是否存在 Token。
- 确认请求头是否包含 Token。
- 若后端要求特定头名,需在上层统一注入。
- 处理策略
- 401跳转登录或刷新 Token。
- 403提示权限不足或引导用户联系管理员。
章节来源
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
### 五、500 服务器错误
- 建议
- 记录完整请求上下文URL、params/data、headers、Token
- 在 onHttpError 中接入日志上报,便于后端定位。
- 必要时进行降级或重试。
章节来源
- [TsHttpUtil.js:125](file://src/https/TsHttpUtil.js#L125)
### 六、请求参数配置问题
- 分页参数
- pagination 转换为 pageNum/pageSize确认传入对象结构正确。
- equals 对象
- equals 对象中空值会被过滤,确保非空字段参与拼接。
- 全局额外参数
- httpParams 返回的对象会合并到 GET params 或 POST data注意字段冲突与覆盖顺序。
章节来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsGlobalConfig.js:10-12](file://src/utils/TsGlobalConfig.js#L10-L12)
### 七、URL 前缀配置错误
- 现状
- prefix 支持字符串或函数;函数形式可按 URL 动态生成。
- 排查
- 确认 prefix 是否为空或返回空字符串。
- 函数形式需保证返回值为合法前缀(含协议与结尾斜杠)。
- 建议
- 在开发环境与生产环境分别设置不同前缀,避免硬编码。
章节来源
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsGlobalConfig.js:7](file://src/utils/TsGlobalConfig.js#L7)
### 八、Cookie 传递问题
- 现状
- 默认携带 Cookiecredentials: include适用于同源与跨子域场景。
- 排查
- 确认后端是否正确设置 Domain/SameSite/Cross-Origin。
- 若跨域,需后端允许 Credentials 且指定具体 Origin。
- 建议
- 在上层统一设置 Cookie 与 Token避免遗漏。
章节来源
- [TsHttpUtil.js:42](file://src/https/TsHttpUtil.js#L42)
### 九、加解密相关问题
- 现状
- 当开启 encrypt_body 时,请求体被包装为 encryptData 并加密;响应若标记加密则自动解密。
- 排查
- 确认 base64Key 与后端一致。
- 确认加密模式ECB与后端一致。
- 确认 cipherType 为 Base64。
- 建议
- 仅对敏感字段启用加密,避免大体积数据加密带来的性能损耗。
章节来源
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsCrypto.js:8-13](file://src/utils/TsCrypto.js#L8-L13)
- [TsSM4.js:128-141](file://src/utils/TsSM4.js#L128-L141)
### 十、调试工具与监控技巧
- 浏览器开发者工具
- Network查看请求头、响应头、CORS、Cookie、状态码与耗时。
- Console输出 onHttpError 回调中的错误信息。
- 日志与上报
- 在 onHttpError 中记录URL、状态码、请求体摘要、Token 状态、时间戳。
- 对 5xx 错误进行聚合统计,辅助定位热点接口。
- 本地与线上差异
- 使用不同 prefix 区分开发/测试/生产环境。
- 在开发环境开启更详细的日志与断言。
章节来源
- [TsHttpUtil.js:125](file://src/https/TsHttpUtil.js#L125)
- [TsGlobalConfig.js:7](file://src/utils/TsGlobalConfig.js#L7)
### 十一、错误日志分析与问题定位流程
- 步骤
- 收集URL、状态码、请求头、请求体、响应体、时间戳、Token 状态。
- 分类4xx参数/权限/资源、5xx服务/网关、CORS/超时。
- 定位依据状态码与日志缩小范围至前端配置、Cookie/Token、加解密、后端接口。
- 复现:构造最小复现场景,逐步剔除变量(关闭加密、更换 prefix、清除 Cookie
- 验证:修复后回归测试,观察 onHttpError 是否仍触发。
- 建议
- 对高频错误建立告警阈值,结合用户反馈与日志进行联动。
[本节为通用建议,不直接分析具体文件]
## 结论
本工具包通过统一的请求封装、全局配置与加解密模块,提供了较为完善的网络请求基础设施。结合本文提供的故障排除清单与定位流程,可在大多数情况下快速识别并解决常见的网络请求问题。建议在生产环境中补充超时控制、重试与监控上报机制,持续优化用户体验与稳定性。
[本节为总结性内容,不直接分析具体文件]
## 附录
### A. 常见错误代码速查
- 200成功
- 201新建/修改成功
- 202请求已进入后台排队
- 204删除成功
- 400请求参数错误
- 401未认证/令牌无效
- 403权限不足
- 404资源不存在
- 406请求格式不可得
- 410资源永久删除
- 422创建对象时验证错误
- 500服务器内部错误
- 502网关错误
- 503服务不可用/过载
- 504网关超时
章节来源
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
### B. 关键配置与默认值
- 默认配置
- base64Key默认密钥用于加密模块初始化
- prefix默认空字符串。
- onHttpError默认空函数。
- httpParams默认空函数。
- 请求默认
- credentials: include携带 Cookie
- requestType: jsonPOST JSON
- 默认错误处理:将状态映射为可读消息。
章节来源
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### C. 使用示例参考
- README 提供了基本使用方式与全局配置示例,可据此进行最小复现与验证。
章节来源
- [README.md:12-26](file://README.md#L12-L26)

View File

@@ -0,0 +1,803 @@
# 调试工具和方法
<cite>
**本文档中引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [调试工具集成指南](#调试工具集成指南)
7. [调试技术与方法](#调试技术与方法)
8. [性能监控与优化](#性能监控与优化)
9. [故障排查指南](#故障排查指南)
10. [最佳实践总结](#最佳实践总结)
## 简介
本指南专注于如何有效使用各种调试工具和技术来诊断和解决基于 Node.js 的 npm 工具包问题。该工具包提供了通用方法、网络请求、存储管理、加密解密等功能模块,涵盖了现代 Web 应用开发中的常见调试场景。
## 项目结构
该项目采用模块化设计,主要包含以下核心模块:
```mermaid
graph TB
subgraph "主入口"
Index[index.js]
end
subgraph "工具模块"
Common[TsCommon.js<br/>通用工具函数]
Crypto[TsCrypto.js<br/>加密解密]
Storage[TsStorage.js<br/>数据存储]
Config[TsGlobalConfig.js<br/>全局配置]
SM4[TsSM4.js<br/>SM4算法实现]
end
subgraph "HTTP模块"
HttpUtil[TsHttpUtil.js<br/>网络请求封装]
end
subgraph "依赖"
UmiRequest[umi-request<br/>HTTP客户端]
Base64[base64-js<br/>Base64编码]
end
Index --> Common
Index --> Crypto
Index --> Storage
Index --> Config
Index --> SM4
Index --> HttpUtil
HttpUtil --> Storage
HttpUtil --> Crypto
HttpUtil --> Config
HttpUtil --> Common
Crypto --> SM4
Crypto --> Config
Crypto --> Base64
HttpUtil --> UmiRequest
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
### 通用工具模块 (TsCommon.js)
提供基础的 JavaScript 工具函数,包括:
- URL 参数解析
- 数据类型检查
- JSON 解析安全处理
- 字符串操作
- 环境检测
### 网络请求模块 (TsHttpUtil.js)
基于 umi-request 封装的 HTTP 客户端,支持:
- 自动错误处理
- 请求参数预处理
- 数据加密传输
- 响应数据解密
- Token 自动注入
### 存储模块 (TsStorage.js)
本地存储管理,支持:
- 对象序列化存储
- 用户 Token 管理
- 加密开关控制
- 类型安全的数据获取
### 加密模块 (TsCrypto.js)
基于 SM4 算法的加密解密工具,包含:
- SM4 算法实现
- Base64 编码支持
- 动态密钥处理
- 加密模式配置
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
## 架构概览
```mermaid
sequenceDiagram
participant Client as 客户端应用
participant HttpUtil as HTTP工具
participant Crypto as 加密模块
participant Storage as 存储模块
participant Server as 服务器
Client->>HttpUtil : 发起请求
HttpUtil->>Storage : 获取用户Token
Storage-->>HttpUtil : 返回Token
HttpUtil->>HttpUtil : 处理请求参数
HttpUtil->>Crypto : 加密请求数据(可选)
Crypto-->>HttpUtil : 返回加密结果
HttpUtil->>Server : 发送HTTP请求
Server-->>HttpUtil : 返回响应
HttpUtil->>Crypto : 解密响应数据(可选)
Crypto-->>HttpUtil : 返回解密结果
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsStorage.js:9-15](file://src/utils/TsStorage.js#L9-L15)
## 详细组件分析
### HTTP 请求流程分析
```mermaid
flowchart TD
Start([开始请求]) --> CheckPrefix["检查URL前缀配置"]
CheckPrefix --> AddPrefix["添加URL前缀"]
AddPrefix --> ParamsPrep["参数预处理"]
ParamsPrep --> CheckEncryption{"检查加密开关"}
CheckEncryption --> |开启| EncryptData["加密请求数据"]
CheckEncryption --> |关闭| SkipEncrypt["跳过加密"]
EncryptData --> AddToken["添加用户Token"]
SkipEncrypt --> AddToken
AddToken --> SendRequest["发送HTTP请求"]
SendRequest --> CheckResponse{"检查响应状态"}
CheckResponse --> |成功| DecryptData["解密响应数据(可选)"]
CheckResponse --> |失败| ErrorHandler["错误处理"]
DecryptData --> ParseJSON["解析JSON数据"]
ParseJSON --> ReturnSuccess["返回成功响应"]
ErrorHandler --> ReturnError["返回错误响应"]
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
### 加密解密流程分析
```mermaid
classDiagram
class TsCrypto {
-SM4 sm4
+constructor()
+encrypt(content) String
+decrypt(base64) String
}
class TsSM4 {
-Uint8Array key
-Uint8Array iv
-String mode
-String cipherType
-Uint32Array encryptRoundKeys
-Uint32Array decryptRoundKeys
+constructor(config)
+encrypt(plaintext) String
+decrypt(ciphertext) String
-padding(buffer) Uint8Array
-dePadding(buffer) Uint8Array
}
class TsGlobalConfig {
+defaultConfig
+getConfig() Object
+setConfig(obj) void
}
TsCrypto --> TsSM4 : 使用
TsCrypto --> TsGlobalConfig : 读取配置
TsSM4 --> TsGlobalConfig : 读取密钥
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 调试工具集成指南
### 浏览器开发者工具调试
#### 1. 断点设置技巧
**网络请求断点**
-`TsHttpUtil.js``req` 函数中设置断点
- 检查 `dealParamsBody` 函数中的参数处理逻辑
- 监控 `errorHandler` 函数的错误处理流程
**加密解密断点**
-`TsCrypto.js``encrypt``decrypt` 方法中设置断点
- 监控 `TsSM4.js` 中的加密算法执行过程
- 检查 Base64 编码解码的中间结果
#### 2. 变量检查方法
**关键变量监控**
- `window.httpConfig` - 全局配置对象
- `localStorage` - 本地存储数据
- `process.env.NODE_ENV` - 环境变量
- 请求头中的 `token` 字段
#### 3. 控制台调试命令
```javascript
// 检查全局配置
console.log('HTTP配置:', window.httpConfig);
// 检查存储状态
console.log('用户Token:', Storage.getUserToken());
console.log('加密开关:', Storage.getEncryptBody());
// 检查请求参数
console.log('请求参数:', dealParamsBody(options));
```
### Node.js 调试器使用
#### 1. 启动调试会话
```bash
# 使用 inspect 模式启动
node --inspect-brk=9229 index.js
# 或者使用 nodemon 进行热重载调试
nodemon --inspect-brk=9229 index.js
```
#### 2. VS Code 调试配置
创建 `.vscode/launch.json`
```json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "调试 npm 工具包",
"program": "${workspaceFolder}/index.js",
"args": [],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
```
#### 3. 条件断点设置
在 Node.js 中可以设置更精确的断点条件:
```javascript
// 在加密函数中设置条件断点
if (typeof content === 'object') {
debugger; // 仅当内容为对象时触发
}
// 在特定 URL 时断点
if (url.includes('api')) {
debugger; // 仅在 API 请求时触发
}
```
**章节来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
## 调试技术与方法
### 日志记录策略
#### 1. 结构化日志记录
```javascript
// 在关键函数中添加日志
function debugLog(operation, data, result) {
console.log(`[${new Date().toISOString()}] ${operation}`, {
data: JSON.stringify(data),
result: JSON.stringify(result),
stack: new Error().stack
});
}
// 使用示例
debugLog('HTTP请求', {url, options}, response);
```
#### 2. 环境特定的日志级别
```javascript
// 开发环境启用详细日志
if (Common.isDevelopment()) {
console.debug('详细调试信息');
console.trace('调用栈跟踪');
}
// 生产环境限制日志输出
console.warn('警告信息');
console.error('错误信息');
```
#### 3. 性能日志记录
```javascript
// 记录函数执行时间
function performanceLog(funcName, callback) {
const start = performance.now();
try {
const result = callback();
const end = performance.now();
console.log(`${funcName} 执行时间: ${end - start}ms`);
return result;
} catch (error) {
const end = performance.now();
console.error(`${funcName} 执行失败: ${end - start}ms`, error);
throw error;
}
}
```
### 错误追踪方法
#### 1. 异步错误处理
```javascript
// 在 Promise 中添加错误处理
async function safeRequest(url, options) {
try {
const response = await req(url, options);
return response;
} catch (error) {
console.error('请求失败:', {
url,
error: error.message,
stack: error.stack,
timestamp: new Date()
});
throw error;
}
}
```
#### 2. 错误边界捕获
```javascript
// 全局错误捕获
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的 Promise 拒绝:', {
reason: reason.message,
stack: reason.stack,
promise: promise
});
});
process.on('uncaughtException', (error) => {
console.error('未捕获的异常:', {
error: error.message,
stack: error.stack,
timestamp: new Date()
});
});
```
#### 3. 调试信息收集
```javascript
// 收集调试信息的工具函数
function collectDebugInfo() {
return {
timestamp: new Date(),
environment: process.env.NODE_ENV,
userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Node.js',
memory: process.memoryUsage(),
config: {
httpConfig: window.httpConfig,
encryptBody: Storage.getEncryptBody()
}
};
}
```
### 性能监控技巧
#### 1. 内存使用监控
```javascript
// 监控内存使用情况
function monitorMemory() {
const usage = process.memoryUsage();
console.log('内存使用:', {
rss: `${Math.round(usage.rss / 1024 / 1024)} MB`,
heapTotal: `${Math.round(usage.heapTotal / 1024 / 1024)} MB`,
heapUsed: `${Math.round(usage.heapUsed / 1024 / 1024)} MB`
});
}
// 定期监控
setInterval(monitorMemory, 5000);
```
#### 2. 网络性能监控
```javascript
// 监控 HTTP 请求性能
function monitorHttpRequest(url, startTime, endTime, status) {
const duration = endTime - startTime;
console.log('HTTP 请求性能:', {
url,
duration: `${duration}ms`,
status,
timestamp: new Date()
});
// 性能阈值告警
if (duration > 3000) {
console.warn(`慢请求警告: ${url} (${duration}ms)`);
}
}
```
#### 3. 加密性能监控
```javascript
// 监控加密解密性能
function monitorCryptoOperation(operation, dataLength, startTime, endTime) {
const duration = endTime - startTime;
console.log(`${operation} 性能:`, {
dataLength: `${dataLength} 字节`,
duration: `${duration}ms`,
throughput: `${(dataLength / duration).toFixed(2)} 字节/ms`
});
}
```
**章节来源**
- [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
## 故障排查指南
### 常见问题诊断
#### 1. 网络请求问题
**问题症状**
- 请求超时
- 401 未授权
- CORS 跨域错误
**诊断步骤**
1. 检查 Token 是否正确设置
2. 验证 URL 前缀配置
3. 确认请求头设置
4. 检查服务器响应格式
```javascript
// 调试网络请求
function debugNetworkRequest(url, options) {
console.log('请求详情:', {
url: url,
options: JSON.stringify(options),
token: Storage.getUserToken(),
config: GlobalConfig.getConfig()
});
return req(url, options)
.catch(error => {
console.error('请求失败:', {
url: url,
error: error.message,
response: error.response,
stack: error.stack
});
throw error;
});
}
```
#### 2. 加密解密问题
**问题症状**
- 解密失败
- 数据损坏
- 性能问题
**诊断步骤**
1. 验证密钥配置
2. 检查数据格式
3. 确认加密模式
4. 监控性能指标
```javascript
// 调试加密解密
function debugCryptoOperation(operation, data) {
console.log(`${operation} 输入:`, {
data: data,
dataType: typeof data,
dataLength: data ? data.length : 0
});
try {
const result = operation(data);
console.log(`${operation} 输出:`, {
result: result,
resultType: typeof result,
resultLength: result ? result.length : 0
});
return result;
} catch (error) {
console.error(`${operation} 失败:`, {
error: error.message,
stack: error.stack
});
throw error;
}
}
```
#### 3. 存储问题
**问题症状**
- 数据丢失
- 解析失败
- 类型不匹配
**诊断步骤**
1. 检查 localStorage 状态
2. 验证数据序列化
3. 确认默认值处理
4. 监控存储容量
```javascript
// 调试存储操作
function debugStorageOperation(operation, key, value) {
console.log(`存储操作: ${operation}`, {
key: key,
value: value,
storageSize: localStorage.length,
storageKeys: Object.keys(localStorage)
});
try {
const result = operation(key, value);
console.log(`存储结果:`, {
key: key,
storedValue: localStorage.getItem(key),
parsedValue: Common.parseJSON(localStorage.getItem(key))
});
return result;
} catch (error) {
console.error(`存储失败:`, {
error: error.message,
stack: error.stack
});
throw error;
}
}
```
### 调试工具使用示例
#### 1. 浏览器控制台调试
```javascript
// 快速测试函数
function testFunction() {
// 设置断点
debugger;
// 检查当前状态
console.log('当前配置:', GlobalConfig.getConfig());
console.log('用户信息:', {
token: Storage.getUserToken(),
encryptBody: Storage.getEncryptBody()
});
// 执行测试
return TsCommon.isEmpty('');
}
// 执行测试
testFunction();
```
#### 2. Node.js 调试会话
```javascript
// 创建调试脚本
const debugScript = async () => {
console.log('开始调试会话');
// 设置断点
debugger;
// 测试加密功能
const testData = {message: 'Hello World'};
const encrypted = TsCrypto.encrypt(JSON.stringify(testData));
const decrypted = TsCrypto.decrypt(encrypted);
console.log('加密测试:', {
original: testData,
encrypted: encrypted,
decrypted: JSON.parse(decrypted)
});
// 测试网络请求
try {
const response = await TsHttpUtil.get('/api/test');
console.log('网络请求测试:', response);
} catch (error) {
console.error('网络请求失败:', error);
}
};
debugScript();
```
#### 3. 性能分析
```javascript
// 性能基准测试
function performanceBenchmark() {
const iterations = 1000;
const testData = 'Test data for encryption'.repeat(100);
console.time('批量加密');
for (let i = 0; i < iterations; i++) {
TsCrypto.encrypt(testData);
}
console.timeEnd('批量加密');
console.time('批量解密');
const encryptedData = TsCrypto.encrypt(testData);
for (let i = 0; i < iterations; i++) {
TsCrypto.decrypt(encryptedData);
}
console.timeEnd('批量解密');
}
performanceBenchmark();
```
**章节来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
## 最佳实践总结
### 系统性调试方法
#### 1. 分层调试策略
```mermaid
flowchart TD
Problem[问题出现] --> Identify[识别问题类型]
Identify --> Isolate[隔离问题范围]
Isolate --> Test[测试最小复现]
Test --> Debug[深入调试]
Debug --> Fix[修复问题]
Fix --> Verify[验证修复]
Verify --> Monitor[持续监控]
Identify --> |网络问题| NetworkDebug[网络调试]
Identify --> |加密问题| CryptoDebug[加密调试]
Identify --> |存储问题| StorageDebug[存储调试]
Identify --> |性能问题| PerfDebug[性能调试]
NetworkDebug --> Test
CryptoDebug --> Test
StorageDebug --> Test
PerfDebug --> Test
```
#### 2. 调试工具组合使用
**多工具协同调试**
- 浏览器开发者工具 + Node.js 调试器
- 控制台日志 + 断点调试
- 性能分析 + 内存监控
- 错误追踪 + 堆栈分析
#### 3. 调试效率提升技巧
**快速定位问题**
- 使用条件断点减少调试时间
- 实施渐进式调试策略
- 建立标准化的调试流程
- 维护调试知识库
**调试报告模板**
```markdown
# 调试报告
## 问题描述
- 问题现象:
- 影响范围:
- 复现频率:
## 调试过程
- 关键断点位置:
- 观察到的异常行为:
- 相关日志信息:
## 根因分析
- 问题原因:
- 影响因素:
- 代码路径:
## 解决方案
- 临时修复:
- 永久解决方案:
- 预防措施:
## 验证结果
- 修复验证:
- 回归测试:
- 性能影响:
```
### 调试工具配置建议
#### 1. 开发环境配置
```javascript
// 开发环境调试配置
const devConfig = {
enableLogging: true,
logLevel: 'debug',
enableBreakpoints: true,
autoReload: true,
verboseErrors: true
};
// 生产环境调试配置
const prodConfig = {
enableLogging: false,
logLevel: 'error',
enableBreakpoints: false,
autoReload: false,
verboseErrors: false
};
```
#### 2. 调试工具推荐
**必备工具**
- 浏览器开发者工具
- VS Code 调试器
- Node.js Inspector
- Chrome DevTools
- Postman/Fiddler
**高级工具**
- Performance Profiler
- Memory Profiler
- Network Monitor
- Console Logger
通过遵循这些调试工具和方法指南,开发者可以更高效地诊断和解决基于该 npm 工具包的各种问题,提高开发效率和代码质量。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,726 @@
# HTTP 请求模块 (TsHttpUtil)
<cite>
**本文档引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
HTTP 请求模块 (TsHttpUtil) 是一个基于 umi-request 的网络请求封装库,提供了统一的 HTTP 请求接口,支持 GET、POST 和 FORM 请求方法。该模块集成了参数处理、错误处理、状态码映射、响应数据处理和加密传输等功能,为应用程序提供了一套完整的网络通信解决方案。
该模块的主要特点包括:
- 基于 umi-request 的现代化请求封装
- 智能的参数处理机制分页器转换、equals 条件处理)
- 统一的错误处理和状态码映射
- 可选的 SM4 加密传输支持
- 与存储模块、加密模块和配置模块的深度集成
## 项目结构
该项目采用模块化设计,将功能按职责划分为不同的模块:
```mermaid
graph TB
subgraph "核心模块"
Http[TsHttpUtil.js<br/>HTTP请求封装]
Crypto[TsCrypto.js<br/>加密模块]
SM4[TsSM4.js<br/>SM4算法实现]
end
subgraph "工具模块"
Common[TsCommon.js<br/>通用工具函数]
Storage[TsStorage.js<br/>存储模块]
Config[TsGlobalConfig.js<br/>全局配置]
end
subgraph "外部依赖"
UmiRequest[umi-request<br/>HTTP客户端]
Base64[base64-js<br/>Base64编码]
end
Http --> UmiRequest
Http --> Storage
Http --> Common
Http --> Crypto
Http --> Config
Crypto --> SM4
Crypto --> Base64
Crypto --> Config
SM4 --> Base64
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 核心组件
### 主要导出接口
TsHttpUtil 模块提供了四个主要的 HTTP 请求方法:
1. **req()** - 通用请求方法,支持所有 HTTP 方法
2. **get()** - GET 请求方法
3. **post()** - POST 请求方法JSON 格式)
4. **form()** - 表单提交方法application/x-www-form-urlencoded
### 错误处理机制
模块内置了完善的错误处理系统:
```mermaid
flowchart TD
Request[发起请求] --> Response{收到响应}
Response --> |成功| CheckCode{状态码检查}
Response --> |失败| ErrorHandler[错误处理器]
CheckCode --> |200| ParseData[解析响应数据]
CheckCode --> |其他| HttpError[HTTP错误处理]
ParseData --> EncryptCheck{需要解密?}
EncryptCheck --> |是| Decrypt[解密数据]
EncryptCheck --> |否| ReturnData[返回数据]
Decrypt --> ReturnData
HttpError --> OnError[调用onHttpError回调]
OnError --> Reject[拒绝Promise]
ErrorHandler --> ReturnError[返回标准错误对象]
ReturnError --> Reject
```
**图表来源**
- [TsHttpUtil.js:25-35](file://src/https/TsHttpUtil.js#L25-L35)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
**章节来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 架构概览
### 整体架构设计
```mermaid
graph TB
subgraph "应用层"
Client[业务代码]
end
subgraph "HTTP层"
TsHttpUtil[TsHttpUtil]
Request[umi-request]
end
subgraph "数据处理层"
ParamsHandler[参数处理器]
ResponseHandler[响应处理器]
end
subgraph "安全层"
Crypto[加密模块]
Storage[存储模块]
end
subgraph "配置层"
GlobalConfig[全局配置]
SM4[SM4算法]
end
Client --> TsHttpUtil
TsHttpUtil --> Request
TsHttpUtil --> ParamsHandler
TsHttpUtil --> ResponseHandler
ParamsHandler --> Storage
ResponseHandler --> Crypto
Crypto --> SM4
TsHttpUtil --> GlobalConfig
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### 数据流处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as TsHttpUtil
participant ParamsHandler as 参数处理器
participant Crypto as 加密模块
participant Request as umi-request
participant Server as 服务器
Client->>HttpUtil : 发起请求
HttpUtil->>ParamsHandler : 处理参数
ParamsHandler->>ParamsHandler : 分页器转换
ParamsHandler->>ParamsHandler : equals条件处理
ParamsHandler->>ParamsHandler : 添加额外参数
alt 需要加密
ParamsHandler->>Crypto : 加密数据
Crypto->>Crypto : SM4加密
Crypto-->>ParamsHandler : 返回加密数据
end
ParamsHandler-->>HttpUtil : 返回处理后的参数
HttpUtil->>Request : 发送HTTP请求
Request->>Server : HTTP请求
Server-->>Request : HTTP响应
Request-->>HttpUtil : 响应数据
alt 响应需要解密
HttpUtil->>Crypto : 解密响应
Crypto->>Crypto : SM4解密
Crypto-->>HttpUtil : 返回明文数据
end
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:46-91](file://src/https/TsHttpUtil.js#L46-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 详细组件分析
### 参数处理机制
#### 分页器转换
模块支持智能的分页器参数转换:
| 输入参数 | 输出参数 |
|---------|---------|
| pagination.pageSize | pageSize |
| pagination.current | pageNum |
| pagination | 删除 |
#### equals 条件处理
equals 对象会被转换为逗号分隔的字符串:
```javascript
// 输入
{ equals: { id: 1, name: 'test' } }
// 输出
{ equals: "id=1,name=test" }
```
#### 额外参数添加
根据请求类型自动添加额外参数:
- **GET 请求**: 合并到 `params` 对象
- **POST 请求**: 合并到 `data` 对象
- **表单请求**: 合并到 `data` 对象
**章节来源**
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
### 加密传输支持
#### 加密配置
加密功能通过全局配置启用:
```javascript
// 启用加密
TsGlobalConfig.setConfig({
encryptBody: true,
base64Key: "your-base64-key"
});
```
#### 加密流程
```mermaid
flowchart LR
Plain[明文数据] --> JSON[JSON序列化]
JSON --> SM4[SM4加密]
SM4 --> Base64[Base64编码]
Base64 --> Encrypted[加密数据]
Encrypted --> Send[发送到服务器]
Send --> Receive[接收响应]
Receive --> Decrypt[SM4解密]
Decrypt --> Parse[JSON解析]
Parse --> Plain
```
**图表来源**
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
### 错误处理策略
#### 状态码映射
模块内置了常用 HTTP 状态码的中文描述:
| 状态码 | 描述 |
|-------|------|
| 200 | 服务器成功返回请求的数据 |
| 201 | 新建或修改数据成功 |
| 202 | 一个请求已经进入后台排队(异步任务) |
| 204 | 删除数据成功 |
| 400 | 发出的请求有错误,服务器没有进行新建或修改数据的操作 |
| 401 | 用户没有权限(令牌、用户名、密码错误) |
| 403 | 用户得到授权,但是访问是被禁止的 |
| 404 | 发出的请求针对的是不存在的记录,服务器没有进行操作 |
| 406 | 请求的格式不可得 |
| 410 | 请求的资源被永久删除,且不会再得到的 |
| 422 | 当创建一个对象时,发生一个验证错误 |
| 500 | 服务器发生错误,请检查服务器 |
| 502 | 网关错误 |
| 503 | 服务不可用,服务器暂时过载或维护 |
| 504 | 网关超时 |
#### 错误处理流程
```mermaid
flowchart TD
Start[请求开始] --> TryRequest[尝试请求]
TryRequest --> Success{请求成功?}
Success --> |是| CheckStatus{状态码检查}
Success --> |否| NetworkError[网络错误处理]
CheckStatus --> Status200{状态码=200?}
Status200 --> |是| ParseResponse[解析响应]
Status200 --> |否| HttpError[HTTP错误处理]
ParseResponse --> EncryptCheck{需要解密?}
EncryptCheck --> |是| Decrypt[解密数据]
EncryptCheck --> |否| ReturnSuccess[返回成功结果]
Decrypt --> ReturnSuccess
HttpError --> CallCallback[调用onHttpError回调]
CallCallback --> ReturnError[返回错误对象]
NetworkError --> ReturnError
ReturnSuccess --> End[请求结束]
ReturnError --> End
```
**图表来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
**章节来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### API 接口说明
#### get() 方法
**方法签名**
```javascript
async function get(url, params = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| params | object | 否 | {} | GET请求参数 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 基本使用
const result = await HttpUtil.get('/api/users');
// 带参数使用
const result = await HttpUtil.get('/api/users', {
page: 1,
size: 10,
name: '张三'
});
// 自定义选项
const result = await HttpUtil.get('/api/users', {}, {
timeout: 5000,
headers: {'Authorization': 'Bearer token'}
});
```
#### post() 方法
**方法签名**
```javascript
async function post(url, data = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| data | object | 否 | {} | POST请求数据 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 基本使用
const result = await HttpUtil.post('/api/users', {
name: '张三',
age: 25
});
// 表单数据
const result = await HttpUtil.post('/api/login', {
username: 'admin',
password: 'password'
}, {
requestType: 'form'
});
```
#### form() 方法
**方法签名**
```javascript
async function form(url, data = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| data | object | 否 | {} | 表单数据 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 表单提交
const result = await HttpUtil.form('/api/upload', {
file: fileInput.files[0],
description: '文件描述'
});
```
#### req() 方法
**方法签名**
```javascript
async function req(url, options)
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| options | object | 是 | {} | 请求选项 |
**请求选项参数**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| method | string | 否 | 'GET' | HTTP方法 |
| params | object | 否 | {} | GET参数 |
| data | object | 否 | {} | 请求数据 |
| requestType | string | 否 | 'json' | 请求类型 ('json' 或 'form') |
| headers | object | 否 | {} | 请求头 |
| rawResponse | boolean | 否 | false | 是否返回原始响应 |
**使用示例**
```javascript
// 自定义请求
const result = await HttpUtil.req('/api/data', {
method: 'POST',
data: {key: 'value'},
headers: {'Custom-Header': 'value'}
});
```
**章节来源**
- [TsHttpUtil.js:136-165](file://src/https/TsHttpUtil.js#L136-L165)
### 集成关系
#### 与存储模块的集成
TsHttpUtil 通过存储模块管理用户认证信息:
```mermaid
classDiagram
class TsHttpUtil {
+getUserToken() string
+saveUserToken(token) void
+getEncryptBody() boolean
+saveEncryptBody(bool) void
}
class TsStorage {
+getUserToken() string
+saveUserToken(token) void
+getEncryptBody() boolean
+saveEncryptBody(bool) void
}
class TsHttpUtil {
+headers : object
+token : string
}
TsHttpUtil --> TsStorage : 使用
```
**图表来源**
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
#### 与加密模块的集成
加密功能通过 TsCrypto 和 TsSM4 实现:
```mermaid
classDiagram
class TsHttpUtil {
+encryptData(data) object
+decryptData(data) string
}
class TsCrypto {
+encrypt(content) string
+decrypt(base64) string
}
class TsSM4 {
+encrypt(plaintext) string
+decrypt(ciphertext) string
}
class TsGlobalConfig {
+base64Key : string
}
TsHttpUtil --> TsCrypto : 使用
TsCrypto --> TsSM4 : 使用
TsCrypto --> TsGlobalConfig : 读取配置
```
**图表来源**
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
#### 与配置模块的集成
全局配置管理:
```mermaid
classDiagram
class TsGlobalConfig {
+defaultConfig : object
+getConfig() object
+setConfig(obj) void
}
class TsHttpUtil {
+prefix : string
+httpParams : function
+onHttpError : function
}
TsHttpUtil --> TsGlobalConfig : 读取配置
TsGlobalConfig --> TsHttpUtil : 提供配置
```
**图表来源**
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
**章节来源**
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 依赖关系分析
### 外部依赖
项目的主要外部依赖包括:
| 依赖包 | 版本 | 用途 |
|-------|------|-----|
| umi-request | 1.4.0 | HTTP 客户端库 |
| base64-js | 1.5.1 | Base64 编码/解码 |
### 内部模块依赖
```mermaid
graph TD
TsHttpUtil[TsHttpUtil.js] --> TsStorage[TsStorage.js]
TsHttpUtil --> TsCommon[TsCommon.js]
TsHttpUtil --> TsCrypto[TsCrypto.js]
TsHttpUtil --> TsGlobalConfig[TsGlobalConfig.js]
TsCrypto --> TsSM4[TsSM4.js]
TsCrypto --> TsGlobalConfig
TsSM4 --> Base64[base64-js]
index[index.js] --> TsHttpUtil
index --> TsStorage
index --> TsCrypto
index --> TsGlobalConfig
index --> TsSM4
index --> TsCommon
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 请求优化建议
1. **批量请求**: 对于多个相关的请求,考虑合并到单个请求中以减少网络开销
2. **缓存策略**: 在业务层实现适当的缓存机制,避免重复请求相同数据
3. **超时设置**: 合理设置请求超时时间,避免长时间阻塞
4. **压缩传输**: 对大体积数据考虑使用压缩算法
### 内存管理
- 及时清理不再使用的响应数据
- 避免在请求过程中创建大量临时对象
- 注意循环引用的处理
## 故障排除指南
### 常见问题及解决方案
#### 1. 认证失败
**症状**: 返回 401 状态码
**原因**: 用户令牌无效或过期
**解决方案**:
```javascript
// 检查用户令牌
const token = Storage.getUserToken();
if (!token) {
// 重新登录
redirectToLogin();
}
// 设置自定义头部
const result = await HttpUtil.get('/api/protected', {}, {
headers: {
'Authorization': `Bearer ${token}`
}
});
```
#### 2. 数据解密失败
**症状**: 解密后数据格式错误
**原因**: 加密密钥不匹配或数据损坏
**解决方案**:
```javascript
// 检查加密配置
const encryptEnabled = Storage.getEncryptBody();
if (encryptEnabled) {
// 验证密钥配置
const config = GlobalConfig.getConfig();
if (!config.base64Key) {
throw new Error('缺少加密密钥配置');
}
}
```
#### 3. 请求超时
**症状**: 请求长时间无响应
**原因**: 网络延迟或服务器负载过高
**解决方案**:
```javascript
try {
const result = await HttpUtil.get('/api/data', {}, {
timeout: 10000 // 10秒超时
});
} catch (error) {
if (error.code === 'ECONNABORTED') {
// 处理超时
showTimeoutMessage();
}
}
```
#### 4. 参数格式错误
**症状**: 返回 400 状态码
**原因**: 请求参数格式不符合服务器要求
**解决方案**:
```javascript
// 使用分页器参数
const result = await HttpUtil.get('/api/list', {
pagination: {
pageSize: 10,
current: 1
}
});
// 使用 equals 条件
const result = await HttpUtil.get('/api/search', {
equals: {
status: 'active',
type: 'user'
}
});
```
**章节来源**
- [TsHttpUtil.js:124-127](file://src/https/TsHttpUtil.js#L124-L127)
- [TsHttpUtil.js:130-132](file://src/https/TsHttpUtil.js#L130-L132)
## 结论
HTTP 请求模块 (TsHttpUtil) 提供了一个功能完整、易于使用的网络请求封装解决方案。其主要优势包括:
1. **统一的接口设计**: 提供简洁一致的 API 接口
2. **智能参数处理**: 自动处理分页器和条件参数
3. **完善的错误处理**: 内置状态码映射和错误回调机制
4. **灵活的安全支持**: 可选的 SM4 加密传输功能
5. **良好的模块化**: 与存储、加密、配置模块的深度集成
该模块适合在企业级应用中使用,能够有效简化网络请求的处理逻辑,提高开发效率和代码质量。通过合理的配置和使用,可以满足大多数 Web 应用的网络通信需求。

View File

@@ -0,0 +1,490 @@
# SM4 算法模块 (TsSM4)
<cite>
**本文档引用的文件**
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
SM4 算法模块是基于中国国家密码标准的对称加密算法实现,采用 128 位分组长度和 128 位密钥长度。该模块提供了完整的 SM4 加密解密功能,支持 CBC 和 ECB 两种工作模式,并实现了 PKCS7 自动填充算法。模块设计遵循现代 JavaScript 最佳实践,使用 ES6 类语法和 TypedArray 数据结构,确保高性能和内存效率。
本模块在企业级应用中用于数据加密、安全通信和敏感信息保护,特别适用于需要符合中国国家标准的加密需求场景。
## 项目结构
该项目采用模块化组织方式,主要包含以下核心文件:
```mermaid
graph TB
subgraph "核心模块"
SM4[TsSM4.js<br/>主加密模块]
Crypto[TsCrypto.js<br/>加密服务封装]
Global[TsGlobalConfig.js<br/>全局配置]
end
subgraph "工具模块"
Common[TsCommon.js<br/>通用工具]
Storage[TsStorage.js<br/>存储工具]
HttpUtil[TsHttpUtil.js<br/>HTTP工具]
end
subgraph "入口文件"
Index[index.js<br/>模块导出]
Package[package.json<br/>依赖管理]
end
SM4 --> Crypto
Crypto --> Global
Index --> SM4
Index --> Crypto
Index --> Common
Index --> Storage
Index --> HttpUtil
Package --> SM4
Package --> Crypto
```
**图表来源**
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [index.js:1-16](file://index.js#L1-L16)
**章节来源**
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [index.js:1-16](file://index.js#L1-L16)
## 核心组件
### 主要类结构
TsSM4 模块包含两个核心类Crypt 工具类和 TsSM4 加密类。
```mermaid
classDiagram
class Crypt {
+stringToArrayBufferInUtf8(str) Uint8Array
+utf8ArrayBufferToString(buffer) String
+arrayBufferToBase64(buffer) String
+base64ToArrayBuffer(base64) Uint8Array
}
class TsSM4 {
-Uint8Array key
-Uint8Array iv
-String mode
-String cipherType
-Uint32Array encryptRoundKeys
-Uint32Array decryptRoundKeys
+constructor(config)
+doBlockCrypt(blockData, roundKeys) Uint32Array
+spawnEncryptRoundKeys() Uint32Array
+rotateLeft(x, y) Number
+linearTransform1(b) Number
+linearTransform2(b) Number
+tauTransform(a) Number
+tTransform1(z) Number
+tTransform2(z) Number
+padding(originalBuffer) Uint8Array
+dePadding(paddedBuffer) Uint8Array
+uint8ToUint32Block(uint8Array, baseIndex) Uint32Array
+encrypt(plaintext) String
+decrypt(ciphertext) String
}
class TsCrypto {
-SM4 sm4
+constructor()
+encrypt(content) String
+decrypt(base64) String
}
TsSM4 --> Crypt : "使用"
TsCrypto --> TsSM4 : "封装"
```
**图表来源**
- [TsSM4.js:39-453](file://src/utils/TsSM4.js#L39-L453)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
### 关键常量定义
模块定义了 SM4 算法的核心常量:
- **Sbox 替换表**: 16×16 的 S 盒替换表,用于字节替换操作
- **CK 常量数组**: 32 个轮常量,用于密钥扩展
- **FK 固定常量**: 4 个固定常量,用于初始密钥处理
**章节来源**
- [TsSM4.js:5-37](file://src/utils/TsSM4.js#L5-L37)
## 架构概览
### 整体架构设计
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
Config[配置管理]
end
subgraph "加密服务层"
CryptoService[TsCrypto]
SM4Engine[TsSM4]
end
subgraph "数据转换层"
Base64[Base64 编码]
UTF8[UTF-8 编码]
ByteArray[字节数组]
end
subgraph "底层实现"
SBox[S 盒表]
RoundKeys[轮密钥]
Transform[变换函数]
end
App --> CryptoService
Config --> CryptoService
CryptoService --> SM4Engine
SM4Engine --> Base64
SM4Engine --> UTF8
SM4Engine --> ByteArray
SM4Engine --> SBox
SM4Engine --> RoundKeys
SM4Engine --> Transform
```
**图表来源**
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
### 数据流处理
```mermaid
sequenceDiagram
participant Client as 应用客户端
participant Crypto as TsCrypto
participant SM4 as TsSM4
participant Crypt as Crypt工具
Client->>Crypto : encrypt(明文)
Crypto->>SM4 : encrypt(明文)
SM4->>Crypt : stringToArrayBufferInUtf8(明文)
Crypt-->>SM4 : UTF-8 字节数组
SM4->>SM4 : padding(填充)
SM4->>SM4 : CBC/ECB 模式处理
SM4->>Crypt : arrayBufferToBase64(密文)
Crypt-->>SM4 : Base64 字符串
SM4-->>Crypto : 密文字符串
Crypto-->>Client : 密文字符串
```
**图表来源**
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsCrypto.js:19-21](file://src/utils/TsCrypto.js#L19-L21)
## 详细组件分析
### SM4 核心算法实现
#### 密钥扩展算法
密钥扩展是 SM4 算法的核心步骤,负责从原始密钥生成 32 个轮密钥。
```mermaid
flowchart TD
Start([开始密钥扩展]) --> ExtractMK["提取 MK 密钥<br/>mk[0..3] = key[0..15]"]
ExtractMK --> InitK["初始化 K 数组<br/>k[0..3] = mk ⊕ FK"]
InitK --> Loop{"循环 i = 0..31"}
Loop --> CalcK["计算 k[i+4] = k[i] ⊕ T(k[i+1] ⊕ k[i+2] ⊕ k[i+3] ⊕ CK[i])"]
CalcK --> SaveKey["保存轮密钥<br/>encryptRoundKeys[i] = k[i+4]"]
SaveKey --> Loop
Loop --> |完成| ReverseKeys["反转密钥顺序<br/>decryptRoundKeys = reverse(encryptRoundKeys)"]
ReverseKeys --> End([结束])
```
**图表来源**
- [TsSM4.js:189-207](file://src/utils/TsSM4.js#L189-L207)
#### 轮函数实现
每个 SM4 轮包含多个变换操作:
```mermaid
flowchart TD
BlockIn[16字节明文块] --> SplitBlock["分割为4个32位字<br/>block[0..3]"]
SplitBlock --> RoundLoop{"i = 0..31"}
RoundLoop --> XOROp["x[i+4] = x[i] ⊕ T(x[i+1] ⊕ x[i+2] ⊕ x[i+3] ⊕ RK[i])"]
XOROp --> RoundLoop
RoundLoop --> |完成| FinalBlock["组合最终块<br/>y[0..3] = x[32..35]"]
FinalBlock --> BlockOut[16字节密文块]
```
**图表来源**
- [TsSM4.js:166-180](file://src/utils/TsSM4.js#L166-L180)
#### 变换函数详解
##### τ 变换 (字节替换)
τ 变换使用 S 盒进行非线性替换:
- 输入: 32位值
- 处理: 将每个字节通过 S 盒查找替换
- 输出: 32位值
##### L 线性变换
L 变换实现位移和异或操作:
- L1: b ⊕ (b <<< 2) (b <<< 10) (b <<< 18) (b <<< 24)
- L2: b (b <<< 13) (b <<< 23)
##### T 组合变换
T 变换结合 τ L 变换
- T1: L1(τ(z))
- T2: L2(τ(z))
**章节来源**
- [TsSM4.js:250-277](file://src/utils/TsSM4.js#L250-L277)
### 工作模式实现
#### CBC 模式
CBC (Cipher Block Chaining) 模式提供链式加密
```mermaid
sequenceDiagram
participant P as 明文块
participant IV as 初始化向量
participant XOR as 异或运算
participant ENC as 加密器
participant C as 密文块
P1->>XOR : 明文1 ⊕ IV
XOR->>ENC : (明文1 ⊕ IV)
ENC-->>C : 密文1
C->>XOR : 密文1 ⊕ 明文2
XOR->>ENC : (密文1 ⊕ 明文2) ⊕ IV
ENC-->>C : 密文2
Note over IV,C : 每次使用前一个密文作为链输入
```
**图表来源**
- [TsSM4.js:343-378](file://src/utils/TsSM4.js#L343-L378)
#### ECB 模式
ECB (Electronic Codebook) 模式提供独立块加密
```mermaid
flowchart TD
Plain1[明文块1] --> Encrypt1[独立加密]
Plain2[明文块2] --> Encrypt2[独立加密]
Plain3[明文块3] --> Encrypt3[独立加密]
Encrypt1 --> Cipher1[密文块1]
Encrypt2 --> Cipher2[密文块2]
Encrypt3 --> Cipher3[密文块3]
Note1[相同明文块产生相同密文块]
Note2[无链式依赖]
```
**图表来源**
- [TsSM4.js:368-378](file://src/utils/TsSM4.js#L368-L378)
### PKCS7 填充算法
PKCS7 是一种标准的块填充方案
```mermaid
flowchart TD
Start([开始填充]) --> CheckNull{"输入为空?"}
CheckNull --> |是| ReturnNull[返回 null]
CheckNull --> |否| CalcPad["计算填充长度<br/>padLen = 16 - (len % 16)"]
CalcPad --> CreateBuffer["创建新缓冲区<br/>长度 = 原长度 + padLen"]
CreateBuffer --> CopyData["复制原数据到新缓冲区"]
CopyData --> FillPad["填充 padLen 个字节<br/>每个字节值为 padLen"]
FillPad --> ReturnBuffer[返回填充后的缓冲区]
ReturnNull --> End([结束])
ReturnBuffer --> End
```
**图表来源**
- [TsSM4.js:287-296](file://src/utils/TsSM4.js#L287-L296)
**章节来源**
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
### 数据类型转换
#### 字节数组与 32 位整数转换
```mermaid
flowchart TD
Uint8Array[Uint8Array] --> SplitBytes["按字节分割<br/>每4字节组成一个32位整数"]
SplitBytes --> ShiftLeft["左移操作<br/>高位字节 << 24, 16, 8, 0"]
ShiftLeft --> ORCombine["按位或组合<br/>形成32位整数"]
ORCombine --> Uint32Array[Uint32Array]
Uint32Array --> SplitBits["按位拆分<br/>32位整数拆分为4个字节"]
SplitBits --> ShiftRight["右移操作<br/>高位字节 >> 24, 16, 8, 0"]
ShiftRight --> ANDMask["按位与掩码<br/>& 0xFF"]
ANDMask --> Uint8Array[Uint8Array]
```
**图表来源**
- [TsSM4.js:322-329](file://src/utils/TsSM4.js#L322-L329)
**章节来源**
- [TsSM4.js:322-329](file://src/utils/TsSM4.js#L322-L329)
## 依赖关系分析
### 外部依赖
```mermaid
graph TB
subgraph "外部库"
Base64[base64-js@1.5.1<br/>Base64 编解码]
UmiRequest[umi-request@1.4.0<br/>HTTP 请求]
end
subgraph "内部模块"
SM4[TsSM4.js<br/>SM4 加密算法]
Crypto[TsCrypto.js<br/>加密服务封装]
Global[TsGlobalConfig.js<br/>全局配置]
Common[TsCommon.js<br/>通用工具]
Storage[TsStorage.js<br/>存储工具]
HttpUtil[TsHttpUtil.js<br/>HTTP 工具]
end
SM4 --> Base64
Crypto --> Base64
Crypto --> Global
HttpUtil --> UmiRequest
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [TsSM4.js](file://src/utils/TsSM4.js#L1)
- [TsCrypto.js](file://src/utils/TsCrypto.js#L1)
### 内部模块依赖
```mermaid
graph LR
SM4[TsSM4] --> Crypt[Crypt 工具类]
Crypto[TsCrypto] --> SM4
Crypto --> Global[全局配置]
HttpUtil[TsHttpUtil] --> SM4
HttpUtil --> Crypto
```
**图表来源**
- [TsSM4.js:1-94](file://src/utils/TsSM4.js#L1-L94)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [index.js:1-16](file://index.js#L1-L16)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 内存使用分析
#### 数据结构内存占用
| 数据结构 | 大小 | 用途 |
|---------|------|------|
| Uint8Array | 1 字节/元素 | 原始字节数据 |
| Uint32Array | 4 字节/元素 | 32位整数运算 |
| Sbox | 256 字节 | 字节替换表 |
| 轮密钥数组 | 128 字节 | 32个轮密钥 |
| 中间变量 | ~144 字节 | 临时计算结果 |
#### 内存优化策略
1. **TypedArray 使用**: 优先使用 TypedArray 减少内存开销
2. **就地计算**: 尽可能重用数组避免额外分配
3. **批量处理**: 一次处理多个块提高缓存利用率
### 性能特征
#### 时间复杂度
- **密钥扩展**: O(1) - 固定 32 次迭代
- **单块加密**: O(1) - 固定 32 轮运算
- **整体加密**: O(n) - n 为块数量
#### 空间复杂度
- **内存使用**: O(n) - n 为输入数据大小
- **额外开销**: O(1) - 固定大小的中间变量
### 并发处理
模块当前不支持并发操作建议
1. 为每个并发任务创建独立的 TsSM4 实例
2. 避免在多线程环境中共享同一实例
3. 考虑使用 Web Workers 处理大量数据
## 故障排除指南
### 常见错误及解决方案
#### 密钥长度错误
**问题**: 密钥长度不是 16 字节
**解决**: 确保密钥为 16 字节长度
**位置**: [TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
#### IV 参数错误
**问题**: CBC 模式下 IV 长度不正确
**解决**: 确保 IV 16 字节长度
**位置**: [TsSM4.js:119-121](file://src/utils/TsSM4.js#L119-L121)
#### 填充数据错误
**问题**: 去填充时数据格式不正确
**解决**: 确保使用相同的填充算法进行加解密
**位置**: [TsSM4.js:309-311](file://src/utils/TsSM4.js#L309-L311)
### 调试技巧
1. **启用详细日志**: 在开发环境中输出中间计算结果
2. **单元测试**: 为关键函数编写测试用例
3. **边界测试**: 测试空数据单块数据多块数据等场景
**章节来源**
- [TsSM4.js:103-121](file://src/utils/TsSM4.js#L103-L121)
- [TsSM4.js:309-311](file://src/utils/TsSM4.js#L309-L311)
## 结论
SM4 算法模块提供了完整高效的中国国家标准加密实现模块具有以下特点
### 技术优势
1. **标准兼容**: 完全符合 SM4 算法规范
2. **性能优秀**: 使用 TypedArray 和优化算法
3. **接口友好**: 提供简洁的加密解密接口
4. **模式完整**: 支持 CBC ECB 两种工作模式
### 应用场景
- 企业数据加密
- 网络通信安全
- 敏感信息保护
- 符合国家标准的系统集成
### 发展建议
1. **添加更多模式**: 考虑支持 OFBCFB 等模式
2. **性能优化**: 实现 SIMD 指令集优化
3. **安全性增强**: 添加完整性校验机制
4. **文档完善**: 提供更详细的使用示例
该模块为企业级应用提供了可靠的加密解决方案满足了中国国家标准的要求同时保持了良好的性能和易用性

View File

@@ -0,0 +1,363 @@
# 全局配置模块 (TsGlobalConfig)
<cite>
**本文引用的文件列表**
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向全局配置模块TsGlobalConfig系统性阐述其在工具包中的核心地位与作用以及与网络请求、加解密、存储等模块的集成关系。文档重点覆盖
- 默认配置与动态更新机制
- 配置项类型、作用域与优先级规则
- 完整的配置 API 使用说明
- 配置示例、最佳实践与常见场景
- 错误处理回调与配置验证逻辑
## 项目结构
该工具包采用按功能模块划分的组织方式TsGlobalConfig 作为全局配置中心,被网络请求、加解密、存储等模块以依赖形式使用,对外通过入口文件统一导出。
```mermaid
graph TB
subgraph "入口与导出"
IDX["index.js"]
end
subgraph "配置与工具"
CFG["TsGlobalConfig.js"]
COM["TsCommon.js"]
STO["TsStorage.js"]
end
subgraph "网络与安全"
HTTP["TsHttpUtil.js"]
CRY["TsCrypto.js"]
SM4["TsSM4.js"]
end
IDX --> HTTP
IDX --> CFG
IDX --> STO
IDX --> CRY
IDX --> COM
HTTP --> CFG
HTTP --> STO
HTTP --> COM
CRY --> CFG
CRY --> SM4
```
图表来源
- [index.js](file://index.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
章节来源
- [index.js](file://index.js)
- [package.json](file://package.json)
## 核心组件
- 全局配置中心TsGlobalConfig
- 提供默认配置与运行时配置合并能力
- 暴露配置读取与写入接口,支持动态更新
- 网络请求模块TsHttpUtil
- 通过全局配置决定前缀、附加参数、错误处理回调等行为
- 加密模块TsCrypto
- 从全局配置读取密钥,用于 SM4 加解密
- 存储模块TsStorage
- 与全局配置配合控制是否启用请求体加密开关
章节来源
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
## 架构总览
TsGlobalConfig 作为“全局状态”容器,贯穿请求生命周期的关键节点:
- 请求发起前:根据配置决定 URL 前缀拼接、附加参数注入
- 请求过程中:根据配置决定是否加密请求体
- 请求完成后:根据配置调用错误处理回调
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Http as "TsHttpUtil"
participant Cfg as "TsGlobalConfig"
participant Sto as "TsStorage"
participant Cry as "TsCrypto"
participant Net as "umi-request"
Caller->>Http : "发起请求"
Http->>Cfg : "读取配置前缀/附加参数/错误回调"
Http->>Sto : "读取用户 Token"
Http->>Http : "根据配置处理参数/附加参数"
alt "需要加密"
Http->>Cry : "读取 base64Key 并加密"
end
Http->>Net : "发送请求"
Net-->>Http : "响应结果"
alt "业务错误"
Http->>Cfg : "调用 onHttpError 回调"
end
Http-->>Caller : "返回处理后的数据"
```
图表来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
## 详细组件分析
### TsGlobalConfig 组件分析
- 默认配置
- 包含基础密钥、URL 前缀、HTTP 错误回调、附加参数函数等
- 配置读取
- 优先读取浏览器全局对象上的运行时配置;若未设置则回退到默认配置
- 配置写入
- 合并传入配置与当前配置,形成最终运行时配置
- 作用域与优先级
- 作用域:浏览器全局 window 对象
- 优先级:运行时配置 > 默认配置
- 配置项类型与用途
- base64KeySM4 密钥Base64 字符串),用于加密/解密
- prefix字符串或函数用于拼接请求 URL 前缀
- onHttpError函数接收后端返回的错误对象用于统一错误处理
- httpParams函数返回附加参数对象用于 GET/POST 注入
```mermaid
flowchart TD
Start(["开始"]) --> ReadRuntime["读取 window.httpConfig"]
ReadRuntime --> HasRuntime{"是否存在运行时配置?"}
HasRuntime -- "是" --> Merge["合并默认配置与运行时配置"]
HasRuntime -- "否" --> UseDefault["使用默认配置"]
Merge --> ReturnCfg["返回最终配置"]
UseDefault --> ReturnCfg
ReturnCfg --> End(["结束"])
```
图表来源
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
章节来源
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
### TsHttpUtil 与全局配置的集成
- URL 前缀处理
- 支持字符串或函数两种形式;函数形式可按 URL 动态生成前缀
- 附加参数注入
- 若配置了 httpParams 函数,则在 GET 参数与非表单 POST 数据中注入
- 错误处理回调
- 当响应码非 200 时,调用 onHttpError 回调
- 请求体加密
- 结合存储模块的开关与全局配置的密钥,对请求体进行加密包装
```mermaid
sequenceDiagram
participant Util as "TsHttpUtil"
participant Cfg as "TsGlobalConfig"
participant Sto as "TsStorage"
participant Net as "umi-request"
Util->>Cfg : "读取 prefix/httpParams/onHttpError"
Util->>Sto : "读取用户 Token"
Util->>Util : "处理分页/equals 等参数"
Util->>Cfg : "调用 httpParams()"
Util->>Net : "发送请求"
Net-->>Util : "返回响应"
alt "业务错误"
Util->>Cfg : "调用 onHttpError(res)"
end
```
图表来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
章节来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
### TsCrypto 与全局配置的集成
- 初始化阶段
- 从全局配置读取 base64Key并转换为字节数组
- 加解密流程
- 基于 SM4 算法,支持 ECB/CBC 模式与 Base64 输出类型
- 配置影响点
- base64Key 变更会直接影响密钥解析与后续加解密结果
```mermaid
classDiagram
class TsCrypto {
+constructor()
+encrypt(content)
+decrypt(base64)
}
class TsSM4 {
+constructor(config)
+encrypt(plaintext)
+decrypt(ciphertext)
}
TsCrypto --> TsSM4 : "组合使用"
```
图表来源
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
章节来源
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
### 配置 API 文档
- setConfig(obj)
- 功能:合并传入配置与当前运行时配置,形成新的全局配置
- 参数obj 为配置对象,键值对应默认配置项
- 注意:仅影响后续请求与加密初始化
- getConfig()
- 功能:返回当前运行时配置(若未设置则回退默认配置)
- 返回:配置对象(包含 base64Key、prefix、onHttpError、httpParams
章节来源
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
### 配置项类型、作用域与优先级
- 类型与含义
- base64Key字符串SM4 密钥Base64 编码)
- prefix字符串或函数用于拼接请求 URL 前缀
- onHttpError函数接收后端返回的错误对象
- httpParams函数返回附加参数对象
- 作用域
- 浏览器全局 window 对象,模块间共享
- 优先级
- 运行时配置优先于默认配置;函数类型的 prefix 可按 URL 动态生效
章节来源
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
### 配置示例与最佳实践
- 示例一:设置 URL 前缀与错误回调
- 在应用启动时调用 setConfig设置 prefix 与 onHttpError
- 之后所有请求自动拼接前缀并统一错误处理
- 示例二:启用请求体加密
- 通过存储模块保存加密开关状态
- TsHttpUtil 在发送请求时读取开关并按需加密
- 最佳实践
- 将全局配置集中初始化,避免分散设置
- prefix 使用函数形式以适配多环境
- onHttpError 中统一记录日志与用户提示
- base64Key 由后端统一管理,避免硬编码
章节来源
- [README.md](file://README.md)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
### 错误处理回调与配置验证逻辑
- 错误处理回调
- TsHttpUtil 在业务错误时调用 onHttpError便于统一处理
- 配置验证
- TsCrypto 在构造时依赖 base64Key 的正确性
- TsSM4 在构造时校验密钥长度与 IV 长度(内部逻辑)
- 建议
- 在 setConfig 后进行一次关键配置的自检
- 对 prefix 函数进行边界测试(如空字符串、特殊字符)
章节来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
## 依赖关系分析
- TsHttpUtil 依赖
- TsGlobalConfig读取前缀、附加参数、错误回调
- TsStorage读取用户 Token、加密开关
- TsCommon通用工具如 JSON 解析)
- TsCrypto 依赖
- TsGlobalConfig读取 base64Key
- TsSM4SM4 加解密实现
- TsStorage 与 TsGlobalConfig 的间接耦合
- 通过开关控制是否启用加密,进而影响请求流程
```mermaid
graph LR
Http["TsHttpUtil"] --> Cfg["TsGlobalConfig"]
Http --> Sto["TsStorage"]
Http --> Com["TsCommon"]
Cry["TsCrypto"] --> Cfg
Cry --> Sm4["TsSM4"]
Sto --> Com
```
图表来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
章节来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
## 性能考量
- 配置读取成本极低,建议在请求发起前一次性读取并缓存必要字段
- prefix 为函数时,每次请求都会执行,建议在函数内做必要的缓存或短路判断
- httpParams 返回的对象会被频繁合并,建议保持对象简洁
- 加密/解密为 CPU 密集型操作,仅在必要时启用
## 故障排查指南
- 症状:请求未带前缀
- 排查:确认 setConfig 是否已设置 prefix若为函数确认返回值
- 症状onHttpError 未触发
- 排查:确认后端返回码非 200确认 onHttpError 是否为函数
- 症状:加密失败或解密异常
- 排查:确认 base64Key 正确;确认前后端密钥一致;确认存储开关状态
- 症状:附加参数未生效
- 排查:确认 httpParams 是否为函数确认请求类型GET/POST是否匹配
章节来源
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
## 结论
TsGlobalConfig 作为工具包的“全局中枢”,通过简单而强大的配置 API实现了对网络请求、加解密、存储等模块的统一控制。合理使用配置项与回调可显著提升系统的可维护性与一致性。建议在应用启动阶段完成全局配置初始化并结合错误处理与日志记录确保问题可追踪、可恢复。
## 附录
- 入口导出
- index.js 将 TsGlobalConfig 与其他模块一起导出,便于外部统一引用
- 版本与依赖
- 依赖 umi-request 与 base64-js用于网络请求与 Base64 编解码
章节来源
- [index.js](file://index.js)
- [package.json](file://package.json)

View File

@@ -0,0 +1,398 @@
# 加密模块 (TsCrypto)
<cite>
**本文引用的文件列表**
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为加密模块TsCrypto的全面技术文档聚焦于基于 SM4 算法的加密与解密实现,覆盖 CBC 与 ECB 模式支持与配置、Base64 编解码机制、自动填充与去填充算法,以及与全局配置系统、存储系统和 HTTP 请求模块的集成方式。文档同时提供完整的 API 接口说明、使用示例、性能与安全最佳实践并解释加密开关控制、token 加密传输等典型应用场景。
## 项目结构
该工具包采用按功能模块划分的组织方式:
- utils通用工具与加密核心实现
- TsCrypto.js对外暴露的加密模块入口封装 SM4 并与全局配置联动
- TsSM4.jsSM4 算法实现,含填充/去填充、CBC/ECB 模式、Base64 文本编解码
- TsGlobalConfig.js全局配置读取与设置
- TsStorage.js本地存储与加密开关、token 的持久化
- TsCommon.js通用工具函数如 JSON 解析、URL 参数解析等)
- httpsHTTP 请求封装与加密开关集成
- TsHttpUtil.js统一请求处理、参数预处理、加解密与响应解密
- index.js导出模块集合
- package.json依赖声明base64-js、umi-request
```mermaid
graph TB
subgraph "工具包(utils)"
Crypto["TsCrypto.js"]
SM4["TsSM4.js"]
GConf["TsGlobalConfig.js"]
Store["TsStorage.js"]
Common["TsCommon.js"]
end
subgraph "HTTP(https)"
HttpUtil["TsHttpUtil.js"]
end
Index["index.js"]
Package["package.json"]
Crypto --> SM4
Crypto --> GConf
HttpUtil --> Crypto
HttpUtil --> Store
HttpUtil --> GConf
HttpUtil --> Common
Index --> Crypto
Index --> SM4
Index --> GConf
Index --> Store
Index --> HttpUtil
Package --> SM4
Package --> HttpUtil
```
图表来源
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- TsCrypto对外加密模块负责初始化 SM4 实例(默认 ECB 模式、Base64 输出),并提供 encrypt/decrypt 方法。
- TsSM4SM4 算法核心,支持 CBC/ECB 模式、Base64/text 输出、自动 PKCS#7 填充与去填充、UTF-8 字符串编解码。
- TsGlobalConfig全局配置读取与合并提供 base64Key、prefix、httpParams、onHttpError 等。
- TsStorage本地存储封装提供用户 token、加密开关等键值存取。
- TsHttpUtilHTTP 请求封装集成加密开关、请求体加密、响应体解密、token 注入等。
章节来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构总览
加密模块在工具包中的位置与交互如下:
- TsCrypto 初始化时从全局配置读取 base64Key转换为字节后注入 SM4默认模式为 ECB输出为 Base64。
- TsHttpUtil 在发送请求前根据存储的加密开关决定是否对请求体进行加密;收到响应后若标记为加密,则进行解密并尝试 JSON 解析。
- TsStorage 提供加密开关与 token 的持久化,便于跨页面/会话保持状态。
- TsGlobalConfig 提供全局配置(如前缀、附加参数、错误回调)以影响 HTTP 请求行为。
```mermaid
sequenceDiagram
participant Client as "调用方"
participant HttpUtil as "TsHttpUtil"
participant Store as "TsStorage"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Server as "后端服务"
Client->>HttpUtil : "post(url, data)"
HttpUtil->>Store : "getEncryptBody()"
alt "加密开关开启"
HttpUtil->>Crypto : "encrypt(JSON.stringify(data))"
Crypto->>SM4 : "encrypt(UTF-8字节)"
SM4-->>Crypto : "Base64密文"
Crypto-->>HttpUtil : "Base64密文"
HttpUtil->>Server : "POST { encryptData : Base64密文 }"
else "加密开关关闭"
HttpUtil->>Server : "POST data"
end
Server-->>HttpUtil : "响应 { code, data, encrypt? }"
alt "响应标记为加密"
HttpUtil->>Crypto : "decrypt(data)"
Crypto->>SM4 : "decrypt(Base64密文)"
SM4-->>Crypto : "明文字节数组"
Crypto-->>HttpUtil : "明文字符串"
HttpUtil->>HttpUtil : "parseJSON(可选)"
end
HttpUtil-->>Client : "{ data, recordsTotal }"
```
图表来源
- [TsHttpUtil.js:81-123](file://src/https/TsHttpUtil.js#L81-L123)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-452](file://src/utils/TsSM4.js#L338-L452)
## 详细组件分析
### TsCrypto 组件分析
- 角色定位:对外加密模块,封装 SM4 并与全局配置联动。
- 关键点:
- 构造函数中从全局配置读取 base64Key转换为字节数组后传入 SM4。
- 默认模式为 ECB输出类型为 Base64。
- 对外提供 encrypt/content 与 decrypt/base64 两个方法,分别委托给 SM4 的对应逻辑。
- 适用场景:作为 HTTP 请求层的加密前置,或独立用于数据加密/解密。
```mermaid
classDiagram
class TsCrypto {
+constructor()
+encrypt(content) String
+decrypt(base64) String
}
class TsSM4 {
+constructor(config)
+encrypt(plaintext) String
+decrypt(ciphertext) String
-padding(buffer) Uint8Array
-dePadding(buffer) Uint8Array
-uint8ToUint32Block(arr, idx) Uint32Array
-doBlockCrypt(block, roundKeys) Uint32Array
-spawnEncryptRoundKeys() void
-tTransform1(z) Uint32
-tTransform2(z) Uint32
-linearTransform1(x) Uint32
-linearTransform2(x) Uint32
-rotateLeft(x,y) Uint32
}
class GlobalConfig {
+getConfig() Object
+setConfig(obj) void
}
TsCrypto --> TsSM4 : "组合"
TsCrypto --> GlobalConfig : "读取配置"
```
图表来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
章节来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
### TsSM4 组件分析
- 角色定位SM4 算法实现,支持 CBC/ECB 模式、Base64/text 输出、UTF-8 编解码、PKCS#7 填充/去填充。
- 关键点:
- 支持 CBC/ECB 模式选择,默认 CBCCBC 需要 16 字节 IV否则抛错。
- 输出类型支持 Base64 与 text输入统一为 UTF-8 字节流。
- 填充/去填充:按 16 字节块进行 PKCS#7 填充与去填充。
- 字符串编解码:通过 Crypt 工具类在 UTF-8 与 Base64 之间转换。
- 性能与复杂度:
- 每块 16 字节,循环 32 轮;时间复杂度 O(n),空间复杂度 O(n)。
- 填充/去填充为线性处理,开销较小。
- 安全性:
- CBC 模式下 IV 必须为 16 字节,且建议随机生成;当前实现未内置 IV 生成,需确保传入合法 IV。
- ECB 模式不推荐用于长文本或重复明文场景,易暴露模式特征。
```mermaid
flowchart TD
Start(["开始"]) --> ToUtf8["UTF-8 编码为字节数组"]
ToUtf8 --> Pad["PKCS#7 填充到 16 字节倍数"]
Pad --> Mode{"模式选择"}
Mode --> |CBC| CbcLoop["逐块 CBC 循环<br/>链式 XOR + 轮函数"]
Mode --> |ECB| EcbLoop["逐块 ECB 循环<br/>直接轮函数"]
CbcLoop --> OutSel{"输出类型"}
EcbLoop --> OutSel
OutSel --> |Base64| ToBase64["Base64 编码"]
OutSel --> |text| ToText["UTF-8 解码"]
ToBase64 --> End(["结束"])
ToText --> End
```
图表来源
- [TsSM4.js:287-312](file://src/utils/TsSM4.js#L287-L312)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:408-452](file://src/utils/TsSM4.js#L408-L452)
章节来源
- [TsSM4.js:96-456](file://src/utils/TsSM4.js#L96-L456)
### TsGlobalConfig 组件分析
- 角色定位:全局配置中心,提供默认配置与运行时合并。
- 关键点:
- 默认 base64Key、prefix、httpParams、onHttpError 等。
- getConfig 返回 window.httpConfig 或默认配置setConfig 合并传入对象。
- 与加密模块的关系:
- TsCrypto 通过 getConfig().base64Key 读取密钥TsHttpUtil 通过 getConfig().prefix/httpParams/onHttpError 影响请求行为。
章节来源
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
### TsStorage 组件分析
- 角色定位:本地存储封装,提供 token 与加密开关的持久化。
- 关键点:
- save/get统一 JSON 序列化/反序列化。
- saveUserToken/getUserTokentoken 的便捷存取。
- saveEncryptBody/getEncryptBody加密开关的持久化影响 HTTP 请求是否加密请求体。
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
### TsHttpUtil 组件分析
- 角色定位HTTP 请求封装集成加密开关、请求体加密、响应体解密、token 注入。
- 关键点:
- dealParamsBody对 GET 参数与 POST 数据进行预处理;当加密开关开启时,将 data 包装为 { encryptData: TsCrypto.encrypt(JSON.stringify(data)) }。
- req发起请求自动拼接 prefix、注入 token、处理响应若响应标记为加密则调用 TsCrypto.decrypt 并尝试 JSON 解析。
- 错误处理:根据状态码映射错误信息,或调用全局 onHttpError 回调。
- 与加密模块的协作:
- 使用 TsCrypto.encrypt/decrypt 完成请求体与响应体的加解密。
- 通过 TsStorage 控制加密开关,通过 TsGlobalConfig 控制前缀与附加参数。
章节来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 依赖关系分析
- TsCrypto 依赖 TsSM4 与 TsGlobalConfig。
- TsHttpUtil 依赖 TsCrypto、TsStorage、TsGlobalConfig、TsCommon。
- TsSM4 依赖 base64-js用于 Base64 编解码)。
- index.js 将各模块统一导出,供外部使用。
- package.json 声明 base64-js 与 umi-request 依赖。
```mermaid
graph LR
TsCrypto["TsCrypto.js"] --> TsSM4["TsSM4.js"]
TsCrypto --> TsGlobalConfig["TsGlobalConfig.js"]
TsHttpUtil["TsHttpUtil.js"] --> TsCrypto
TsHttpUtil --> TsStorage["TsStorage.js"]
TsHttpUtil --> TsGlobalConfig
TsHttpUtil --> TsCommon["TsCommon.js"]
TsSM4 --> Base64["base64-js(依赖)"]
index_js["index.js"] --> TsCrypto
index_js --> TsSM4
index_js --> TsGlobalConfig
index_js --> TsStorage
index_js --> TsHttpUtil
package_json["package.json"] --> Base64
package_json --> UmiReq["umi-request(依赖)"]
```
图表来源
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 性能考量
- 时间复杂度SM4 每块 16 字节32 轮,整体 O(n);填充/去填充为线性处理,开销较小。
- 内存占用:主要为输入/输出字节数组与中间块数组,空间复杂度 O(n)。
- Base64 编解码:在浏览器与 Node 环境均可用 base64-js性能稳定。
- CBC/ECB 选择CBC 增加链式处理但无额外显著性能损耗ECB 更简单但安全性较低。
- 建议:
- 对大文本分块处理(当前实现按块处理,已具备良好扩展性)。
- 在浏览器端避免频繁重复加密,必要时缓存结果。
- 使用 CBC 模式并确保 IV 正确(当前实现要求 16 字节 IV否则抛错
## 故障排查指南
- “iv 错误”异常
- 现象CBC 模式下抛出 iv 错误。
- 原因:未正确传入 16 字节 IV 或未传入 IV。
- 处理:确保传入长度为 16 的 IV或切换至 ECB 模式。
- 参考路径:[TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)、[TsSM4.js:410-412](file://src/utils/TsSM4.js#L410-L412)
- “密钥长度不为 16 字节”
- 现象:构造 SM4 实例时抛出密钥长度错误。
- 原因base64Key 解码后不是 16 字节。
- 处理:确认 base64Key 来自后端并符合规范。
- 参考路径:[TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
- “响应未解密”
- 现象:响应未按预期解密。
- 原因:响应未标记为加密或密钥不一致。
- 处理:确认后端响应标记 encrypt 且密钥一致。
- 参考路径:[TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- “加密开关无效”
- 现象:请求未加密。
- 原因:加密开关未启用或未持久化。
- 处理:调用 saveEncryptBody(true) 并确认存储生效。
- 参考路径:[TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)、[TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
章节来源
- [TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
- [TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)
- [TsSM4.js:410-412](file://src/utils/TsSM4.js#L410-L412)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 结论
本加密模块以 TsCrypto 为核心,结合 TsSM4 的 SM4 算法实现,提供了 CBC/ECB 模式、Base64 编解码、PKCS#7 填充与去填充、UTF-8 字符串编解码能力并与全局配置系统、存储系统、HTTP 请求模块形成完整闭环。通过加密开关与 token 注入,满足了请求体加密与安全传输的常见需求。建议在生产环境中优先使用 CBC 模式并妥善管理 IV 与密钥,遵循最小暴露原则与安全最佳实践。
## 附录
### API 接口文档
- TsCrypto.encrypt(content)
- 功能:对明文字符串进行加密,返回 Base64 字符串。
- 输入:明文字符串。
- 输出Base64 密文字符串。
- 参考路径:[TsCrypto.js:19-21](file://src/utils/TsCrypto.js#L19-L21)、[TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- TsCrypto.decrypt(base64)
- 功能:对 Base64 密文进行解密,返回明文字符串。
- 输入Base64 密文字符串。
- 输出:明文字符串。
- 参考路径:[TsCrypto.js:28-30](file://src/utils/TsCrypto.js#L28-L30)、[TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
- TsSM4.encrypt(plaintext)
- 功能:支持 CBC/ECB 模式、Base64/text 输出、UTF-8 编解码与 PKCS#7 填充。
- 输入:明文字符串。
- 输出Base64 或 UTF-8 字符串(取决于 cipherType
- 参考路径:[TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- TsSM4.decrypt(ciphertext)
- 功能:支持 CBC/ECB 模式、Base64/text 输入、UTF-8 编解码与 PKCS#7 去填充。
- 输入Base64 或 UTF-8 密文字符串。
- 输出:明文字符串。
- 参考路径:[TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
- TsGlobalConfig.getConfig()/setConfig(obj)
- 功能:读取/设置全局配置,包括 base64Key、prefix、httpParams、onHttpError。
- 参考路径:[TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
- TsStorage.saveEncryptBody(bool)/getEncryptBody()
- 功能:设置/获取加密开关,影响 HTTP 请求是否加密请求体。
- 参考路径:[TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- TsHttpUtil.post/get/form(req)
- 功能:统一发起 HTTP 请求自动处理加密开关、请求体加密、响应体解密、token 注入。
- 参考路径:[TsHttpUtil.js:152-165](file://src/https/TsHttpUtil.js#L152-L165)
### 使用示例
- 启用请求体加密
- 设置加密开关:调用 saveEncryptBody(true)。
- 发送请求post(url, data) 自动将 data 包装为 { encryptData: TsCrypto.encrypt(JSON.stringify(data)) }。
- 参考路径:[TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)、[TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- 响应体解密
- 若后端响应标记为加密,则自动调用 TsCrypto.decrypt 并尝试 JSON 解析。
- 参考路径:[TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- 自定义密钥与前缀
- 通过 setConfig({ base64Key, prefix }) 配置密钥与请求前缀。
- 参考路径:[TsGlobalConfig.js:27-29](file://src/utils/TsGlobalConfig.js#L27-L29)、[TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
### 安全最佳实践
- CBC 模式
- 使用 16 字节 IV建议随机生成并随消息传输或在协议中约定。
- 避免重复使用相同的 IV 与密钥组合。
- ECB 模式
- 不适用于长文本或存在重复明文的场景,易泄露模式特征。
- 密钥管理
- base64Key 应来自可信后端,定期轮换;避免硬编码在前端。
- 响应校验
- 对响应进行完整性校验(如 HMAC防止篡改。
- 日志与调试
- 生产环境避免打印密文与敏感信息;仅在开发环境启用严格日志级别。

View File

@@ -0,0 +1,507 @@
# 存储模块 (TsStorage)
<cite>
**本文引用的文件列表**
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为存储模块TsStorage的完整数据持久化文档聚焦于基于浏览器 localStorage 的数据存储机制,涵盖以下主题:
- 数据序列化与反序列化流程
- 用户 token 管理
- 加密开关控制与数据生命周期管理
- 与加密模块SM4/加密器)的集成关系
- 数据安全传输与存储最佳实践
- 完整 API 接口说明(保存、获取、删除等)
- 使用示例、数据迁移策略与备份恢复方案
- 浏览器兼容性与存储容量限制
## 项目结构
该工具包采用“按功能域分层”的组织方式,存储模块位于 utils 目录下,并通过 index.js 汇总导出,供上层业务统一调用。
```mermaid
graph TB
subgraph "工具包入口"
IDX["index.js"]
end
subgraph "存储层"
TS["TsStorage.js"]
TC["TsCommon.js"]
end
subgraph "加密层"
TG["TsGlobalConfig.js"]
TSM["TsSM4.js"]
TCR["TsCrypto.js"]
end
subgraph "网络层"
TH["TsHttpUtil.js"]
end
IDX --> TS
IDX --> TCR
IDX --> TSM
IDX --> TG
IDX --> TH
TH --> TS
TH --> TCR
TH --> TG
TS --> TC
TCR --> TSM
TCR --> TG
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- 存储模块TsStorage封装 localStorage 的读写、token 管理、加密开关管理,提供统一的键值存取接口。
- 加密模块TsCrypto + TsSM4基于 SM4 算法的加解密实现,支持 ECB 模式与 Base64 输出。
- 全局配置TsGlobalConfig提供 base64Key、前缀、HTTP 参数注入与错误回调等全局配置。
- 通用工具TsCommon提供 JSON 解析、空值判断等基础能力。
- 网络工具TsHttpUtil在请求中自动注入 token 与加密开关,对响应进行解密与解析。
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构总览
存储模块与加密模块的交互路径如下:网络层在发送请求时根据加密开关对请求体进行加密;接收响应时若标记为加密,则进行解密并解析 JSON存储层负责持久化 token 与加密开关状态。
```mermaid
sequenceDiagram
participant App as "应用"
participant Http as "TsHttpUtil"
participant Store as "TsStorage"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Srv as "后端服务"
App->>Store : "saveUserToken(token)"
App->>Store : "saveEncryptBody(true/false)"
App->>Http : "post(url, data)"
Http->>Store : "getEncryptBody()"
alt "加密开启"
Http->>Crypto : "encrypt(JSON.stringify(data))"
Crypto->>SM4 : "encrypt(明文)"
SM4-->>Crypto : "密文(Base64)"
Crypto-->>Http : "密文"
Http->>Srv : "POST { encryptData : 密文 }"
else "加密关闭"
Http->>Srv : "POST 原始 JSON"
end
Srv-->>Http : "响应(可能含 encrypt 标记)"
alt "响应需解密"
Http->>Crypto : "decrypt(密文)"
Crypto->>SM4 : "decrypt(密文)"
SM4-->>Crypto : "明文"
Crypto-->>Http : "明文"
Http->>Http : "parseJSON(明文)"
end
Http-->>App : "{ data, recordsTotal }"
```
图表来源
- [TsHttpUtil.js:80-91](file://src/https/TsHttpUtil.js#L80-L91)
- [TsHttpUtil.js:117-123](file://src/https/TsHttpUtil.js#L117-L123)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
## 详细组件分析
### 存储模块TsStorage
- 功能职责
- 统一的键值存取:将任意值序列化为 JSON 字符串后写入 localStorage。
- 用户 token 管理:提供保存与读取 token 的便捷方法。
- 加密开关管理:保存/读取“是否对请求体进行加密”的布尔标志。
- 安全反序列化:通过通用工具解析 JSON避免异常导致崩溃。
- 关键实现要点
- 写入:以 {data: value} 的结构写入 localStorage便于后续统一解析。
- 读取:从 localStorage 读取字符串,交由通用工具解析为对象,再取出 data 字段;未命中或解析失败时返回默认值。
- token 与加密开关:分别以固定键名保存,便于网络层直接读取。
- 错误处理
- 读取失败或 JSON 解析异常时,返回默认值,保证健壮性。
- 性能与复杂度
- 写入/读取均为 O(1),序列化/反序列化为 O(n)n 为字符串长度)。
- 使用建议
- 对大对象建议在上层进行拆分或压缩,避免 localStorage 膨胀。
- 避免存储敏感信息(如明文密码),优先使用加密开关与服务端保护。
```mermaid
flowchart TD
Start(["函数入口"]) --> SaveGet{"save 或 get?"}
SaveGet --> |save| Serialize["JSON.stringify({data: value})"]
Serialize --> Write["localStorage.setItem(key, 字符串)"]
SaveGet --> |get| Read["localStorage.getItem(key)"]
Read --> Parse["Common.parseJSON(字符串, {data: 默认值})"]
Parse --> Extract["取 data 字段"]
Extract --> End(["返回结果"])
```
图表来源
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
### 加密模块TsCrypto + TsSM4
- 功能职责
- 提供 SM4 加密与解密能力,支持 ECB 模式与 Base64 输出。
- 通过全局配置注入密钥base64 编码),确保前后端一致。
- 关键实现要点
- 初始化:从全局配置读取 base64Key 并转换为字节数组作为密钥。
- 模式与输出:默认 ECB 模式与 Base64 输出,满足前端直传需求。
- 块处理:按 16 字节块进行填充、轮密钥变换与输出转换。
- 安全性
- ECB 模式适合小数据块加密,但不提供完整性校验;建议仅用于请求体加密场景。
- 密钥来源于全局配置,需确保其安全性与一致性。
- 性能与复杂度
- 单次加/解密为 O(n)n 为数据长度),块大小固定为 16 字节。
- 使用建议
- 对大文本建议分片处理,避免一次性内存压力。
- 与网络层配合使用,避免在本地重复加密。
```mermaid
classDiagram
class TsCrypto {
+constructor()
+encrypt(content) string
+decrypt(base64) string
-sm4 : TsSM4
}
class TsSM4 {
+constructor(config)
+encrypt(plaintext) string
+decrypt(ciphertext) string
-mode : string
-cipherType : string
-key : Uint8Array
-iv : Uint8Array
-encryptRoundKeys : Uint32Array
-decryptRoundKeys : Uint32Array
}
TsCrypto --> TsSM4 : "组合"
```
图表来源
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
章节来源
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 网络层与存储/加密集成TsHttpUtil
- 功能职责
- 在请求前根据加密开关对请求体进行加密,并替换为 { encryptData: 密文 }。
- 在响应后根据响应标记进行解密,并解析 JSON。
- 自动注入 token 到请求头。
- 关键流程
- 请求前处理:读取加密开关,若开启则对 data 进行加密;读取 token 注入到 headers。
- 响应后处理:若响应标记为加密,则解密并解析 JSON否则直接返回 data。
- 错误处理
- 统一错误处理器返回标准化错误对象。
- 性能与复杂度
- 主要开销在 JSON 序列化/反序列化与 SM4 加解密,整体为 O(n)。
- 使用建议
- 通过全局配置统一设置加密开关与密钥,避免分散配置。
```mermaid
sequenceDiagram
participant C as "调用方"
participant H as "TsHttpUtil"
participant S as "TsStorage"
participant E as "TsCrypto"
participant M as "TsSM4"
participant R as "后端"
C->>H : "post(url, {data})"
H->>S : "getEncryptBody()"
alt "加密开启"
H->>E : "encrypt(JSON.stringify(data))"
E->>M : "encrypt(明文)"
M-->>E : "密文"
E-->>H : "密文"
H->>R : "POST { encryptData : 密文 }"
else "加密关闭"
H->>R : "POST { data }"
end
R-->>H : "响应(可能含 encrypt 标记)"
alt "响应需解密"
H->>E : "decrypt(密文)"
E->>M : "decrypt(密文)"
M-->>E : "明文"
E-->>H : "明文"
H->>H : "parseJSON(明文)"
end
H-->>C : "{ data, recordsTotal }"
```
图表来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:117-123](file://src/https/TsHttpUtil.js#L117-L123)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
章节来源
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
### API 接口文档(存储模块)
- 保存用户 token
- 方法saveUserToken(token)
- 作用:将 token 以固定键名保存至 localStorage
- 返回:无
- 参考:[TsStorage.js:9-11](file://src/utils/TsStorage.js#L9-L11)
- 获取用户 token
- 方法getUserToken()
- 作用:从 localStorage 读取 token未命中返回空字符串
- 返回:字符串
- 参考:[TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- 开启/关闭请求体加密
- 方法saveEncryptBody(bool)
- 作用:保存布尔值以控制请求体是否加密
- 返回:无
- 参考:[TsStorage.js:17-19](file://src/utils/TsStorage.js#L17-L19)
- 读取加密开关
- 方法getEncryptBody()
- 作用:读取加密开关,未命中返回默认 true
- 返回:布尔值
- 参考:[TsStorage.js:21-23](file://src/utils/TsStorage.js#L21-L23)
- 通用保存
- 方法save(key, value)
- 作用:将任意值序列化后保存至 localStorage
- 返回:无
- 参考:[TsStorage.js:31-33](file://src/utils/TsStorage.js#L31-L33)
- 通用获取
- 方法get(key, def)
- 作用:从 localStorage 读取并解析 JSON返回 data 字段
- 返回:任意类型(默认值为传入 def
- 参考:[TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### 数据序列化与反序列化
- 序列化
- 将任意值包装为 {data: value},再通过 JSON.stringify 转为字符串,写入 localStorage。
- 优点:统一结构,便于后续解析;可扩展字段(如版本号)。
- 参考:[TsStorage.js:31-33](file://src/utils/TsStorage.js#L31-L33)
- 反序列化
- 从 localStorage 读取字符串,使用通用工具解析为对象,取 data 字段作为实际值。
- 若解析失败或未命中返回默认值def
- 参考:[TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43), [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
章节来源
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
### 用户 token 管理
- 存储位置:固定键名为 token
- 读写接口saveUserToken/getUserToken
- 使用场景:网络层在请求头中注入 token实现鉴权
- 参考:[TsStorage.js:9-15](file://src/utils/TsStorage.js#L9-L15), [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
### 加密开关控制与数据生命周期
- 加密开关
- 保存键名encrypt_body
- 默认值true开启加密
- 作用:控制网络层是否对请求体进行加密
- 参考:[TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23), [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- 生命周期
- 保存saveEncryptBody(bool)
- 读取getEncryptBody(),未命中返回 true
- 删除localStorage.removeItem("encrypt_body")
- 参考:[TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsHttpUtil.js:80-91](file://src/https/TsHttpUtil.js#L80-L91)
### 存储模块与加密模块的集成关系
- 网络层在请求前读取加密开关,决定是否对 data 进行加密。
- 响应后若标记为加密,网络层进行解密并解析 JSON。
- 存储层负责持久化 token 与加密开关,形成闭环。
- 参考:[TsHttpUtil.js:80-91](file://src/https/TsHttpUtil.js#L80-L91), [TsHttpUtil.js:117-123](file://src/https/TsHttpUtil.js#L117-L123), [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
章节来源
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### 数据安全传输与存储最佳实践
- 传输安全
- 使用加密开关对请求体进行加密,避免明文在网络中传输。
- 仅对必要字段加密,避免过度加密影响性能。
- 参考:[TsHttpUtil.js:80-91](file://src/https/TsHttpUtil.js#L80-L91)
- 存储安全
- 不在 localStorage 中存储敏感明文(如密码、私钥)。
- 使用加密开关保护本地缓存的敏感数据。
- 参考:[TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- 配置安全
- 密钥来源于全局配置,需确保其保密性与一致性。
- 参考:[TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29), [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
章节来源
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
### 使用示例
- 保存与读取普通数据
- 参考:[README.md:28-41](file://README.md#L28-L41)
- 设置加密开关
- 参考:[README.md:12-26](file://README.md#L12-L26)
- 保存用户 token
- 参考:[TsStorage.js:9-15](file://src/utils/TsStorage.js#L9-L15)
章节来源
- [README.md:1-43](file://README.md#L1-L43)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### 数据迁移策略与备份恢复
- 迁移策略
- 版本升级时,可在存储层增加版本字段,读取时进行兼容性处理。
- 对历史数据进行批量重写(如重新序列化),确保新结构可用。
- 参考:[TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- 备份与恢复
- 备份:读取所有键值并导出为 JSON 文件。
- 恢复:导入 JSON 后逐条写入 localStorage。
- 注意:避免在恢复过程中覆盖当前用户数据,建议先导入到临时键名,再合并。
- 参考:[TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### 浏览器兼容性与存储容量限制
- 浏览器兼容性
- localStorage 在现代浏览器中广泛支持;在无痕模式或受限环境下可能不可用。
- 参考:[TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- 存储容量限制
- localStorage 通常为 510 MB因浏览器而异超出会抛出异常。
- 建议:对大对象进行分片或压缩,避免频繁写入导致溢出。
- 参考:[TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
## 依赖关系分析
- 模块耦合
- TsHttpUtil 依赖 TsStorage、TsCrypto、TsGlobalConfig形成“网络层-存储层-加密层-配置层”的链路。
- TsStorage 依赖 TsCommon用于安全解析 JSON。
- TsCrypto 依赖 TsSM4 与全局配置,提供加解密能力。
- 外部依赖
- base64-jsBase64 编解码与字节数组互转。
- umi-requestHTTP 请求封装与错误处理。
- 可能的循环依赖
- 当前模块间无循环依赖,结构清晰。
```mermaid
graph LR
Http["TsHttpUtil"] --> Store["TsStorage"]
Http --> Crypto["TsCrypto"]
Http --> Global["TsGlobalConfig"]
Store --> Common["TsCommon"]
Crypto --> SM4["TsSM4"]
Crypto --> Global
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsStorage.js:1](file://src/utils/TsStorage.js#L1)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [TsGlobalConfig.js:1-3](file://src/utils/TsGlobalConfig.js#L1-L3)
- [TsCommon.js:1](file://src/utils/TsCommon.js#L1)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
## 性能考量
- 序列化/反序列化成本O(n)n 为字符串长度;建议对大对象进行分片或压缩。
- 加解密成本SM4 单次加/解密 O(n),注意避免对频繁小数据进行重复加密。
- I/O 成本localStorage 读写为 O(1),但频繁写入可能导致主线程阻塞,建议批量写入或延迟写入。
- 建议:在业务层对热点数据进行缓存,减少重复序列化与写入。
## 故障排查指南
- 读取不到数据
- 检查键名是否正确;确认是否被覆盖或删除。
- 参考:[TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
- JSON 解析失败
- 检查存储内容是否为合法 JSON确认是否被其他模块篡改。
- 参考:[TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- 加密/解密异常
- 检查密钥是否正确;确认 ECB 模式与 Base64 输出是否匹配。
- 参考:[TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13), [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- 请求未加密
- 检查加密开关是否开启;确认网络层是否正确读取开关。
- 参考:[TsHttpUtil.js:80-91](file://src/https/TsHttpUtil.js#L80-L91), [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
章节来源
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 结论
TsStorage 通过统一的序列化/反序列化与键值管理,为应用提供了简洁可靠的本地存储能力;结合加密模块与网络层,实现了从传输到存储的端到端安全方案。建议在生产环境中:
- 明确敏感数据边界,合理启用加密开关;
- 控制存储体积,避免 localStorage 溢出;
- 在升级时做好版本兼容与迁移策略;
- 严格管理密钥与配置,确保一致性与安全性。
## 附录
- 入口导出
- index.js 汇总导出各模块,便于统一引入。
- 参考:[index.js:8-15](file://index.js#L8-L15)
- 依赖清单
- base64-js、umi-request 等外部依赖。
- 参考:[package.json:19-22](file://package.json#L19-L22)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)

View File

@@ -0,0 +1,516 @@
# 核心模块
<cite>
**本文引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
npm-tool 是一个专为前端应用设计的综合性工具包,提供了网络请求、数据加密、存储管理、通用工具函数等核心功能。该工具包采用模块化设计,通过清晰的职责分离和接口抽象,为开发者提供了一套完整的前端开发基础设施。
本工具包的核心设计理念包括:
- **模块化架构**:每个功能模块独立封装,职责单一明确
- **可扩展性**:通过配置中心支持运行时配置调整
- **安全性**内置SM4对称加密算法保障数据传输安全
- **易用性**提供简洁的API接口降低使用复杂度
## 项目结构
项目采用按功能域组织的目录结构,主要分为以下层次:
```mermaid
graph TB
subgraph "根目录"
Root[index.js]
Package[package.json]
Readme[README.md]
end
subgraph "源代码结构"
Utils[src/utils/]
Https[src/https/]
subgraph "工具模块"
Common[TsCommon.js]
Crypto[TsCrypto.js]
SM4[TsSM4.js]
Storage[TsStorage.js]
GlobalConfig[TsGlobalConfig.js]
end
subgraph "HTTP模块"
HttpUtil[TsHttpUtil.js]
end
end
Root --> Utils
Root --> Https
Utils --> Common
Utils --> Crypto
Utils --> SM4
Utils --> Storage
Utils --> GlobalConfig
Https --> HttpUtil
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
npm-tool 工具包由六个核心模块组成,每个模块都有明确的职责分工:
### 模块职责矩阵
| 模块名称 | 主要职责 | 关键功能 | 依赖关系 |
|---------|----------|----------|----------|
| TsCommon | 通用工具函数 | 字符串处理、类型判断、URL解析 | 无 |
| TsStorage | 数据持久化 | 本地存储、用户令牌管理 | TsCommon |
| TsSM4 | SM4加密算法 | 对称加密解密、密钥管理 | base64-js |
| TsCrypto | 加密服务层 | 加密解密接口、密钥转换 | TsSM4, TsGlobalConfig |
| TsGlobalConfig | 全局配置管理 | 配置读取设置、运行时配置 | 无 |
| TsHttpUtil | HTTP请求封装 | 网络请求、参数处理、错误处理 | umi-request |
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构概览
工具包采用分层架构设计从底层到上层依次为基础工具层、加密服务层、存储管理层、HTTP请求层。
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
end
subgraph "HTTP请求层"
HttpUtil[TsHttpUtil]
Request[umi-request]
end
subgraph "加密服务层"
Crypto[TsCrypto]
SM4[TsSM4]
Base64[base64-js]
end
subgraph "存储管理层"
Storage[TsStorage]
LocalStorage[localStorage]
end
subgraph "配置管理层"
GlobalConfig[TsGlobalConfig]
end
subgraph "工具函数层"
Common[TsCommon]
end
App --> HttpUtil
HttpUtil --> Crypto
HttpUtil --> Storage
HttpUtil --> GlobalConfig
HttpUtil --> Request
Crypto --> SM4
Crypto --> Base64
Storage --> Common
SM4 --> Base64
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
## 详细组件分析
### TsCommon 通用工具模块
TsCommon 模块提供了一系列基础的工具函数涵盖了字符串处理、类型判断、URL解析等常用功能。
#### 核心功能特性
```mermaid
classDiagram
class TsCommon {
+getParamFormUrl(key, host) string
+isEmpty(value) boolean
+parseJSON(value, def) any
+split(obj, seq) string[]
+isDevelopment() boolean
+replaceAll(string, s1, s2) string
+endWith(string, endStr) boolean
}
note for TsCommon "提供基础工具函数<br/>字符串处理<br/>类型判断<br/>URL解析"
```
**图表来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
#### 设计模式与实现要点
- **纯函数设计**:所有函数都是无状态的纯函数,便于测试和复用
- **容错处理**对可能的异常情况进行了充分的try-catch处理
- **类型安全**:通过严格的参数验证确保函数的健壮性
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
### TsStorage 存储模块
TsStorage 模块基于 localStorage 实现了数据持久化功能,特别针对用户令牌和配置信息进行了优化。
#### 数据存储策略
```mermaid
flowchart TD
Start([存储请求]) --> CheckType{"检查数据类型"}
CheckType --> |对象| Serialize["JSON序列化"]
CheckType --> |基本类型| Direct["直接存储"]
Serialize --> Wrap["包装为{data: value}"]
Direct --> Wrap
Wrap --> Save["localStorage.setItem"]
Save --> End([存储完成])
subgraph "读取流程"
LoadStart([读取请求]) --> GetItem["localStorage.getItem"]
GetItem --> Parse["JSON.parse"]
Parse --> Extract["提取data字段"]
Extract --> LoadEnd([返回数据])
end
```
**图表来源**
- [TsStorage.js:26-44](file://src/utils/TsStorage.js#L26-L44)
#### 特殊功能设计
- **用户令牌管理**专门的token存储接口简化了认证流程
- **加密开关控制**:支持动态启用/禁用数据加密
- **默认值处理**:提供灵活的默认值机制
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### TsSM4 加密算法模块
TsSM4 模块实现了国家商用密码标准 SM4 的完整算法支持ECB和CBC两种加密模式。
#### SM4算法实现架构
```mermaid
classDiagram
class TsSM4 {
-key Uint8Array
-iv Uint8Array
-mode string
-cipherType string
-encryptRoundKeys Uint32Array
-decryptRoundKeys Uint32Array
+constructor(config)
+encrypt(plaintext) string
+decrypt(ciphertext) string
-doBlockCrypt(blockData, roundKeys) Uint32Array
-spawnEncryptRoundKeys() void
-padding(originalBuffer) Uint8Array
-dePadding(paddedBuffer) Uint8Array
}
class Crypt {
+stringToArrayBufferInUtf8(str) Uint8Array
+utf8ArrayBufferToString(buffer) string
+arrayBufferToBase64(buffer) string
+base64ToArrayBuffer(base64) Uint8Array
}
TsSM4 --> Crypt : "使用"
```
**图表来源**
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
#### 加密算法特性
- **双模式支持**同时支持ECB和CBC加密模式
- **密钥管理**:自动密钥扩展和轮转密钥生成
- **填充机制**实现PKCS#7填充标准
- **编码转换**支持Base64和文本两种输出格式
**章节来源**
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
### TsCrypto 加密服务模块
TsCrypto 作为加密服务层,提供了统一的加密解密接口,并与全局配置系统集成。
#### 加密服务架构
```mermaid
sequenceDiagram
participant Client as 客户端
participant Crypto as TsCrypto
participant SM4 as TsSM4
participant Config as TsGlobalConfig
Client->>Crypto : encrypt(content)
Crypto->>Config : getConfig()
Config-->>Crypto : base64Key
Crypto->>SM4 : new SM4(config)
Crypto->>SM4 : encrypt(content)
SM4-->>Crypto : encryptedData
Crypto-->>Client : 返回加密结果
```
**图表来源**
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
#### 服务设计特点
- **配置驱动**:通过全局配置管理密钥和加密参数
- **接口统一**提供简洁的加密解密API
- **依赖注入**:通过构造函数注入底层加密实现
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
### TsGlobalConfig 全局配置模块
TsGlobalConfig 提供了全局配置管理功能,支持运行时配置更新和默认配置机制。
#### 配置管理流程
```mermaid
flowchart TD
Init([初始化]) --> LoadDefault["加载默认配置"]
LoadDefault --> CheckWindow{"检查window.httpConfig"}
CheckWindow --> |存在| MergeConfig["合并配置"]
CheckWindow --> |不存在| UseDefault["使用默认配置"]
MergeConfig --> StoreConfig["存储到window.httpConfig"]
UseDefault --> StoreConfig
StoreConfig --> ExportConfig["导出配置接口"]
subgraph "配置更新"
Update([setConfig]) --> Merge["深度合并"]
Merge --> Store["存储到window.httpConfig"]
Store --> Notify["通知配置变更"]
end
```
**图表来源**
- [TsGlobalConfig.js:15-29](file://src/utils/TsGlobalConfig.js#L15-L29)
#### 配置系统设计
- **默认值机制**:提供完善的默认配置,确保系统稳定性
- **运行时更新**:支持在应用运行时动态更新配置
- **环境适配**:支持函数形式的动态配置生成
**章节来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### TsHttpUtil HTTP请求模块
TsHttpUtil 是工具包的核心模块封装了网络请求的所有细节提供了简洁易用的API。
#### HTTP请求处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as TsHttpUtil
participant Storage as TsStorage
participant Crypto as TsCrypto
participant Request as umi-request
participant Server as 服务器
Client->>HttpUtil : post(url, data)
HttpUtil->>HttpUtil : dealParamsBody(options)
HttpUtil->>Storage : getEncryptBody()
Storage-->>HttpUtil : 加密开关状态
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto-->>HttpUtil : 加密后的数据
HttpUtil->>Request : request(url, options)
Request->>Server : HTTP请求
Server-->>Request : 响应数据
Request-->>HttpUtil : 响应对象
HttpUtil->>HttpUtil : 处理响应数据
HttpUtil-->>Client : {data, recordsTotal}
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
#### 请求处理核心逻辑
- **参数预处理**统一处理分页参数、equals条件等特殊需求
- **动态前缀**支持根据URL动态生成API前缀
- **加密处理**:根据配置自动对请求体进行加密
- **响应解密**:自动解密服务器返回的加密数据
- **错误处理**:统一的错误处理和状态码映射
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 依赖分析
工具包的依赖关系体现了清晰的分层架构和模块化设计原则。
```mermaid
graph TB
subgraph "外部依赖"
UmiRequest[umi-request@1.4.0]
Base64Js[base64-js@1.5.1]
end
subgraph "内部模块依赖"
index[index.js]
subgraph "HTTP模块"
TsHttpUtil
TsStorage
TsCrypto
TsGlobalConfig
end
subgraph "工具模块"
TsCommon
TsSM4
end
end
index --> TsHttpUtil
index --> TsCommon
index --> TsStorage
index --> TsSM4
index --> TsCrypto
index --> TsGlobalConfig
TsHttpUtil --> UmiRequest
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCrypto
TsHttpUtil --> TsGlobalConfig
TsHttpUtil --> TsCommon
TsCrypto --> TsSM4
TsCrypto --> Base64Js
TsCrypto --> TsGlobalConfig
TsStorage --> TsCommon
TsSM4 --> Base64Js
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-6](file://index.js#L1-L6)
### 依赖关系分析
#### 直接依赖
- **umi-request**HTTP请求库提供网络通信能力
- **base64-js**Base64编码解码工具
#### 间接依赖
- **TsHttpUtil** 依赖于所有其他模块,形成核心依赖环
- **TsCrypto** 依赖于TsSM4和TsGlobalConfig
- **TsStorage** 依赖于TsCommon
#### 循环依赖检测
该工具包采用了良好的模块化设计避免了循环依赖问题。TsHttpUtil虽然依赖多个模块但这种依赖关系是单向的符合模块化设计原则。
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 内存使用优化
1. **流式处理**TsSM4算法采用分块处理方式避免大内存占用
2. **对象复用**在加密过程中重用Uint32Array对象减少GC压力
3. **延迟初始化**TsCrypto在首次使用时才初始化SM4实例
### 网络性能优化
1. **请求合并**TsHttpUtil支持将额外参数合并到请求中减少请求次数
2. **缓存策略**结合localStorage实现数据缓存减少重复请求
3. **异步处理**所有网络请求都采用Promise异步处理避免阻塞主线程
### 加密性能优化
1. **轮转密钥**TsSM4算法预先计算轮转密钥避免重复计算
2. **位运算优化**:大量使用位运算替代乘除法,提高执行效率
3. **内存对齐**使用TypedArray确保内存对齐提升访问速度
## 故障排除指南
### 常见问题及解决方案
#### 加密相关问题
**问题**:加密后数据无法正确解密
- **原因**:密钥不匹配或加密模式不一致
- **解决方案**检查TsGlobalConfig中的base64Key配置确认加密模式设置
**问题**Base64编码异常
- **原因**:输入数据包含特殊字符
- **解决方案**使用TsCommon.parseJSON进行安全解析
#### HTTP请求问题
**问题**:请求超时或失败
- **原因**umi-request配置问题或网络异常
- **解决方案**检查TsGlobalConfig中的prefix配置确认网络连接状态
**问题**:响应数据格式异常
- **原因**:服务器返回格式不符合预期
- **解决方案**检查TsHttpUtil的响应处理逻辑添加适当的错误处理
#### 存储相关问题
**问题**localStorage存储失败
- **原因**:浏览器隐私模式或存储空间不足
- **解决方案**:添加存储容量检查和降级方案
**章节来源**
- [TsHttpUtil.js:25-35](file://src/https/TsHttpUtil.js#L25-L35)
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
- [TsStorage.js:26-44](file://src/utils/TsStorage.js#L26-L44)
## 结论
npm-tool 工具包通过精心设计的模块化架构,为前端开发提供了完整的基础设施支持。其核心优势包括:
### 技术优势
1. **模块化设计**:每个模块职责单一,便于维护和扩展
2. **安全性保障**内置SM4加密算法提供企业级数据保护
3. **易用性**提供简洁的API接口降低学习成本
4. **可配置性**:通过全局配置系统支持灵活的运行时调整
### 架构决策
1. **分层架构**:从底层工具函数到上层业务封装,层次清晰
2. **依赖注入**:通过构造函数注入依赖,提高模块独立性
3. **配置驱动**:将可变因素抽象为配置,增强系统灵活性
4. **错误处理**:统一的错误处理机制,提升系统稳定性
### 最佳实践建议
1. **模块组合使用**建议按照TsHttpUtil → TsCrypto → TsSM4的顺序使用加密功能
2. **配置管理**通过TsGlobalConfig集中管理所有可配置项
3. **错误处理**:在业务层添加适当的错误处理和用户反馈
4. **性能监控**:定期监控加密和网络请求的性能指标
该工具包为前端开发提供了一个可靠、安全、易用的基础框架,适合在企业级应用中使用。

View File

@@ -0,0 +1,591 @@
# 通用工具模块TsCommon
<cite>
**本文档引用的文件**
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
通用工具模块TsCommon是一个专为前端开发设计的JavaScript工具库提供了日常开发中最常用的工具函数集合。该模块采用模块化设计支持浏览器和Node.js环境具有以下特点
- **轻量级设计**:专注于核心工具函数,避免功能冗余
- **环境适配**:智能检测运行环境,提供跨平台兼容性
- **错误安全**:完善的异常处理机制,确保函数调用的稳定性
- **易于扩展**:清晰的模块接口,便于功能扩展和维护
该工具模块主要服务于企业级应用开发,特别是在需要统一工具函数管理的大型项目中发挥重要作用。
## 项目结构
项目采用清晰的模块化组织结构,按照功能域进行文件分类:
```mermaid
graph TB
subgraph "项目根目录"
Root[index.js]
Package[package.json]
Readme[README.md]
end
subgraph "源代码目录"
Utils[src/utils/]
Https[src/https/]
end
subgraph "工具模块"
Common[TsCommon.js]
Storage[TsStorage.js]
Crypto[TsCrypto.js]
SM4[TsSM4.js]
GlobalConfig[TsGlobalConfig.js]
HttpUtil[TsHttpUtil.js]
end
subgraph "HTTP模块"
HttpUtil
end
Root --> Utils
Root --> Https
Utils --> Common
Utils --> Storage
Utils --> Crypto
Utils --> SM4
Utils --> GlobalConfig
Https --> HttpUtil
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
TsCommon模块提供了7个核心工具函数每个函数都针对特定的开发场景进行了优化
### 主要功能函数
| 函数名称 | 功能描述 | 返回类型 | 使用场景 |
|---------|----------|----------|----------|
| getParamFormUrl | 从URL中提取指定参数值 | String | URL参数解析、路由参数处理 |
| isEmpty | 检查值是否为空 | Boolean | 数据验证、条件判断 |
| parseJSON | 安全解析JSON字符串 | Any | 数据序列化、API响应处理 |
| split | 分割字符串为数组 | Array | 数据处理、配置解析 |
| isDevelopment | 检测开发环境 | Boolean | 环境配置、调试控制 |
| replaceAll | 替换所有匹配字符 | String | 文本处理、数据清洗 |
| endWith | 检查字符串结尾 | Boolean | 文件类型判断、路径处理 |
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
## 架构概览
TsCommon模块采用简洁的函数式编程模式所有工具函数都是独立的纯函数不依赖外部状态。模块间通过明确的依赖关系协作形成完整的工具生态系统。
```mermaid
graph TD
subgraph "TsCommon模块"
CommonFunctions[TsCommon.js]
UrlParser[URL参数解析]
ValueChecker[空值检查]
JsonParser[JSON解析]
StringProcessor[字符串处理]
EnvDetector[环境检测]
end
subgraph "依赖模块"
Storage[TsStorage.js]
Crypto[TsCrypto.js]
GlobalConfig[TsGlobalConfig.js]
SM4[TsSM4.js]
end
subgraph "上层应用"
HttpUtil[TsHttpUtil.js]
BusinessLogic[业务逻辑层]
end
CommonFunctions --> UrlParser
CommonFunctions --> ValueChecker
CommonFunctions --> JsonParser
CommonFunctions --> StringProcessor
CommonFunctions --> EnvDetector
HttpUtil --> CommonFunctions
HttpUtil --> Storage
HttpUtil --> Crypto
Crypto --> SM4
Storage --> CommonFunctions
BusinessLogic --> CommonFunctions
```
**图表来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 详细组件分析
### URL参数解析函数
#### getParamFormUrl函数
该函数专门用于从URL中提取指定的查询参数值支持自定义主机地址和参数键名。
```mermaid
sequenceDiagram
participant Client as 客户端
participant Common as TsCommon
participant Browser as 浏览器环境
participant Regex as 正则表达式
Client->>Common : getParamFormUrl(key, host?)
Common->>Browser : 获取当前页面URL
Browser-->>Common : 返回完整URL
Common->>Regex : 创建参数匹配正则
Regex-->>Common : 返回匹配结果
Common->>Common : 解码URI编码值
Common-->>Client : 返回参数值或空字符串
Note over Common : 异常处理:解析失败返回空字符串
```
**图表来源**
- [TsCommon.js:4-18](file://src/utils/TsCommon.js#L4-L18)
**函数签名**: `getParamFormUrl(key: string, host?: string): string`
**参数说明**:
- `key`: 必需,要提取的参数键名
- `host`: 可选自定义URL地址默认使用当前页面URL
**返回值**: 提取到的参数值,如果未找到则返回空字符串
**使用示例**:
```javascript
// 从当前页面URL提取参数
const userId = Common.getParamFormUrl('userId');
// 从指定URL提取参数
const token = Common.getParamFormUrl('token', 'https://api.example.com?token=abc123');
```
**章节来源**
- [TsCommon.js:4-18](file://src/utils/TsCommon.js#L4-L18)
### 空值检查函数
#### isEmpty函数
提供统一的空值检查机制覆盖JavaScript中常见的空值情况。
**函数签名**: `isEmpty(value: any): boolean`
**功能特性**:
- 检测 `undefined`
- 检测 `null`
- 检测空字符串 `''`
- 支持任意数据类型的空值判断
**使用场景**:
- 表单数据验证
- API响应数据处理
- 条件渲染控制
**章节来源**
- [TsCommon.js:25-27](file://src/utils/TsCommon.js#L25-L27)
### JSON解析函数
#### parseJSON函数
提供安全的JSON解析功能包含异常处理和默认值机制。
```mermaid
flowchart TD
Start([函数调用]) --> ParseJSON["尝试解析JSON字符串"]
ParseJSON --> ParseSuccess{"解析成功?"}
ParseSuccess --> |是| ValidateResult["验证解析结果"]
ParseSuccess --> |否| UseDefault["使用默认值"]
ValidateResult --> ResultValid{"结果有效?"}
ResultValid --> |是| ReturnResult["返回解析结果"]
ResultValid --> |否| UseDefault
UseDefault --> ReturnDefault["返回默认值"]
ReturnResult --> End([结束])
ReturnDefault --> End
```
**图表来源**
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
**函数签名**: `parseJSON(value: string, def?: any): any`
**参数说明**:
- `value`: 必需要解析的JSON字符串
- `def`: 可选,默认返回值,默认为 `{}`
**返回值**: 解析后的对象或提供的默认值
**使用示例**:
```javascript
// 基本使用
const userData = Common.parseJSON('{"name":"John"}');
// 自定义默认值
const config = Common.parseJSON('invalid-json', {theme:'dark'});
```
**章节来源**
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
### 字符串分割函数
#### split函数
提供灵活的字符串分割功能,支持自定义分隔符。
**函数签名**: `split(obj: string, seq?: string): string[]`
**参数说明**:
- `obj`: 必需,要分割的字符串
- `seq`: 可选,分隔符,默认为逗号 `,`
**返回值**: 分割后的字符串数组
**使用示例**:
```javascript
// 默认逗号分隔
const tags = Common.split('javascript,python,java');
// 自定义分隔符
const items = Common.split('apple|banana|orange', '|');
```
**章节来源**
- [TsCommon.js:51-56](file://src/utils/TsCommon.js#L51-L56)
### 开发环境检测函数
#### isDevelopment函数
提供统一的环境检测机制,支持多种环境配置方式。
**函数签名**: `isDevelopment(): boolean`
**功能特性**:
- 检测 `process.env.NODE_ENV` 环境变量
- 支持开发环境标识
- 返回布尔值结果
**使用场景**:
- 条件调试输出
- 开发/生产环境配置切换
- API地址环境区分
**章节来源**
- [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
### 字符串替换函数
#### replaceAll函数
提供全局字符串替换功能,支持正则表达式模式。
**函数签名**: `replaceAll(string: string, s1: string, s2: string): string`
**参数说明**:
- `string`: 必需,原字符串
- `s1`: 必需,要被替换的子字符串
- `s2`: 必需,替换后的字符串
**返回值**: 替换后的字符串
**使用示例**:
```javascript
// 替换所有特殊字符
const cleanText = Common.replaceAll('hello world!', ' ', '');
// HTML标签清理
const plainText = Common.replaceAll('<p>Hello</p>', '<[^>]*>', '');
```
**章节来源**
- [TsCommon.js:74-76](file://src/utils/TsCommon.js#L74-L76)
### 字符串结尾检查函数
#### endWith函数
提供字符串结尾检查功能,支持多字符结尾判断。
**函数签名**: `endWith(string?: string, endStr?: string): boolean`
**参数说明**:
- `string`: 可选,要检查的字符串,默认为空字符串
- `endStr`: 必需,要检查的结尾字符串
**返回值**: 如果字符串以指定后缀结尾返回true否则false
**使用示例**:
```javascript
// 检查文件扩展名
const isImage = Common.endWith('photo.jpg', '.jpg');
// 检查URL结尾
const isApiEndpoint = Common.endWith('/api/users', '/users');
```
**章节来源**
- [TsCommon.js:84-87](file://src/utils/TsCommon.js#L84-L87)
## 依赖关系分析
TsCommon模块与其他模块之间存在清晰的依赖关系形成了完整的工具生态系统。
```mermaid
graph LR
subgraph "TsCommon核心"
Common[TsCommon.js]
end
subgraph "直接依赖"
Storage[TsStorage.js]
Crypto[TsCrypto.js]
GlobalConfig[TsGlobalConfig.js]
end
subgraph "间接依赖"
SM4[TsSM4.js]
Base64[base64-js]
UmiRequest[umi-request]
end
subgraph "外部依赖"
BrowserEnv[浏览器环境]
NodeEnv[Node.js环境]
end
Common --> Storage
Common --> GlobalConfig
Storage --> Common
Crypto --> SM4
Crypto --> Base64
Crypto --> GlobalConfig
SM4 --> Base64
HttpUtil --> Common
HttpUtil --> Storage
HttpUtil --> Crypto
HttpUtil --> GlobalConfig
HttpUtil --> UmiRequest
Common -.-> BrowserEnv
Common -.-> NodeEnv
Storage -.-> BrowserEnv
Crypto -.-> NodeEnv
```
**图表来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [package.json:19-22](file://package.json#L19-L22)
### 模块间交互流程
```mermaid
sequenceDiagram
participant App as 应用程序
participant HttpUtil as HTTP工具
participant Storage as 存储工具
participant Crypto as 加密工具
participant Common as 通用工具
App->>HttpUtil : 发起HTTP请求
HttpUtil->>Common : 使用isEmpty检查数据
HttpUtil->>Storage : 获取用户令牌
Storage->>Common : 使用parseJSON解析数据
HttpUtil->>Crypto : 加密请求数据
Crypto->>Crypto : 使用SM4算法
Crypto-->>HttpUtil : 返回加密结果
HttpUtil-->>App : 返回处理后的响应
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsStorage.js:41-43](file://src/utils/TsStorage.js#L41-L43)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 性能考虑
### 时间复杂度分析
| 函数 | 时间复杂度 | 空间复杂度 | 说明 |
|------|------------|------------|------|
| getParamFormUrl | O(n) | O(1) | n为URL长度正则匹配 |
| isEmpty | O(1) | O(1) | 常数时间比较 |
| parseJSON | O(n) | O(n) | n为字符串长度JSON解析 |
| split | O(n) | O(n) | n为字符串长度字符串分割 |
| isDevelopment | O(1) | O(1) | 环境变量读取 |
| replaceAll | O(n*m) | O(n+m) | n为原字符串长度m为匹配次数 |
| endWith | O(m) | O(1) | m为endStr长度 |
### 内存使用优化
1. **字符串处理优化**: 所有字符串操作都使用原生JavaScript方法避免额外的内存分配
2. **正则表达式复用**: URL参数解析中的正则表达式在函数内部创建避免重复编译
3. **异常处理**: 所有函数都有完善的异常处理,防止内存泄漏
### 缓存策略
- URL参数解析结果不进行缓存因为每次调用可能使用不同的URL
- 环境检测结果可缓存,但当前实现每次都重新检查以确保准确性
## 故障排除指南
### 常见问题及解决方案
#### URL参数解析失败
**问题**: `getParamFormUrl` 返回空字符串
**原因**:
- URL中不存在指定参数
- URL格式不正确
- 浏览器环境限制
**解决方案**:
```javascript
// 检查URL格式
const url = Common.getParamFormUrl('key', customUrl);
if (!url) {
console.warn('参数解析失败检查URL格式');
}
// 使用默认值
const value = Common.getParamFormUrl('key') || defaultValue;
```
#### JSON解析异常
**问题**: `parseJSON` 抛出异常或返回错误结果
**原因**:
- 输入不是有效的JSON格式
- 字符串包含特殊字符
**解决方案**:
```javascript
// 使用try-catch处理
let result;
try {
result = Common.parseJSON(jsonString);
} catch (error) {
console.error('JSON解析失败:', error);
result = defaultValue;
}
// 或者使用默认值机制
const data = Common.parseJSON(invalidJson, {});
```
#### 环境检测不准确
**问题**: `isDevelopment` 返回错误的环境信息
**原因**:
- `NODE_ENV` 环境变量未正确设置
- 在浏览器环境中无法访问Node.js环境变量
**解决方案**:
```javascript
// 检查环境变量
console.log('NODE_ENV:', process.env.NODE_ENV);
// 在浏览器环境中使用其他方式检测
const isDev = typeof window !== 'undefined' &&
window.location.hostname === 'localhost';
```
### 调试技巧
1. **启用详细日志**: 在开发环境中使用 `isDevelopment` 函数控制日志输出
2. **参数验证**: 在调用工具函数前验证输入参数的有效性
3. **异常捕获**: 对可能失败的函数调用使用try-catch包装
**章节来源**
- [TsCommon.js:7-17](file://src/utils/TsCommon.js#L7-L17)
- [TsCommon.js:36-42](file://src/utils/TsCommon.js#L36-L42)
## 结论
TsCommon通用工具模块通过提供7个核心工具函数为JavaScript开发提供了坚实的基础工具集。该模块具有以下优势
1. **功能完备**: 覆盖了日常开发中最常用的工具函数
2. **设计优雅**: 采用纯函数设计,无副作用,易于测试
3. **环境友好**: 支持浏览器和Node.js双环境运行
4. **错误安全**: 完善的异常处理机制,确保程序稳定性
5. **易于扩展**: 清晰的模块接口,便于功能扩展
该模块特别适用于需要统一工具函数管理的企业级应用开发能够显著提高开发效率和代码质量。通过合理的依赖管理和模块化设计TsCommon为整个工具库生态系统奠定了坚实的基础。
## 附录
### API参考表
#### URL处理函数
| 函数名 | 参数 | 返回值 | 描述 |
|--------|------|--------|------|
| getParamFormUrl | `(key: string, host?: string)` | `string` | 从URL中提取参数值 |
| endWith | `(string?: string, endStr?: string)` | `boolean` | 检查字符串是否以指定后缀结尾 |
#### 数据处理函数
| 函数名 | 参数 | 返回值 | 描述 |
|--------|------|--------|------|
| isEmpty | `(value: any)` | `boolean` | 检查值是否为空 |
| parseJSON | `(value: string, def?: any)` | `any` | 安全解析JSON字符串 |
| split | `(obj: string, seq?: string)` | `string[]` | 分割字符串为数组 |
#### 字符串处理函数
| 函数名 | 参数 | 返回值 | 描述 |
|--------|------|--------|------|
| replaceAll | `(string: string, s1: string, s2: string)` | `string` | 替换所有匹配的子字符串 |
#### 环境检测函数
| 函数名 | 参数 | 返回值 | 描述 |
|--------|------|--------|------|
| isDevelopment | `()` | `boolean` | 检测是否为开发环境 |
### 最佳实践建议
1. **参数验证**: 在调用任何工具函数前,先使用 `isEmpty` 验证输入参数
2. **错误处理**: 对可能失败的函数调用使用适当的异常处理机制
3. **环境适配**: 使用 `isDevelopment` 控制开发和生产环境的不同行为
4. **性能优化**: 对于频繁调用的函数,考虑缓存结果以提高性能
5. **代码复用**: 将常用的工具函数组合成更高层的业务函数
### 版本兼容性
- **Node.js版本**: 支持Node.js 12及以上版本
- **浏览器兼容**: 支持现代浏览器Chrome 60+, Firefox 55+, Safari 11+
- **ES版本**: 使用ES6+语法,需要相应的转译配置

View File

@@ -0,0 +1,320 @@
# HTTP 请求配置
<cite>
**本文引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与缓存策略](#性能与缓存策略)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录:完整配置示例与最佳实践](#附录完整配置示例与最佳实践)
## 简介
本文件面向使用 TsHttpUtil 的开发者,系统性说明 HTTP 请求配置项、请求头设置、超时控制、重试机制、httpParams 回调、请求拦截与响应处理、错误处理 onHttpError、认证与代理、SSL 与加密、性能优化与缓存策略,以及调试与监控方法。文档基于仓库源码进行逐层解析,并提供可直接落地的配置建议与流程图示。
## 项目结构
该工具包以“功能域”组织https 层负责网络请求封装utils 层提供全局配置、存储、通用工具、加解密等支撑能力;入口 index.js 汇总导出模块。
```mermaid
graph TB
subgraph "入口"
IDX["index.js"]
end
subgraph "HTTPS 层"
HTTP["TsHttpUtil.js"]
end
subgraph "工具层"
GC["TsGlobalConfig.js"]
ST["TsStorage.js"]
CM["TsCommon.js"]
CR["TsCrypto.js"]
SM["TsSM4.js"]
end
IDX --> HTTP
HTTP --> GC
HTTP --> ST
HTTP --> CM
HTTP --> CR
CR --> SM
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- TsHttpUtil统一请求入口封装 GET/POST/FORM内置默认错误处理、请求头注入、参数合并与加密逻辑。
- TsGlobalConfig全局配置中心支持 prefix 前缀、onHttpError 错误回调、httpParams 动态参数注入。
- TsStorage本地存储与用户 Token 管理,支持开关 body 加密。
- TsCommon通用工具含空值判断、JSON 解析、开发环境判断等。
- TsCrypto/TsSM4SM4 对称加密实现,配合 base64 密钥与模式配置。
章节来源
- [TsHttpUtil.js:25-171](file://src/https/TsHttpUtil.js#L25-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 架构总览
TsHttpUtil 在 umi-request 基础上扩展了:
- 默认错误处理 errorHandler
- 默认携带 cookie、JSON 请求体类型
- 统一参数处理 dealParamsBody分页、equals、动态参数注入
- 请求前缀 prefix 注入
- 自动注入用户 Token
- 响应体解密与数据提取
- 错误回调 onHttpError
```mermaid
sequenceDiagram
participant App as "应用"
participant Http as "TsHttpUtil"
participant Umi as "umi-request"
participant Cfg as "TsGlobalConfig"
participant Store as "TsStorage"
participant Crypto as "TsCrypto/TsSM4"
App->>Http : 调用 get/post/form(req)
Http->>Cfg : 读取 prefix/httpParams/onHttpError
Http->>Store : 读取用户 Token
Http->>Http : 合并动态参数/分页/equals
Http->>Http : 条件加密 encryptBody
Http->>Umi : request(url, options)
Umi-->>Http : 返回响应
Http->>Http : 解密/提取 data/recordsTotal
Http-->>App : Promise.resolve(data, recordsTotal)
Http->>Cfg : onHttpError(res)失败时
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
## 详细组件分析
### 1) 请求配置与默认行为
- 默认错误处理:对无响应或状态码映射到统一消息。
- 凭据策略:默认携带 Cookie。
- 请求体类型:默认 JSON。
- 请求前缀:支持字符串或函数式前缀,按 URL 动态拼接。
- 动态参数注入:通过 httpParams 回调注入到 GET 查询参数或非表单 POST 请求体中。
- 用户 Token自动从本地存储读取并注入到请求头 token 字段。
- 响应处理:默认仅返回 data 与 recordsTotal若响应标记加密则自动解密并解析 JSON。
章节来源
- [TsHttpUtil.js:28-44](file://src/https/TsHttpUtil.js#L28-L44)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsGlobalConfig.js:5-21](file://src/utils/TsGlobalConfig.js#L5-L21)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
### 2) httpParams 回调函数详解
- 触发时机:在 GET 请求合并查询参数、或非表单 POST 请求合并请求体之前。
- 参数与返回:回调接收当前请求上下文(由全局配置提供),返回一个对象作为额外参数注入。
- 使用场景:统一注入业务维度参数(如租户 ID、版本号、traceId、环境标识、签名参数等。
- 注意事项GET 与非表单 POST 的注入位置不同,避免覆盖关键字段。
章节来源
- [TsHttpUtil.js:70-88](file://src/https/TsHttpUtil.js#L70-L88)
- [TsGlobalConfig.js:10-12](file://src/utils/TsGlobalConfig.js#L10-L12)
### 3) 请求头设置与认证
- 自动头注入:每次请求自动附加 token 头部,值来自用户 Token。
- 手动头覆盖:可通过 options.headers 传入自定义头,会与默认头合并。
- 认证策略:建议在 httpParams 或 headers 中注入 Authorization/Bearer 等,结合用户 Token 管理。
章节来源
- [TsHttpUtil.js:108-112](file://src/https/TsHttpUtil.js#L108-L112)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
### 4) 超时与重试机制
- 超时umi-request 支持 timeout 配置,可在 options 中传入TsHttpUtil 不在内部强制设置。
- 重试:未内置重试逻辑,可在上层封装或通过 umi-request 的 retry 选项实现(需在调用侧传入)。
章节来源
- [TsHttpUtil.js:108-112](file://src/https/TsHttpUtil.js#L108-L112)
- [package.json:19-22](file://package.json#L19-L22)
### 5) 请求拦截器与响应处理器
- 请求拦截:通过 options.headers、httpParams 注入参数与头prefix 前缀在请求发起前拼接。
- 响应处理:默认解析 data/recordsTotal若响应带加密标记则自动解密。
- 自定义处理:通过 rawResponse 可直接返回原始响应对象,交由调用方自行处理。
章节来源
- [TsHttpUtil.js:108-134](file://src/https/TsHttpUtil.js#L108-L134)
### 6) 错误处理 onHttpError
- 默认行为将错误映射为统一结构code/message
- 自定义回调:通过 TsGlobalConfig.setConfig 注入 onHttpError用于统一上报、埋点、登录态失效处理等。
- 触发条件:当响应 code 非 200 时触发。
章节来源
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsHttpUtil.js:125-127](file://src/https/TsHttpUtil.js#L125-L127)
- [TsGlobalConfig.js:8-9](file://src/utils/TsGlobalConfig.js#L8-L9)
### 7) 加密与安全
- 加密开关:通过 TsStorage.saveEncryptBody(true/false) 控制是否对请求体进行加密。
- 加密算法SM4ECB/可选 CBC密钥来自 TsGlobalConfig.base64Key。
- 解密:响应体若标记加密,自动解密并解析 JSON。
- 建议:生产环境务必使用强密钥与 HTTPS避免明文传输。
章节来源
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
### 8) 参数处理与分页/equals
- 分页:将 pagination 对象转换为 pageSize/pageNum 并移除 pagination。
- equals将对象转为逗号分隔的键值串过滤空值。
- 动态参数:通过 httpParams 注入GET 合并到查询参数,非表单 POST 合并到请求体。
章节来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
### 9) 环境差异化配置策略
- 开发环境:可启用 httpParams 注入调试参数、开启日志输出prefix 指向本地/联调服务。
- 测试环境:启用 httpParams 注入测试标识;开启轻量级错误上报;必要时开启加密。
- 生产环境:严格启用 HTTPS、固定密钥、关闭敏感日志onHttpError 上报统一错误;限制 httpParams 注入范围。
章节来源
- [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
- [TsGlobalConfig.js:5-21](file://src/utils/TsGlobalConfig.js#L5-L21)
## 依赖关系分析
```mermaid
graph LR
HTTP["TsHttpUtil.js"] --> GC["TsGlobalConfig.js"]
HTTP --> ST["TsStorage.js"]
HTTP --> CM["TsCommon.js"]
HTTP --> CR["TsCrypto.js"]
CR --> SM["TsSM4.js"]
IDX["index.js"] --> HTTP
PKG["package.json"] --> HTTP
```
图表来源
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-5](file://src/utils/TsStorage.js#L1-L5)
- [TsCommon.js:1-4](file://src/utils/TsCommon.js#L1-L4)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1-3](file://src/utils/TsSM4.js#L1-L3)
- [index.js:1-6](file://index.js#L1-L6)
- [package.json:19-22](file://package.json#L19-L22)
章节来源
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [package.json:19-22](file://package.json#L19-L22)
## 性能与缓存策略
- 请求合并:优先使用 httpParams 合并公共参数,减少重复字段。
- 数据压缩:在服务端支持前提下,考虑 gzip/deflate 传输。
- 缓存策略:对 GET 请求可结合业务缓存(如内存/LocalStorage避免重复请求注意缓存失效与一致性。
- 超时与并发:合理设置 timeout避免阻塞对批量请求采用并发控制。
- 加密成本:加密/解密为 CPU 密集型,建议仅对敏感数据启用,或在高频接口中评估开销。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 无法登录/鉴权失败:检查 headers 中 token 是否正确注入;确认 httpParams 是否覆盖了必要的认证头。
- 参数丢失:确认 GET 与非表单 POST 的参数注入位置;避免与 options.params/data 冲突。
- 加密异常:确认 TsStorage.encryptBody 开关、base64Key 正确、服务端密钥一致。
- 错误未上报:确认 onHttpError 是否正确注入;检查响应 code/message 映射。
- 调试方法:开启浏览器 Network 面板,观察请求头、参数、响应体;在 httpParams 中注入 traceId 便于后端定位。
章节来源
- [TsHttpUtil.js:108-134](file://src/https/TsHttpUtil.js#L108-L134)
- [TsGlobalConfig.js:8-9](file://src/utils/TsGlobalConfig.js#L8-L9)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
## 结论
TsHttpUtil 提供了简洁而强大的 HTTP 封装,通过全局配置与工具层能力,实现了参数注入、认证、加密、错误处理与响应解密等关键能力。建议在不同环境下采用差异化的配置策略,并结合调试与监控手段持续优化性能与稳定性。
[本节为总结,不直接分析具体文件]
## 附录:完整配置示例与最佳实践
### 1) 全局配置示例(开发/测试/生产)
- 开发环境
- prefix: 指向本地/联调地址
- httpParams: 注入 debug=true、env=dev、traceId
- onHttpError: 输出到控制台或轻量上报
- encryptBody: false
- 测试环境
- prefix: 指向测试域名
- httpParams: 注入 env=test、version、tenantId
- onHttpError: 轻量上报
- encryptBody: 可选开启
- 生产环境
- prefix: 指向生产域名
- httpParams: 仅注入必要参数(如 tenantId、version
- onHttpError: 完整上报(含堆栈)
- encryptBody: 必须开启base64Key 固定且保密
章节来源
- [TsGlobalConfig.js:5-21](file://src/utils/TsGlobalConfig.js#L5-L21)
- [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65)
### 2) 认证配置
- 方案一:在 headers 中注入 Authorization/Bearer
- 方案二:在 httpParams 中注入 token 参数
- 方案三:结合用户 Token 管理TsStorage.getUserToken
章节来源
- [TsHttpUtil.js:108-112](file://src/https/TsHttpUtil.js#L108-L112)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
### 3) 代理与 SSL
- 代理通过网络层或构建工具配置TsHttpUtil 不直接处理代理。
- SSL生产环境必须启用 HTTPS确保证书有效与中间人攻击防护。
[本节为通用指导,不直接分析具体文件]
### 4) 性能优化与缓存
- 合理设置 timeout避免长时间阻塞
- 对高频 GET 接口增加本地缓存
- 仅对敏感数据启用加密,评估 CPU 开销
- 使用 httpParams 合并公共参数,减少请求体积
[本节为通用指导,不直接分析具体文件]
### 5) 调试与监控
- 在 httpParams 中注入 traceId、version、env
- onHttpError 上报统一错误,包含 code/message/URL
- 使用浏览器 Network 面板与后端日志联动定位问题
章节来源
- [TsGlobalConfig.js:8-9](file://src/utils/TsGlobalConfig.js#L8-L9)

View File

@@ -0,0 +1,348 @@
# 全局配置
<cite>
**本文引用的文件**
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与安全考量](#性能与安全考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“全局配置系统”的使用者与维护者,系统性阐述 TsGlobalConfig 模块的设计理念、实现原理与使用方法,并结合 Http 请求流程、加解密链路与存储模块,给出配置项的数据类型、默认值、取值范围、动态更新机制、优先级处理逻辑、配置示例(开发/生产)、配置存储位置与访问方式、配置验证、错误处理与调试技巧。目标是帮助读者快速理解并正确使用该全局配置体系。
## 项目结构
该项目采用按功能域组织的目录结构:
- utils通用工具与基础能力全局配置、通用方法、存储、加解密、SM4 实现)
- httpsHTTP 请求封装(基于 umi-request 的扩展)
- 根目录入口 index.js 汇总导出各模块,供上层业务统一引入
```mermaid
graph TB
subgraph "工具模块(utils)"
GC["TsGlobalConfig.js"]
CM["TsCommon.js"]
ST["TsStorage.js"]
CR["TsCrypto.js"]
SM["TsSM4.js"]
end
subgraph "HTTP模块(https)"
HT["TsHttpUtil.js"]
end
IDX["index.js"] --> GC
IDX --> CM
IDX --> ST
IDX --> CR
IDX --> SM
IDX --> HT
HT --> GC
HT --> ST
HT --> CR
CR --> GC
CR --> SM
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- 全局配置模块 TsGlobalConfig提供默认配置、读取配置、合并覆盖配置的能力配置最终存储于 window.httpConfig。
- HTTP 工具 TsHttpUtil通过 GlobalConfig 读取前缀、错误回调与附加参数函数;负责请求扩展、参数处理、加解密开关、响应解析与错误回调。
- 加密模块 TsCrypto基于 SM4 算法与 base64 密钥,从 GlobalConfig 读取 base64Key 构造密钥缓冲区,支持加密/解密。
- 存储模块 TsStorage提供本地存储、用户 Token 与“是否加密 body”的开关读写。
- 通用模块 TsCommon提供空值判断、JSON 解析、URL 参数解析、开发环境判断等辅助能力。
章节来源
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
## 架构总览
下图展示全局配置在系统中的作用与交互关系HTTP 请求在发起前读取 GlobalConfig 的 prefix、httpParams 与 onHttpError加密模块在初始化时读取 base64Key存储模块提供加密开关与用户 Token。
```mermaid
sequenceDiagram
participant App as "应用代码"
participant Http as "TsHttpUtil"
participant GC as "TsGlobalConfig"
participant Crypto as "TsCrypto"
participant Store as "TsStorage"
participant Net as "umi-request"
App->>Http : "调用 get/post/form"
Http->>GC : "读取 prefix / httpParams / onHttpError"
Http->>Store : "读取用户 Token"
Http->>Net : "发起请求(含 headers/token)"
Net-->>Http : "返回响应"
Http->>Http : "根据响应码处理/解密"
Http->>GC : "调用 onHttpError(res)"
Http-->>App : "Promise 返回结果"
Note over Crypto,GC : "TsCrypto 在构造时读取 base64Key"
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsCrypto.js:5-13](file://src/utils/TsCrypto.js#L5-L13)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
## 详细组件分析
### TsGlobalConfig 设计与实现
- 默认配置 defaultConfig
- base64Key: 字符串,用于 SM4 密钥的 base64 编码形式
- prefix: 字符串或函数,用于拼接请求前缀
- onHttpError: 函数,用于统一处理 HTTP 错误
- httpParams: 函数,用于为每次请求注入额外参数
- getConfig
- 从 window.httpConfig 读取当前配置;若未设置则回退到 defaultConfig
- setConfig
- 将传入对象与当前配置进行浅合并后写回 window.httpConfig
```mermaid
flowchart TD
Start(["调用 setConfig(obj)"]) --> GetCur["读取当前配置<br/>window.httpConfig 或 defaultConfig"]
GetCur --> Merge["浅合并: {...cur, ...obj}"]
Merge --> Write["写回 window.httpConfig"]
Write --> End(["完成"])
```
图表来源
- [TsGlobalConfig.js:27-29](file://src/utils/TsGlobalConfig.js#L27-L29)
- [TsGlobalConfig.js:19-21](file://src/utils/TsGlobalConfig.js#L19-L21)
章节来源
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### 配置项详解与使用
- base64Key
- 类型字符串Base64 编码)
- 默认值:见默认配置
- 作用:作为 SM4 密钥的 base64 字符串,在加密模块初始化时转换为字节缓冲区
- 取值范围:需满足 SM4 密钥长度要求(构造函数会校验长度)
- 使用建议:生产环境务必由后端提供并保持一致;不要硬编码在前端
- 访问方式:通过 GlobalConfig.getConfig().base64Key
- 关联模块TsCrypto、TsSM4
- prefix
- 类型:字符串或函数
- 默认值:空字符串
- 作用:为请求 URL 添加统一前缀;若为函数,则以 URL 为参数动态计算前缀
- 取值范围:任意字符串或可返回字符串的函数
- 使用建议:开发环境与生产环境可通过函数区分;避免硬编码路径
- 访问方式:通过 GlobalConfig.getConfig().prefix
- 关联模块TsHttpUtil
- onHttpError
- 类型:函数
- 默认值:空函数
- 作用:统一处理 HTTP 响应非 200 的场景;接收响应对象
- 取值范围:函数签名需兼容接收响应对象
- 使用建议:可在其中记录日志、弹窗提示、跳转登录等
- 访问方式:通过 GlobalConfig.getConfig().onHttpError(res)
- 关联模块TsHttpUtil
- httpParams
- 类型:函数
- 默认值:空函数
- 作用为每次请求注入额外参数GET 请求合并到 params非 GET 且非 form 合并到 data
- 取值范围:函数需返回参数对象
- 使用建议:可用于注入公共查询条件、租户信息、时间戳等
- 访问方式:通过 GlobalConfig.getConfig().httpParams()
- 关联模块TsHttpUtil
章节来源
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsHttpUtil.js:70-88](file://src/https/TsHttpUtil.js#L70-L88)
- [TsHttpUtil.js:124-127](file://src/https/TsHttpUtil.js#L124-L127)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsSM4.js:102-106](file://src/utils/TsSM4.js#L102-L106)
### 动态更新机制与优先级
- 更新机制
- setConfig 会将传入对象与当前配置进行浅合并,写回 window.httpConfig
- getConfig 读取 window.httpConfig若未设置则回退到默认配置
- 优先级
- 传入对象 > 当前配置 > 默认配置
- 若传入对象中某键缺失,则沿用当前配置;若当前配置也缺失,则使用默认配置
- 注意事项
- 浅合并意味着嵌套对象不会递归合并;如需深层覆盖,应在传入对象中直接提供完整结构
- prefix 支持函数,可在运行时根据 URL 动态决定前缀
章节来源
- [TsGlobalConfig.js:27-29](file://src/utils/TsGlobalConfig.js#L27-L29)
- [TsGlobalConfig.js:19-21](file://src/utils/TsGlobalConfig.js#L19-L21)
### 配置存储位置与访问方式
- 存储位置window.httpConfig
- 访问方式:
- 读取GlobalConfig.getConfig()
- 写入GlobalConfig.setConfig(obj)
- 适用场景:
- 开发环境:可注入测试前缀、日志输出的错误处理函数
- 生产环境:注入真实域名前缀、统一鉴权头、错误上报回调
章节来源
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 配置示例(开发/生产)
- 开发环境示例
- 前缀:指向本地或测试服务
- 错误处理:控制台打印
- 附加参数:注入测试租户或调试标记
- 加密开关:可关闭或开启(视需求而定)
- 生产环境示例
- 前缀:指向正式域名
- 错误处理:统一上报、登录跳转
- 附加参数:注入用户标识、时间戳、签名等
- 加密开关开启加密体encrypt_body并确保 base64Key 与后端一致
说明:以上为使用思路与最佳实践,具体实现请参考 README 中的示例与各模块源码。
章节来源
- [README.md:12-26](file://README.md#L12-L26)
- [TsHttpUtil.js:70-88](file://src/https/TsHttpUtil.js#L70-L88)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
### 配置验证与错误处理
- 配置验证
- base64Key 长度校验SM4 构造函数会校验密钥长度为 16 字节
- prefix 类型校验:若为函数,需确保返回字符串
- httpParams 类型校验:需返回对象
- onHttpError 类型校验:需为函数
- 错误处理
- HTTP 层:统一错误处理函数 onHttpError(res)
- 加密层:密钥不匹配或格式错误会在加密/解密阶段抛出异常
- 存储层:本地存储失败时会降级为默认值
章节来源
- [TsSM4.js:102-106](file://src/utils/TsSM4.js#L102-L106)
- [TsHttpUtil.js:124-127](file://src/https/TsHttpUtil.js#L124-L127)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
### 调试技巧
- 打印当前配置:在关键位置调用 GlobalConfig.getConfig() 输出配置快照
- 检查前缀拼接:在请求发起前打印最终 URL
- 检查附加参数:在 dealParamsBody 中断点查看 extraParams 与 options 的合并结果
- 检查加密开关:通过 TsStorage.getEncryptBody() 确认是否启用加密体
- 检查错误回调:在 onHttpError 中记录响应状态与消息,便于定位问题
章节来源
- [TsGlobalConfig.js:19-21](file://src/utils/TsGlobalConfig.js#L19-L21)
- [TsHttpUtil.js:70-91](file://src/https/TsHttpUtil.js#L70-L91)
- [TsStorage.js:21-23](file://src/utils/TsStorage.js#L21-L23)
## 依赖关系分析
- TsHttpUtil 依赖
- GlobalConfig读取 prefix、httpParams、onHttpError
- Storage读取用户 Token、加密开关
- Crypto在需要时对请求体进行加密
- TsCrypto 依赖
- GlobalConfig读取 base64Key
- SM4执行加解密
- index.js 汇总导出所有模块,供上层统一引入
```mermaid
graph LR
HT["TsHttpUtil"] --> GC["TsGlobalConfig"]
HT --> ST["TsStorage"]
HT --> CR["TsCrypto"]
CR --> GC
CR --> SM["TsSM4"]
IDX["index.js"] --> GC
IDX --> HT
IDX --> CR
IDX --> ST
IDX --> SM
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
## 性能与安全考量
- 性能
- setConfig 为浅合并,开销极低;建议仅在应用启动时进行一次全局配置
- httpParams 为函数调用,建议避免复杂计算;必要时可缓存结果
- 加密体仅在开启加密开关时启用,避免不必要的 CPU 开销
- 安全
- base64Key 不要硬编码在前端;生产环境由后端下发或通过安全渠道同步
- 建议在生产环境强制开启加密体,并定期轮换密钥
- onHttpError 中避免泄露敏感信息
[本节为通用指导,无需特定文件来源]
## 故障排查指南
- 无法读取配置
- 确认是否已调用 setConfig否则 getConfig 将返回默认配置
- 前缀无效
- 检查 prefix 是字符串还是函数;若是函数,确认其返回值为字符串
- 附加参数未生效
- 确认 httpParams 返回对象GET 请求合并到 params非 GET 且非 form 合并到 data
- 加密异常
- 检查 base64Key 是否为 16 字节对应的 Base64确认前后端密钥一致
- 错误回调未触发
- 确认响应码非 200onHttpError 仅在非 200 时调用
章节来源
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsHttpUtil.js:70-88](file://src/https/TsHttpUtil.js#L70-L88)
- [TsHttpUtil.js:124-127](file://src/https/TsHttpUtil.js#L124-L127)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsSM4.js:102-106](file://src/utils/TsSM4.js#L102-L106)
## 结论
TsGlobalConfig 提供了简洁、灵活的全局配置能力,配合 TsHttpUtil、TsCrypto、TsStorage 等模块,形成完整的请求、加解密与存储闭环。通过 window.httpConfig 统一管理配置,既保证了易用性,又兼顾了动态更新与优先级处理。建议在实际项目中:
- 在应用启动阶段集中 setConfig
- 明确区分开发/生产环境的前缀与错误处理策略
- 严格管理 base64Key确保前后端一致
- 合理使用 httpParams 注入公共参数,避免重复代码
[本节为总结,无需特定文件来源]
## 附录
### API 一览(来自模块导出)
- index.js 汇总导出TsHttpUtil、TsCommon、TsStorage、TsSM4、TsCrypto、TsGlobalConfig
- README.md 提供了基本使用示例(含 setConfig 与 post 调用)
章节来源
- [index.js:8-15](file://index.js#L8-L15)
- [README.md:12-26](file://README.md#L12-L26)

View File

@@ -0,0 +1,352 @@
# 加密配置
<cite>
**本文引用的文件列表**
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南围绕项目中的 SM4 加密配置展开,系统性说明 CBC 与 ECB 模式的配置与使用差异、base64Key 的作用与长度要求、安全性考量,以及在数据传输加密与存储加密等场景下的配置建议。同时覆盖加密模式切换、与全局配置的关系与继承机制、最佳实践(密钥管理、性能优化、安全加固)、以及测试与验证方法。文档严格基于仓库源码进行分析与总结,避免臆测。
## 项目结构
该项目采用“工具类 + 组件化”的组织方式:
- 工具层SM4 实现、通用加密封装、全局配置、本地存储、通用方法
- 业务集成层HTTP 请求工具,负责在请求前后对数据进行加解密
- 入口导出:统一通过入口文件导出各模块
```mermaid
graph TB
subgraph "工具层"
SM4["TsSM4<br/>SM4 加密实现"]
Crypto["TsCrypto<br/>基于 SM4 的加密封装"]
GlobalCfg["TsGlobalConfig<br/>全局配置"]
Storage["TsStorage<br/>本地存储"]
Common["TsCommon<br/>通用方法"]
end
subgraph "业务集成层"
HttpUtil["TsHttpUtil<br/>HTTP 请求工具"]
end
SM4 --> Crypto
GlobalCfg --> Crypto
Crypto --> HttpUtil
Storage --> HttpUtil
Common --> HttpUtil
```
图表来源
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- SM4 加密实现:提供 CBC/ECB 模式、PKCS#7 填充、Base64 文本输出、密钥扩展与轮函数等完整实现
- 加密封装:基于 SM4 构建默认实例,读取全局配置中的 base64Key并默认以 ECB 模式工作
- 全局配置:提供 base64Key、前缀、HTTP 参数注入、错误回调等配置项
- HTTP 工具:在请求体加密开关开启时,对请求体进行加密;在响应标记为加密时进行解密
- 本地存储:提供开关控制是否对请求体进行加密
章节来源
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 架构总览
下图展示了从请求发起到加解密处理的关键流程,以及与全局配置、本地存储的关系。
```mermaid
sequenceDiagram
participant Client as "调用方"
participant HttpUtil as "TsHttpUtil"
participant Storage as "TsStorage"
participant Crypto as "TsCrypto"
participant SM4 as "TsSM4"
participant Server as "后端服务"
Client->>HttpUtil : "post(url, data)"
HttpUtil->>Storage : "getEncryptBody()"
Storage-->>HttpUtil : "true/false"
alt "需要加密"
HttpUtil->>Crypto : "encrypt(JSON.stringify(data))"
Crypto->>SM4 : "encrypt(明文)"
SM4-->>Crypto : "密文(Base64)"
Crypto-->>HttpUtil : "密文(Base64)"
HttpUtil->>Server : "POST { encryptData : 密文 }"
else "无需加密"
HttpUtil->>Server : "POST data"
end
Server-->>HttpUtil : "响应 { code, data, encrypt? }"
alt "响应标记为加密"
HttpUtil->>Crypto : "decrypt(data)"
Crypto->>SM4 : "decrypt(密文)"
SM4-->>Crypto : "明文"
Crypto-->>HttpUtil : "明文"
HttpUtil-->>Client : "{ data, recordsTotal }"
else "未加密响应"
HttpUtil-->>Client : "{ data, recordsTotal }"
end
```
图表来源
- [TsHttpUtil.js:82-88](file://src/https/TsHttpUtil.js#L82-L88)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 详细组件分析
### SM4 加密实现TsSM4
- 模式支持CBC、ECB 双模式,可通过构造参数选择
- IV 要求CBC 模式必须提供 16 字节 IVECB 模式可省略 IV
- 密钥要求:必须为 16 字节128 位),构造时会校验
- 输出类型:支持 Base64 与文本两种输出类型
- 填充策略PKCS#7 填充,解密时自动去除
- 轮函数与密钥扩展:内置完整的 SM4 轮函数与轮密钥生成逻辑
```mermaid
classDiagram
class Crypt {
+stringToArrayBufferInUtf8(str) Uint8Array
+utf8ArrayBufferToString(buf) String
+arrayBufferToBase64(buf) String
+base64ToArrayBuffer(str) Uint8Array
}
class TsSM4 {
+Uint8Array key
+Uint8Array iv
+String mode
+String cipherType
+Uint32Array encryptRoundKeys
+Uint32Array decryptRoundKeys
+doBlockCrypt(blockData, roundKeys) Uint32Array
+spawnEncryptRoundKeys() void
+padding(buffer) Uint8Array
+dePadding(buffer) Uint8Array
+uint8ToUint32Block(arr, baseIndex) Uint32Array
+encrypt(plaintext) String
+decrypt(ciphertext) String
}
TsSM4 --> Crypt : "使用"
```
图表来源
- [TsSM4.js:39-94](file://src/utils/TsSM4.js#L39-L94)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
章节来源
- [TsSM4.js:102-156](file://src/utils/TsSM4.js#L102-L156)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
### 加密封装TsCrypto
- 默认使用 ECB 模式
- 从全局配置读取 base64Key 并转换为字节数组作为密钥
- 对外暴露 encrypt、decrypt 接口,内部委托给 TsSM4
章节来源
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
### 全局配置TsGlobalConfig
- 提供 base64Key、prefix、httpParams、onHttpError 等配置项
- 支持运行时 setConfig 合并默认配置
- HTTP 工具通过 getConfig 获取 prefix 与 httpParams 注入
章节来源
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsHttpUtil.js:72-74](file://src/https/TsHttpUtil.js#L72-L74)
### HTTP 工具TsHttpUtil
- 在请求体加密开关开启时,将 data 包装为 { encryptData: 加密结果 }
- 在响应标记 encrypt 时,对 data 执行解密并解析 JSON
- 支持 GET/POST/form 等多种请求类型
章节来源
- [TsHttpUtil.js:82-88](file://src/https/TsHttpUtil.js#L82-L88)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsHttpUtil.js:142-154](file://src/https/TsHttpUtil.js#L142-L154)
- [TsHttpUtil.js:163-165](file://src/https/TsHttpUtil.js#L163-L165)
### 本地存储TsStorage
- 提供 getEncryptBody/saveEncryptBody 开关,用于控制请求体是否加密
- 与 HTTP 工具配合使用
章节来源
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 依赖关系分析
- TsCrypto 依赖 TsSM4 与 TsGlobalConfig
- TsHttpUtil 依赖 TsCrypto、TsStorage、TsGlobalConfig
- TsSM4 依赖 base64js用于 Base64 编解码)
```mermaid
graph LR
base64js["base64js"] --> SM4["TsSM4"]
GlobalCfg["TsGlobalConfig"] --> Crypto["TsCrypto"]
SM4 --> Crypto
Crypto --> HttpUtil["TsHttpUtil"]
Storage["TsStorage"] --> HttpUtil
Common["TsCommon"] --> HttpUtil
```
图表来源
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [TsHttpUtil.js:1-5](file://src/https/TsHttpUtil.js#L1-L5)
章节来源
- [package.json:19-22](file://package.json#L19-L22)
## 性能考量
- 模式选择
- ECB每块独立加密适合无状态、可并行处理的场景但相同明文块会产生相同密文块易受统计分析攻击
- CBC引入链式传播相同明文块不会产生相同密文块更安全但需 16 字节 IV且加密过程串行
- 输出类型
- Base64 输出便于网络传输与日志记录,但会增加约 33% 的体积;文本输出取决于底层编码,通常体积更小
- 填充开销
- PKCS#7 填充会在明文末尾追加若干字节,对小数据影响较小
- 建议
- 优先使用 CBC 模式(若后端支持 IV并在需要时启用 Base64 输出
- 对大体量数据,考虑分块或压缩后再加密,减少网络往返
## 故障排查指南
- 常见错误与定位
- “密钥长度不为 16 字节”:检查 base64Key 是否正确,确保解码后为 16 字节
- “IV 错误”CBC 模式必须提供 16 字节 IV确认传入的 iv 长度与编码
- “输出类型不匹配”:若后端返回非 Base64 内容,需将 cipherType 设置为文本
- “解密失败”:确认使用的密钥与模式一致,且数据未被篡改
- 定位步骤
- 确认全局配置中 base64Key 是否正确设置
- 检查请求体加密开关是否按预期开启
- 核对响应是否标记为加密,以及解密流程是否执行
- 使用最小化复现:仅传递一段固定明文,观察加解密结果一致性
章节来源
- [TsSM4.js:103-105](file://src/utils/TsSM4.js#L103-L105)
- [TsSM4.js:118-121](file://src/utils/TsSM4.js#L118-L121)
- [TsSM4.js:345-347](file://src/utils/TsSM4.js#L345-L347)
- [TsSM4.js:410-412](file://src/utils/TsSM4.js#L410-L412)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsHttpUtil.js:82-88](file://src/https/TsHttpUtil.js#L82-L88)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
## 结论
本项目以 TsSM4 为核心,通过 TsCrypto 封装默认 ECB 模式与 base64Key结合 TsHttpUtil 的请求体加密与响应解密能力,形成一套可配置、可扩展的加密方案。实际部署中应优先采用 CBC 模式并妥善管理 IV 与密钥,确保输出类型与后端一致,并通过全局配置集中管理密钥与前缀等参数。
## 附录
### 加密配置选项与说明
- base64Key
- 作用:作为 SM4 密钥的 Base64 字符串,构造时会被解码为 16 字节密钥
- 长度要求:解码后必须为 16 字节128 位)
- 安全性:应由后端生成并下发,避免硬编码泄露;定期轮换
- 模式选择
- CBC需提供 16 字节 IV更安全推荐用于大多数场景
- ECB无需 IV简单但安全性较低仅在特定场景使用
- 输出类型
- Base64便于网络传输与日志记录
- 文本:体积更小,但需确保后端一致
- IV 要求
- CBC 模式必须提供 16 字节 IVECB 模式可省略
章节来源
- [TsSM4.js:102-156](file://src/utils/TsSM4.js#L102-L156)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
### 不同场景下的配置建议
- 数据传输加密HTTP 请求体)
- 开启请求体加密开关
- 使用 CBC 模式并提供 16 字节 IV若后端支持
- 输出类型建议 Base64
- 存储加密(本地或数据库)
- 若明文为字符串,建议使用 ECB 模式简化处理
- 若存在重复明文块,建议使用 CBC 模式并随机 IV
- 输出类型根据存储介质选择Base64 更通用)
章节来源
- [TsHttpUtil.js:82-88](file://src/https/TsHttpUtil.js#L82-L88)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
### 加密模式切换与注意事项
- 切换方法
- 通过 TsCrypto 构造参数或直接创建 TsSM4 实例指定 mode 与 iv/cipherType
- 注意事项
- CBC 必须提供 16 字节 IVECB 可省略 IV
- 输出类型需与后端保持一致
- 切换模式后需同步后端解密逻辑
章节来源
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
- [TsSM4.js:128-141](file://src/utils/TsSM4.js#L128-L141)
- [TsSM4.js:343-378](file://src/utils/TsSM4.js#L343-L378)
- [TsSM4.js:408-447](file://src/utils/TsSM4.js#L408-L447)
### 最佳实践
- 密钥管理
- 使用强随机生成的 16 字节密钥,避免硬编码
- 通过安全渠道下发 base64Key定期轮换
- 性能优化
- 对小数据优先使用 ECB对大数据优先使用 CBC
- 合理选择输出类型,平衡体积与兼容性
- 安全加固
- CBC 模式务必使用随机 IV
- 对响应数据进行完整性校验(如 HMAC
- 限制日志中输出密文,必要时仅输出摘要
### 加密配置与全局配置的关系与继承机制
- TsCrypto 默认从全局配置读取 base64Key并以 ECB 模式初始化
- TsHttpUtil 通过 GlobalConfig.getConfig 获取 prefix 与 httpParams用于请求拼接与参数注入
- setConfig 可合并默认配置,实现运行时动态调整
章节来源
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsHttpUtil.js:72-74](file://src/https/TsHttpUtil.js#L72-L74)
### 测试方法与验证步骤
- 单元测试(建议)
- 使用固定明文与密钥,验证加解密一致性
- 分别测试 ECB 与 CBC 模式,确保 IV 正确性
- 验证 Base64 与文本输出类型的互操作
- 端到端测试(建议)
- 通过 HTTP 工具发起请求,开启请求体加密,验证响应解密
- 模拟后端响应标记为加密,验证解密流程
- 日志与监控
- 记录关键配置项模式、输出类型、IV 是否提供)
- 对异常进行捕获与上报
章节来源
- [README.md:12-26](file://README.md#L12-L26)
- [TsHttpUtil.js:82-88](file://src/https/TsHttpUtil.js#L82-L88)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)

View File

@@ -0,0 +1,545 @@
# 存储配置
<cite>
**本文档引用的文件**
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南专注于 TsStorage 模块的存储配置,这是一个基于 localStorage 的轻量级存储解决方案。该模块提供了完整的数据持久化功能,包括基础存储操作、用户令牌管理、数据加密以及全局配置管理。通过本文档,您将了解如何正确配置和使用存储功能,包括存储前缀、加密开关、存储策略等关键配置选项。
## 项目结构
该项目采用模块化设计,主要包含以下核心文件:
```mermaid
graph TB
subgraph "核心模块"
A[index.js<br/>主入口文件]
B[TsStorage.js<br/>存储模块]
C[TsCrypto.js<br/>加密模块]
D[TsSM4.js<br/>SM4算法实现]
E[TsGlobalConfig.js<br/>全局配置]
F[TsCommon.js<br/>通用工具]
end
subgraph "外部依赖"
G[base64-js<br/>Base64编码]
H[umi-request<br/>HTTP请求]
end
A --> B
A --> C
A --> D
A --> E
A --> F
C --> D
C --> E
B --> F
D --> G
A --> H
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
### TsStorage 模块
TsStorage 是整个存储系统的核心模块,提供了以下主要功能:
- **基础存储操作**:提供通用的保存和获取方法
- **用户令牌管理**:专门处理用户认证令牌的存储
- **加密开关控制**:支持启用或禁用数据加密功能
- **数据序列化**:自动处理 JSON 序列化和反序列化
### TsCrypto 模块
负责数据加密和解密的核心模块,基于 SM4 算法实现:
- **SM4 加密算法**:实现中国国家密码标准的 SM4 对称加密
- **密钥管理**:从全局配置中获取和管理加密密钥
- **模式支持**:支持 ECB 和 CBC 两种加密模式
### TsSM4 模块
SM4 算法的具体实现,包含完整的加密和解密逻辑:
- **算法实现**:完整的 SM4 加密算法实现
- **填充机制**:支持 PKCS7 填充标准
- **多种输出格式**:支持 Base64 和文本两种输出格式
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 架构概览
存储系统的整体架构采用分层设计,确保了功能的模块化和可维护性:
```mermaid
graph TD
subgraph "应用层"
App[应用程序]
end
subgraph "存储接口层"
Storage[Storage 接口]
Crypto[Crypto 接口]
end
subgraph "业务逻辑层"
Token[用户令牌管理]
Config[配置管理]
Utils[通用工具]
end
subgraph "数据访问层"
LocalStorage[localStorage]
Memory[内存缓存]
end
App --> Storage
App --> Crypto
Storage --> Token
Storage --> Config
Storage --> Utils
Crypto --> SM4
Utils --> LocalStorage
Storage --> LocalStorage
Crypto --> Memory
```
**图表来源**
- [TsStorage.js:26-43](file://src/utils/TsStorage.js#L26-L43)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 详细组件分析
### 存储配置选项详解
#### 基础存储配置
TsStorage 模块提供了灵活的基础存储配置选项:
**数据序列化配置**
- 自动 JSON 序列化:所有存储的数据都会被自动转换为 JSON 字符串
- 安全反序列化:使用安全的 JSON 解析机制,避免异常导致的应用崩溃
- 默认值处理:支持为不存在的键提供默认值
**存储策略配置**
- 键值映射:每个存储项都以键值对的形式保存在 localStorage 中
- 数据包装:内部使用 `{data: value}` 的包装格式存储原始数据
- 类型保持:通过 JSON 序列化保持数据类型信息
#### 加密存储配置
**加密开关配置**
- `saveEncryptBody(bool)`:设置是否启用数据加密
- `getEncryptBody()`:获取当前加密状态
- 默认启用:加密功能默认处于启用状态
**加密算法配置**
- SM4 算法:采用中国国家密码标准的对称加密算法
- ECB 模式:默认使用 ECB 模式进行加密
- Base64 输出:加密结果以 Base64 格式存储
**密钥配置**
- 全局密钥管理:密钥从全局配置中获取
- Base64 编码:密钥以 Base64 格式存储和传输
- 配置覆盖:支持运行时动态修改密钥
#### 用户令牌配置
**令牌存储配置**
- 专用令牌键:使用固定的 'token' 键存储用户令牌
- 自动序列化:令牌数据自动进行 JSON 序列化
- 空值处理:未找到令牌时返回空字符串
**令牌管理策略**
- 单一令牌模型:系统只支持单一用户令牌
- 简化接口:提供简化的 get/set 方法
- 安全存储:令牌数据同样遵循加密配置
**章节来源**
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
- [TsCrypto.js:7-13](file://src/utils/TsCrypto.js#L7-L13)
### 存储场景配置建议
#### 用户会话存储
**配置策略**
- 启用加密:用户会话数据包含敏感信息,必须启用加密
- 设置过期时间:结合业务需求设置合理的过期时间
- 清理策略:定期清理过期的会话数据
**实现示例**
```javascript
// 启用加密存储
Storage.saveEncryptBody(true);
// 存储用户令牌
Storage.saveUserToken(token);
// 获取用户令牌
const token = Storage.getUserToken();
```
#### 应用状态存储
**配置策略**
- 非敏感数据:非敏感的应用状态可以不启用加密
- 性能优化:对于大量数据的存储,考虑启用加密可能影响性能
- 数据压缩:对于大体量数据,考虑先压缩再存储
**实现示例**
```javascript
// 根据数据敏感性选择加密
if (isSensitiveData) {
Storage.saveEncryptBody(true);
} else {
Storage.saveEncryptBody(false);
}
// 存储应用配置
Storage.save('appConfig', configData);
```
#### 临时数据存储
**配置策略**
- 短期存储:临时数据适合短期存储,不需要长期保留
- 自动清理:设置合理的过期时间,避免占用过多存储空间
- 批量清理:定期清理过期的临时数据
**章节来源**
- [TsStorage.js:47-54](file://src/utils/TsStorage.js#L47-L54)
### 存储容量限制和清理策略
#### 容量限制
**localStorage 限制**
- 浏览器限制:每个域名下通常有 5-10MB 的存储限制
- 平台差异:不同浏览器的限制可能有所不同
- 存储检查:需要定期检查存储使用情况
**容量监控**
- 使用率计算:监控已用空间与总容量的比例
- 预警机制:当使用率达到一定阈值时发出警告
- 自动清理:超过阈值时自动清理过期数据
#### 清理策略
**定时清理**
- 周期性清理:定期执行清理任务,删除过期数据
- 条件清理:根据存储使用情况触发清理
- 批量清理:一次性清理多个过期项目
**智能清理**
- 优先级清理:优先清理低优先级的过期数据
- 空间回收:清理后释放存储空间
- 性能优化:清理过程不影响正常的数据访问
**章节来源**
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
### 加密存储配置方法和性能影响
#### 加密配置方法
**基本加密配置**
```javascript
// 创建加密实例
const crypto = new TsCrypto();
// 加密数据
const encrypted = crypto.encrypt("敏感数据");
// 解密数据
const decrypted = crypto.decrypt(encrypted);
```
**高级配置选项**
- 模式选择ECB 或 CBC 模式的选择
- 输出格式Base64 或文本格式的输出
- IV 参数CBC 模式的初始化向量配置
#### 性能影响分析
**CPU 开销**
- 加密开销:加密操作需要额外的 CPU 时间
- 解密开销:解密操作同样消耗 CPU 资源
- 批量处理:批量处理数据时的性能考虑
**内存使用**
- 内存占用:加密算法需要额外的内存空间
- 数据复制:加密过程中可能产生数据副本
- 缓存策略:合理使用缓存减少重复计算
**I/O 影响**
- 序列化成本JSON 序列化和反序列化的影响
- 存储效率:加密后的数据大小变化
- 网络传输:加密数据在网络传输中的影响
**章节来源**
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
### 存储配置的安全考虑和最佳实践
#### 安全配置
**密钥管理**
- 密钥强度:确保密钥具有足够的随机性和长度
- 密钥轮换:定期更换加密密钥
- 安全存储:密钥的存储和传输要确保安全
**数据保护**
- 敏感数据:识别和保护敏感数据
- 访问控制:限制对敏感数据的访问权限
- 审计日志:记录重要的数据访问和修改操作
**传输安全**
- HTTPS 传输:确保数据在传输过程中的安全
- 中间人攻击:防范中间人攻击和数据篡改
- 会话管理:安全的会话管理和令牌处理
#### 最佳实践
**配置最佳实践**
- 最小权限原则:只授予必要的存储权限
- 数据最小化:只存储必要的数据
- 及时清理:及时清理不再需要的数据
**性能最佳实践**
- 异步操作:使用异步方式处理存储操作
- 批量处理:批量处理多个存储请求
- 缓存策略:合理使用缓存提高性能
**错误处理最佳实践**
- 异常捕获:妥善处理存储操作中的异常
- 降级策略:在存储失败时提供降级方案
- 用户提示:向用户提供清晰的错误信息
**章节来源**
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsCrypto.js:8-12](file://src/utils/TsCrypto.js#L8-L12)
### 存储配置的迁移和备份策略
#### 迁移策略
**版本兼容性**
- 数据格式升级:确保新版本能够读取旧版本的数据
- 渐进式迁移:逐步将旧数据迁移到新格式
- 回滚机制:提供数据迁移失败时的回滚方案
**配置迁移**
- 配置项更新:处理配置项的新增、删除和重命名
- 默认值处理:为新配置项设置合理的默认值
- 兼容性测试:确保迁移过程不影响现有功能
#### 备份策略
**数据备份**
- 定期备份:建立定期备份机制
- 多点备份:在多个位置保存备份数据
- 自动恢复:提供自动数据恢复功能
**配置备份**
- 配置导出:支持配置的导出和导入
- 版本管理:管理配置的不同版本
- 快速恢复:提供快速恢复到之前配置的能力
**章节来源**
- [TsStorage.js:26-43](file://src/utils/TsStorage.js#L26-L43)
- [TsGlobalConfig.js:27-29](file://src/utils/TsGlobalConfig.js#L27-L29)
### 存储配置的调试和监控方法
#### 调试方法
**存储调试**
- 数据验证:验证存储的数据是否正确
- 格式检查:检查数据的格式是否符合预期
- 性能监控:监控存储操作的性能指标
**加密调试**
- 加密验证:验证加密和解密过程的正确性
- 密钥检查:确认使用的密钥是否正确
- 算法验证:验证加密算法的实现是否正确
#### 监控方法
**性能监控**
- 响应时间:监控存储操作的响应时间
- 错误率:统计存储操作的错误率
- 资源使用:监控存储相关的资源使用情况
**健康监控**
- 存储状态:监控存储系统的健康状态
- 数据完整性:检查数据的完整性和一致性
- 安全监控:监控存储相关的安全事件
**章节来源**
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
## 依赖关系分析
存储系统的依赖关系相对简单,主要依赖于几个核心模块:
```mermaid
graph LR
subgraph "直接依赖"
A[TsStorage.js]
B[TsCrypto.js]
C[TsSM4.js]
D[TsCommon.js]
end
subgraph "外部依赖"
E[base64-js]
F[umi-request]
end
subgraph "全局配置"
G[TsGlobalConfig.js]
end
A --> D
B --> C
B --> G
C --> E
A --> G
A --> F
```
**图表来源**
- [TsStorage.js:1](file://src/utils/TsStorage.js#L1)
- [TsCrypto.js:1-3](file://src/utils/TsCrypto.js#L1-L3)
- [TsSM4.js:1](file://src/utils/TsSM4.js#L1)
- [TsGlobalConfig.js:1-3](file://src/utils/TsGlobalConfig.js#L1-L3)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-7](file://index.js#L1-L7)
## 性能考虑
### 存储性能优化
**序列化优化**
- JSON 序列化:使用高效的 JSON 序列化方法
- 数据压缩:对于大数据量考虑压缩存储
- 批量操作:合并多个存储请求减少 I/O 操作
**内存管理**
- 对象复用:复用对象减少内存分配
- 及时释放:及时释放不再使用的对象引用
- 垃圾回收:合理安排垃圾回收时机
**并发处理**
- 异步操作:使用异步方式处理存储操作
- 锁机制:在需要时使用锁机制保证数据一致性
- 队列管理:使用队列管理并发的存储请求
### 加密性能优化
**算法优化**
- 缓存密钥:缓存加密密钥避免重复计算
- 批量加密:批量处理多个数据项
- 异步加密:使用异步方式处理加密操作
**资源配置**
- 线程池:合理配置加密操作的线程池
- 内存池:使用内存池减少内存分配开销
- 缓存策略:合理使用缓存提高加密性能
## 故障排除指南
### 常见问题诊断
**存储失败**
- 检查浏览器兼容性:确认目标浏览器支持 localStorage
- 验证存储空间:检查是否有足够的存储空间
- 检查权限设置:确认应用有足够的存储权限
**数据损坏**
- 验证数据格式:检查存储的数据格式是否正确
- 检查序列化问题:确认 JSON 序列化和反序列化正常
- 处理异常数据:对异常数据进行特殊处理
**加密问题**
- 密钥验证:确认使用的密钥是否正确
- 算法兼容性:检查加密算法的兼容性
- 性能问题:监控加密操作的性能表现
### 调试技巧
**日志记录**
- 关键操作日志:记录重要的存储操作
- 错误日志:详细记录存储操作中的错误
- 性能日志:记录存储操作的性能指标
**监控工具**
- 浏览器开发者工具:使用开发者工具监控存储操作
- 性能分析器:使用性能分析器分析存储性能
- 日志分析:定期分析存储相关的日志
**章节来源**
- [TsCommon.js:34-44](file://src/utils/TsCommon.js#L34-L44)
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
## 结论
TsStorage 模块提供了一个功能完整、配置灵活的存储解决方案。通过本文档的详细说明,您可以:
1. **正确配置存储选项**:理解存储前缀、加密开关和存储策略的配置方法
2. **优化存储性能**:掌握性能优化的最佳实践和注意事项
3. **确保存储安全**:实施有效的安全措施和最佳实践
4. **制定迁移策略**:规划数据迁移和备份的完整方案
5. **有效调试监控**:建立完善的调试和监控体系
该模块的设计充分考虑了实际应用场景的需求,在保证功能完整性的同时,也注重了性能和安全性的平衡。通过合理配置和使用,可以满足大多数应用的存储需求。
## 附录
### 配置参考表
| 配置项 | 类型 | 默认值 | 描述 |
|--------|------|--------|------|
| base64Key | string | WmdUzPJXbngVNiaSsQrihg== | 加密密钥Base64编码 |
| prefix | string | "" | 存储键前缀 |
| encrypt_body | boolean | true | 是否启用数据加密 |
| token | string | "" | 用户令牌存储 |
### 使用示例路径
- [基础存储操作:31-43](file://src/utils/TsStorage.js#L31-L43)
- [用户令牌管理:9-15](file://src/utils/TsStorage.js#L9-L15)
- [加密开关配置:17-23](file://src/utils/TsStorage.js#L17-L23)
- [全局配置管理:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)

View File

@@ -0,0 +1,695 @@
# 配置指南
<cite>
**本文档引用的文件**
- [package.json](file://package.json)
- [README.md](file://README.md)
- [index.js](file://index.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心配置组件](#核心配置组件)
4. [架构概览](#架构概览)
5. [详细配置分析](#详细配置分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
npm-tool 是一个基于 Node.js 的工具包,提供了网络请求、数据加密、存储管理和通用工具等功能。该工具包的核心特性包括:
- **全局配置管理**:支持通过 window 对象进行全局配置
- **数据加密功能**:基于 SM4 算法的端到端数据加密
- **HTTP 请求封装**:基于 umi-request 的网络请求工具
- **本地存储管理**:提供用户令牌和加密开关的持久化存储
- **环境适配**:支持开发和生产环境的差异化配置
## 项目结构
该项目采用模块化的文件组织方式,主要分为以下几个核心目录:
```mermaid
graph TB
subgraph "项目根目录"
PJSON[package.json]
README[README.md]
INDEX[index.js]
end
subgraph "源代码目录 (src/)"
HTTPS[https/]
UTILS[utils/]
end
subgraph "HTTPS 模块"
HTTP[TsHttpUtil.js]
end
subgraph "工具模块"
COMMON[TsCommon.js]
CRYPTO[TsCrypto.js]
GLOBAL[TsGlobalConfig.js]
SM4[TsSM4.js]
STORAGE[TsStorage.js]
end
INDEX --> HTTP
INDEX --> COMMON
INDEX --> CRYPTO
INDEX --> GLOBAL
INDEX --> SM4
INDEX --> STORAGE
HTTP --> STORAGE
HTTP --> COMMON
HTTP --> CRYPTO
HTTP --> GLOBAL
CRYPTO --> GLOBAL
CRYPTO --> SM4
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [package.json:1-24](file://package.json#L1-L24)
- [index.js:1-16](file://index.js#L1-L16)
## 核心配置组件
### 全局配置系统
全局配置系统是整个工具包的核心配置中心,提供了统一的配置管理和覆盖机制。
#### 配置结构定义
全局配置包含以下核心参数:
| 配置项 | 类型 | 默认值 | 描述 |
|--------|------|--------|------|
| `base64Key` | String | `"WmdUzPJXbngVNiaSsQrihg=="` | SM4 加密算法的基础密钥 |
| `prefix` | String/Function | `""` | API 请求前缀,可为字符串或函数 |
| `onHttpError` | Function | `() => {}` | HTTP 错误回调处理器 |
| `httpParams` | Function | `() => {}` | 额外 HTTP 参数生成器 |
#### 配置优先级机制
```mermaid
flowchart TD
A[应用启动] --> B[加载默认配置]
B --> C[检查 window.httpConfig]
C --> D{存在自定义配置?}
D --> |是| E[合并自定义配置]
D --> |否| F[使用默认配置]
E --> G[最终配置生效]
F --> G
G --> H[配置缓存]
subgraph "配置合并过程"
I[源配置] --> J[用户配置]
J --> K[深度合并]
K --> L[优先级: 用户配置 > 默认配置]
end
```
**图表来源**
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
#### 配置设置方法
配置可以通过以下方式设置:
1. **直接调用 setConfig 方法**
2. **通过 window 对象直接赋值**
3. **在应用初始化时进行批量配置**
**章节来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### 加密配置系统
加密系统基于 SM4 对称加密算法,提供了端到端的数据保护机制。
#### 加密配置参数
| 参数 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `keyBuffer` | Uint8Array | 是 | 16 字节的密钥缓冲区 |
| `mode` | String | 否 | 加密模式 (`cbc``ecb`) |
| `cipherType` | String | 否 | 输出类型 (`base64``text`) |
#### 加密流程图
```mermaid
flowchart TD
A[输入明文数据] --> B[JSON 序列化]
B --> C[字节缓冲区转换]
C --> D[数据填充 (PKCS7)]
D --> E{加密模式选择}
E --> |CBC 模式| F[CBC 加密流程]
E --> |ECB 模式| G[ECB 加密流程]
F --> H[初始向量处理]
H --> I[块级加密]
I --> J[输出 Base64]
G --> K[块级独立加密]
K --> J
J --> L[返回加密结果]
```
**图表来源**
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
### HTTP 请求配置
HTTP 请求配置提供了灵活的网络请求参数管理,支持多种配置场景。
#### HTTP 配置参数
| 参数 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `credentials` | String | `"include"` | Cookie 传输策略 |
| `requestType` | String | `"json"` | 请求数据类型 |
| `headers` | Object | `{}` | 自定义请求头 |
| `params` | Object | `{}` | GET 请求参数 |
| `data` | Object | `{}` | POST 请求数据 |
#### 请求处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as HTTP 工具
participant Crypto as 加密模块
participant Storage as 存储模块
participant Server as 服务器
Client->>HttpUtil : 发送请求
HttpUtil->>HttpUtil : 处理参数
HttpUtil->>Storage : 获取用户令牌
Storage-->>HttpUtil : 返回令牌
alt 需要加密
HttpUtil->>Crypto : 加密请求数据
Crypto-->>HttpUtil : 返回加密数据
end
HttpUtil->>Server : 发送 HTTP 请求
Server-->>HttpUtil : 返回响应
HttpUtil->>HttpUtil : 处理响应
alt 响应需要解密
HttpUtil->>Crypto : 解密响应数据
Crypto-->>HttpUtil : 返回明文数据
end
HttpUtil-->>Client : 返回处理后的结果
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构概览
### 整体架构设计
```mermaid
graph TB
subgraph "应用层"
APP[业务应用]
end
subgraph "配置管理层"
GC[全局配置]
SC[存储配置]
end
subgraph "核心服务层"
HC[HTTP 客户端]
EC[加密引擎]
ST[存储服务]
end
subgraph "工具层"
CM[通用工具]
SM[SM4 实现]
end
subgraph "外部依赖"
UR[umi-request]
B64[base64-js]
end
APP --> GC
APP --> HC
APP --> EC
APP --> ST
GC --> UR
HC --> UR
HC --> EC
HC --> ST
EC --> SM
EC --> B64
ST --> CM
GC --> CM
```
**图表来源**
- [index.js:8-15](file://index.js#L8-L15)
- [package.json:19-22](file://package.json#L19-L22)
### 组件交互关系
```mermaid
classDiagram
class TsGlobalConfig {
+defaultConfig : Object
+getConfig() : Object
+setConfig(obj) : void
}
class TsCrypto {
-sm4 : TsSM4
+encrypt(content) : String
+decrypt(base64) : String
}
class TsHttpUtil {
+req(url, options) : Promise
+get(url, params, options) : Promise
+post(url, data, options) : Promise
+form(url, data, options) : Promise
}
class TsSM4 {
+encrypt(plaintext) : String
+decrypt(ciphertext) : String
}
class TsStorage {
+save(key, value) : void
+get(key, def) : any
+getUserToken() : String
+saveEncryptBody(bool) : void
}
TsHttpUtil --> TsCrypto : 使用
TsHttpUtil --> TsStorage : 读取
TsHttpUtil --> TsGlobalConfig : 读取
TsCrypto --> TsSM4 : 依赖
TsCrypto --> TsGlobalConfig : 读取密钥
```
**图表来源**
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
- [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34)
- [TsHttpUtil.js:168-171](file://src/https/TsHttpUtil.js#L168-L171)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsStorage.js:47-55](file://src/utils/TsStorage.js#L47-L55)
## 详细配置分析
### 开发环境配置
开发环境推荐配置方案:
#### 基础开发配置
```javascript
// 开发环境基础配置
const devConfig = {
base64Key: "WmdUzPJXbngVNiaSsQrihg==", // 开发环境密钥
prefix: "http://localhost:8080/api", // 开发服务器地址
onHttpError: (res) => {
console.error("开发环境错误:", res);
},
httpParams: () => ({
debug: true,
version: "dev"
})
};
```
#### 加密配置建议
```javascript
// 开发环境加密配置
const devEncryption = {
encryptBody: false, // 开发阶段关闭加密便于调试
encryptResponse: false
};
```
### 生产环境配置
生产环境配置需要更加严格的安全控制:
#### 安全生产配置
```javascript
// 生产环境安全配置
const prodConfig = {
base64Key: process.env.ENCRYPTION_KEY, // 从环境变量读取
prefix: (url) => {
// 动态前缀根据域名判断
if (window.location.hostname.includes('staging')) {
return 'https://staging-api.example.com';
}
return 'https://api.example.com';
},
onHttpError: (res) => {
// 生产环境错误上报
this.reportError(res);
},
httpParams: () => ({
timestamp: Date.now(),
nonce: Math.random().toString(36).substr(2, 9)
})
};
```
#### 加密配置要求
```javascript
// 生产环境强制加密
const prodEncryption = {
encryptBody: true, // 必须启用请求加密
encryptResponse: true, // 必须启用响应解密
encryptionLevel: "high" // 高强度加密
};
```
### 不同使用场景的配置示例
#### 移动端应用配置
```javascript
// 移动端配置优化
const mobileConfig = {
// 移动端网络优化
timeout: 10000, // 10秒超时
retry: 2, // 重试2次
cache: false, // 禁用缓存
// 移动端安全配置
base64Key: process.env.MOBILE_ENCRYPTION_KEY,
encryptBody: true,
// 移动端特殊处理
httpParams: () => ({
platform: "mobile",
appVersion: "1.0.0",
deviceInfo: navigator.userAgent
})
};
```
#### 微服务架构配置
```javascript
// 微服务架构配置
const microserviceConfig = {
// 服务发现集成
prefix: (url) => {
const serviceMap = {
"user": "https://user-service/api",
"order": "https://order-service/api",
"product": "https://product-service/api"
};
const service = Object.keys(serviceMap).find(key => url.includes(key));
return service ? serviceMap[service] : serviceMap.default;
},
// 微服务特定配置
onHttpError: (res) => {
if (res.code === 503) {
// 服务不可用,切换到备用服务
this.switchToBackupService();
}
},
httpParams: () => ({
traceId: this.generateTraceId(),
correlationId: this.generateCorrelationId()
})
};
```
### 配置验证和调试方法
#### 配置验证流程
```mermaid
flowchart TD
A[配置输入] --> B[基本格式验证]
B --> C{格式正确?}
C --> |否| D[返回格式错误]
C --> |是| E[参数完整性检查]
E --> F{参数完整?}
F --> |否| G[返回缺失参数]
F --> |是| H[功能可用性测试]
H --> I{功能正常?}
I --> |否| J[返回功能错误]
I --> |是| K[配置验证通过]
subgraph "验证步骤"
L[检查必填参数]
M[验证参数类型]
N[测试加密功能]
O[测试网络连接]
end
```
#### 调试配置选项
```javascript
// 调试模式配置
const debugConfig = {
// 开启详细日志
debug: true,
logLevel: "verbose",
// 开发辅助功能
enableMock: true,
mockDelay: 1000,
// 错误监控
onError: (error) => {
console.error("配置错误详情:", {
error: error.message,
config: error.config,
stack: error.stack
});
}
};
```
**章节来源**
- [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
## 依赖关系分析
### 外部依赖管理
项目依赖关系清晰明确,主要依赖包括:
```mermaid
graph LR
subgraph "核心依赖"
UMI[umi-request@1.4.0]
B64[base64-js@1.5.1]
end
subgraph "内部模块"
HTTP[TsHttpUtil]
CRYPTO[TsCrypto]
GLOBAL[TsGlobalConfig]
SM4[TsSM4]
STORAGE[TsStorage]
COMMON[TsCommon]
end
HTTP --> UMI
CRYPTO --> B64
CRYPTO --> SM4
HTTP --> CRYPTO
HTTP --> STORAGE
HTTP --> GLOBAL
HTTP --> COMMON
GLOBAL --> COMMON
STORAGE --> COMMON
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-6](file://index.js#L1-L6)
### 内部模块依赖
内部模块之间的依赖关系遵循单一职责原则:
| 模块 | 依赖模块 | 用途 |
|------|----------|------|
| TsHttpUtil | TsCrypto, TsStorage, TsGlobalConfig, TsCommon | HTTP 请求处理 |
| TsCrypto | TsSM4, TsGlobalConfig | 数据加密解密 |
| TsStorage | TsCommon | 本地存储管理 |
| TsGlobalConfig | TsCommon | 全局配置管理 |
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 加密性能优化
加密操作是影响性能的关键因素,需要考虑以下优化策略:
#### 加密性能指标
| 操作类型 | 处理时间 | 内存占用 | 推荐场景 |
|----------|----------|----------|----------|
| 小数据加密 (<1KB) | <1ms | <1KB | API 请求 |
| 中等数据加密 (1-10KB) | 1-5ms | 1-10KB | 文件上传 |
| 大数据加密 (>10KB) | 5-50ms | 10-50KB | 批量数据 |
#### 性能优化建议
1. **延迟加密**:仅对敏感数据进行加密
2. **批量处理**:合并多个小请求为批量请求
3. **缓存策略**:对不敏感数据使用缓存
4. **异步处理**:在后台线程中执行加密操作
### 网络请求优化
#### 请求优化策略
```javascript
// 性能优化配置示例
const performanceConfig = {
// 连接池管理
maxConnections: 10,
connectionTimeout: 5000,
// 缓存策略
cacheStrategy: "smart", // 智能缓存
cacheTTL: 300000, // 5分钟缓存
// 压缩配置
enableCompression: true,
compressionThreshold: 1024,
// 超时配置
requestTimeout: 10000,
retryTimeout: 2000,
// 重试策略
maxRetries: 3,
retryBackoff: "exponential"
};
```
## 故障排除指南
### 常见配置问题
#### 加密相关问题
| 问题类型 | 症状 | 解决方案 |
|----------|------|----------|
| 密钥不匹配 | 加密失败,抛出异常 | 检查 base64Key 配置 |
| IV 配置错误 | CBC 模式加密异常 | 确认 IV 参数正确设置 |
| 模式不兼容 | 加密/解密失败 | 确保加密和解密使用相同模式 |
#### HTTP 请求问题
| 问题类型 | 症状 | 解决方案 |
|----------|------|----------|
| 跨域问题 | CORS 错误 | 配置正确的 CORS 头 |
| 超时问题 | 请求超时 | 调整 timeout 参数 |
| 认证失败 | 401 错误 | 检查用户令牌配置 |
#### 存储相关问题
| 问题类型 | 症状 | 解决方案 |
|----------|------|----------|
| 存储失败 | 无法保存数据 | 检查浏览器存储权限 |
| 数据丢失 | 重启后数据消失 | 确认使用 localStorage |
| 格式错误 | JSON 解析失败 | 检查数据序列化 |
### 调试工具和方法
#### 配置调试接口
```javascript
// 配置状态检查
const checkConfigStatus = () => {
return {
globalConfig: TsGlobalConfig.getConfig(),
encryptionEnabled: TsStorage.getEncryptBody(),
userToken: TsStorage.getUserToken(),
storageAvailable: typeof localStorage !== 'undefined'
};
};
// 加密功能测试
const testEncryption = (testData) => {
try {
const encrypted = TsCrypto.encrypt(testData);
const decrypted = TsCrypto.decrypt(encrypted);
return {
success: testData === decrypted,
original: testData,
encrypted: encrypted,
decrypted: decrypted
};
} catch (error) {
return {
success: false,
error: error.message
};
}
};
```
#### 日志记录配置
```javascript
// 详细日志配置
const loggingConfig = {
enableDebugLogs: true,
logLevels: ["error", "warn", "info", "debug"],
logToFile: false,
logToConsole: true,
maxLogSize: 10485760, // 10MB
retentionDays: 7
};
```
**章节来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsStorage.js:47-55](file://src/utils/TsStorage.js#L47-L55)
## 结论
npm-tool 工具包提供了完整的配置管理解决方案,具有以下特点:
### 主要优势
1. **灵活的配置系统**:支持多层级配置和动态覆盖
2. **强大的加密能力**:基于 SM4 算法的安全数据传输
3. **完善的错误处理**:全面的异常捕获和错误恢复机制
4. **环境适配性强**:支持开发、测试、生产多环境部署
### 最佳实践建议
1. **生产环境必须启用加密**:确保数据传输安全
2. **合理配置超时参数**:平衡用户体验和系统性能
3. **实施适当的缓存策略**:提升应用响应速度
4. **建立完善的监控体系**:及时发现和解决问题
### 安全考虑
1. **密钥安全管理**:使用环境变量存储敏感配置
2. **传输安全**:确保所有数据通过 HTTPS 传输
3. **访问控制**:实施严格的权限验证机制
4. **审计日志**:记录重要的配置变更和访问行为
通过遵循本指南提供的配置最佳实践,可以确保 npm-tool 工具包在各种使用场景下都能稳定、安全地运行。

View File

@@ -0,0 +1,417 @@
# 项目概述
<cite>
**本文档引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [项目简介](#项目简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [技术栈与依赖](#技术栈与依赖)
7. [设计理念与架构原则](#设计理念与架构原则)
8. [应用场景与使用示例](#应用场景与使用示例)
9. [性能考虑](#性能考虑)
10. [总结](#总结)
## 项目简介
npm-tool 是一个专为前端开发设计的综合性工具包,由铁晟科技开发和维护。该项目旨在为前端开发者提供一套统一、可靠且功能丰富的工具集,涵盖网络请求、数据加密、本地存储、通用工具方法等多个方面。
### 项目目标
- **统一工具标准化**:提供一套标准化的前端工具函数,减少重复开发工作
- **安全数据传输**内置SM4对称加密算法确保数据传输安全
- **简化开发流程**:通过封装常用功能,提升开发效率
- **企业级应用支持**:针对企业级应用场景进行优化和扩展
### 核心价值
1. **易用性**简洁的API设计降低学习成本
2. **可靠性**:经过企业级项目验证的稳定实现
3. **安全性**:内置加密机制,保障数据安全
4. **可扩展性**:模块化设计,便于功能扩展
## 项目结构
项目采用模块化的目录结构,按照功能领域进行组织:
```mermaid
graph TB
subgraph "项目根目录"
A[index.js] --> B[src/]
A --> C[package.json]
A --> D[README.md]
end
subgraph "src/ 源码目录"
B --> E[utils/]
B --> F[https/]
E --> G[TsCommon.js]
E --> H[TsCrypto.js]
E --> I[TsStorage.js]
E --> J[TsGlobalConfig.js]
E --> K[TsSM4.js]
F --> L[TsHttpUtil.js]
end
subgraph "构建入口"
M[package.json] --> N[main: index.js]
N --> O[模块导出]
end
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
npm-tool 项目包含六个核心模块,每个模块都针对特定的功能领域:
### 主要模块概览
| 模块名称 | 功能描述 | 导出方式 |
|---------|----------|----------|
| TsHttpUtil | HTTP网络请求封装 | 网络请求、数据传输 |
| TsCommon | 通用工具方法 | 数据处理、字符串操作 |
| TsStorage | 本地存储管理 | 数据持久化、状态管理 |
| TsSM4 | SM4加密算法实现 | 对称加密、数据保护 |
| TsCrypto | 加密工具类 | 统一加密接口 |
| TsGlobalConfig | 全局配置管理 | 应用配置、参数设置 |
**章节来源**
- [index.js:8-15](file://index.js#L8-L15)
## 架构概览
项目采用分层架构设计,各模块之间通过清晰的接口进行交互:
```mermaid
graph TD
subgraph "应用层"
APP[业务应用]
end
subgraph "工具层"
HTTP[TsHttpUtil<br/>HTTP请求]
STORAGE[TsStorage<br/>本地存储]
COMMON[TsCommon<br/>通用工具]
end
subgraph "加密层"
CRYPTO[TsCrypto<br/>加密工具]
SM4[TsSM4<br/>SM4算法]
BASE64[base64-js<br/>编码转换]
end
subgraph "配置层"
GLOBAL[TsGlobalConfig<br/>全局配置]
REQUEST[umi-request<br/>HTTP客户端]
end
subgraph "外部依赖"
EXT1[浏览器环境]
EXT2[Node.js环境]
end
APP --> HTTP
APP --> STORAGE
APP --> COMMON
HTTP --> STORAGE
HTTP --> CRYPTO
HTTP --> GLOBAL
HTTP --> REQUEST
CRYPTO --> SM4
CRYPTO --> BASE64
STORAGE --> COMMON
STORAGE --> EXT1
SM4 --> BASE64
SM4 --> EXT2
GLOBAL --> EXT1
REQUEST --> EXT1
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
## 详细组件分析
### TsHttpUtil - HTTP请求封装
TsHttpUtil 是项目的核心模块提供了完整的HTTP请求解决方案
#### 核心功能特性
```mermaid
sequenceDiagram
participant Client as 客户端应用
participant HttpUtil as TsHttpUtil
participant Crypto as TsCrypto
participant Storage as TsStorage
participant Request as umi-request
Client->>HttpUtil : 发送请求
HttpUtil->>Storage : 获取用户token
Storage-->>HttpUtil : 返回token
HttpUtil->>HttpUtil : 处理请求参数
HttpUtil->>Crypto : 加密数据(可选)
Crypto-->>HttpUtil : 返回加密结果
HttpUtil->>Request : 发送HTTP请求
Request-->>HttpUtil : 返回响应
HttpUtil->>Crypto : 解密响应(可选)
Crypto-->>HttpUtil : 返回解密结果
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
#### 支持的请求类型
| 请求方法 | 参数类型 | 使用场景 |
|---------|----------|----------|
| GET | params | 查询数据、获取列表 |
| POST | data | 提交表单、新增数据 |
| POST(form) | data | 表单提交、文件上传 |
**章节来源**
- [TsHttpUtil.js:142-165](file://src/https/TsHttpUtil.js#L142-L165)
### TsStorage - 本地存储管理
TsStorage 提供了简化的本地存储接口,支持对象序列化和类型转换:
#### 存储策略
```mermaid
flowchart TD
A[存储请求] --> B{数据类型}
B --> |对象| C[JSON序列化]
B --> |字符串| D[直接存储]
B --> |数字| E[转换为字符串]
C --> F[localStorage.setItem]
D --> F
E --> F
F --> G[数据读取]
G --> H{数据格式}
H --> |JSON| I[JSON反序列化]
H --> |其他| J[原样返回]
I --> K[返回原始对象]
J --> K
```
**图表来源**
- [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43)
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### TsSM4 - SM4加密算法
TsSM4 实现了国家商用密码标准的SM4对称加密算法
#### 加密模式支持
| 模式 | 特点 | 适用场景 |
|------|------|----------|
| CBC | 链式加密,安全性高 | 数据传输加密 |
| ECB | 简单加密,性能好 | 小数据快速加密 |
**章节来源**
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
### TsCommon - 通用工具方法
TsCommon 提供了常用的JavaScript工具函数
#### 核心工具函数
| 函数名 | 功能描述 | 使用场景 |
|--------|----------|----------|
| isEmpty | 检查值是否为空 | 表单验证、数据校验 |
| parseJSON | 安全解析JSON | API响应处理 |
| getParamFormUrl | 获取URL参数 | 路由参数处理 |
| isDevelopment | 检查开发环境 | 条件逻辑判断 |
**章节来源**
- [TsCommon.js:25-97](file://src/utils/TsCommon.js#L25-L97)
## 技术栈与依赖
### 核心依赖
| 依赖包 | 版本 | 用途 | 重要性 |
|--------|------|------|--------|
| base64-js | 1.5.1 | Base64编解码 | 高 |
| umi-request | 1.4.0 | HTTP请求库 | 高 |
| Node.js | >= 12.0.0 | 运行环境 | 基础 |
| 浏览器 | >= IE11 | 前端运行环境 | 基础 |
### 开发依赖
项目目前没有定义专门的开发依赖主要依赖于运行时环境提供的API。
### 兼容性信息
- **Node.js版本**: >= 12.0.0
- **浏览器支持**: IE11+,现代浏览器完全支持
- **ES规范**: ES6+语法支持
- **模块系统**: CommonJS模块系统
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
## 设计理念与架构原则
### 模块化设计原则
1. **单一职责原则**: 每个模块专注于特定功能领域
2. **开放封闭原则**: 对扩展开放,对修改封闭
3. **依赖倒置原则**: 高层模块不依赖低层模块
### 安全性设计
```mermaid
graph LR
subgraph "数据流"
A[明文数据] --> B[加密算法]
B --> C[密文数据]
C --> D[网络传输]
D --> E[接收端]
E --> F[解密算法]
F --> G[明文数据]
end
subgraph "安全措施"
H[密钥管理] --> B
I[随机IV] --> B
J[完整性校验] --> F
end
```
**图表来源**
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:338-452](file://src/utils/TsSM4.js#L338-L452)
### 错误处理机制
项目实现了多层次的错误处理策略:
1. **网络层错误**: 通过umi-request统一处理
2. **业务层错误**: 通过回调函数处理
3. **数据层错误**: 通过try-catch捕获
**章节来源**
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 应用场景与使用示例
### 常见使用场景
#### 1. 网络请求场景
```javascript
// 基础GET请求
const response = await HttpUtil.get('/api/users');
// 带参数的请求
const users = await HttpUtil.get('/api/users', {
params: {page: 1, pageSize: 10}
});
// POST请求
const result = await HttpUtil.post('/api/users', {
name: '张三',
email: 'zhangsan@example.com'
});
```
#### 2. 数据加密场景
```javascript
// 设置全局加密配置
HttpUtil.setConfig({
encryptBody: true,
base64Key: 'your-base64-key-here'
});
// 自动加密的数据传输
const sensitiveData = await HttpUtil.post('/api/secure', {
userId: 123,
token: 'abc-def-ghi'
});
```
#### 3. 本地存储场景
```javascript
// 保存用户信息
Storage.saveUserToken('jwt-token-here');
Storage.save('userInfo', {id: 1, name: '张三'});
// 获取用户信息
const token = Storage.getUserToken();
const userInfo = Storage.get('userInfo', {});
```
### 最佳实践建议
1. **配置管理**: 使用全局配置集中管理应用设置
2. **错误处理**: 为所有异步操作添加适当的错误处理
3. **数据验证**: 在发送请求前验证数据格式
4. **安全考虑**: 敏感数据必须进行加密传输
## 性能考虑
### 优化策略
1. **懒加载**: 按需加载模块,减少初始加载时间
2. **缓存机制**: 合理使用localStorage缓存数据
3. **批量操作**: 对频繁操作进行批处理优化
4. **内存管理**: 及时清理不需要的对象引用
### 性能监控
建议在生产环境中添加以下监控指标:
- 请求响应时间
- 错误率统计
- 缓存命中率
- 内存使用情况
## 总结
npm-tool 项目是一个设计精良、功能完备的前端工具包,具有以下特点:
### 优势总结
1. **功能完整**: 涵盖了前端开发的主要需求场景
2. **设计优雅**: 模块化设计,接口简洁易用
3. **安全可靠**: 内置加密机制,保障数据安全
4. **易于扩展**: 清晰的架构设计,便于功能扩展
### 适用范围
- 企业级Web应用开发
- 中后台管理系统
- 移动端Hybrid应用
- 微信小程序开发
### 发展方向
1. **测试覆盖**: 增加单元测试和集成测试
2. **文档完善**: 提供更详细的API文档
3. **性能优化**: 持续优化性能表现
4. **生态建设**: 扩展更多实用工具模块
该项目为前端开发者提供了一个可靠的工具基础,能够显著提升开发效率和代码质量。

File diff suppressed because one or more lines are too long

140
README.md
View File

@@ -1,42 +1,138 @@
## 工具包
# @tiesheng/npm-tool
### 通用方法类Common.js
> 杭州铁晟前端通用基类工具库,封装了 HTTP 请求、SM4 国密加解密、本地存储、全局配置以及常用工具方法,便于业务项目快速接入。
```js
import {Common} from "@tiesheng/npm-tool";
- **当前版本**2.0.6
- **仓库地址**<https://git.tieshengkeji.com/tieshengkeji/npm-tool>
- **作者**zeng_wenhao
- **License**ISC
Common.isEmpty("tet")
> 📚 本项目已生成完整的 RepoWiki 文档,下文所有章节均可直接跳转到详细文档。完整入口:[`.qoder/repowiki/zh/content`](./.qoder/repowiki/zh/content)
---
## 特性
- 📡 基于 [umi-request](https://github.com/umijs/umi-request) 的统一 HTTP 请求封装,内置错误码映射、分页参数与 `equals` 参数自动处理。
- 🔐 内置 SM4 国密算法加解密ECB 模式base64 输出),请求体可按开关自动加密。
- 🔑 统一 Token 读写与请求头注入。
- 💾 简化的 localStorage 封装,统一以 `{data: value}` 结构存取。
- ⚙️ 全局配置中心,支持 `prefix``base64Key`、统一异常回调、请求额外参数。
- 🧰 常用工具方法URL 参数解析、空值判断、JSON 安全解析、字符串处理等。
## 安装
需先配置公司私有 npm 仓库,再执行:
```bash
npm install @tiesheng/npm-tool
# 或
yarn add @tiesheng/npm-tool
```
### 网络请求类HttpUtil
更多安装与上手细节见 👉 [快速开始](./.qoder/repowiki/zh/content/快速开始.md)。
## 快速开始
```js
import {HttpUtil} from "@tiesheng/npm-tool";
import {
TsHttpUtil,
TsGlobalConfig,
TsStorage,
TsCrypto,
TsCommon,
TsSM4,
} from '@tiesheng/npm-tool';
// 全局配置
HttpUtil.setConfig({
encryptBody: true, // 加密发送数据默认加密秘钥WmdUzPJXbngVNiaSsQrihg==(具体秘钥咨询后台开发人员)
// 1. 初始化全局配置(建议在应用入口处调用一次)
TsGlobalConfig.setConfig({
prefix: '/api', // 请求前缀,也可传函数
base64Key: 'WmdUzPJXbngVNiaSsQrihg==', // SM4 密钥base64
onHttpError: (res) => {
console.error('请求异常:', res.message);
},
httpParams: () => ({
// 每次请求自动追加的额外参数GET 拼到 queryPOST 合并到 body
clientType: 'web',
}),
});
HttpUtil.post("http://localhost:8080",{key:"111",value:"2222"}).then(console.log);
// 这里Promise返回的数据只有data不在包含code等其他字段。
// Hello World!
// 2. 登录后保存 token后续请求会自动带上 token 请求头)
TsStorage.saveUserToken('your-token');
// 3. 发起请求
const { data } = await TsHttpUtil.post('/user/info', { id: 1 });
```
### 存储类Storage
```js
import {Storage} from "@tiesheng/npm-tool";
## 项目概述
// save方法可以直接保存对象
Storage.save("keyVal", {key: 111, val: 2222});
- [项目概述](./.qoder/repowiki/zh/content/项目概述.md)
- [快速开始](./.qoder/repowiki/zh/content/快速开始.md)
let obj = Storage.get("keyVal");
console.log(obj);
## 核心模块
// log
// {key: 111, val: 2222}
> 源码入口:[`index.js`](./index.js),统一导出 `TsHttpUtil / TsCommon / TsStorage / TsSM4 / TsCrypto / TsGlobalConfig`。
| 模块 | 源码 | 文档 |
| --- | --- | --- |
| HTTP 请求模块 | [`src/https/TsHttpUtil.js`](./src/https/TsHttpUtil.js) | [HTTP 请求模块 (TsHttpUtil)](./.qoder/repowiki/zh/content/核心模块/HTTP%20请求模块%20%28TsHttpUtil%29.md) |
| 加密模块 | [`src/utils/TsCrypto.js`](./src/utils/TsCrypto.js) | [加密模块 (TsCrypto)](./.qoder/repowiki/zh/content/核心模块/加密模块%20%28TsCrypto%29.md) |
| SM4 算法模块 | [`src/utils/TsSM4.js`](./src/utils/TsSM4.js) | [SM4 算法模块 (TsSM4)](./.qoder/repowiki/zh/content/核心模块/SM4%20算法模块%20%28TsSM4%29.md) |
| 存储模块 | [`src/utils/TsStorage.js`](./src/utils/TsStorage.js) | [存储模块 (TsStorage)](./.qoder/repowiki/zh/content/核心模块/存储模块%20%28TsStorage%29.md) |
| 通用工具模块 | [`src/utils/TsCommon.js`](./src/utils/TsCommon.js) | [通用工具模块 (TsCommon)](./.qoder/repowiki/zh/content/核心模块/通用工具模块%20%28TsCommon%29.md) |
| 全局配置模块 | [`src/utils/TsGlobalConfig.js`](./src/utils/TsGlobalConfig.js) | [全局配置模块 (TsGlobalConfig)](./.qoder/repowiki/zh/content/核心模块/全局配置模块%20%28TsGlobalConfig%29.md) |
模块总览:[核心模块.md](./.qoder/repowiki/zh/content/核心模块/核心模块.md)
## API 参考手册
- [API 参考手册(总览)](./.qoder/repowiki/zh/content/API%20参考手册/API%20参考手册.md)
- [HTTP 请求 API](./.qoder/repowiki/zh/content/API%20参考手册/HTTP%20请求%20API.md)
- [加密解密 API](./.qoder/repowiki/zh/content/API%20参考手册/加密解密%20API.md)
- [SM4 算法 API](./.qoder/repowiki/zh/content/API%20参考手册/SM4%20算法%20API.md)
- [存储管理 API](./.qoder/repowiki/zh/content/API%20参考手册/存储管理%20API.md)
- [通用工具 API](./.qoder/repowiki/zh/content/API%20参考手册/通用工具%20API.md)
- [配置管理 API](./.qoder/repowiki/zh/content/API%20参考手册/配置管理%20API.md)
## 配置指南
- [配置指南(总览)](./.qoder/repowiki/zh/content/配置指南/配置指南.md)
- [全局配置](./.qoder/repowiki/zh/content/配置指南/全局配置.md)
- [HTTP 请求配置](./.qoder/repowiki/zh/content/配置指南/HTTP%20请求配置.md)
- [加密配置](./.qoder/repowiki/zh/content/配置指南/加密配置.md)
- [存储配置](./.qoder/repowiki/zh/content/配置指南/存储配置.md)
## 故障排除
- [故障排除(总览)](./.qoder/repowiki/zh/content/故障排除/故障排除.md)
- [网络请求问题](./.qoder/repowiki/zh/content/故障排除/网络请求问题.md)
- [加密解密问题](./.qoder/repowiki/zh/content/故障排除/加密解密问题.md)
- [存储访问问题](./.qoder/repowiki/zh/content/故障排除/存储访问问题.md)
- [配置问题](./.qoder/repowiki/zh/content/故障排除/配置问题.md)
- [调试工具和方法](./.qoder/repowiki/zh/content/故障排除/调试工具和方法.md)
## 目录结构
```
npm-tool
├── index.js # 统一出口
├── src
│ ├── https
│ │ └── TsHttpUtil.js # HTTP 请求封装(基于 umi-request
│ └── utils
│ ├── TsCommon.js # 通用工具
│ ├── TsCrypto.js # SM4 加解密门面
│ ├── TsGlobalConfig.js# 全局配置(挂载在 window.httpConfig
│ ├── TsSM4.js # SM4 算法实现
│ └── TsStorage.js # localStorage 封装
└── .qoder/repowiki/zh # 项目 Wiki 文档
```
## 依赖
- [`umi-request`](https://www.npmjs.com/package/umi-request) `1.4.0`
- [`base64-js`](https://www.npmjs.com/package/base64-js) `1.5.1`
---
如在使用过程中遇到问题,可先查阅 [故障排除](./.qoder/repowiki/zh/content/故障排除/故障排除.md) 文档,或联系仓库维护者。