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.
178 lines
4.9 KiB
178 lines
4.9 KiB
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';
|
|
|
|
/// 账号管理服务
|
|
///
|
|
/// 负责处理所有与用户账号相关的操作,包括登出和账号删除
|
|
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();
|
|
logger.d('用户数据清理成功');
|
|
return true;
|
|
} catch (e) {
|
|
logger.e('用户数据清理失败: $e');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Future<bool> clearAllUserData() async {
|
|
// 清理所有用户数据
|
|
try {
|
|
await _storage.erase();
|
|
User.clearUserSession();
|
|
BesDeviceAuth.reset();
|
|
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,
|
|
});
|
|
}
|
|
|