mod: 登录/退出登录逻辑

This commit is contained in:
guozhigq
2023-08-09 22:25:24 +08:00
parent 79aa50c0df
commit 8a5a56cb15
8 changed files with 173 additions and 167 deletions

View File

@ -95,10 +95,6 @@ class Request {
//Http请求头. //Http请求头.
headers: { headers: {
// 'cookie': '', // 'cookie': '',
"env": 'prod',
"app-key": 'android',
"x-bili-aurora-eid": 'UlMFQVcABlAH',
"x-bili-aurora-zone": 'sh001',
'referer': 'https://www.bilibili.com/', 'referer': 'https://www.bilibili.com/',
}, },
); );
@ -106,17 +102,22 @@ class Request {
Box user = GStrorage.user; Box user = GStrorage.user;
if (user.get(UserBoxKey.userMid) != null) { if (user.get(UserBoxKey.userMid) != null) {
options.headers['x-bili-mid'] = user.get(UserBoxKey.userMid).toString(); options.headers['x-bili-mid'] = user.get(UserBoxKey.userMid).toString();
options.headers['env'] = 'prod';
options.headers['app-key'] = 'android64';
options.headers['x-bili-aurora-eid'] = 'UlMFQVcABlAH';
options.headers['x-bili-aurora-zone'] = 'sh001';
} }
dio.options = options; dio.options = options;
//添加拦截器 //添加拦截器
dio.interceptors dio.interceptors.add(ApiInterceptor());
..add(ApiInterceptor())
// 日志拦截器 输出请求、响应内容 // 日志拦截器 输出请求、响应内容
..add(LogInterceptor( // dio.interceptors.add(LogInterceptor(
request: false, // request: false,
requestHeader: false, // requestHeader: false,
responseHeader: false, // responseHeader: false,
)); // ));
dio.transformer = BackgroundTransformer(); dio.transformer = BackgroundTransformer();
dio.options.validateStatus = (status) { dio.options.validateStatus = (status) {
return status! >= 200 && status < 300 || status == 304 || status == 302; return status! >= 200 && status < 300 || status == 304 || status == 302;
@ -161,7 +162,7 @@ class Request {
* post请求 * post请求
*/ */
post(url, {data, queryParameters, options, cancelToken, extra}) async { post(url, {data, queryParameters, options, cancelToken, extra}) async {
print('post-data: $data'); // print('post-data: $data');
Response response; Response response;
try { try {
response = await dio.post( response = await dio.post(
@ -171,7 +172,7 @@ class Request {
options: options, options: options,
cancelToken: cancelToken, cancelToken: cancelToken,
); );
print('post success: ${response.data}'); // print('post success: ${response.data}');
return response; return response;
} on DioException catch (e) { } on DioException catch (e) {
print('post error: $e'); print('post error: $e');

View File

@ -18,8 +18,9 @@ class BangumiController extends GetxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
mid = int.parse( if (user.get(UserBoxKey.userMid) != null) {
Get.parameters['mid'] ?? user.get(UserBoxKey.userMid).toString()); mid = int.parse(user.get(UserBoxKey.userMid).toString());
}
userLogin.value = user.get(UserBoxKey.userLogin) != null; userLogin.value = user.get(UserBoxKey.userLogin) != null;
} }

View File

@ -177,50 +177,6 @@ class _DynamicsPageState extends State<DynamicsPage>
icon: const Icon(Icons.history, size: 21), icon: const Icon(Icons.history, size: 21),
), ),
), ),
Positioned(
left: 10,
top: 0,
bottom: 0,
child: Align(
alignment: Alignment.center,
child: user.get(UserBoxKey.userLogin) ?? false
? GestureDetector(
onTap: () {
feedBack();
showModalBottomSheet(
context: context,
builder: (_) => const SizedBox(
height: 450,
child: MinePage(),
),
clipBehavior: Clip.hardEdge,
isScrollControlled: true,
);
},
child: NetworkImgLayer(
type: 'avatar',
width: 30,
height: 30,
src: user.get(UserBoxKey.userFace),
),
)
: IconButton(
onPressed: () {
feedBack();
showModalBottomSheet(
context: context,
builder: (_) => const SizedBox(
height: 450,
child: MinePage(),
),
clipBehavior: Clip.hardEdge,
isScrollControlled: true,
);
},
icon: const Icon(CupertinoIcons.person, size: 22),
),
),
),
], ],
), ),
), ),

