You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

196 lines
5.6 KiB

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<bool> 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>()) {
MemoryService.to.clear();
}
if (Get.isRegistered<MemoryReminderScheduler>()) {
unawaited(MemoryReminderScheduler.to.clear());
}
logger.d('用户数据清理成功');
return true;
} catch (e) {
logger.e('用户数据清理失败: $e');
return false;
}
}
Future<bool> clearAllUserData() async {
// 清理所有用户数据
try {
await _storage.erase();
User.clearUserSession();
BesDeviceAuth.reset();
if (Get.isRegistered<MemoryService>()) {
MemoryService.to.clear();
}
if (Get.isRegistered<MemoryReminderScheduler>()) {
unawaited(MemoryReminderScheduler.to.clear());
}
logger.d('所有用户数据清理成功');
return true;
} catch (e) {
logger.e('用户数据清理失败: $e');
return false;
}
}
/// 退出第三方登录
///
/// 返回操作是否成功
Future<bool> 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<AccountOperationResult> signOut() async {
try {
// 清除会议记录任务列表
final uploadService = Get.find<MeetingUploadService>();
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<AccountOperationResult> 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,
});
}