diff --git a/lib/http/api.dart b/lib/http/api.dart index b8c5c47c..5c772654 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -1,6 +1,6 @@ class Api { // 推荐视频 - static const String recommendList = '/x/web-interface/index/top/rcmd'; + static const String recommendList = '/x/web-interface/index/top/feed/rcmd'; // 热门视频 static const String hotList = '/x/web-interface/popular'; diff --git a/lib/http/video.dart b/lib/http/video.dart index d5c0cf05..cf46d5a4 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -19,8 +19,7 @@ class VideoHttp { var res = await Request().get( Api.recommendList, data: { - 'user-agent': Request().headerUa('mob'), - 'feed_version': 'V4', + 'feed_version': 'V3', 'ps': ps, 'fresh_idx': freshIdx, }, @@ -203,21 +202,20 @@ class VideoHttp { int? root, int? parent, }) async { - if(message == ''){ + if (message == '') { return {'status': false, 'data': [], 'msg': '请输入评论内容'}; } print('root:$root'); print('parent: $parent'); - var res = await Request() - .post(Api.replyAdd, queryParameters: { - 'type': type.index, - 'oid': oid, - 'root': root ?? '', - 'parent': parent == null || parent == 0 ? '' : parent, - 'message': message, - 'csrf': await Request.getCsrf(), - }); + var res = await Request().post(Api.replyAdd, queryParameters: { + 'type': type.index, + 'oid': oid, + 'root': root ?? '', + 'parent': parent == null || parent == 0 ? '' : parent, + 'message': message, + 'csrf': await Request.getCsrf(), + }); log(res.toString()); if (res.data['code'] == 0) { return {'status': true, 'data': res.data['data']}; diff --git a/lib/models/user/info.dart b/lib/models/user/info.dart index b51c68f0..143c4db2 100644 --- a/lib/models/user/info.dart +++ b/lib/models/user/info.dart @@ -1,3 +1,8 @@ +import 'package:hive/hive.dart'; + +part 'info.g.dart'; + +@HiveType(typeId: 4) class UserInfoData { UserInfoData({ this.isLogin, @@ -25,30 +30,53 @@ class UserInfoData { this.hasShop, this.shopUrl, }); - + @HiveField(0) bool? isLogin; + @HiveField(1) int? emailVerified; + @HiveField(2) String? face; + @HiveField(3) LevelInfo? levelInfo; + @HiveField(4) int? mid; + @HiveField(5) int? mobileVerified; + @HiveField(6) int? money; + @HiveField(7) int? moral; + @HiveField(8) Map? official; + @HiveField(9) Map? officialVerify; + @HiveField(10) Map? pendant; + @HiveField(11) int? scores; + @HiveField(12) String? uname; + @HiveField(13) int? vipDueDate; + @HiveField(14) int? vipStatus; + @HiveField(15) int? vipType; + @HiveField(16) int? vipPayType; + @HiveField(17) int? vipThemeType; + @HiveField(18) Map? vipLabel; + @HiveField(19) int? vipAvatarSub; + @HiveField(20) String? vipNicknameColor; + @HiveField(21) Map? wallet; + @HiveField(22) bool? hasShop; + @HiveField(23) String? shopUrl; UserInfoData.fromJson(Map json) { @@ -81,6 +109,7 @@ class UserInfoData { } } +@HiveType(typeId: 5) class LevelInfo { LevelInfo({ this.currentLevel, @@ -88,10 +117,13 @@ class LevelInfo { this.currentExp, this.nextExp, }); - + @HiveField(0) int? currentLevel; + @HiveField(1) int? currentMin; + @HiveField(2) int? currentExp; + @HiveField(3) int? nextExp; LevelInfo.fromJson(Map json) { diff --git a/lib/models/user/info.g.dart b/lib/models/user/info.g.dart new file mode 100644 index 00000000..ed3aa62c --- /dev/null +++ b/lib/models/user/info.g.dart @@ -0,0 +1,153 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'info.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserInfoDataAdapter extends TypeAdapter { + @override + final int typeId = 4; + + @override + UserInfoData read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return UserInfoData( + isLogin: fields[0] as bool?, + emailVerified: fields[1] as int?, + face: fields[2] as String?, + levelInfo: fields[3] as LevelInfo?, + mid: fields[4] as int?, + mobileVerified: fields[5] as int?, + money: fields[6] as int?, + moral: fields[7] as int?, + official: (fields[8] as Map?)?.cast(), + officialVerify: (fields[9] as Map?)?.cast(), + pendant: (fields[10] as Map?)?.cast(), + scores: fields[11] as int?, + uname: fields[12] as String?, + vipDueDate: fields[13] as int?, + vipStatus: fields[14] as int?, + vipType: fields[15] as int?, + vipPayType: fields[16] as int?, + vipThemeType: fields[17] as int?, + vipLabel: (fields[18] as Map?)?.cast(), + vipAvatarSub: fields[19] as int?, + vipNicknameColor: fields[20] as String?, + wallet: (fields[21] as Map?)?.cast(), + hasShop: fields[22] as bool?, + shopUrl: fields[23] as String?, + ); + } + + @override + void write(BinaryWriter writer, UserInfoData obj) { + writer + ..writeByte(24) + ..writeByte(0) + ..write(obj.isLogin) + ..writeByte(1) + ..write(obj.emailVerified) + ..writeByte(2) + ..write(obj.face) + ..writeByte(3) + ..write(obj.levelInfo) + ..writeByte(4) + ..write(obj.mid) + ..writeByte(5) + ..write(obj.mobileVerified) + ..writeByte(6) + ..write(obj.money) + ..writeByte(7) + ..write(obj.moral) + ..writeByte(8) + ..write(obj.official) + ..writeByte(9) + ..write(obj.officialVerify) + ..writeByte(10) + ..write(obj.pendant) + ..writeByte(11) + ..write(obj.scores) + ..writeByte(12) + ..write(obj.uname) + ..writeByte(13) + ..write(obj.vipDueDate) + ..writeByte(14) + ..write(obj.vipStatus) + ..writeByte(15) + ..write(obj.vipType) + ..writeByte(16) + ..write(obj.vipPayType) + ..writeByte(17) + ..write(obj.vipThemeType) + ..writeByte(18) + ..write(obj.vipLabel) + ..writeByte(19) + ..write(obj.vipAvatarSub) + ..writeByte(20) + ..write(obj.vipNicknameColor) + ..writeByte(21) + ..write(obj.wallet) + ..writeByte(22) + ..write(obj.hasShop) + ..writeByte(23) + ..write(obj.shopUrl); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserInfoDataAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class LevelInfoAdapter extends TypeAdapter { + @override + final int typeId = 5; + + @override + LevelInfo read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return LevelInfo( + currentLevel: fields[0] as int?, + currentMin: fields[1] as int?, + currentExp: fields[2] as int?, + nextExp: fields[3] as int?, + ); + } + + @override + void write(BinaryWriter writer, LevelInfo obj) { + writer + ..writeByte(4) + ..writeByte(0) + ..write(obj.currentLevel) + ..writeByte(1) + ..write(obj.currentMin) + ..writeByte(2) + ..write(obj.currentExp) + ..writeByte(3) + ..write(obj.nextExp); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LevelInfoAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index db73fd6f..ccaaf06e 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -1,10 +1,8 @@ -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/models/user/stat.dart'; -import 'package:pilipala/pages/main/controller.dart'; import 'package:pilipala/utils/storage.dart'; class MineController extends GetxController { @@ -14,6 +12,17 @@ class MineController extends GetxController { Rx userStat = UserStat().obs; Box user = GStrorage.user; RxBool userLogin = false.obs; + Box userInfoCache = GStrorage.userInfo; + + @override + onInit() { + super.onInit(); + + if (userInfoCache.get('userInfoCache') != null) { + print(userInfoCache.get('userInfoCache')); + userInfo.value = userInfoCache.get('userInfoCache'); + } + } onLogin() { Get.toNamed( @@ -34,6 +43,7 @@ class MineController extends GetxController { if (res['status']) { if (res['data'].isLogin) { userInfo.value = res['data']; + userInfoCache.put('userInfoCache', res['data']); user.put(UserBoxKey.userName, res['data'].uname); user.put(UserBoxKey.userFace, res['data'].face); user.put(UserBoxKey.userMid, res['data'].mid); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 108b9b74..af22869a 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -3,10 +3,12 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:path_provider/path_provider.dart'; import 'package:pilipala/models/model_owner.dart'; import 'package:pilipala/models/model_rec_video_item.dart'; +import 'package:pilipala/models/user/info.dart'; class GStrorage { static late final Box user; static late final Box recVideo; + static late final Box userInfo; static Future init() async { final dir = await getApplicationDocumentsDirectory(); @@ -17,11 +19,15 @@ class GStrorage { Hive.registerAdapter(RcmdReasonAdapter()); Hive.registerAdapter(StatAdapter()); Hive.registerAdapter(OwnerAdapter()); + Hive.registerAdapter(UserInfoDataAdapter()); + Hive.registerAdapter(LevelInfoAdapter()); // 用户信息 user = await Hive.openBox('user'); // 首页推荐视频 recVideo = await Hive.openBox('recVideo'); + // 登录用户信息 + userInfo = await Hive.openBox('userInfo'); } }