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.
176 lines
5.1 KiB
176 lines
5.1 KiB
import 'package:get_storage/get_storage.dart';
|
|
import '../../../core/utils/logger.dart';
|
|
|
|
class User {
|
|
// 单例实例
|
|
static User? _instance;
|
|
|
|
/// 安全地检查用户是否已经登录(即单例是否已初始化)
|
|
static bool isLoggedIn() {
|
|
return _instance != null;
|
|
}
|
|
|
|
// 单例访问器(增加空安全保护)
|
|
static User get instance {
|
|
if (_instance == null) {
|
|
throw Exception("User must be initialized first");
|
|
}
|
|
return _instance!;
|
|
}
|
|
|
|
// --- 新增 ---
|
|
/// 清理所有与用户会话相关的数据
|
|
static Future<void> clearUserSession() async {
|
|
final GetStorage storage = GetStorage();
|
|
// 1. 清理本地存储
|
|
await storage.remove('logintoken');
|
|
await storage.remove('user_info');
|
|
// 2. 清理内存中的单例
|
|
_instance = null;
|
|
Logger.i("User", "用户会话数据已安全清理。");
|
|
}
|
|
|
|
// 最终属性(不可变)
|
|
String name;
|
|
String uid;
|
|
String avatar;
|
|
String language;
|
|
String token;
|
|
String mail;
|
|
String phone;
|
|
String phonemac;
|
|
String password;
|
|
int viplv = 0; //添加会员等级字段,0表示普通用户
|
|
|
|
List<UserDevice> devices;
|
|
|
|
// 私有构造函数
|
|
User._({
|
|
required this.name,
|
|
required this.uid,
|
|
required this.avatar,
|
|
required this.language,
|
|
required this.token,
|
|
required this.mail,
|
|
required this.phone,
|
|
required this.phonemac,
|
|
required this.password,
|
|
required this.viplv,
|
|
required this.devices,
|
|
});
|
|
|
|
factory User.fromJson(Map<String, dynamic> json) {
|
|
// 修复1:安全获取嵌套的 user 字段
|
|
final userData = json['user'] as Map<String, dynamic>?; // 允许空值
|
|
final devicesData = json['devices'] as List<dynamic>?; // 允许空值
|
|
//final token = json['data']['token'] as String? ?? '';
|
|
//final token = '';
|
|
// 更新单例实例
|
|
return _instance = User._(
|
|
token: '',
|
|
//token: token as String? ?? '',
|
|
name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值
|
|
uid: (userData?['uid'] as String?) ?? '',
|
|
avatar: (userData?['avatar'] as String?) ?? '',
|
|
|
|
language: (userData?['language'] as String?) ?? 'en',
|
|
|
|
mail: (userData?['mail'] as String?) ?? '',
|
|
phone: (userData?['phone'] as String?) ?? '',
|
|
phonemac: (userData?['phonemac'] as String?) ?? '',
|
|
password: (userData?['password'] as String?) ?? '',
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值
|
|
devices: devicesData
|
|
?.map((e) => UserDevice.fromJson(e as Map<String, dynamic>))
|
|
.toList() ??
|
|
[], // 处理设备列表
|
|
);
|
|
}
|
|
factory User.fronTokenJson(Map<String, dynamic> json) {
|
|
// 修复1:安全获取嵌套的 user 字段
|
|
final userData = json['user'] as Map<String, dynamic>?; // 允许空值
|
|
final devicesData = json['devices'] as List<dynamic>?; // 允许空值
|
|
print("数据获取fronTokenJson$userData $devicesData");
|
|
// 更新单例实例
|
|
return _instance = User._(
|
|
token: '',
|
|
name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值
|
|
uid: (userData?['uid'] as String?) ?? '',
|
|
avatar: (userData?['avatar'] as String?) ?? '',
|
|
language: (userData?['language'] as String?) ?? 'en',
|
|
|
|
mail: (userData?['mail'] as String?) ?? '',
|
|
phone: (userData?['phone'] as String?) ?? '',
|
|
phonemac: (userData?['phonemac'] as String?) ?? '',
|
|
password: (userData?['password'] as String?) ?? '',
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值
|
|
devices: devicesData != null
|
|
? (devicesData)
|
|
.map((e) => UserDevice.fromJson(e as Map<String, dynamic>))
|
|
.toList()
|
|
: [], // 处理设备列表
|
|
);
|
|
}
|
|
|
|
// 完整的JSON序列化
|
|
Map<String, dynamic> toJson() => {
|
|
'user': {
|
|
'name': name,
|
|
'uid': uid,
|
|
'avatar': avatar,
|
|
'language': language,
|
|
'token': token,
|
|
'mail': mail,
|
|
'phone': phone,
|
|
'phonemac': phonemac,
|
|
'password': password,
|
|
'viplv': viplv,
|
|
'devices': devices.map((device) => device.toJson()).toList(),
|
|
},
|
|
};
|
|
|
|
// 添加设备
|
|
addUserDevice(UserDevice device) {
|
|
devices.add(device);
|
|
}
|
|
|
|
// 查找设备
|
|
removeUserDevice(int id) {
|
|
devices.removeWhere((device) => device.id == id);
|
|
}
|
|
}
|
|
|
|
class UserDevice {
|
|
int id;
|
|
String uid;
|
|
int devicetype;
|
|
String devicename;
|
|
String devicemac;
|
|
String license;
|
|
UserDevice({
|
|
required this.id,
|
|
required this.uid,
|
|
required this.devicetype,
|
|
required this.devicename,
|
|
required this.devicemac,
|
|
required this.license,
|
|
});
|
|
|
|
factory UserDevice.fromJson(Map<String, dynamic> json) => UserDevice(
|
|
id: json['id'] as int,
|
|
uid: json['uid'] as String,
|
|
devicetype: (json['devicetype'] as num).toInt(),
|
|
devicename: json['devicename'] as String,
|
|
devicemac: json['devicemac'] as String,
|
|
license: json['license'] as String,
|
|
);
|
|
|
|
toJson() => {
|
|
'id': id,
|
|
'uid': uid,
|
|
'devicetype': devicetype,
|
|
'devicename': devicename,
|
|
'devicemac': devicemac,
|
|
'license': license,
|
|
};
|
|
}
|
|
|