561 lines
14 KiB
Markdown
561 lines
14 KiB
Markdown
|
|
# Basic Utils 基础工具模块
|
||
|
|
|
||
|
|
## 模块概述
|
||
|
|
|
||
|
|
`basic_utils` 是 OneApp 基础工具模块群中的核心工具集合,提供了应用开发中常用的基础工具类、辅助方法和通用组件。该模块包含了事件总线、图片处理、分享功能、加密解密、文件上传等丰富的工具功能。
|
||
|
|
|
||
|
|
### 基本信息
|
||
|
|
- **模块名称**: basic_utils
|
||
|
|
- **版本**: 0.0.3
|
||
|
|
- **描述**: 基础工具包
|
||
|
|
- **Flutter 版本**: >=2.10.5
|
||
|
|
- **Dart 版本**: >=3.0.0 <4.0.08
|
||
|
|
|
||
|
|
## 功能特性
|
||
|
|
|
||
|
|
### 核心功能
|
||
|
|
1. **事件总线系统**
|
||
|
|
- 全局事件发布订阅
|
||
|
|
- 类型安全的事件传递
|
||
|
|
- 事件生命周期管理
|
||
|
|
- 异步事件处理
|
||
|
|
|
||
|
|
2. **图片处理工具**
|
||
|
|
- 图片选择和拍照
|
||
|
|
- 图片压缩和格式转换
|
||
|
|
- 图片裁剪和编辑
|
||
|
|
- 图片缓存管理
|
||
|
|
|
||
|
|
3. **分享功能集成**
|
||
|
|
- 社交平台分享
|
||
|
|
- 文件分享
|
||
|
|
- 链接分享
|
||
|
|
- 自定义分享内容
|
||
|
|
|
||
|
|
4. **加密解密服务**
|
||
|
|
- 对称加密算法
|
||
|
|
- 非对称加密算法
|
||
|
|
- 哈希算法
|
||
|
|
- 数字签名
|
||
|
|
|
||
|
|
5. **云存储服务**
|
||
|
|
- 腾讯云COS集成
|
||
|
|
- 文件上传下载
|
||
|
|
- 断点续传
|
||
|
|
- 存储管理
|
||
|
|
|
||
|
|
## 技术架构
|
||
|
|
|
||
|
|
### 目录结构
|
||
|
|
```
|
||
|
|
lib/
|
||
|
|
├── basic_utils.dart # 模块入口文件
|
||
|
|
├── src/ # 源代码目录
|
||
|
|
│ ├── event_bus/ # 事件总线
|
||
|
|
│ ├── image/ # 图片处理
|
||
|
|
│ ├── share/ # 分享功能
|
||
|
|
│ ├── crypto/ # 加密解密
|
||
|
|
│ ├── storage/ # 云存储
|
||
|
|
│ ├── network/ # 网络工具
|
||
|
|
│ ├── utils/ # 通用工具
|
||
|
|
│ └── models/ # 数据模型
|
||
|
|
├── widgets/ # 通用组件
|
||
|
|
└── test/ # 测试文件
|
||
|
|
```
|
||
|
|
|
||
|
|
### 依赖关系
|
||
|
|
|
||
|
|
#### 核心框架依赖
|
||
|
|
- `basic_modular: ^0.2.3` - 模块化框架
|
||
|
|
- `basic_storage: 0.2.2` - 基础存储
|
||
|
|
- `basic_webview: ^0.2.4` - WebView组件
|
||
|
|
|
||
|
|
#### 工具依赖
|
||
|
|
- `event_bus: ^2.0.0` - 事件总线
|
||
|
|
- `shared_preferences: ^2.0.17` - 本地存储
|
||
|
|
- `http: ^1.0.0` - HTTP客户端
|
||
|
|
- `dartz: ^0.10.1` - 函数式编程
|
||
|
|
|
||
|
|
#### 功能依赖
|
||
|
|
- `image_picker: ^1.1.2` - 图片选择
|
||
|
|
- `flutter_image_compress: 2.1.0` - 图片压缩
|
||
|
|
- `share_plus: 7.2.1` - 分享功能
|
||
|
|
- `fluwx: ^4.2.5` - 微信SDK
|
||
|
|
- `weibo_kit: ^4.0.0` - 微博SDK
|
||
|
|
|
||
|
|
#### 安全依赖
|
||
|
|
- `crypto: any` - 加密算法
|
||
|
|
- `encrypt: any` - 加密工具
|
||
|
|
- `pointycastle: any` - 加密库
|
||
|
|
|
||
|
|
#### 云服务依赖
|
||
|
|
- `tencentcloud_cos_sdk_plugin: 1.2.0` - 腾讯云COS
|
||
|
|
|
||
|
|
## 核心模块分析
|
||
|
|
|
||
|
|
### 1. 模块入口 (`basic_utils.dart`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 工具模块统一导出
|
||
|
|
- 全局配置初始化
|
||
|
|
- 服务注册管理
|
||
|
|
|
||
|
|
### 2. 事件总线 (`src/event_bus/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 全局事件发布订阅机制
|
||
|
|
- 类型安全的事件传递
|
||
|
|
- 事件过滤和转换
|
||
|
|
- 内存泄漏防护
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `GlobalEventBus` - 全局事件总线
|
||
|
|
- `EventSubscription` - 事件订阅管理
|
||
|
|
- `TypedEvent` - 类型化事件
|
||
|
|
- `EventFilter` - 事件过滤器
|
||
|
|
|
||
|
|
**使用示例**:
|
||
|
|
```dart
|
||
|
|
// 定义事件类型
|
||
|
|
class UserLoginEvent {
|
||
|
|
final String userId;
|
||
|
|
final String userName;
|
||
|
|
|
||
|
|
UserLoginEvent(this.userId, this.userName);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 发布事件
|
||
|
|
GlobalEventBus.instance.fire(UserLoginEvent('123', 'John'));
|
||
|
|
|
||
|
|
// 订阅事件
|
||
|
|
final subscription = GlobalEventBus.instance.on<UserLoginEvent>().listen((event) {
|
||
|
|
print('User ${event.userName} logged in');
|
||
|
|
});
|
||
|
|
|
||
|
|
// 取消订阅
|
||
|
|
subscription.cancel();
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 图片处理 (`src/image/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 图片选择和拍照功能
|
||
|
|
- 图片压缩和格式转换
|
||
|
|
- 图片编辑和处理
|
||
|
|
- 图片缓存和管理
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `ImagePicker` - 图片选择器
|
||
|
|
- `ImageCompressor` - 图片压缩器
|
||
|
|
- `ImageEditor` - 图片编辑器
|
||
|
|
- `ImageCache` - 图片缓存管理
|
||
|
|
|
||
|
|
**使用示例**:
|
||
|
|
```dart
|
||
|
|
class ImageUtils {
|
||
|
|
static Future<File?> pickImage({
|
||
|
|
ImageSource source = ImageSource.gallery,
|
||
|
|
double? maxWidth,
|
||
|
|
double? maxHeight,
|
||
|
|
int? imageQuality,
|
||
|
|
}) async {
|
||
|
|
final picker = ImagePicker();
|
||
|
|
final XFile? image = await picker.pickImage(
|
||
|
|
source: source,
|
||
|
|
maxWidth: maxWidth,
|
||
|
|
maxHeight: maxHeight,
|
||
|
|
imageQuality: imageQuality,
|
||
|
|
);
|
||
|
|
|
||
|
|
return image != null ? File(image.path) : null;
|
||
|
|
}
|
||
|
|
|
||
|
|
static Future<File> compressImage(
|
||
|
|
File file, {
|
||
|
|
int quality = 85,
|
||
|
|
int? minWidth,
|
||
|
|
int? minHeight,
|
||
|
|
}) async {
|
||
|
|
final result = await FlutterImageCompress.compressAndGetFile(
|
||
|
|
file.absolute.path,
|
||
|
|
'${file.parent.path}/compressed_${file.name}',
|
||
|
|
quality: quality,
|
||
|
|
minWidth: minWidth,
|
||
|
|
minHeight: minHeight,
|
||
|
|
);
|
||
|
|
|
||
|
|
return File(result!.path);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. 分享功能 (`src/share/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 系统原生分享
|
||
|
|
- 社交平台分享
|
||
|
|
- 自定义分享内容
|
||
|
|
- 分享结果回调
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `ShareManager` - 分享管理器
|
||
|
|
- `WeChatShare` - 微信分享
|
||
|
|
- `WeiboShare` - 微博分享
|
||
|
|
- `SystemShare` - 系统分享
|
||
|
|
|
||
|
|
**使用示例**:
|
||
|
|
```dart
|
||
|
|
class ShareUtils {
|
||
|
|
static Future<void> shareText(String text) async {
|
||
|
|
await Share.share(text);
|
||
|
|
}
|
||
|
|
|
||
|
|
static Future<void> shareFile(String filePath) async {
|
||
|
|
await Share.shareXFiles([XFile(filePath)]);
|
||
|
|
}
|
||
|
|
|
||
|
|
static Future<void> shareToWeChat({
|
||
|
|
required String title,
|
||
|
|
required String description,
|
||
|
|
String? imageUrl,
|
||
|
|
String? webpageUrl,
|
||
|
|
}) async {
|
||
|
|
final model = WeChatShareWebPageModel(
|
||
|
|
webPage: webpageUrl ?? '',
|
||
|
|
title: title,
|
||
|
|
description: description,
|
||
|
|
thumbnail: WeChatImage.network(imageUrl ?? ''),
|
||
|
|
);
|
||
|
|
|
||
|
|
await fluwx.shareToWeChat(model);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. 加密解密 (`src/crypto/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 对称加密解密
|
||
|
|
- 非对称加密解密
|
||
|
|
- 数字签名验证
|
||
|
|
- 哈希算法实现
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `AESCrypto` - AES加密
|
||
|
|
- `RSACrypto` - RSA加密
|
||
|
|
- `HashUtils` - 哈希工具
|
||
|
|
- `SignatureUtils` - 数字签名
|
||
|
|
|
||
|
|
**使用示例**:
|
||
|
|
```dart
|
||
|
|
class CryptoUtils {
|
||
|
|
static String md5Hash(String input) {
|
||
|
|
final bytes = utf8.encode(input);
|
||
|
|
final digest = md5.convert(bytes);
|
||
|
|
return digest.toString();
|
||
|
|
}
|
||
|
|
|
||
|
|
static String sha256Hash(String input) {
|
||
|
|
final bytes = utf8.encode(input);
|
||
|
|
final digest = sha256.convert(bytes);
|
||
|
|
return digest.toString();
|
||
|
|
}
|
||
|
|
|
||
|
|
static String aesEncrypt(String plainText, String key) {
|
||
|
|
final encrypter = Encrypter(AES(Key.fromBase64(key)));
|
||
|
|
final encrypted = encrypter.encrypt(plainText);
|
||
|
|
return encrypted.base64;
|
||
|
|
}
|
||
|
|
|
||
|
|
static String aesDecrypt(String encryptedText, String key) {
|
||
|
|
final encrypter = Encrypter(AES(Key.fromBase64(key)));
|
||
|
|
final decrypted = encrypter.decrypt64(encryptedText);
|
||
|
|
return decrypted;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. 云存储 (`src/storage/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 腾讯云COS集成
|
||
|
|
- 文件上传下载
|
||
|
|
- 断点续传
|
||
|
|
- 存储空间管理
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `COSManager` - COS管理器
|
||
|
|
- `FileUploader` - 文件上传器
|
||
|
|
- `FileDownloader` - 文件下载器
|
||
|
|
- `StorageMonitor` - 存储监控
|
||
|
|
|
||
|
|
**使用示例**:
|
||
|
|
```dart
|
||
|
|
class CloudStorageUtils {
|
||
|
|
static Future<String?> uploadFile(
|
||
|
|
String filePath, {
|
||
|
|
String? objectKey,
|
||
|
|
Function(int, int)? onProgress,
|
||
|
|
}) async {
|
||
|
|
try {
|
||
|
|
final result = await TencentCloudCosSdkPlugin.upload(
|
||
|
|
filePath,
|
||
|
|
objectKey ?? _generateObjectKey(filePath),
|
||
|
|
onProgress: onProgress,
|
||
|
|
);
|
||
|
|
|
||
|
|
return result['url'] as String?;
|
||
|
|
} catch (e) {
|
||
|
|
print('Upload failed: $e');
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
static Future<bool> downloadFile(
|
||
|
|
String url,
|
||
|
|
String savePath, {
|
||
|
|
Function(int, int)? onProgress,
|
||
|
|
}) async {
|
||
|
|
try {
|
||
|
|
await TencentCloudCosSdkPlugin.download(
|
||
|
|
url,
|
||
|
|
savePath,
|
||
|
|
onProgress: onProgress,
|
||
|
|
);
|
||
|
|
return true;
|
||
|
|
} catch (e) {
|
||
|
|
print('Download failed: $e');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
static String _generateObjectKey(String filePath) {
|
||
|
|
final fileName = path.basename(filePath);
|
||
|
|
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
||
|
|
return 'uploads/$timestamp/$fileName';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 7. 网络工具 (`src/network/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- HTTP请求封装
|
||
|
|
- 网络状态检测
|
||
|
|
- 请求重试机制
|
||
|
|
- 响应数据处理
|
||
|
|
|
||
|
|
**主要组件**:
|
||
|
|
- `HttpClient` - HTTP客户端
|
||
|
|
- `NetworkMonitor` - 网络监控
|
||
|
|
- `RequestInterceptor` - 请求拦截器
|
||
|
|
- `ResponseHandler` - 响应处理器
|
||
|
|
|
||
|
|
### 8. 通用工具 (`src/utils/`)
|
||
|
|
|
||
|
|
**功能职责**:
|
||
|
|
- 字符串处理工具
|
||
|
|
- 日期时间工具
|
||
|
|
- 数学计算工具
|
||
|
|
- 格式化工具
|
||
|
|
|
||
|
|
**主要工具**:
|
||
|
|
- `StringUtils` - 字符串工具
|
||
|
|
- `DateUtils` - 日期工具
|
||
|
|
- `MathUtils` - 数学工具
|
||
|
|
- `FormatUtils` - 格式化工具
|
||
|
|
|
||
|
|
**工具方法示例**:
|
||
|
|
```dart
|
||
|
|
class StringUtils {
|
||
|
|
static bool isNullOrEmpty(String? str) {
|
||
|
|
return str == null || str.isEmpty;
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool isValidEmail(String email) {
|
||
|
|
return RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(email);
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool isValidPhone(String phone) {
|
||
|
|
return RegExp(r'^1[3-9]\d{9}$').hasMatch(phone);
|
||
|
|
}
|
||
|
|
|
||
|
|
static String maskPhone(String phone) {
|
||
|
|
if (phone.length != 11) return phone;
|
||
|
|
return '${phone.substring(0, 3)}****${phone.substring(7)}';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
class DateUtils {
|
||
|
|
static String formatDateTime(DateTime dateTime, [String? pattern]) {
|
||
|
|
pattern ??= 'yyyy-MM-dd HH:mm:ss';
|
||
|
|
return DateFormat(pattern).format(dateTime);
|
||
|
|
}
|
||
|
|
|
||
|
|
static DateTime? parseDateTime(String dateStr, [String? pattern]) {
|
||
|
|
try {
|
||
|
|
pattern ??= 'yyyy-MM-dd HH:mm:ss';
|
||
|
|
return DateFormat(pattern).parse(dateStr);
|
||
|
|
} catch (e) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool isToday(DateTime dateTime) {
|
||
|
|
final now = DateTime.now();
|
||
|
|
return dateTime.year == now.year &&
|
||
|
|
dateTime.month == now.month &&
|
||
|
|
dateTime.day == now.day;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 通用组件
|
||
|
|
|
||
|
|
### Loading组件
|
||
|
|
```dart
|
||
|
|
class LoadingUtils {
|
||
|
|
static OverlayEntry? _overlayEntry;
|
||
|
|
|
||
|
|
static void show(BuildContext context, {String? message}) {
|
||
|
|
hide(); // 先隐藏之前的
|
||
|
|
|
||
|
|
_overlayEntry = OverlayEntry(
|
||
|
|
builder: (context) => Material(
|
||
|
|
color: Colors.black54,
|
||
|
|
child: Center(
|
||
|
|
child: Container(
|
||
|
|
padding: const EdgeInsets.all(20),
|
||
|
|
decoration: BoxDecoration(
|
||
|
|
color: Colors.white,
|
||
|
|
borderRadius: BorderRadius.circular(8),
|
||
|
|
),
|
||
|
|
child: Column(
|
||
|
|
mainAxisSize: MainAxisSize.min,
|
||
|
|
children: [
|
||
|
|
const CircularProgressIndicator(),
|
||
|
|
if (message != null) ...[
|
||
|
|
const SizedBox(height: 16),
|
||
|
|
Text(message),
|
||
|
|
],
|
||
|
|
],
|
||
|
|
),
|
||
|
|
),
|
||
|
|
),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
|
||
|
|
Overlay.of(context).insert(_overlayEntry!);
|
||
|
|
}
|
||
|
|
|
||
|
|
static void hide() {
|
||
|
|
_overlayEntry?.remove();
|
||
|
|
_overlayEntry = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Toast组件
|
||
|
|
```dart
|
||
|
|
class ToastUtils {
|
||
|
|
static void showSuccess(String message) {
|
||
|
|
Fluttertoast.showToast(
|
||
|
|
msg: message,
|
||
|
|
backgroundColor: Colors.green,
|
||
|
|
textColor: Colors.white,
|
||
|
|
toastLength: Toast.LENGTH_SHORT,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
static void showError(String message) {
|
||
|
|
Fluttertoast.showToast(
|
||
|
|
msg: message,
|
||
|
|
backgroundColor: Colors.red,
|
||
|
|
textColor: Colors.white,
|
||
|
|
toastLength: Toast.LENGTH_SHORT,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
static void showInfo(String message) {
|
||
|
|
Fluttertoast.showToast(
|
||
|
|
msg: message,
|
||
|
|
backgroundColor: Colors.blue,
|
||
|
|
textColor: Colors.white,
|
||
|
|
toastLength: Toast.LENGTH_SHORT,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 性能优化
|
||
|
|
|
||
|
|
### 内存管理
|
||
|
|
- **事件订阅管理**: 及时取消不需要的事件订阅
|
||
|
|
- **图片内存优化**: 合理控制图片加载和缓存
|
||
|
|
- **对象池**: 复用常用对象减少GC压力
|
||
|
|
- **弱引用**: 使用弱引用避免内存泄漏
|
||
|
|
|
||
|
|
### 网络优化
|
||
|
|
- **请求缓存**: 缓存网络请求结果
|
||
|
|
- **并发控制**: 控制并发请求数量
|
||
|
|
- **超时重试**: 智能超时和重试机制
|
||
|
|
- **数据压缩**: 压缩传输数据
|
||
|
|
|
||
|
|
### 存储优化
|
||
|
|
- **文件压缩**: 压缩存储文件
|
||
|
|
- **清理策略**: 定期清理过期文件
|
||
|
|
- **分块上传**: 大文件分块上传
|
||
|
|
- **断点续传**: 支持上传下载断点续传
|
||
|
|
|
||
|
|
## 安全特性
|
||
|
|
|
||
|
|
### 数据安全
|
||
|
|
- **敏感数据加密**: 敏感信息加密存储
|
||
|
|
- **传输加密**: HTTPS传输保护
|
||
|
|
- **数据校验**: 数据完整性校验
|
||
|
|
- **防篡改**: 数字签名防篡改
|
||
|
|
|
||
|
|
### 隐私保护
|
||
|
|
- **权限控制**: 严格的功能权限控制
|
||
|
|
- **数据脱敏**: 敏感数据脱敏处理
|
||
|
|
- **本地存储**: 安全的本地数据存储
|
||
|
|
- **清理机制**: 数据清理和销毁机制
|
||
|
|
|
||
|
|
## 测试策略
|
||
|
|
|
||
|
|
### 单元测试
|
||
|
|
- **工具类测试**: 各种工具方法测试
|
||
|
|
- **加密解密测试**: 加密算法正确性
|
||
|
|
- **事件总线测试**: 事件发布订阅机制
|
||
|
|
- **网络工具测试**: 网络请求功能
|
||
|
|
|
||
|
|
### 集成测试
|
||
|
|
- **文件上传测试**: 云存储集成测试
|
||
|
|
- **分享功能测试**: 社交分享集成测试
|
||
|
|
- **图片处理测试**: 图片处理流程测试
|
||
|
|
- **端到端测试**: 完整功能流程测试
|
||
|
|
|
||
|
|
### 性能测试
|
||
|
|
- **内存泄漏测试**: 长时间运行检测
|
||
|
|
- **并发性能测试**: 高并发场景测试
|
||
|
|
- **文件处理测试**: 大文件处理性能
|
||
|
|
- **网络性能测试**: 网络请求性能
|
||
|
|
|
||
|
|
## 最佳实践
|
||
|
|
|
||
|
|
### 开发建议
|
||
|
|
1. **工具复用**: 优先使用现有工具方法
|
||
|
|
2. **异常处理**: 完善的异常处理机制
|
||
|
|
3. **资源管理**: 及时释放不需要的资源
|
||
|
|
4. **性能考虑**: 避免不必要的操作开销
|
||
|
|
|
||
|
|
### 使用指南
|
||
|
|
1. **按需导入**: 只导入需要的工具类
|
||
|
|
2. **配置优化**: 合理配置各种参数
|
||
|
|
3. **错误处理**: 妥善处理可能的错误
|
||
|
|
4. **日志记录**: 记录关键操作日志
|
||
|
|
|
||
|
|
## 总结
|
||
|
|
|
||
|
|
`basic_utils` 模块作为 OneApp 的基础工具集合,提供了丰富的开发工具和辅助功能。通过事件总线、图片处理、分享功能、加密解密等核心能力,大大简化了应用开发的复杂性。模块具有良好的性能优化和安全保护机制,能够满足各种开发场景的需求。
|