# 通用工具 API
**本文档引用的文件**
- [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)
## 目录
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
主入口文件]
Package[package.json
项目配置]
Readme[README.md
使用说明]
end
subgraph "src/ 工具源码目录"
Utils[src/utils/
通用工具模块]
Https[src/https/
HTTP 工具模块]
end
subgraph "Utils 模块"
Common[TsCommon.js
通用工具]
Crypto[TsCrypto.js
加密工具]
SM4[TsSM4.js
SM4 算法实现]
Storage[TsStorage.js
存储工具]
Config[TsGlobalConfig.js
全局配置]
end
subgraph "Https 模块"
HttpUtil[TsHttpUtil.js
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
网络请求库]
Base64[base64-js
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 层
TsHttpUtil]
CryptoLayer[加密层
TsCrypto + TsSM4]
StorageLayer[存储层
TsStorage]
CommonLayer[通用层
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["准备明文字节流
UTF-8 编码"]
Prepare --> Padding["PKCS#7 填充
16 字节对齐"]
Padding --> Mode{"选择模式"}
Mode --> |CBC| CBCInit["CBC 模式初始化
IV = 16 字节"]
Mode --> |ECB| ECBInit["ECB 模式初始化
无 IV"]
CBCInit --> BlockLoop["按块处理
16 字节/块"]
ECBInit --> BlockLoop
BlockLoop --> XOR["与前一块密文异或
(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