mod: 本地缓存字段修改、登录状态

This commit is contained in:
guozhigq
2023-08-20 14:28:50 +08:00
parent 8627869309
commit 83341cd62b
29 changed files with 217 additions and 167 deletions

View File

@ -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';

View File

@ -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});
}
}
}

View File

@ -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,9 +198,13 @@ class UserHttp {
'sign': Constants.thirdSign,
},
);
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);
}
}
// 清空稍后再看

View File

@ -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) {

View File

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

View File

@ -11,17 +11,19 @@ class BangumiController extends GetxController {
RxList<BangumiListItemModel> 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 {

View File

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

View File

@ -121,7 +121,7 @@ class _BangumiInfoState extends State<BangumiInfo> {
// 收藏
showFavBottomSheet() {
if (bangumiIntroController.user.get(UserBoxKey.userMid) == null) {
if (bangumiIntroController.userInfo.mid == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -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();
}

View File

@ -30,7 +30,7 @@ class _DynamicsPageState extends State<DynamicsPage>
late Future _futureBuilderFuture;
late Future _futureBuilderFutureUp;
bool _isLoadingMore = false;
Box user = GStrorage.user;
Box userInfoCache = GStrorage.userInfo;
EventBus eventBus = EventBus();
late ScrollController scrollController;

View File

@ -24,7 +24,8 @@ class _UpPanelState extends State<UpPanel> {
List<UpItem> upList = [];
List<LiveUserItem> 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<UpPanel> {
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,
),
);
}

View File

@ -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<FansItemModel> 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 {

View File

@ -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 = FavFolderData().obs;
Box userInfoCache = GStrorage.userInfo;
UserInfoData? userInfo;
Future<dynamic> 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'];

View File

@ -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<FollowItemModel> 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 {

View File

@ -11,16 +11,17 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
late TabController tabController;
late List tabsCtrList;
late List<Widget> 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 : '';
}
}

View File

@ -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),

View File

@ -8,7 +8,7 @@ import 'package:pilipala/utils/storage.dart';
class MediaController extends GetxController {
Rx<FavFolderData> 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<dynamic> 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;

View File

@ -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<VListItemModel>? 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;
}

View File

@ -13,9 +13,8 @@ class MineController extends GetxController {
// 用户状态 动态、关注、粉丝
Rx<UserStat> 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 = 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<MainController>().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<MainController>().resetLast();
}
onChangeTheme() {

View File

@ -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 = 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<MineController>().resetUserInfo();

View File

@ -13,12 +13,14 @@ class PrivacySetting extends StatefulWidget {
class _PrivacySettingState extends State<PrivacySetting> {
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

View File

@ -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;
}

View File

@ -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 = 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;
}

View File

@ -127,7 +127,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
// 收藏
showFavBottomSheet() {
if (videoIntroController.user.get(UserBoxKey.userMid) == null) {
if (videoIntroController.userInfo == null) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@ -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,26 +53,39 @@ 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/'))) {
confirmLogin(url);
}
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('bilibili://')) {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
)
..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();
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']);
await userInfoCache.put('userInfoCache', result['data']);
// 通知更新
eventBus.emit(EventName.loginEvent, {'status': true});
@ -96,21 +110,12 @@ class WebviewController extends GetxController {
} else {
// 获取用户信息失败
SmartDialog.showToast(result.msg);
Clipboard.setData(ClipboardData(text: result.msg.toString()));
}
} catch (e) {
print(e);
}
}
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('bilibili://')) {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
)
..loadRequest(Uri.parse(url));
SmartDialog.showNotify(msg: e.toString(), notifyType: NotifyType.warning);
content = content + e.toString();
}
Clipboard.setData(ClipboardData(text: content));
}
}

View File

@ -18,19 +18,25 @@ class _WebviewPageState extends State<WebviewPage> {
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<WebviewPage> {
),
),
),
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),
),

View File

@ -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();

View File

@ -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<void> 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 {

View File

@ -109,8 +109,10 @@ class WbiSign {
// 获取最新的 img_key 和 sub_key 可以从缓存中获取
static Future<Map<String, dynamic>> 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<String, dynamic>.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;
}