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,8 +182,7 @@ 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(
@ -183,33 +196,31 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
Get.toNamed('/search', parameters: { Get.toNamed('/search',
'hintText': ctr.defaultSearch.value 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: 23, size: 21,
color: Theme.of(context).colorScheme.outline, color: Theme.of(context).colorScheme.outline,
), ),
const SizedBox(width: 7), const SizedBox(width: 6),
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(
@ -224,50 +235,58 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
), ),
), ),
), ),
const SizedBox(width: 12), const SizedBox(width: 10),
if (user.get(UserBoxKey.userLogin) ?? false) ...[ // SizedBox(
GestureDetector( // width: 36,
onTap: () { // height: 36,
feedBack(); // child: IconButton(
showModalBottomSheet( // style: ButtonStyle(
context: context, // padding: MaterialStateProperty.all(EdgeInsets.zero),
builder: (_) => const SizedBox( // ),
height: 450, // onPressed: () {},
child: MinePage(), // icon: const Icon(Icons.notifications_none_outlined,
), // size: 22),
clipBehavior: Clip.hardEdge, // ),
isScrollControlled: true, // ),
); // const SizedBox(width: 8),
}, Obx(
() => ctr!.userLogin.value
? GestureDetector(
onTap: () => callback!(),
child: NetworkImgLayer( child: NetworkImgLayer(
type: 'avatar', type: 'avatar',
width: 34, width: 34,
height: 34, height: 34,
src: user.get(UserBoxKey.userFace), src: ctr!.userFace.value,
), ),
) )
] else ...[ : SizedBox(
IconButton( width: 36,
onPressed: () { height: 36,
feedBack(); child: IconButton(
showModalBottomSheet( style: ButtonStyle(
context: context, padding:
builder: (_) => const SizedBox( MaterialStateProperty.all(EdgeInsets.zero),
height: 450, backgroundColor:
child: MinePage(), MaterialStateProperty.resolveWith((states) {
return Theme.of(context)
.colorScheme
.onInverseSurface;
}),
), ),
clipBehavior: Clip.hardEdge, onPressed: () => callback!(),
isScrollControlled: true, icon: Icon(
); Icons.person_rounded,
}, size: 22,
icon: const Icon(CupertinoIcons.person, size: 22), color: Theme.of(context).colorScheme.primary,
)
],
],
), ),
), ),
), ),
), ),
]),
),
),
),
); );
}, },
); );

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('登录成功');
try {
Box user = GStrorage.user; Box user = GStrorage.user;
user.put(UserBoxKey.userLogin, true); user.put(UserBoxKey.userLogin, true);
user.put(UserBoxKey.userName, result['data'].uname); user.put(UserBoxKey.userName, result['data'].uname);
user.put(UserBoxKey.userFace, result['data'].face); user.put(UserBoxKey.userFace, result['data'].face);
user.put(UserBoxKey.userMid, result['data'].mid); user.put(UserBoxKey.userMid, result['data'].mid);
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
userInfoCache.put('userInfoCache', result['data']); userInfoCache.put('userInfoCache', result['data']);
Get.find<MineController>().userInfo.value = result['data']; Get.find<MineController>().userInfo.value = result['data'];
Get.find<MineController>().onInit(); Get.find<MineController>().onInit();
Get.find<RcmdController>().queryRcmdFeed('onRefresh'); Get.find<RcmdController>().queryRcmdFeed('onRefresh');
Get.find<DynamicsController>().queryFollowDynamic(); 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;
} }
} }