|
|
@ -1,10 +1,14 @@ |
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
|
|
|
import 'package:get/get.dart'; |
|
|
import '../../../core/utils/logger.dart'; |
|
|
import '../../../core/utils/logger.dart'; |
|
|
|
|
|
|
|
|
class User { |
|
|
class User { |
|
|
// 单例实例 |
|
|
// 单例实例 |
|
|
static User? _instance; |
|
|
static User? _instance; |
|
|
|
|
|
|
|
|
|
|
|
/// 全局刷新信号(当用户信息更新时 +1,用于驱动UI重建) |
|
|
|
|
|
static final RxInt refreshTick = 0.obs; |
|
|
|
|
|
|
|
|
/// 安全地检查用户是否已经登录(即单例是否已初始化) |
|
|
/// 安全地检查用户是否已经登录(即单例是否已初始化) |
|
|
static bool isLoggedIn() { |
|
|
static bool isLoggedIn() { |
|
|
return _instance != null; |
|
|
return _instance != null; |
|
|
@ -41,7 +45,6 @@ class User { |
|
|
String phonemac; |
|
|
String phonemac; |
|
|
String password; |
|
|
String password; |
|
|
int viplv = 0; //添加会员等级字段,0表示普通用户 |
|
|
int viplv = 0; //添加会员等级字段,0表示普通用户 |
|
|
// 新增的会员与用量统计字段 |
|
|
|
|
|
int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) |
|
|
int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) |
|
|
int tradetotaltime = 0; // 翻译总时长 |
|
|
int tradetotaltime = 0; // 翻译总时长 |
|
|
int meettotaltime = 0; // 会议总时长 |
|
|
int meettotaltime = 0; // 会议总时长 |
|
|
@ -63,6 +66,13 @@ class User { |
|
|
required this.phonemac, |
|
|
required this.phonemac, |
|
|
required this.password, |
|
|
required this.password, |
|
|
required this.viplv, |
|
|
required this.viplv, |
|
|
|
|
|
required this.viptime, |
|
|
|
|
|
required this.aichattotaltimer, |
|
|
|
|
|
required this.meettotaltime, |
|
|
|
|
|
required this.tradetotaltime, |
|
|
|
|
|
required this.aichattimer, |
|
|
|
|
|
required this.meettime, |
|
|
|
|
|
required this.tradetime, |
|
|
required this.devices, |
|
|
required this.devices, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
@ -79,20 +89,28 @@ class User { |
|
|
name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值 |
|
|
name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值 |
|
|
uid: (userData?['uid'] as String?) ?? '', |
|
|
uid: (userData?['uid'] as String?) ?? '', |
|
|
avatar: (userData?['avatar'] as String?) ?? '', |
|
|
avatar: (userData?['avatar'] as String?) ?? '', |
|
|
|
|
|
|
|
|
language: (userData?['language'] as String?) ?? 'en', |
|
|
language: (userData?['language'] as String?) ?? 'en', |
|
|
|
|
|
|
|
|
mail: (userData?['mail'] as String?) ?? '', |
|
|
mail: (userData?['mail'] as String?) ?? '', |
|
|
phone: (userData?['phone'] as String?) ?? '', |
|
|
phone: (userData?['phone'] as String?) ?? '', |
|
|
phonemac: (userData?['phonemac'] as String?) ?? '', |
|
|
phonemac: (userData?['phonemac'] as String?) ?? '', |
|
|
password: (userData?['password'] as String?) ?? '', |
|
|
password: (userData?['password'] as String?) ?? '', |
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 |
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 |
|
|
|
|
|
viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 |
|
|
|
|
|
|
|
|
|
|
|
aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, |
|
|
|
|
|
meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, |
|
|
|
|
|
tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, |
|
|
|
|
|
aichattimer: (userData?['aichattimer'] as int?) ?? 0, |
|
|
|
|
|
meettime: (userData?['meettime'] as int?) ?? 0, |
|
|
|
|
|
tradetime: (userData?['tradetime'] as int?) ?? 0, |
|
|
|
|
|
|
|
|
devices: devicesData |
|
|
devices: devicesData |
|
|
?.map((e) => UserDevice.fromJson(e as Map<String, dynamic>)) |
|
|
?.map((e) => UserDevice.fromJson(e as Map<String, dynamic>)) |
|
|
.toList() ?? |
|
|
.toList() ?? |
|
|
[], // 处理设备列表 |
|
|
[], // 处理设备列表 |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
factory User.fronTokenJson(Map<String, dynamic> json) { |
|
|
factory User.fronTokenJson(Map<String, dynamic> json) { |
|
|
// 修复1:安全获取嵌套的 user 字段 |
|
|
// 修复1:安全获取嵌套的 user 字段 |
|
|
final userData = json['user'] as Map<String, dynamic>?; // 允许空值 |
|
|
final userData = json['user'] as Map<String, dynamic>?; // 允许空值 |
|
|
@ -111,6 +129,13 @@ class User { |
|
|
phonemac: (userData?['phonemac'] as String?) ?? '', |
|
|
phonemac: (userData?['phonemac'] as String?) ?? '', |
|
|
password: (userData?['password'] as String?) ?? '', |
|
|
password: (userData?['password'] as String?) ?? '', |
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 |
|
|
viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 |
|
|
|
|
|
viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 |
|
|
|
|
|
aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, |
|
|
|
|
|
meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, |
|
|
|
|
|
tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, |
|
|
|
|
|
aichattimer: (userData?['aichattimer'] as int?) ?? 0, |
|
|
|
|
|
meettime: (userData?['meettime'] as int?) ?? 0, |
|
|
|
|
|
tradetime: (userData?['tradetime'] as int?) ?? 0, |
|
|
devices: devicesData != null |
|
|
devices: devicesData != null |
|
|
? (devicesData) |
|
|
? (devicesData) |
|
|
.map((e) => UserDevice.fromJson(e as Map<String, dynamic>)) |
|
|
.map((e) => UserDevice.fromJson(e as Map<String, dynamic>)) |
|
|
@ -119,6 +144,29 @@ class User { |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
updateUserInfo(Map<String, dynamic> user) { |
|
|
|
|
|
name = user['name'] as String? ?? name; |
|
|
|
|
|
uid = user['uid'] as String? ?? uid; |
|
|
|
|
|
avatar = user['avatar'] as String? ?? avatar; |
|
|
|
|
|
language = user['language'] as String? ?? language; |
|
|
|
|
|
token = user['token'] as String? ?? token; |
|
|
|
|
|
mail = user['mail'] as String? ?? mail; |
|
|
|
|
|
phone = user['phone'] as String? ?? phone; |
|
|
|
|
|
phonemac = user['phonemac'] as String? ?? phonemac; |
|
|
|
|
|
password = user['password'] as String? ?? password; |
|
|
|
|
|
viplv = user['viplv'] as int? ?? viplv; |
|
|
|
|
|
viptime = user['viptime'] as int? ?? viptime; |
|
|
|
|
|
tradetotaltime = user['tradetotaltime'] as int? ?? tradetotaltime; |
|
|
|
|
|
meettotaltime = user['meettotaltime'] as int? ?? meettotaltime; |
|
|
|
|
|
aichattotaltimer = user['aichattotaltimer'] as int? ?? aichattotaltimer; |
|
|
|
|
|
tradetime = user['tradetime'] as int? ?? tradetime; |
|
|
|
|
|
meettime = user['meettime'] as int? ?? meettime; |
|
|
|
|
|
aichattimer = user['aichattimer'] as int? ?? aichattimer; |
|
|
|
|
|
|
|
|
|
|
|
// 触发全局刷新信号,驱动依赖UI重建 |
|
|
|
|
|
refreshTick.value++; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 完整的JSON序列化 |
|
|
// 完整的JSON序列化 |
|
|
Map<String, dynamic> toJson() => { |
|
|
Map<String, dynamic> toJson() => { |
|
|
'user': { |
|
|
'user': { |
|
|
@ -135,8 +183,7 @@ class User { |
|
|
'viptime': viptime, |
|
|
'viptime': viptime, |
|
|
'tradetotaltime': tradetotaltime, |
|
|
'tradetotaltime': tradetotaltime, |
|
|
'meettotaltime': meettotaltime, |
|
|
'meettotaltime': meettotaltime, |
|
|
// 序列化统一使用 aichattotaltime 键 |
|
|
'aichattotaltimer': aichattotaltimer, |
|
|
'aichattotaltime': aichattotaltimer, |
|
|
|
|
|
'tradetime': tradetime, |
|
|
'tradetime': tradetime, |
|
|
'meettime': meettime, |
|
|
'meettime': meettime, |
|
|
'aichattimer': aichattimer, |
|
|
'aichattimer': aichattimer, |
|
|
|