View File

@ -1,10 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/http/index.dart'; import 'package:pilipala/http/index.dart';
import 'package:pilipala/pages/bangumi/index.dart'; import 'package:pilipala/pages/bangumi/index.dart';
import 'package:pilipala/pages/hot/index.dart'; import 'package:pilipala/pages/hot/index.dart';
import 'package:pilipala/pages/live/index.dart'; import 'package:pilipala/pages/live/index.dart';
import 'package:pilipala/pages/rcmd/index.dart'; import 'package:pilipala/pages/rcmd/index.dart';
import 'package:pilipala/utils/storage.dart';
class HomeController extends GetxController with GetTickerProviderStateMixin { class HomeController extends GetxController with GetTickerProviderStateMixin {
bool flag = false; bool flag = false;
@ -51,6 +53,9 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
Get.find<BangumiController>, Get.find<BangumiController>,
]; ];
RxString defaultSearch = '输入关键词搜索'.obs; RxString defaultSearch = '输入关键词搜索'.obs;
Box user = GStrorage.user;
RxBool userLogin = false.obs;
RxString userFace = ''.obs;
@override @override
void onInit() { void onInit() {
@ -61,6 +66,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
vsync: this, vsync: this,
); );
searchDefault(); searchDefault();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
userFace.value = user.get(UserBoxKey.userFace) ?? '';
} }
void onRefresh() { void onRefresh() {
@ -81,4 +88,10 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
defaultSearch.value = res.data['data']['name']; defaultSearch.value = res.data['data']['name'];
} }
} }
// 更新登录状态
void updateLoginStatus(val) {
userLogin.value = val ?? false;
userFace.value = user.get(UserBoxKey.userFace) ?? '';
}
} }

View File

