Files
2026-09-15 15:44:13 +07:00

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'];
}
}