Browse Source

feat(账号服务): 添加账号管理服务并集成到个人资料模块

- 创建AccountService处理账号相关操作包括登出和删除
- 在InitialBinding中注册账号服务
- 重构ProfileController使用账号服务处理登出和删除逻辑
- 添加操作结果封装类AccountOperationResult
newdev_shunjiawei
lxm 1 year ago
parent
commit
2dcfd3d4ef
  1. 4
      lib/core/bindings/initial_binding.dart
  2. 144
      lib/data/services/account_service.dart
  3. 106
      lib/modules/profile/controllers/profile_controller.dart

4
lib/core/bindings/initial_binding.dart

@ -9,6 +9,7 @@ import '../../data/services/language_manager.dart';
import '../../core/utils/logger.dart'; import '../../core/utils/logger.dart';
import '../../data/services/bluetooth_manager.dart'; import '../../data/services/bluetooth_manager.dart';
import '../../data/services/ble_manager.dart'; import '../../data/services/ble_manager.dart';
import '../../data/services/account_service.dart';
/// 初始绑定,用于管理全局依赖 /// 初始绑定,用于管理全局依赖
class InitialBinding extends Bindings { class InitialBinding extends Bindings {
@ -42,6 +43,9 @@ class InitialBinding extends Bindings {
// 火山AI服务 // 火山AI服务
// Get.lazyPut<VolcanoAIService>(() => VolcanoAIService(), fenix: true); // Get.lazyPut<VolcanoAIService>(() => VolcanoAIService(), fenix: true);
// 账号管理服务
Get.lazyPut<AccountService>(() => AccountService(), fenix: true);
// 杰理蓝牙服务 // 杰理蓝牙服务
// // 语言管理器(需要最先初始化) // // 语言管理器(需要最先初始化)

144
lib/data/services/account_service.dart

@ -0,0 +1,144 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:logger/logger.dart';
import '../../modules/login/controllers/googleLogin.dart';
import '../../modules/login/controllers/facebookLogin.dart';
import '../services/network/api.dart';
/// 账号管理服务
///
/// 负责处理所有与用户账号相关的操作,包括登出和账号删除
class AccountService extends GetxService {
final GetStorage _storage = GetStorage();
final logger = Logger();
/// 初始化服务
@override
void onInit() {
super.onInit();
logger.d('AccountService 已初始化');
}
/// 清理本地用户数据
///
/// 返回操作是否成功
Future<bool> clearUserData() async {
try {
// 清理所有存储
await _storage.erase();
// 或者逐个清理关键存储项
await _storage.write("logintoken", null);
await _storage.write("user_info", null);
await _storage.write("local_avatar", null);
logger.d('用户数据清理成功');
return true;
} catch (e) {
logger.e('用户数据清理失败: $e');
return false;
}
}
/// 退出第三方登录
///
/// 返回操作是否成功
Future<bool> logoutThirdParty() async {
try {
final google = Google();
final facebook = Facebook();
await Future.wait([
google.signOutGoogle(),
facebook.signOutFacebook(),
]);
logger.d('第三方登录退出成功');
return true;
} catch (e) {
logger.e('第三方登录退出失败: $e');
// 返回true,因为这不应阻止整体登出流程
return true;
}
}
/// 用户登出
///
/// 清理本地数据并退出第三方登录
/// 返回操作结果,包含成功状态和错误信息
Future<AccountOperationResult> signOut() async {
try {
// 清理本地数据
final dataCleaned = await clearUserData();
if (!dataCleaned) {
return AccountOperationResult(
success: false,
errorMessage: '清理用户数据失败',
);
}
// 退出第三方登录
await logoutThirdParty();
return AccountOperationResult(
success: true,
message: '已退出登录',
);
} catch (e) {
logger.e('登出过程发生错误: $e');
return AccountOperationResult(
success: false,
errorMessage: '退出登录失败,请重试',
);
}
}
/// 删除用户账号
///
/// 调用API删除账号,然后清理本地数据
/// 返回操作结果,包含成功状态和错误信息
Future<AccountOperationResult> deleteAccount() async {
try {
// 调用API删除账号
final response = await Api.deleteUser();
if (response == null) {
return AccountOperationResult(
success: false,
errorMessage: '删除用户数据失败',
);
}
// 清理本地数据
final dataCleaned = await clearUserData();
if (!dataCleaned) {
return AccountOperationResult(
success: false,
errorMessage: '清理用户数据失败',
);
}
// 退出第三方登录
await logoutThirdParty();
return AccountOperationResult(
success: true,
message: '账号已被永久删除',
);
} catch (e) {
logger.e('删除账号过程发生错误: $e');
return AccountOperationResult(
success: false,
errorMessage: '删除账号失败,请重试',
);
}
}
}
/// 账号操作结果
class AccountOperationResult {
final bool success;
final String? message;
final String? errorMessage;
AccountOperationResult({
required this.success,
this.message,
this.errorMessage,
});
}

106
lib/modules/profile/controllers/profile_controller.dart

@ -7,14 +7,15 @@ import 'package:logger/logger.dart';
import '../../../data/models/user_Info.dart'; import '../../../data/models/user_Info.dart';
import '../../settings/controllers/settings_controller.dart'; import '../../settings/controllers/settings_controller.dart';
import 'dart:io'; import 'dart:io';
import 'dart:convert'; //import 'dart:convert';
import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:path_provider/path_provider.dart'; 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';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
import '../../../modules/login/controllers/googleLogin.dart'; //import '../../../modules/login/controllers/googleLogin.dart';
import '../../../modules/login/controllers/facebookLogin.dart'; //import '../../../modules/login/controllers/facebookLogin.dart';
import '../../../data/services/account_service.dart';
//import 'package:http_parser/http_parser.dart'; // 新增此导入 //import 'package:http_parser/http_parser.dart'; // 新增此导入
class ProfileController extends GetxController { class ProfileController extends GetxController {
@ -31,9 +32,14 @@ class ProfileController extends GetxController {
// 使用响应式变量 // 使用响应式变量
final currentLanguage = 'zh'.obs; final currentLanguage = 'zh'.obs;
// 账号服务
late final AccountService _accountService;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
// 获取或注册账号服务
_accountService = Get.find<AccountService>();
loadUserInfo(); loadUserInfo();
loadLanguagePreference(); loadLanguagePreference();
} }
@ -358,49 +364,41 @@ class ProfileController extends GetxController {
} }
} }
// 退出登录
Future<void> signOut() async { Future<void> signOut() async {
try { try {
//显示加载提示 // 显示加载提示
// Get.dialog( Get.dialog(
// const Center(child: CircularProgressIndicator()), const Center(child: CircularProgressIndicator()),
// barrierDismissible: false, barrierDismissible: false,
// ); );
// 清理所有存储 // 调用账号服务执行登出
await _storage.erase(); final result = await _accountService.signOut();
// 或者逐个清理关键存储项
await _storage.write("logintoken", null);
await _storage.write("user_info", null);
await _storage.write("local_avatar", null);
print('清理存储成功');
// 第三方登录退出
try {
final google = Google();
final facebook = Facebook();
await Future.wait([
google.signOutGoogle(),
facebook.signOutFacebook(),
]);
} catch (e) {
print('第三方登录退出错误: $e');
// 继续执行,不中断退出流程
}
// 关闭加载提示 // 关闭加载提示
//Get.back(); Get.back();
// 确保导航到登录页面 if (result.success) {
if (Get.currentRoute != Routes.login) { // 先显示成功提示
await Get.offAllNamed(Routes.login); Get.snackbar('成功', result.message ?? '已退出登录');
} Logger().d('退出登录成功');
Get.snackbar('成功', '已退出登录'); // 然后导航到登录页面
print('退出登录成功'); if (Get.currentRoute != Routes.login) {
await Get.offAllNamed(Routes.login);
}
} else {
Get.snackbar('错误', result.errorMessage ?? '退出登录失败,请重试');
Logger().e('退出登录失败: ${result.errorMessage}');
}
} catch (e) { } catch (e) {
//Get.back(); // 关闭加载提示 // 确保加载提示被关闭
if (Get.isDialogOpen ?? false) {
Get.back();
}
Get.snackbar('错误', '退出登录失败,请重试'); Get.snackbar('错误', '退出登录失败,请重试');
print('退出登录错误: $e'); Logger().e('退出登录错误: $e');
} }
} }
@ -413,24 +411,32 @@ class ProfileController extends GetxController {
barrierDismissible: false, barrierDismissible: false,
); );
// 删除后台用户数据 // 调用账号服务执行账号删除
final responce = await Api.deleteUser(); final result = await _accountService.deleteAccount();
if (responce == null) {
Get.back(); // 关闭加载提示
Get.snackbar('错误', '删除用户数据失败');
return;
}
// 关闭加载提示 // 关闭加载提示
Get.back(); Get.back();
signOut(); // 调用 signOut 方法 if (result.success) {
// 先显示成功提示
Get.snackbar('成功', result.message ?? '账号已被永久删除');
Logger().d('账号删除成功');
Get.snackbar('Success', 'Account has been permanently deleted'); // 然后导航到登录页面
Logger().d('账号删除成功'); if (Get.currentRoute != Routes.login) {
await Get.offAllNamed(Routes.login);
}
} else {
Get.snackbar('错误', result.errorMessage ?? '删除账号失败,请重试');
Logger().e('删除账号失败: ${result.errorMessage}');
}
} catch (e) { } catch (e) {
Get.back(); // 关闭加载提示 // 确保加载提示被关闭
if (Get.isDialogOpen ?? false) {
Get.back();
}
Get.snackbar('错误', '删除账号失败,请重试'); Get.snackbar('错误', '删除账号失败,请重试');
Logger().d('账号删除失败: $e'); Logger().e('删除账号失败: $e');
} }
} }
} }

Loading…
Cancel
Save