@ -1,7 +1,5 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/pages/bangumi/index.dart'; import 'package:pilipala/pages/bangumi/index.dart';
import 'package:pilipala/pages/hot/index.dart'; import 'package:pilipala/pages/hot/index.dart';
@ -10,7 +8,6 @@ import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/pages/mine/index.dart'; import 'package:pilipala/pages/mine/index.dart';
import 'package:pilipala/pages/rcmd/index.dart'; import 'package:pilipala/pages/rcmd/index.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
import './controller.dart'; import './controller.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
@ -29,6 +26,19 @@ class _HomePageState extends State<HomePage>
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
showUserBottonSheet() {
feedBack();
showModalBottomSheet(
context: context,
builder: (_) => const SizedBox(
height: 450,
child: MinePage(),
),
clipBehavior: Clip.hardEdge,
isScrollControlled: true,
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
@ -38,7 +48,11 @@ class _HomePageState extends State<HomePage>
appBar: AppBar(toolbarHeight: 0, elevation: 0), appBar: AppBar(toolbarHeight: 0, elevation: 0),
body: Column( body: Column(
children: [ children: [
CustomAppBar(stream: stream, ctr: _homeController), CustomAppBar(
stream: stream,
ctr: _homeController,
callback: showUserBottonSheet,
),
Container( Container(
padding: const EdgeInsets.only(left: 12, right: 12, bottom: 4), padding: const EdgeInsets.only(left: 12, right: 12, bottom: 4),
child: Row( child: Row(
@ -132,13 +146,15 @@ class _HomePageState extends State<HomePage>
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
final double height; final double height;
final Stream<bool>? stream; final Stream<bool>? stream;
final ctr; final HomeController? ctr;
final Function? callback;
const CustomAppBar({ const CustomAppBar({
super.key, super.key,
this.height = kToolbarHeight, this.height = kToolbarHeight,
this.stream, this.stream,
this.ctr, this.ctr,
this.callback,
}); });
@override @override
@ -146,8 +162,6 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Box user = GStrorage.user;
return StreamBuilder( return StreamBuilder(
stream: stream, stream: stream,
initialData: true, initialData: true,
@ -168,103 +182,108 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
bottom: 4, bottom: 4,
top: MediaQuery.of(context).padding.top, top: MediaQuery.of(context).padding.top,
), ),
child: Row( child: Row(children: [
children: [ const Text(
const Text( 'PLPL',
'PLPL', style: TextStyle(
style: TextStyle( height: 2.8,
height: 2.8, fontSize: 17,
fontSize: 17, fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, fontFamily: 'Jura-Bold',
fontFamily: 'Jura-Bold',
),
), ),
const SizedBox(width: 10), ),
Expanded( const SizedBox(width: 10),
child: GestureDetector( Expanded(
onTap: () { child: GestureDetector(
Get.toNamed('/search', parameters: { onTap: () {
'hintText': ctr.defaultSearch.value Get.toNamed('/search',
}); parameters: {'hintText': ctr!.defaultSearch.value});
}, },
child: Container( child: Container(
width: 250, width: 250,
height: 45, height: 42,
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
padding: const EdgeInsets.only(left: 12, right: 22), padding: const EdgeInsets.only(left: 12, right: 22),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: borderRadius:
const BorderRadius.all(Radius.circular(25)), const BorderRadius.all(Radius.circular(25)),
color: color: Theme.of(context).colorScheme.onInverseSurface,
Theme.of(context).colorScheme.onInverseSurface, ),
), child: Row(
child: Row( children: [
children: [ Icon(
Icon( Icons.search_outlined,
Icons.search_outlined, size: 21,
size: 23, color: Theme.of(context).colorScheme.outline,
color: Theme.of(context).colorScheme.outline, ),
), const SizedBox(width: 6),
const SizedBox(width: 7), Expanded(
Expanded( child: Obx(
child: Obx( () => Text(
() => Text( ctr!.defaultSearch.value,
ctr.defaultSearch.value, maxLines: 1,
maxLines: 1, overflow: TextOverflow.ellipsis,
overflow: TextOverflow.ellipsis, style: TextStyle(
style: TextStyle( color: Theme.of(context)
color: Theme.of(context) .colorScheme
.colorScheme .outline),
.outline),
),
), ),
), ),
], ),
), ],
), ),
), ),
), ),
const SizedBox(width: 12), ),
if (user.get(UserBoxKey.userLogin) ?? false) ...[ const SizedBox(width: 10),
GestureDetector( // SizedBox(
onTap: () { // width: 36,
feedBack(); // height: 36,
showModalBottomSheet( // child: IconButton(
context: context, // style: ButtonStyle(
builder: (_) => const SizedBox( // padding: MaterialStateProperty.all(EdgeInsets.zero),
height: 450, // ),
child: MinePage(), // onPressed: () {},
// icon: const Icon(Icons.notifications_none_outlined,
// size: 22),
// ),
// ),
// const SizedBox(width: 8),
Obx(
() => ctr!.userLogin.value
? GestureDetector(
onTap: () => callback!(),
child: NetworkImgLayer(
type: 'avatar',
width: 34,
height: 34,
src: ctr!.userFace.value,
), ),
clipBehavior: Clip.hardEdge, )
isScrollControlled: true, : SizedBox(
); width: 36,
}, height: 36,
child: NetworkImgLayer( child: IconButton(
type: 'avatar', style: ButtonStyle(
width: 34, padding:
height: 34, MaterialStateProperty.all(EdgeInsets.zero),
src: user.get(UserBoxKey.userFace), backgroundColor:
), MaterialStateProperty.resolveWith((states) {
) return Theme.of(context)
] else ...[ .colorScheme
IconButton( .onInverseSurface;
onPressed: () { }),
feedBack(); ),
showModalBottomSheet( onPressed: () => callback!(),
context: context, icon: Icon(
builder: (_) => const SizedBox( Icons.person_rounded,
height: 450, size: 22,
child: MinePage(), color: Theme.of(context).colorScheme.primary,
),
), ),
clipBehavior: Clip.hardEdge, ),
isScrollControlled: true, ),
); ]),
},
icon: const Icon(CupertinoIcons.person, size: 22),
)
],
],
),
), ),
), ),
), ),

View File

@ -1,7 +1,11 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/init.dart';
import 'package:pilipala/pages/dynamics/index.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/pages/mine/controller.dart'; import 'package:pilipala/pages/mine/controller.dart';
import 'package:pilipala/utils/data.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -25,6 +29,8 @@ class SettingController extends GetxController {
await Get.find<MineController>().resetUserInfo(); await Get.find<MineController>().resetUserInfo();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false; userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
userInfoCache.put('userInfoCache', null); userInfoCache.put('userInfoCache', null);
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(false);
} }
// 开启关闭震动反馈 // 开启关闭震动反馈

