# 存储配置
**本文档引用的文件**
- [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)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南专注于 TsStorage 模块的存储配置,这是一个基于 localStorage 的轻量级存储解决方案。该模块提供了完整的数据持久化功能,包括基础存储操作、用户令牌管理、数据加密以及全局配置管理。通过本文档,您将了解如何正确配置和使用存储功能,包括存储前缀、加密开关、存储策略等关键配置选项。
## 项目结构
该项目采用模块化设计,主要包含以下核心文件:
```mermaid
graph TB
subgraph "核心模块"
A[index.js
主入口文件]
B[TsStorage.js
存储模块]
C[TsCrypto.js
加密模块]
D[TsSM4.js
SM4算法实现]
E[TsGlobalConfig.js
全局配置]
F[TsCommon.js
通用工具]
end
subgraph "外部依赖"
G[base64-js
Base64编码]
H[umi-request
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)