From eb5144a5f525590b7a971cb5ec346dc189029d2b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 18 Jun 2025 19:17:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=B4=A6=E5=8F=B7=E6=9C=8D=E5=8A=A1):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B4=A6=E5=8F=B7=E7=AE=A1=E7=90=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=B9=B6=E9=9B=86=E6=88=90=E5=88=B0=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建AccountService处理账号相关操作包括登出和删除 - 在InitialBinding中注册账号服务 - 重构ProfileController使用账号服务处理登出和删除逻辑 - 添加操作结果封装类AccountOperationResult --- lib/core/bindings/initial_binding.dart | 4 + lib/data/services/account_service.dart | 144 ++++++++++++++++++ .../controllers/profile_controller.dart | 106 +++++++------ 3 files changed, 204 insertions(+), 50 deletions(-) create mode 100644 lib/data/services/account_service.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index c6539c0e2..08bb41500 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -9,6 +9,7 @@ import '../../data/services/language_manager.dart'; import '../../core/utils/logger.dart'; import '../../data/services/bluetooth_manager.dart'; import '../../data/services/ble_manager.dart'; +import '../../data/services/account_service.dart'; /// 初始绑定,用于管理全局依赖 class InitialBinding extends Bindings { @@ -42,6 +43,9 @@ class InitialBinding extends Bindings { // 火山AI服务 // Get.lazyPut(() => VolcanoAIService(), fenix: true); + // 账号管理服务 + Get.lazyPut(() => AccountService(), fenix: true); + // 杰理蓝牙服务 // // 语言管理器(需要最先初始化) diff --git a/lib/data/services/account_service.dart b/lib/data/services/account_service.dart new file mode 100644 index 000000000..6c01ac65c --- /dev/null +++ b/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 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 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 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 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, + }); +} diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index bea4404c0..1dae96f4f 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -7,14 +7,15 @@ import 'package:logger/logger.dart'; import '../../../data/models/user_Info.dart'; import '../../settings/controllers/settings_controller.dart'; import 'dart:io'; -import 'dart:convert'; +//import 'dart:convert'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:path_provider/path_provider.dart'; import '../../../data/services/network/api.dart'; import 'package:dio/dio.dart'; import '../../../routes/app_routes.dart'; -import '../../../modules/login/controllers/googleLogin.dart'; -import '../../../modules/login/controllers/facebookLogin.dart'; +//import '../../../modules/login/controllers/googleLogin.dart'; +//import '../../../modules/login/controllers/facebookLogin.dart'; +import '../../../data/services/account_service.dart'; //import 'package:http_parser/http_parser.dart'; // 新增此导入 class ProfileController extends GetxController { @@ -31,9 +32,14 @@ class ProfileController extends GetxController { // 使用响应式变量 final currentLanguage = 'zh'.obs; + // 账号服务 + late final AccountService _accountService; + @override void onInit() { super.onInit(); + // 获取或注册账号服务 + _accountService = Get.find(); loadUserInfo(); loadLanguagePreference(); } @@ -358,49 +364,41 @@ class ProfileController extends GetxController { } } + // 退出登录 Future signOut() async { try { - //显示加载提示 - // Get.dialog( - // const Center(child: CircularProgressIndicator()), - // barrierDismissible: false, - // ); - - // 清理所有存储 - await _storage.erase(); - // 或者逐个清理关键存储项 - 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.dialog( + const Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); + + // 调用账号服务执行登出 + final result = await _accountService.signOut(); // 关闭加载提示 - //Get.back(); + Get.back(); - // 确保导航到登录页面 - if (Get.currentRoute != Routes.login) { - await Get.offAllNamed(Routes.login); - } + if (result.success) { + // 先显示成功提示 + 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) { - //Get.back(); // 关闭加载提示 + // 确保加载提示被关闭 + if (Get.isDialogOpen ?? false) { + Get.back(); + } Get.snackbar('错误', '退出登录失败,请重试'); - print('退出登录错误: $e'); + Logger().e('退出登录错误: $e'); } } @@ -413,24 +411,32 @@ class ProfileController extends GetxController { barrierDismissible: false, ); - // 删除后台用户数据 - final responce = await Api.deleteUser(); - if (responce == null) { - Get.back(); // 关闭加载提示 - Get.snackbar('错误', '删除用户数据失败'); - return; - } + // 调用账号服务执行账号删除 + final result = await _accountService.deleteAccount(); + // 关闭加载提示 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) { - Get.back(); // 关闭加载提示 + // 确保加载提示被关闭 + if (Get.isDialogOpen ?? false) { + Get.back(); + } Get.snackbar('错误', '删除账号失败,请重试'); - Logger().d('账号删除失败: $e'); + Logger().e('删除账号失败: $e'); } } }