View File

@ -7,6 +7,7 @@ import 'package:pilipala/http/constants.dart';
import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/init.dart';
import 'package:pilipala/http/user.dart'; import 'package:pilipala/http/user.dart';
import 'package:pilipala/pages/dynamics/index.dart'; import 'package:pilipala/pages/dynamics/index.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/mine/index.dart'; import 'package:pilipala/pages/mine/index.dart';
import 'package:pilipala/pages/rcmd/controller.dart'; import 'package:pilipala/pages/rcmd/controller.dart';
import 'package:pilipala/utils/cookie.dart'; import 'package:pilipala/utils/cookie.dart';
@ -71,17 +72,24 @@ class WebviewController extends GetxController {
print('网页登录: $result'); print('网页登录: $result');
if (result['status'] && result['data'].isLogin) { if (result['status'] && result['data'].isLogin) {
SmartDialog.showToast('登录成功'); SmartDialog.showToast('登录成功');
Box user = GStrorage.user; try {
user.put(UserBoxKey.userLogin, true); Box user = GStrorage.user;
user.put(UserBoxKey.userName, result['data'].uname); user.put(UserBoxKey.userLogin, true);
user.put(UserBoxKey.userFace, result['data'].face); user.put(UserBoxKey.userName, result['data'].uname);
user.put(UserBoxKey.userMid, result['data'].mid); user.put(UserBoxKey.userFace, result['data'].face);
Box userInfoCache = GStrorage.userInfo; user.put(UserBoxKey.userMid, result['data'].mid);
userInfoCache.put('userInfoCache', result['data']);
Get.find<MineController>().userInfo.value = result['data']; Box userInfoCache = GStrorage.userInfo;
Get.find<MineController>().onInit(); userInfoCache.put('userInfoCache', result['data']);
Get.find<RcmdController>().queryRcmdFeed('onRefresh');
Get.find<DynamicsController>().queryFollowDynamic(); Get.find<MineController>().userInfo.value = result['data'];
Get.find<MineController>().onInit();
Get.find<RcmdController>().queryRcmdFeed('onRefresh');
Get.find<DynamicsController>().queryFollowDynamic();
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(true);
} catch (_) {}
Get.back(); Get.back();
} }
} catch (e) { } catch (e) {

View File

@ -21,6 +21,8 @@ class SetCookie {
await cookieJar.saveFromResponse(Uri.parse(url), jarCookies); await cookieJar.saveFromResponse(Uri.parse(url), jarCookies);
// 重新设置 cookie // 重新设置 cookie
Request.setCookie(); Request.setCookie();
Request.cookieManager.cookieJar
.saveFromResponse(Uri.parse(url), jarCookies);
return true; return true;
} }
} }