feat: 新版登录页:以APP接口和新界面全面重构网页版登录;更新二维码与极验插件;更新版本号

This commit is contained in:
orz12
2024-07-07 15:31:58 +08:00
parent 8bb990015c
commit 8daf603fdb
17 changed files with 1575 additions and 1114 deletions

View File

@@ -7,6 +7,7 @@ import 'package:PiliPalaX/models/common/theme_type.dart';
import 'package:PiliPalaX/utils/feed_back.dart';
import 'package:PiliPalaX/utils/login.dart';
import 'package:PiliPalaX/utils/storage.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../models/common/dynamic_badge_mode.dart';
import '../../models/common/nav_bar_config.dart';
import '../main/index.dart';
@@ -32,7 +33,8 @@ class SettingController extends GetxController {
super.onInit();
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
hiddenSettingUnlocked.value = setting.get(SettingBoxKey.hiddenSettingUnlocked, defaultValue: false);
hiddenSettingUnlocked.value =
setting.get(SettingBoxKey.hiddenSettingUnlocked, defaultValue: false);
feedBackEnable.value =
setting.get(SettingBoxKey.feedBackEnable, defaultValue: false);
toastOpacity.value =
@@ -65,12 +67,23 @@ class SettingController extends GetxController {
// 清空cookie
await Request.cookieManager.cookieJar.deleteAll();
Request.dio.options.headers['cookie'] = '';
// 清空本地存储的用户标识
userInfoCache.put('userInfoCache', null);
localCache
.put(LocalCacheKey.accessKey, {'mid': -1, 'value': ''});
localCache.put(LocalCacheKey.accessKey,
{'mid': -1, 'value': '', 'refresh': ''});
try {
final WebViewController controller = WebViewController();
controller.clearCache();
controller.clearLocalStorage();
WebViewCookieManager().clearCookies();
} catch (e) {
print(e);
}
userLogin.value = false;
if (Get.isRegistered<MainController>()) {
MainController mainController = Get.find<MainController>();
mainController.userLogin.value = false;
}
await LoginUtils.refreshLoginStatus(false);
Get.back();
},
@@ -107,8 +120,7 @@ class SettingController extends GetxController {
dynamicBadgeType.value = result;
setting.put(SettingBoxKey.dynamicBadgeMode, result.code);
MainController mainController = Get.put(MainController());
mainController.dynamicBadgeType =
DynamicBadgeMode.values[result.code];
mainController.dynamicBadgeType = DynamicBadgeMode.values[result.code];
if (mainController.dynamicBadgeType != DynamicBadgeMode.hidden) {
mainController.getUnreadDynamic();
}

View File

@@ -1,4 +1,3 @@
import 'package:PiliPalaX/utils/cookie.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -68,42 +67,26 @@ class _PrivacySettingState extends State<PrivacySetting> {
subtitle: Text('已拉黑用户', style: subTitleStyle),
leading: const Icon(Icons.block),
),
ListTile(
onTap: () async {
if (!userLogin) {
SmartDialog.showToast('请先登录');
return;
}
var res = await MemberHttp.cookieToKey();
if (res['status']) {
SmartDialog.showToast(res['msg']);
} else {
SmartDialog.showToast("刷新失败:${res['msg']}");
}
},
dense: false,
title: Text('刷新access_key', style: titleStyle),
leading: const Icon(Icons.perm_device_info_outlined),
subtitle: Text(
'用于app端推荐接口的用户凭证。刷新有小概率导致其他设备下线。若app端未推荐个性化内容可尝试刷新或清除本app数据后重新登录',
style: subTitleStyle),
),
if (hiddenSettingUnlocked)
ListTile(
title: Text(
'导入/导出cookie',
style: titleStyle,
),
subtitle: Text(
'cookie代表您的登录状态仅供高级用户使用',
style: subTitleStyle,
),
leading: const Icon(Icons.cookie_outlined),
dense: false,
onTap: () {
import_export_cookies(titleStyle, subTitleStyle);
},
),
// ListTile(
// onTap: () async {
// if (!userLogin) {
// SmartDialog.showToast('请先登录');
// return;
// }
// var res = await MemberHttp.cookieToKey();
// if (res['status']) {
// SmartDialog.showToast(res['msg']);
// } else {
// SmartDialog.showToast("刷新失败:${res['msg']}");
// }
// },
// dense: false,
// title: Text('刷新access_key', style: titleStyle),
// leading: const Icon(Icons.perm_device_info_outlined),
// subtitle: Text(
// '用于app端推荐接口的用户凭证。若app端未推荐个性化内容可尝试刷新或清除本app数据后重新登录',
// style: subTitleStyle),
// ),
ListTile(
onTap: () {
MineController.onChangeAnonymity(context);
@@ -150,147 +133,4 @@ class _PrivacySettingState extends State<PrivacySetting> {
);
}
void import_export_cookies(TextStyle titleStyle, TextStyle subTitleStyle) {
showDialog(
context: context,
builder: (context) {
return SimpleDialog(
title: const Text('导入/导出cookie', style: TextStyle(color: Colors.red)),
children: [
ListTile(
title: Text(
'导出cookie至剪贴板',
style: titleStyle.copyWith(color: Colors.red),
),
leading: const Icon(
Icons.warning_amber,
color: Colors.red,
),
subtitle: Text(
'泄露账号cookie等同于绕过账号密码与验证码直接登录可导致隐私泄露、风控、毁号、盗号等各类问题。\n'
'你应妥善保管该cookie且仅供自己使用。你承诺不会利用本服务进行任何违法或不当的活动。你承诺对所进行的一切活动'
'(包括但不限于网上点击同意或提交各类规则协议或购买服务、分享资讯或图片等)负全部责任。\n'
'你承诺、理解、同意并确认,在你的账户遭到未获授权的使用,或者发生其他任何安全问题时,'
'作者不对上述情形产生的任何直接或间接的遗失或损害承担责任。',
style: subTitleStyle.copyWith(color: Colors.redAccent),
),
dense: false,
onTap: () async {
Navigator.of(context).pop();
if (!userLogin) {
SmartDialog.showToast('请先登录');
return;
}
final String cookie = await CookieTool.exportCookie();
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('导出cookie危险',
style: TextStyle(color: Colors.red)),
content: Text(cookie),
actions: [
TextButton(
onPressed: () async {
Navigator.of(context).pop();
await Clipboard.setData(
ClipboardData(text: cookie));
},
child: const Text('复制(危险)',
style: TextStyle(color: Colors.red)),
),
TextButton(
onPressed: () async {
Navigator.of(context).pop();
},
child: const Text('取消'),
),
],
);
},
);
}),
ListTile(
title: Text(
'从剪贴板导入cookie',
style: titleStyle,
),
leading: const Icon(
Icons.warning_amber,
color: Colors.red,
),
subtitle: Text(
'导入将覆盖当前登录状态,你应自行对利用服务从事的所有行为及结果承担责任,请慎用',
style: subTitleStyle,
),
dense: false,
onTap: () async {
ClipboardData? data = await Clipboard.getData('text/plain');
if (data == null || data.text == null || data.text == '') {
SmartDialog.showToast('未检测到剪贴板内容');
return;
}
if (!context.mounted) return;
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('导入剪贴板中的cookie'),
content: Text(data.text!),
actions: [
TextButton(
onPressed: () async {
Get.back();
},
child: const Text('取消'),
),
TextButton(
onPressed: () async {
Get.back();
final String cookie = data.text!;
try {
await CookieTool.importCookie(cookie);
await SmartDialog.showToast('已导入');
await CookieTool.onSet();
final result = await UserHttp.userInfo();
if (result['status'] &&
result['data'].isLogin) {
SmartDialog.showToast('登录成功,当前采用「'
'${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web')}'
'端」推荐');
Box userInfoCache = GStorage.userInfo;
await userInfoCache.put(
'userInfoCache', result['data']);
final HomeController homeCtr =
Get.find<HomeController>();
homeCtr.updateLoginStatus(true);
homeCtr.userFace.value = result['data'].face;
final MediaController mediaCtr =
Get.find<MediaController>();
mediaCtr.mid = result['data'].mid;
await LoginUtils.refreshLoginStatus(true);
Get.back();
} else {
// 获取用户信息失败
SmartDialog.showNotify(
msg:
'登录失败请检查cookie是否正确${result['message']}',
notifyType: NotifyType.warning);
}
} catch (e) {
SmartDialog.showToast('导入失败:$e');
}
},
child: const Text('确认'),
),
],
);
},
);
}),
],
);
},
);
}
}