140 lines
4.3 KiB
Dart
140 lines
4.3 KiB
Dart
import 'package:hgdj/assets_tool/images.dart';
|
|
|
|
/// 用户信息
|
|
class UserInfoModel {
|
|
// —— 基础资料 ——
|
|
int? uid; // 用户ID
|
|
String? name; // 昵称
|
|
String? portrait; // 头像
|
|
String? gender; // 性别
|
|
String? summary; // 个性签名
|
|
String? mobile; // 手机号
|
|
int? urrPortraitStatus; // 头像审核状态
|
|
|
|
// —— 账号 / 登录 ——
|
|
String? token; // 登录 token
|
|
String? devID; // 设备 ID
|
|
String? createdAt; // 注册时间
|
|
String? districtCode; // 渠道码
|
|
|
|
// —— 社交统计 ——
|
|
int? fans; // 粉丝数
|
|
int? likeCount; // 获赞数
|
|
bool? isFollow; // 是否已关注
|
|
|
|
// —— 会员 / VIP ——
|
|
bool? isVip; // 是否会员
|
|
int? vipLevel; // 会员等级 1-影片会员 2-ACG会员 3-超级会员(一卡通)
|
|
String? vipName; // 会员名称
|
|
String? vipExpireDate; // 会员到期时间
|
|
bool? isUpgrade; // 是否可升级
|
|
|
|
// —— 推广 / 邀请 ——
|
|
String? promoteURL; // 推广链接
|
|
String? promotionCode; // 我的邀请码
|
|
String? inviterCode; // 邀请人邀请码
|
|
|
|
// —— 金币 / 观影券 / 权益 ——
|
|
bool allGoldVideoFree = false; // 是否全场金币视频免费
|
|
String? goldVideoFreeExpire; // 金币视频免费权益到期时间
|
|
List<MyCoupon>? goldVideoCoupon; // 观影券列表
|
|
String? broadcastExpire; // 直播观看权益有效期
|
|
String? dramaExpire; // 短剧卡到期时间,晚于当前时间就是有短剧权益
|
|
int? payVidDiscount; // 付费视频折扣
|
|
|
|
// —— 创作 / 等级 ——
|
|
int? vidUploadCount; // 视频上传数
|
|
int? coverUploadCount; // 封面上传数
|
|
int? level; // 当前等级
|
|
|
|
// —— 状态 / 权限 ——
|
|
int? adverAbTestShowType; // 广告AB -1-首次进app免广告 0-全部展示 其他N-注册后N分钟内免广告(分层后固定不变)
|
|
|
|
// ============ 计算属性 ============
|
|
|
|
/// 观影券总数量
|
|
int get couponCount =>
|
|
(goldVideoCoupon ?? []).fold(0, (sum, e) => sum + (e.count ?? 0));
|
|
|
|
/// 可解锁该金币视频的观影券面额:券面额需 >= 视频金币,都不够就退回第一张
|
|
int? couponGold(int? originCoins) {
|
|
final coupons = goldVideoCoupon ?? [];
|
|
for (final coupon in coupons) {
|
|
if ((coupon.gold ?? 0) >= (originCoins ?? 0)) return coupon.gold ?? 0;
|
|
}
|
|
return coupons.isEmpty ? null : coupons.first.gold;
|
|
}
|
|
|
|
/// 作品总数(视频上传 + 封面上传)
|
|
int get totalWorkCount => (vidUploadCount ?? 0) + (coverUploadCount ?? 0);
|
|
|
|
/// 会员等级对应的角标图片;等级 1~4,0 级(含推广会员)无角标
|
|
String get vipImageName {
|
|
final level = vipLevel ?? 0;
|
|
if (level < 1) return "";
|
|
return "vip_${level.clamp(1, 4)}.webp".mineImgPath;
|
|
}
|
|
|
|
/// 是否充值会员
|
|
bool get isRechargeVIP => (isVip ?? false) && (vipLevel ?? 0) > 0;
|
|
|
|
// ============ 序列化 ============
|
|
|
|
UserInfoModel.fromJson(Map<String, dynamic>? map) {
|
|
map ??= {};
|
|
uid = map['uid'];
|
|
name = map['name'];
|
|
portrait = map['portrait'];
|
|
gender = map['gender'];
|
|
summary = map['summary'];
|
|
mobile = map['mobile'];
|
|
urrPortraitStatus = map['urrPortraitStatus'];
|
|
|
|
token = map['token'];
|
|
devID = map['devID'];
|
|
createdAt = map['createdAt'];
|
|
districtCode = map['districtCode'];
|
|
|
|
fans = map['fans'];
|
|
likeCount = map['likeCount'];
|
|
isFollow = map['isFollow'];
|
|
|
|
isVip = map['isVip'];
|
|
vipLevel = map['vipLevel'];
|
|
vipName = map['vipName'];
|
|
vipExpireDate = map['vipExpireDate'];
|
|
isUpgrade = map['isUpgrade'];
|
|
|
|
promoteURL = map['promoteURL'];
|
|
promotionCode = map['promotionCode'];
|
|
inviterCode = map['inviterCode'];
|
|
|
|
allGoldVideoFree = map['allGoldVideoFree'] ?? false;
|
|
goldVideoFreeExpire = map['goldVideoFreeExpire'];
|
|
goldVideoCoupon = (map['goldVideoCoupon'] as List?)
|
|
?.map((o) => MyCoupon.fromJson(o))
|
|
.toList();
|
|
broadcastExpire = map['broadcastExpire'];
|
|
dramaExpire = map['dramaExpire'];
|
|
payVidDiscount = map['payVidDiscount'];
|
|
|
|
vidUploadCount = map['vidUploadCount'];
|
|
coverUploadCount = map['coverUploadCount'];
|
|
level = map['level'];
|
|
|
|
adverAbTestShowType = map['adverAbTestShowType'];
|
|
}
|
|
}
|
|
|
|
/// 观影券
|
|
class MyCoupon {
|
|
int? gold; // 券面额(金币)
|
|
int? count; // 数量
|
|
|
|
MyCoupon.fromJson(Map<String, dynamic>? map) {
|
|
map ??= {};
|
|
gold = map['gold'];
|
|
count = map['count'];
|
|
}
|
|
}
|