From 83341cd62b7140f5ce290a8f7ba521f574a65022 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 20 Aug 2023 14:28:50 +0800 Subject: [PATCH] =?UTF-8?q?mod:=20=E6=9C=AC=E5=9C=B0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=BF=AE=E6=94=B9=E3=80=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/http/init.dart | 12 ++- lib/http/interceptor.dart | 5 +- lib/http/user.dart | 9 +- lib/http/video.dart | 7 +- lib/models/user/info.dart | 6 +- lib/pages/bangumi/controller.dart | 10 +- .../bangumi/introduction/controller.dart | 10 +- lib/pages/bangumi/introduction/view.dart | 2 +- lib/pages/dynamics/controller.dart | 6 +- lib/pages/dynamics/view.dart | 2 +- lib/pages/dynamics/widgets/up_panel.dart | 8 +- lib/pages/fan/controller.dart | 11 +- lib/pages/fav/controller.dart | 10 +- lib/pages/follow/controller.dart | 11 +- lib/pages/home/controller.dart | 12 ++- lib/pages/home/widgets/app_bar.dart | 7 +- lib/pages/media/controller.dart | 10 +- lib/pages/member/controller.dart | 8 +- lib/pages/mine/controller.dart | 22 ++-- lib/pages/setting/controller.dart | 12 ++- lib/pages/setting/privacy_setting.dart | 6 +- lib/pages/video/detail/controller.dart | 6 +- .../video/detail/introduction/controller.dart | 14 +-- lib/pages/video/detail/introduction/view.dart | 2 +- lib/pages/webview/controller.dart | 101 +++++++++--------- lib/pages/webview/view.dart | 23 +++- lib/utils/data.dart | 4 +- lib/utils/storage.dart | 38 +++---- lib/utils/wbi_sign.dart | 10 +- 29 files changed, 217 insertions(+), 167 deletions(-) diff --git a/lib/http/init.dart b/lib/http/init.dart index 05bf5e28..5f9e1e2b 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -20,7 +20,7 @@ class Request { /// 设置cookie static setCookie() async { - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; var cookiePath = await Utils.getCookiePath(); var cookieJar = PersistCookieJar( ignoreExpires: true, @@ -30,7 +30,8 @@ class Request { dio.interceptors.add(cookieManager); var cookie = await cookieManager.cookieJar .loadForRequest(Uri.parse(HttpString.baseUrl)); - if (user.get(UserBoxKey.userMid) != null) { + var userInfo = userInfoCache.get('userInfoCache'); + if (userInfo != null && userInfo.mid != null) { var cookie2 = await cookieManager.cookieJar .loadForRequest(Uri.parse(HttpString.tUrl)); if (cookie2.isEmpty) { @@ -86,9 +87,10 @@ class Request { }, ); - Box user = GStrorage.user; - if (user.get(UserBoxKey.userMid) != null) { - options.headers['x-bili-mid'] = user.get(UserBoxKey.userMid).toString(); + Box userInfoCache = GStrorage.userInfo; + var userInfo = userInfoCache.get('userInfoCache'); + if (userInfo != null && userInfo.mid != null) { + options.headers['x-bili-mid'] = userInfo.mid.toString(); options.headers['env'] = 'prod'; options.headers['app-key'] = 'android64'; options.headers['x-bili-aurora-eid'] = 'UlMFQVcABlAH'; diff --git a/lib/http/interceptor.dart b/lib/http/interceptor.dart index 2521d02d..9a86fbb9 100644 --- a/lib/http/interceptor.dart +++ b/lib/http/interceptor.dart @@ -17,7 +17,7 @@ class ApiInterceptor extends Interceptor { handler.next(options); } - Box user = GStrorage.user; + Box localCache = GStrorage.localCache; @override void onResponse(Response response, ResponseInterceptorHandler handler) { @@ -29,7 +29,8 @@ class ApiInterceptor extends Interceptor { final uri = Uri.parse(locations.first); final accessKey = uri.queryParameters['access_key']; final mid = uri.queryParameters['mid']; - user.put(UserBoxKey.accessKey, {'mid': mid, 'value': accessKey}); + localCache + .put(LocalCacheKey.accessKey, {'mid': mid, 'value': accessKey}); } } } diff --git a/lib/http/user.dart b/lib/http/user.dart index 050470fb..26739b02 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -1,3 +1,4 @@ +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/http/api.dart'; import 'package:pilipala/http/init.dart'; @@ -197,8 +198,12 @@ class UserHttp { 'sign': Constants.thirdSign, }, ); - if (res.data['code'] == 0 && res.data['data']['has_login'] == 1) { - Request().get(res.data['data']['confirm_uri']); + try { + if (res.data['code'] == 0 && res.data['data']['has_login'] == 1) { + Request().get(res.data['data']['confirm_uri']); + } + } catch (err) { + SmartDialog.showNotify(msg: '获取用户凭证: $err', notifyType: NotifyType.error); } } diff --git a/lib/http/video.dart b/lib/http/video.dart index 18048377..5d3098d7 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -18,7 +18,7 @@ import 'package:pilipala/utils/storage.dart'; /// 返回{'status': bool, 'data': List} /// view层根据 status 判断渲染逻辑 class VideoHttp { - static Box user = GStrorage.user; + static Box localCache = GStrorage.localCache; static Box setting = GStrorage.setting; // 首页推荐视频 @@ -61,8 +61,9 @@ class VideoHttp { 'device_name': 'vivo', 'pull': freshIdx == 0 ? 'true' : 'false', 'appkey': Constants.appKey, - 'access_key': - user.get(UserBoxKey.accessKey, defaultValue: {})['value'] ?? '' + 'access_key': localCache + .get(LocalCacheKey.accessKey, defaultValue: {})['value'] ?? + '' }, ); if (res.data['code'] == 0) { diff --git a/lib/models/user/info.dart b/lib/models/user/info.dart index 143c4db2..0dbaaf5c 100644 --- a/lib/models/user/info.dart +++ b/lib/models/user/info.dart @@ -93,7 +93,7 @@ class UserInfoData { official = json['official']; officialVerify = json['officialVerify']; pendant = json['pendant']; - scores = json['scores']; + // scores = json['scores']; uname = json['uname']; vipDueDate = json['vipDueDate']; vipStatus = json['vipStatus']; @@ -130,6 +130,8 @@ class LevelInfo { currentLevel = json['current_level']; currentMin = json['current_min']; currentExp = json['current_exp']; - nextExp = json['next_exp']; + // nextExp = json['next_exp']; + nextExp = + json['current_level'] == 6 ? json['current_exp'] : json['next_exp']; } } diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index 7f9f6a61..73b56625 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -11,17 +11,19 @@ class BangumiController extends GetxController { RxList bangumiFollowList = [BangumiListItemModel()].obs; int _currentPage = 1; bool isLoadingMore = true; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; RxBool userLogin = false.obs; late int mid; + var userInfo; @override void onInit() { super.onInit(); - if (user.get(UserBoxKey.userMid) != null) { - mid = int.parse(user.get(UserBoxKey.userMid).toString()); + userInfo = userInfoCache.get('userInfoCache'); + if (userInfo != null) { + mid = userInfo.mid; } - userLogin.value = user.get(UserBoxKey.userLogin) != null; + userLogin.value = userInfo != null; } Future queryBangumiListFeed({type = 'init'}) async { diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index b0ce9452..e63e797d 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -49,7 +49,7 @@ class BangumiIntroController extends GetxController { RxBool hasCoin = false.obs; // 是否收藏 RxBool hasFav = false.obs; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; bool userLogin = false; Rx favFolderData = FavFolderData().obs; List addMediaIdsNew = []; @@ -57,6 +57,7 @@ class BangumiIntroController extends GetxController { // 关注状态 默认未关注 RxMap followStatus = {}.obs; int _tempThemeValue = -1; + var userInfo; @override void onInit() { @@ -82,7 +83,8 @@ class BangumiIntroController extends GetxController { // videoItem!['owner'] = args.owner; } } - userLogin = user.get(UserBoxKey.userLogin) != null; + userInfo = userInfoCache.get('userInfoCache'); + userLogin = userInfo != null; } // 获取番剧简介&选集 @@ -142,7 +144,7 @@ class BangumiIntroController extends GetxController { // 投币 Future actionCoinVideo() async { - if (user.get(UserBoxKey.userMid) == null) { + if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; } @@ -283,7 +285,7 @@ class BangumiIntroController extends GetxController { Future queryVideoInFolder() async { var result = await VideoHttp.videoInFolder( - mid: user.get(UserBoxKey.userMid), rid: IdUtils.bv2av(bvid)); + mid: userInfo.mid, rid: IdUtils.bv2av(bvid)); if (result['status']) { favFolderData.value = result['data']; } diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 456f532c..7d31c108 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -121,7 +121,7 @@ class _BangumiInfoState extends State { // 收藏 showFavBottomSheet() { - if (bangumiIntroController.user.get(UserBoxKey.userMid) == null) { + if (bangumiIntroController.userInfo.mid == null) { SmartDialog.showToast('账号未登录'); return; } diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index 89cc1add..6ba34102 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -51,12 +51,14 @@ class DynamicsController extends GetxController { ]; bool flag = false; RxInt initialValue = 1.obs; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; RxBool userLogin = false.obs; + var userInfo; @override void onInit() { - userLogin.value = user.get(UserBoxKey.userLogin, defaultValue: false); + userInfo = userInfoCache.get('userInfoCache'); + userLogin.value = userInfo != null; super.onInit(); } diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index c7d518c6..c8d7ec7f 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -30,7 +30,7 @@ class _DynamicsPageState extends State late Future _futureBuilderFuture; late Future _futureBuilderFutureUp; bool _isLoadingMore = false; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; EventBus eventBus = EventBus(); late ScrollController scrollController; diff --git a/lib/pages/dynamics/widgets/up_panel.dart b/lib/pages/dynamics/widgets/up_panel.dart index 2c0a63f7..b9605410 100644 --- a/lib/pages/dynamics/widgets/up_panel.dart +++ b/lib/pages/dynamics/widgets/up_panel.dart @@ -24,7 +24,8 @@ class _UpPanelState extends State { List upList = []; List liveList = []; static const itemPadding = EdgeInsets.symmetric(horizontal: 5, vertical: 0); - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; + var userInfo; @override void initState() { @@ -36,12 +37,13 @@ class _UpPanelState extends State { UpItem( face: 'https://files.catbox.moe/8uc48f.png', uname: '全部动态', mid: -1), ); + userInfo = userInfoCache.get('userInfoCache'); upList.insert( 1, UpItem( - face: user.get(UserBoxKey.userFace), + face: userInfo.face, uname: '我', - mid: user.get(UserBoxKey.userMid), + mid: userInfo.mid, ), ); } diff --git a/lib/pages/fan/controller.dart b/lib/pages/fan/controller.dart index cfbbc90c..4f389b92 100644 --- a/lib/pages/fan/controller.dart +++ b/lib/pages/fan/controller.dart @@ -5,19 +5,22 @@ import 'package:pilipala/models/fans/result.dart'; import 'package:pilipala/utils/storage.dart'; class FansController extends GetxController { - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; int pn = 1; int total = 0; RxList fansList = [FansItemModel()].obs; late int mid; late String name; + var userInfo; @override void onInit() { super.onInit(); - mid = int.parse( - Get.parameters['mid'] ?? user.get(UserBoxKey.userMid).toString()); - name = Get.parameters['name'] ?? user.get(UserBoxKey.userName); + userInfo = userInfoCache.get('userInfoCache'); + mid = Get.parameters['mid'] != null + ? int.parse(Get.parameters['mid']!) + : userInfo.mid; + name = Get.parameters['name'] ?? userInfo.uname; } Future queryFans(type) async { diff --git a/lib/pages/fav/controller.dart b/lib/pages/fav/controller.dart index 80162297..41923449 100644 --- a/lib/pages/fav/controller.dart +++ b/lib/pages/fav/controller.dart @@ -1,16 +1,24 @@ import 'package:get/get.dart'; +import 'package:hive/hive.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/user/fav_folder.dart'; +import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/utils/storage.dart'; class FavController extends GetxController { Rx favFolderData = FavFolderData().obs; + Box userInfoCache = GStrorage.userInfo; + UserInfoData? userInfo; Future queryFavFolder() async { + userInfo = userInfoCache.get('userInfoCache'); + if (userInfo == null) { + return {'status': false, 'msg': '账号未登录'}; + } var res = await await UserHttp.userfavFolder( pn: 1, ps: 10, - mid: GStrorage.user.get(UserBoxKey.userMid) ?? 0, + mid: userInfo!.mid!, ); if (res['status']) { favFolderData.value = res['data']; diff --git a/lib/pages/follow/controller.dart b/lib/pages/follow/controller.dart index 6b8d80c2..a64e20f6 100644 --- a/lib/pages/follow/controller.dart +++ b/lib/pages/follow/controller.dart @@ -5,19 +5,22 @@ import 'package:pilipala/models/follow/result.dart'; import 'package:pilipala/utils/storage.dart'; class FollowController extends GetxController { - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; int pn = 1; int total = 0; RxList followList = [FollowItemModel()].obs; late int mid; late String name; + var userInfo; @override void onInit() { super.onInit(); - mid = int.parse( - Get.parameters['mid'] ?? user.get(UserBoxKey.userMid).toString()); - name = Get.parameters['name'] ?? user.get(UserBoxKey.userName); + userInfo = userInfoCache.get('userInfoCache'); + mid = Get.parameters['mid'] != null + ? int.parse(Get.parameters['mid']!) + : userInfo.mid; + name = Get.parameters['name'] ?? userInfo.uname; } Future queryFollowings(type) async { diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index 980d7381..727cdce3 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -11,16 +11,17 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { late TabController tabController; late List tabsCtrList; late List tabsPageList; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; RxBool userLogin = false.obs; RxString userFace = ''.obs; + var userInfo; @override void onInit() { super.onInit(); - - userLogin.value = user.get(UserBoxKey.userLogin) ?? false; - userFace.value = user.get(UserBoxKey.userFace) ?? ''; + userInfo = userInfoCache.get('userInfoCache'); + userLogin.value = userInfo != null; + userFace.value = userInfo != null ? userInfo.face : ''; // 进行tabs配置 tabs = tabsConfig; @@ -48,7 +49,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin { // 更新登录状态 void updateLoginStatus(val) { + userInfo = userInfoCache.get('userInfoCache'); userLogin.value = val ?? false; - userFace.value = user.get(UserBoxKey.userFace) ?? ''; + userFace.value = userInfo != null ? userInfo.face : ''; } } diff --git a/lib/pages/home/widgets/app_bar.dart b/lib/pages/home/widgets/app_bar.dart index 198a9fa3..36920aef 100644 --- a/lib/pages/home/widgets/app_bar.dart +++ b/lib/pages/home/widgets/app_bar.dart @@ -6,13 +6,14 @@ import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/pages/mine/view.dart'; import 'package:pilipala/utils/storage.dart'; -Box user = GStrorage.user; +Box userInfoCache = GStrorage.userInfo; class HomeAppBar extends StatelessWidget { const HomeAppBar({super.key}); @override Widget build(BuildContext context) { + var userInfo = userInfoCache.get('userInfoCache'); return SliverAppBar( // forceElevated: true, scrolledUnderElevation: 0, @@ -55,7 +56,7 @@ class HomeAppBar extends StatelessWidget { const SizedBox(width: 6), /// TODO - if (user.get(UserBoxKey.userLogin)) ...[ + if (userInfo != null) ...[ GestureDetector( onTap: () => showModalBottomSheet( context: context, @@ -70,7 +71,7 @@ class HomeAppBar extends StatelessWidget { type: 'avatar', width: 32, height: 32, - src: user.get(UserBoxKey.userMid), + src: userInfo.face, ), ), const SizedBox(width: 10), diff --git a/lib/pages/media/controller.dart b/lib/pages/media/controller.dart index 88fef372..688b555c 100644 --- a/lib/pages/media/controller.dart +++ b/lib/pages/media/controller.dart @@ -8,7 +8,7 @@ import 'package:pilipala/utils/storage.dart'; class MediaController extends GetxController { Rx favFolderData = FavFolderData().obs; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; RxBool userLogin = false.obs; List list = [ { @@ -34,21 +34,23 @@ class MediaController extends GetxController { 'onTap': () => Get.toNamed('/later'), }, ]; + var userInfo; @override void onInit() { super.onInit(); - userLogin.value = user.get(UserBoxKey.userLogin) ?? false; + userInfo = userInfoCache.get('userInfoCache'); + userLogin.value = userInfo != null; } Future queryFavFolder() async { - if (!userLogin.value || GStrorage.user.get(UserBoxKey.userMid) == null) { + if (!userLogin.value || GStrorage.userInfo.get('userInfoCache') == null) { return {'status': false, 'data': [], 'msg': '未登录'}; } var res = await await UserHttp.userfavFolder( pn: 1, ps: 5, - mid: GStrorage.user.get(UserBoxKey.userMid), + mid: GStrorage.userInfo.get('userInfoCache').mid, ); favFolderData.value = res['data']; return res; diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index eb3e4f33..db4deaae 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -14,16 +14,18 @@ class MemberController extends GetxController { Map? userStat; String? face; String? heroTag; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; late int ownerMid; // 投稿列表 RxList? archiveList = [VListItemModel()].obs; + var userInfo; @override void onInit() { super.onInit(); mid = int.parse(Get.parameters['mid']!); - ownerMid = user.get(UserBoxKey.userMid) ?? -1; + userInfo = userInfoCache.get('userInfoCache'); + ownerMid = userInfo != null ? userInfo.mid : -1; face = Get.arguments['face'] ?? ''; heroTag = Get.arguments['heroTag'] ?? ''; } @@ -57,7 +59,7 @@ class MemberController extends GetxController { // 关注/取关up Future actionRelationMod() async { - if (user.get(UserBoxKey.userMid) == null) { + if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; } diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index e4118154..66813091 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -13,9 +13,8 @@ class MineController extends GetxController { // 用户状态 动态、关注、粉丝 Rx userStat = UserStat().obs; RxBool userLogin = false.obs; - Box user = GStrorage.user; - Box setting = GStrorage.setting; Box userInfoCache = GStrorage.userInfo; + Box setting = GStrorage.setting; Rx themeType = ThemeType.system.obs; @override @@ -24,6 +23,7 @@ class MineController extends GetxController { if (userInfoCache.get('userInfoCache') != null) { userInfo.value = userInfoCache.get('userInfoCache'); + userLogin.value = true; } themeType.value = ThemeType.values[setting.get(SettingBoxKey.themeMode, @@ -41,8 +41,8 @@ class MineController extends GetxController { }, ); } else { - int mid = user.get(UserBoxKey.userMid); - String face = user.get(UserBoxKey.userFace); + int mid = userInfo.value.mid!; + String face = userInfo.value.face!; Get.toNamed( '/member?mid=$mid', arguments: {'face': face}, @@ -51,7 +51,7 @@ class MineController extends GetxController { } Future queryUserInfo() async { - if (user.get(UserBoxKey.userLogin) == null) { + if (!userLogin.value) { return {'status': false}; } var res = await UserHttp.userInfo(); @@ -59,18 +59,12 @@ class MineController extends GetxController { 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); - user.put(UserBoxKey.userLogin, true); userLogin.value = true; - // Get.find().readuUserFace(); } else { resetUserInfo(); } } else { resetUserInfo(); - // SmartDialog.showToast(res['msg']); } await queryUserStatOwner(); return res; @@ -87,12 +81,8 @@ class MineController extends GetxController { Future resetUserInfo() async { userInfo.value = UserInfoData(); userStat.value = UserStat(); - await user.delete(UserBoxKey.userName); - await user.delete(UserBoxKey.userFace); - await user.delete(UserBoxKey.userMid); - await user.delete(UserBoxKey.userLogin); + userInfoCache.delete('userInfoCache'); userLogin.value = false; - // Get.find().resetLast(); } onChangeTheme() { diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index 0766340b..2cf50ebf 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -11,19 +11,22 @@ import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/storage.dart'; class SettingController extends GetxController { - Box user = GStrorage.user; - Box setting = GStrorage.setting; Box userInfoCache = GStrorage.userInfo; + Box setting = GStrorage.setting; + // Box userInfoCache = GStrorage.userInfo; + Box localCache = GStrorage.localCache; RxBool userLogin = false.obs; RxBool feedBackEnable = false.obs; RxInt picQuality = 10.obs; Rx themeType = ThemeType.system.obs; + var userInfo; @override void onInit() { super.onInit(); - userLogin.value = user.get(UserBoxKey.userLogin) ?? false; + userInfo = userInfoCache.get('userInfoCache'); + userLogin.value = userInfo != null; feedBackEnable.value = setting.get(SettingBoxKey.feedBackEnable, defaultValue: false); picQuality.value = @@ -53,7 +56,8 @@ class SettingController extends GetxController { // 清空本地存储的用户标识 userInfoCache.put('userInfoCache', null); - user.put(UserBoxKey.accessKey, {'mid': -1, 'value': ''}); + localCache + .put(LocalCacheKey.accessKey, {'mid': -1, 'value': ''}); // 更改我的页面登录状态 await Get.find().resetUserInfo(); diff --git a/lib/pages/setting/privacy_setting.dart b/lib/pages/setting/privacy_setting.dart index 5594fc1e..a6d085ab 100644 --- a/lib/pages/setting/privacy_setting.dart +++ b/lib/pages/setting/privacy_setting.dart @@ -13,12 +13,14 @@ class PrivacySetting extends StatefulWidget { class _PrivacySettingState extends State { bool userLogin = false; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; + var userInfo; @override void initState() { super.initState(); - userLogin = user.get(UserBoxKey.userLogin) ?? false; + userInfo = userInfoCache.get('userInfoCache'); + userLogin = userInfo != null; } @override diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index fe19ae0d..230bf447 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -51,7 +51,7 @@ class VideoDetailController extends GetxController RxBool enableHA = true.obs; /// 本地存储 - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; Box localCache = GStrorage.localCache; Box setting = GStrorage.setting; @@ -70,11 +70,13 @@ class VideoDetailController extends GetxController late Duration defaultST; // 默认记录历史记录 bool enableHeart = true; + var userInfo; @override void onInit() { super.onInit(); Map argMap = Get.arguments; + userInfo = userInfoCache.get('userInfoCache'); var keys = argMap.keys.toList(); if (keys.isNotEmpty) { if (keys.contains('videoItem')) { @@ -92,7 +94,7 @@ class VideoDetailController extends GetxController setting.get(SettingBoxKey.autoPlayEnable, defaultValue: true); enableHA.value = setting.get(SettingBoxKey.enableHA, defaultValue: true); - if (user.get(UserBoxKey.userMid) == null || + if (userInfo == null || localCache.get(LocalCacheKey.historyPause) == true) { enableHeart = false; } diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index aa5d41c4..70f8af98 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -42,7 +42,7 @@ class VideoIntroController extends GetxController { RxBool hasCoin = false.obs; // 是否收藏 RxBool hasFav = false.obs; - Box user = GStrorage.user; + Box userInfoCache = GStrorage.userInfo; bool userLogin = false; Rx favFolderData = FavFolderData().obs; List addMediaIdsNew = []; @@ -52,10 +52,12 @@ class VideoIntroController extends GetxController { int _tempThemeValue = -1; RxInt lastPlayCid = 0.obs; + var userInfo; @override void onInit() { super.onInit(); + userInfo = userInfoCache.get('userInfoCache'); if (Get.arguments.isNotEmpty) { if (Get.arguments.containsKey('videoItem')) { preRender = true; @@ -77,7 +79,7 @@ class VideoIntroController extends GetxController { videoItem!['owner'] = args.owner; } } - userLogin = user.get(UserBoxKey.userLogin) != null; + userLogin = userInfo == null; lastPlayCid.value = int.parse(Get.parameters['cid']!); } @@ -143,7 +145,7 @@ class VideoIntroController extends GetxController { // 一键三连 Future actionOneThree() async { - if (user.get(UserBoxKey.userMid) == null) { + if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; } @@ -206,7 +208,7 @@ class VideoIntroController extends GetxController { // 投币 Future actionCoinVideo() async { - if (user.get(UserBoxKey.userMid) == null) { + if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; } @@ -302,7 +304,7 @@ class VideoIntroController extends GetxController { Future queryVideoInFolder() async { var result = await VideoHttp.videoInFolder( - mid: user.get(UserBoxKey.userMid), rid: IdUtils.bv2av(bvid)); + mid: userInfo.mid, rid: IdUtils.bv2av(bvid)); if (result['status']) { favFolderData.value = result['data']; } @@ -337,7 +339,7 @@ class VideoIntroController extends GetxController { // 关注/取关up Future actionRelationMod() async { feedBack(); - if (user.get(UserBoxKey.userMid) == null) { + if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; } diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index 2528ca18..dad038db 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -127,7 +127,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { // 收藏 showFavBottomSheet() { - if (videoIntroController.user.get(UserBoxKey.userMid) == null) { + if (videoIntroController.userInfo == null) { SmartDialog.showToast('账号未登录'); return; } diff --git a/lib/pages/webview/controller.dart b/lib/pages/webview/controller.dart index b5b50152..03b99ee8 100644 --- a/lib/pages/webview/controller.dart +++ b/lib/pages/webview/controller.dart @@ -1,6 +1,7 @@ // ignore_for_file: avoid_print import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; @@ -14,7 +15,7 @@ import 'package:webview_flutter/webview_flutter.dart'; class WebviewController extends GetxController { String url = ''; - String type = ''; + RxString type = ''.obs; String pageTitle = ''; final WebViewController controller = WebViewController(); RxInt loadProgress = 0.obs; @@ -25,10 +26,10 @@ class WebviewController extends GetxController { void onInit() { super.onInit(); url = Get.parameters['url']!; - type = Get.parameters['type']!; + type.value = Get.parameters['type']!; pageTitle = Get.parameters['pageTitle']!; - if (type == 'login') { + if (type.value == 'login') { controller.clearCache(); controller.clearLocalStorage(); WebViewCookieManager().clearCookies(); @@ -52,54 +53,11 @@ class WebviewController extends GetxController { onUrlChange: (UrlChange urlChange) async { loadShow.value = false; String url = urlChange.url ?? ''; - if (type == 'login' && + if (type.value == 'login' && (url.startsWith( 'https://passport.bilibili.com/web/sso/exchange_cookie') || url.startsWith('https://m.bilibili.com/'))) { - try { - await SetCookie.onSet(); - var result = await UserHttp.userInfo(); - UserHttp.thirdLogin(); - print('网页登录: $result'); - if (result['status'] && result['data'].isLogin) { - SmartDialog.showToast('登录成功'); - try { - Box user = GStrorage.user; - user.put(UserBoxKey.userLogin, true); - user.put(UserBoxKey.userName, result['data'].uname); - user.put(UserBoxKey.userFace, result['data'].face); - user.put(UserBoxKey.userMid, result['data'].mid); - - Box userInfoCache = GStrorage.userInfo; - userInfoCache.put('userInfoCache', result['data']); - - // 通知更新 - eventBus.emit(EventName.loginEvent, {'status': true}); - - HomeController homeCtr = Get.find(); - homeCtr.updateLoginStatus(true); - } catch (err) { - SmartDialog.show(builder: (context) { - return AlertDialog( - title: const Text('登录遇到问题'), - content: Text(err.toString()), - actions: [ - TextButton( - onPressed: () => controller.reload(), - child: const Text('确认'), - ) - ], - ); - }); - } - Get.back(); - } else { - // 获取用户信息失败 - SmartDialog.showToast(result.msg); - } - } catch (e) { - print(e); - } + confirmLogin(url); } }, onWebResourceError: (WebResourceError error) {}, @@ -113,4 +71,51 @@ class WebviewController extends GetxController { ) ..loadRequest(Uri.parse(url)); } + + confirmLogin(url) async { + var content = ''; + if (url != null) { + content = '${content + url}; \n'; + } + try { + await SetCookie.onSet(); + var result = await UserHttp.userInfo(); + UserHttp.thirdLogin(); + if (result['status'] && result['data'].isLogin) { + SmartDialog.showToast('登录成功'); + try { + Box userInfoCache = GStrorage.userInfo; + await userInfoCache.put('userInfoCache', result['data']); + + // 通知更新 + eventBus.emit(EventName.loginEvent, {'status': true}); + + HomeController homeCtr = Get.find(); + homeCtr.updateLoginStatus(true); + } catch (err) { + SmartDialog.show(builder: (context) { + return AlertDialog( + title: const Text('登录遇到问题'), + content: Text(err.toString()), + actions: [ + TextButton( + onPressed: () => controller.reload(), + child: const Text('确认'), + ) + ], + ); + }); + } + Get.back(); + } else { + // 获取用户信息失败 + SmartDialog.showToast(result.msg); + Clipboard.setData(ClipboardData(text: result.msg.toString())); + } + } catch (e) { + SmartDialog.showNotify(msg: e.toString(), notifyType: NotifyType.warning); + content = content + e.toString(); + } + Clipboard.setData(ClipboardData(text: content)); + } } diff --git a/lib/pages/webview/view.dart b/lib/pages/webview/view.dart index 71cc84fd..b5f2f8cd 100644 --- a/lib/pages/webview/view.dart +++ b/lib/pages/webview/view.dart @@ -18,19 +18,25 @@ class _WebviewPageState extends State { return Scaffold( appBar: AppBar( centerTitle: false, + titleSpacing: 0, title: Text( _webviewController.pageTitle, style: Theme.of(context).textTheme.titleMedium, ), actions: [ - IconButton( + TextButton( onPressed: () { _webviewController.controller.reload(); }, - icon: const Icon( - Icons.refresh, - size: 22, - ), + child: const Text('刷新'), + ), + Obx( + () => _webviewController.type.value == 'login' + ? TextButton( + onPressed: () => _webviewController.confirmLogin(null), + child: const Text('刷新登录状态'), + ) + : const SizedBox(), ), const SizedBox(width: 10) ], @@ -48,6 +54,13 @@ class _WebviewPageState extends State { ), ), ), + Container( + width: double.infinity, + color: Theme.of(context).colorScheme.onInverseSurface, + padding: + const EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6), + child: const Text('登录成功未自动跳转? 请点击右上角「刷新登录状态」'), + ), Expanded( child: WebViewWidget(controller: _webviewController.controller), ), diff --git a/lib/utils/data.dart b/lib/utils/data.dart index e4361f92..7cf00bae 100644 --- a/lib/utils/data.dart +++ b/lib/utils/data.dart @@ -10,8 +10,8 @@ class Data { static Future historyStatus() async { Box localCache = GStrorage.localCache; - Box user = GStrorage.user; - if (user.get(UserBoxKey.userMid) == null) { + Box userInfoCache = GStrorage.userInfo; + if (userInfoCache.get('userInfoCache') == null) { return; } var res = await UserHttp.historyStatus(); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 4901691e..02daa7f2 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -7,7 +7,6 @@ import 'package:pilipala/models/search/hot.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 late final Box hotKeyword; @@ -21,13 +20,6 @@ class GStrorage { final path = dir.path; await Hive.initFlutter('$path/hive'); regAdapter(); - // 用户信息 - user = await Hive.openBox( - 'user', - compactionStrategy: (entries, deletedEntries) { - return deletedEntries > 10; - }, - ); // 首页推荐视频 recVideo = await Hive.openBox( 'recVideo', @@ -36,7 +28,12 @@ class GStrorage { }, ); // 登录用户信息 - userInfo = await Hive.openBox('userInfo'); + userInfo = await Hive.openBox( + 'userInfo', + compactionStrategy: (entries, deletedEntries) { + return deletedEntries > 2; + }, + ); // 本地缓存 localCache = await Hive.openBox('localCache'); // 设置 @@ -75,8 +72,8 @@ class GStrorage { } static Future close() async { - user.compact(); - user.close(); + // user.compact(); + // user.close(); recVideo.compact(); recVideo.close(); userInfo.compact(); @@ -94,19 +91,6 @@ class GStrorage { } } -// 约定 key -class UserBoxKey { - static const String userName = 'userName'; - // 头像 - static const String userFace = 'userFace'; - // mid - static const String userMid = 'userMid'; - // 登录状态 - static const String userLogin = 'userLogin'; - // 凭证 - static const String accessKey = 'accessKey'; -} - class SettingBoxKey { static const String themeMode = 'themeMode'; static const String feedBackEnable = 'feedBackEnable'; @@ -130,6 +114,12 @@ class SettingBoxKey { class LocalCacheKey { // 历史记录暂停状态 默认false 记录 static const String historyPause = 'historyPause'; + // access_key + static const String accessKey = 'accessKey'; + + // + static const String wbiKeys = 'wbiKeys'; + static const String timeStamp = 'timeStamp'; } class VideoBoxKey { diff --git a/lib/utils/wbi_sign.dart b/lib/utils/wbi_sign.dart index 24fd9e7c..84065964 100644 --- a/lib/utils/wbi_sign.dart +++ b/lib/utils/wbi_sign.dart @@ -109,8 +109,10 @@ class WbiSign { // 获取最新的 img_key 和 sub_key 可以从缓存中获取 static Future> getWbiKeys() async { DateTime nowDate = DateTime.now(); - if (localCache.get('wbiKeys') != null && - DateTime.fromMillisecondsSinceEpoch(localCache.get('timeStamp')).day == + if (localCache.get(LocalCacheKey.wbiKeys) != null && + DateTime.fromMillisecondsSinceEpoch( + localCache.get(LocalCacheKey.timeStamp)) + .day == nowDate.day) { Map cacheWbiKeys = localCache.get('wbiKeys'); return Map.from(cacheWbiKeys); @@ -129,8 +131,8 @@ class WbiSign { .substring(subUrl.lastIndexOf('/') + 1, subUrl.length) .split('.')[0] }; - localCache.put('wbiKeys', wbiKeys); - localCache.put('timeStamp', nowDate.millisecondsSinceEpoch); + localCache.put(LocalCacheKey.wbiKeys, wbiKeys); + localCache.put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch); return wbiKeys; }