|
|
@ -13,6 +13,7 @@ import 'package:path_provider/path_provider.dart'; |
|
|
import '../../../data/services/network/api.dart'; |
|
|
import '../../../data/services/network/api.dart'; |
|
|
import 'package:dio/dio.dart'; |
|
|
import 'package:dio/dio.dart'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProfileController extends GetxController { |
|
|
class ProfileController extends GetxController { |
|
|
static ProfileController get to => Get.find(); |
|
|
static ProfileController get to => Get.find(); |
|
|
|
|
|
|
|
|
@ -115,6 +116,53 @@ class ProfileController extends GetxController { |
|
|
|
|
|
|
|
|
// void toggleEditing() { |
|
|
// void toggleEditing() { |
|
|
// _isEditing.value = !_isEditing.value; |
|
|
// _isEditing.value = !_isEditing.value; |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
// 验证base64图片数据 |
|
|
|
|
|
// Future<void> _verifyBase64Image(String base64String) async { |
|
|
|
|
|
// try { |
|
|
|
|
|
// // 解码base64数据 |
|
|
|
|
|
// List<int> imageBytes = base64Decode(base64String); |
|
|
|
|
|
|
|
|
|
|
|
// // 获取应用文档目录 |
|
|
|
|
|
// final appDir = await getApplicationDocumentsDirectory(); |
|
|
|
|
|
// final verifyPath = '${appDir.path}/verify_base64_${DateTime.now().millisecondsSinceEpoch}.jpg'; |
|
|
|
|
|
|
|
|
|
|
|
// // 将解码后的数据写入文件 |
|
|
|
|
|
// final file = File(verifyPath); |
|
|
|
|
|
// await file.writeAsBytes(imageBytes); |
|
|
|
|
|
|
|
|
|
|
|
// // 记录验证文件的路径 |
|
|
|
|
|
// Logger().d('Base64验证图片已保存到: $verifyPath'); |
|
|
|
|
|
|
|
|
|
|
|
// // 显示图片预览对话框 |
|
|
|
|
|
// Get.dialog( |
|
|
|
|
|
// Dialog( |
|
|
|
|
|
// child: Column( |
|
|
|
|
|
// mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
// children: [ |
|
|
|
|
|
// Padding( |
|
|
|
|
|
// padding: const EdgeInsets.all(16.0), |
|
|
|
|
|
// child: Text('Base64 图片验证', style: TextStyle(fontWeight: FontWeight.bold)), |
|
|
|
|
|
// ), |
|
|
|
|
|
// Image.file(File(verifyPath)), |
|
|
|
|
|
// Padding( |
|
|
|
|
|
// padding: const EdgeInsets.all(16.0), |
|
|
|
|
|
// child: ElevatedButton( |
|
|
|
|
|
// onPressed: () => Get.back(), |
|
|
|
|
|
// child: Text('关闭'), |
|
|
|
|
|
// ), |
|
|
|
|
|
// ), |
|
|
|
|
|
// ], |
|
|
|
|
|
// ), |
|
|
|
|
|
// ), |
|
|
|
|
|
// ); |
|
|
|
|
|
|
|
|
|
|
|
// Get.snackbar('验证', '已将Base64转换回图片,请查看预览'); |
|
|
|
|
|
// } catch (e) { |
|
|
|
|
|
// Logger().e('验证Base64图片失败: $e'); |
|
|
|
|
|
// Get.snackbar('错误', 'Base64验证失败: $e'); |
|
|
|
|
|
// } |
|
|
// } |
|
|
// } |
|
|
|
|
|
|
|
|
// 更新用户信息到后端 |
|
|
// 更新用户信息到后端 |
|
|
@ -123,26 +171,29 @@ class ProfileController extends GetxController { |
|
|
// 准备数据 |
|
|
// 准备数据 |
|
|
Map<String, dynamic> data = { |
|
|
Map<String, dynamic> data = { |
|
|
"image": "", // 默认空字符串 |
|
|
"image": "", // 默认空字符串 |
|
|
"language": currentLanguage.value, |
|
|
"language": currentLanguage.value,//当前用户语言 |
|
|
"name": userInfo.value.name, |
|
|
"name": userInfo.value.name,//当前用户名 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// // 如果有头像,转换为base64 |
|
|
// 如果有头像,转换为base64 |
|
|
// if (localAvatar.value.isNotEmpty) { |
|
|
if (localAvatar.value.isNotEmpty) { |
|
|
// try{ |
|
|
//如果本地头像路径不为空,即代表有头像 |
|
|
// File imageFile = File(localAvatar.value); |
|
|
try { |
|
|
// if(await imageFile.exists()){ |
|
|
File imageFile = File(localAvatar.value); |
|
|
// List<int> imageBytes = await imageFile.readAsBytes(); |
|
|
if (await imageFile.exists()) { |
|
|
// String base64Image = base64Encode(imageBytes); |
|
|
List<int> imageBytes = await imageFile.readAsBytes(); |
|
|
// data["image"] = base64Image; |
|
|
String base64Image = base64Encode(imageBytes); |
|
|
// }else{ |
|
|
data["image"] = base64Image; |
|
|
// Logger().e('头像文件不存在'); |
|
|
|
|
|
// } |
|
|
// // 验证base64数据 - 将base64转回图片并保存到本地 |
|
|
// }catch(e){ |
|
|
// await _verifyBase64Image(base64Image); |
|
|
// Logger().e('读取头像文件失败: $e'); |
|
|
} else { |
|
|
// } |
|
|
Logger().e('头像文件不存在'); |
|
|
|
|
|
} |
|
|
// } |
|
|
} catch (e) { |
|
|
|
|
|
Logger().e('读取头像文件失败: $e'); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
final dio = Dio(BaseOptions( |
|
|
final dio = Dio(BaseOptions( |
|
|
baseUrl: 'https://www.deapsound.com:443', |
|
|
baseUrl: 'https://www.deapsound.com:443', |
|
|
@ -160,6 +211,8 @@ class ProfileController extends GetxController { |
|
|
'/api/home/user_setting', |
|
|
'/api/home/user_setting', |
|
|
data: data, |
|
|
data: data, |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 调用API |
|
|
// 调用API |
|
|
//final response = await Api.updateUserSetting(data); |
|
|
//final response = await Api.updateUserSetting(data); |
|
|
|
|
|
|
|
|
@ -167,6 +220,13 @@ class ProfileController extends GetxController { |
|
|
if (response.data['code'] == 0) { |
|
|
if (response.data['code'] == 0) { |
|
|
Logger().d('更新成功: ${response.data}'); |
|
|
Logger().d('更新成功: ${response.data}'); |
|
|
Get.snackbar('成功', '同步到服务器成功'); |
|
|
Get.snackbar('成功', '同步到服务器成功'); |
|
|
|
|
|
userInfo.update((u) { |
|
|
|
|
|
if (u != null) { |
|
|
|
|
|
u.name = response.data['data']['name'] ?? ''; |
|
|
|
|
|
u.avatar = response.data['data']['avatar'] ?? ''; |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
Logger().d('更新后的用户信息: ${userInfo.value.toJson()}'); |
|
|
} else { |
|
|
} else { |
|
|
throw '更新失败:${response.data['msg'] ?? '未知错误'}'; |
|
|
throw '更新失败:${response.data['msg'] ?? '未知错误'}'; |
|
|
} |
|
|
} |
|
|
@ -184,18 +244,35 @@ class ProfileController extends GetxController { |
|
|
final userJson = _storage.read(userKey); |
|
|
final userJson = _storage.read(userKey); |
|
|
if (userJson != null) { |
|
|
if (userJson != null) { |
|
|
userInfo.value = User.instance; |
|
|
userInfo.value = User.instance; |
|
|
|
|
|
Logger().d('从本地加载用户信息: $userJson'); |
|
|
// 如果有远程头像地址,下载并保存到本地 |
|
|
// 如果有远程头像地址,下载并保存到本地 |
|
|
if (userInfo.value.avatar.isNotEmpty) { |
|
|
if (userInfo.value.avatar.isNotEmpty) { |
|
|
|
|
|
Logger().d('远程头像地址: ${userInfo.value.avatar}'); |
|
|
_downloadAndSaveAvatar(userInfo.value.avatar); |
|
|
_downloadAndSaveAvatar(userInfo.value.avatar); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 下载并保存远程头像 |
|
|
// 下载并保存远程头像 |
|
|
Future<void> _downloadAndSaveAvatar(String url) async { |
|
|
Future<void> _downloadAndSaveAvatar(String url) async { |
|
|
try { |
|
|
try { |
|
|
final response = await GetConnect().get(url); |
|
|
Logger().d('开始下载头像: $url'); |
|
|
if (response.status.isOk && response.body != null) { |
|
|
|
|
|
|
|
|
final dio = Dio(BaseOptions( |
|
|
|
|
|
headers: { |
|
|
|
|
|
'accept': '*/*', |
|
|
|
|
|
'Authorization': _storage.read<String>("logintoken"), |
|
|
|
|
|
}, |
|
|
|
|
|
)); |
|
|
|
|
|
|
|
|
|
|
|
final response = await dio.get( |
|
|
|
|
|
url, |
|
|
|
|
|
options: Options(responseType: ResponseType.bytes), |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
Logger().d('下载状态: ${response.statusCode}'); |
|
|
|
|
|
|
|
|
|
|
|
if (response.statusCode == 200) { |
|
|
// 保存到应用文档目录 |
|
|
// 保存到应用文档目录 |
|
|
final appDir = await getApplicationDocumentsDirectory(); |
|
|
final appDir = await getApplicationDocumentsDirectory(); |
|
|
final fileName = 'avatar_${DateTime.now().millisecondsSinceEpoch}.jpg'; |
|
|
final fileName = 'avatar_${DateTime.now().millisecondsSinceEpoch}.jpg'; |
|
|
@ -203,15 +280,13 @@ class ProfileController extends GetxController { |
|
|
|
|
|
|
|
|
// 写入文件 |
|
|
// 写入文件 |
|
|
final file = File(localPath); |
|
|
final file = File(localPath); |
|
|
final List<int> bytes = response.body.runtimeType == String |
|
|
await file.writeAsBytes(response.data); |
|
|
? base64Decode(response.body.toString()) |
|
|
|
|
|
: response.body; |
|
|
|
|
|
await file.writeAsBytes(bytes); |
|
|
|
|
|
|
|
|
|
|
|
// 更新本地头像路径 |
|
|
// 更新本地头像路径 |
|
|
localAvatar.value = localPath; |
|
|
localAvatar.value = localPath; |
|
|
await _storage.write('local_avatar', localPath); |
|
|
await _storage.write('local_avatar', localPath); |
|
|
Logger().d('头像已下载到本地: $localPath'); |
|
|
Logger().d('头像已下载到本地: $localPath'); |
|
|
|
|
|
//Get.snackbar('头像', '头像已下载到本地'); |
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger().e('下载头像失败: $e'); |
|
|
Logger().e('下载头像失败: $e'); |
|
|
@ -225,12 +300,12 @@ class ProfileController extends GetxController { |
|
|
// 更新用户头像 |
|
|
// 更新用户头像 |
|
|
Future<void> updateUserAvatar() async { |
|
|
Future<void> updateUserAvatar() async { |
|
|
final XFile? image = await _picker.pickImage( |
|
|
final XFile? image = await _picker.pickImage( |
|
|
source: ImageSource.gallery, |
|
|
source: ImageSource.gallery,// 从相册选择 |
|
|
maxWidth: 800, |
|
|
maxWidth: 800, |
|
|
maxHeight: 800, |
|
|
maxHeight: 800, |
|
|
imageQuality: 85, |
|
|
imageQuality: 85, |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
if (image != null) { |
|
|
if (image != null) { |
|
|
// 检查文件大小 |
|
|
// 检查文件大小 |
|
|
final file = File(image.path); |
|
|
final file = File(image.path); |
|
|
@ -268,7 +343,7 @@ class ProfileController extends GetxController { |
|
|
localAvatar.value = image.path; |
|
|
localAvatar.value = image.path; |
|
|
await _storage.write('local_avatar', image.path); |
|
|
await _storage.write('local_avatar', image.path); |
|
|
// await saveUserInfo(); //保存到本地 |
|
|
// await saveUserInfo(); //保存到本地 |
|
|
await _syncWithBackend(); //同步到后端 |
|
|
//await _syncWithBackend(); //同步到后端 |
|
|
|
|
|
|
|
|
// 通知 SettingsController 更新 |
|
|
// 通知 SettingsController 更新 |
|
|
// if (Get.isRegistered<SettingsController>()) { |
|
|
// if (Get.isRegistered<SettingsController>()) { |
|
|
@ -278,7 +353,7 @@ class ProfileController extends GetxController { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 更新用户名 |
|
|
// 更新用户名 |
|
|
Future<void> updateUserName(String name) async { |
|
|
Future<void> updateUserNameAndAvatar(String name) async { |
|
|
if (name.trim().isEmpty) { |
|
|
if (name.trim().isEmpty) { |
|
|
Logger().e('无效名称: $name'); |
|
|
Logger().e('无效名称: $name'); |
|
|
return; |
|
|
return; |
|
|
@ -298,11 +373,14 @@ class ProfileController extends GetxController { |
|
|
//同步更新 SettingsController |
|
|
//同步更新 SettingsController |
|
|
if (Get.isRegistered<SettingsController>()) { |
|
|
if (Get.isRegistered<SettingsController>()) { |
|
|
final settingsController = Get.find<SettingsController>(); |
|
|
final settingsController = Get.find<SettingsController>(); |
|
|
settingsController.loadUserInfo(); |
|
|
settingsController.userInfo.value.name = userInfo.value.name; |
|
|
|
|
|
settingsController.userInfo.value.avatar = '${userInfo.value.avatar}?time=${DateTime.now().millisecondsSinceEpoch}'; |
|
|
|
|
|
//settingsController.loadUserInfo(); |
|
|
|
|
|
settingsController.userInfo.refresh(); |
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger().e('更新名称错误: $e'); |
|
|
Logger().e('更新用户名和头像错误: $e'); |
|
|
Get.snackbar('错误', '更新用户名失败'); |
|
|
Get.snackbar('错误', '更新用户名和头像失败'); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|