import 'dart:async'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:logger/logger.dart'; import '../../core/utils/synchrodata.dart'; import '../../modules/login/controllers/googleLogin.dart'; import '../services/network/api.dart'; import 'db/database_helper.dart'; import '../../data/models/user_Info.dart'; import 'meeting/meeting_upload_service.dart'; import 'bes_device_auth.dart'; import 'memory_reminder_scheduler.dart'; import 'memory_service.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); User.clearUserSession(); // 换账号后同一台耳机要重新登记到新账号名下, // 不清这个 set 的话「本进程已登记过」会把新账号的绑定吞掉。 BesDeviceAuth.reset(); // 拾忆是账号数据:不清的话换账号后会看到上一个人的日程、花销和灵感, // 排定的提醒也会继续按上一个账号的安排响。 if (Get.isRegistered()) { MemoryService.to.clear(); } if (Get.isRegistered()) { unawaited(MemoryReminderScheduler.to.clear()); } logger.d('用户数据清理成功'); return true; } catch (e) { logger.e('用户数据清理失败: $e'); return false; } } Future clearAllUserData() async { // 清理所有用户数据 try { await _storage.erase(); User.clearUserSession(); BesDeviceAuth.reset(); if (Get.isRegistered()) { MemoryService.to.clear(); } if (Get.isRegistered()) { unawaited(MemoryReminderScheduler.to.clear()); } logger.d('所有用户数据清理成功'); return true; } catch (e) { logger.e('用户数据清理失败: $e'); return false; } } /// 退出第三方登录 /// /// 返回操作是否成功 Future logoutThirdParty() async { try { logger.d('lxm--开始退出第三方登录'); 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 uploadService = Get.find(); uploadService.cancelUpload(); // 上传会议记录操作记录 await Synchrodata.uploadOperationRecords(); // 关闭数据库连接 await DatabaseHelper().close(); // 清理本地数据 final dataCleaned = await clearUserData(); if (!dataCleaned) { return AccountOperationResult( success: false, errorMessage: 'clearUserDataFailed'.tr, // 清理用户数据失败 ); } // 退出第三方登录 await logoutThirdParty(); return AccountOperationResult( success: true, message: 'loggedOut'.tr, ); } catch (e) { logger.e('登出过程发生错误: $e'); return AccountOperationResult( success: false, errorMessage: 'logoutFailedRetry'.tr, // 退出登录失败,请重试 ); } } /// 删除用户账号 /// /// 调用API删除账号,然后清理本地数据 /// 返回操作结果,包含成功状态和错误信息 Future deleteAccount() async { try { // 调用API删除账号 final response = await Api.deleteUser(); if (response == null) { return AccountOperationResult( success: false, errorMessage: 'deleteUserDataFailed'.tr, // 删除用户数据失败 ); } // 清理本地数据 final dataCleaned = await clearAllUserData(); // 一次性清除所有数据 if (!dataCleaned) { return AccountOperationResult( success: false, errorMessage: 'clearUserDataFailed'.tr, // 清理用户数据失败 ); } // 退出第三方登录 await logoutThirdParty(); return AccountOperationResult( success: true, message: 'accountPermanentlyDeleted'.tr, // 账号已被永久删除 ); } catch (e) { logger.e('删除账号过程发生错误: $e'); return AccountOperationResult( success: false, errorMessage: 'deleteAccountFailedRetry'.tr, // 删除账号失败,请重试 ); } } } /// 账号操作结果 class AccountOperationResult { final bool success; final String? message; final String? errorMessage; AccountOperationResult({ required this.success, this.message, this.errorMessage, }); }