refactor: 拆分主页与公共组件,扫码登录改走 WinHTTP

- 抽出 lib/core 的日期/JSON 工具,收敛各页重复解析
- 主页与音乐风险页拆成组件,风险功能共用一套运行框架
- 修复设置页作为主页页签保存时弹掉根路由导致的黑屏
- 登录对齐 Astral aimedb 协议:84 位二维码校验、签名与请求头修正,
  补 GlobalSign 中间证书;Windows 改用 WinHTTP 绕过服务端对
  BoringSSL 的 TLS 指纹拦截(证书校验保持开启)
- 补开发预览数据与测试
This commit is contained in:
Bad0RANG3 committed 2026-10-25 15:51:10 +08:00
1 parent 0cb5320290
commit e9357f5969
55 files changed
+4387 -3392

No files matched your search

+19 -14
View File
@@ -27,8 +27,6 @@ class _SettingsPageState extends State<SettingsPage> {
final _regionNameController = TextEditingController();
final _placeNameController = TextEditingController();
final _keychipIdController = TextEditingController();
final _aimeUrlController = TextEditingController();
final _aimeSaltController = TextEditingController();
@override
void initState() {
@@ -50,8 +48,6 @@ class _SettingsPageState extends State<SettingsPage> {
_regionNameController.text = config.regionName;
_placeNameController.text = config.placeName;
_keychipIdController.text = config.keychipId;
_aimeUrlController.text = config.aimeUrl;
_aimeSaltController.text = config.aimeSalt;
}
}
@@ -68,8 +64,6 @@ class _SettingsPageState extends State<SettingsPage> {
_regionNameController.dispose();
_placeNameController.dispose();
_keychipIdController.dispose();
_aimeUrlController.dispose();
_aimeSaltController.dispose();
super.dispose();
}
@@ -88,11 +82,19 @@ class _SettingsPageState extends State<SettingsPage> {
regionName: _regionNameController.text.trim(),
placeName: _placeNameController.text.trim(),
keychipId: _keychipIdController.text.trim(),
aimeUrl: _aimeUrlController.text.trim(),
aimeSalt: _aimeSaltController.text.trim(),
));
if (mounted) Navigator.of(context).pop();
if (!mounted) return;
final navigator = Navigator.of(context);
// 作为主页页签嵌入时(showAppBar: false)没有可弹出的路由,
// 直接 pop 会把根路由弹掉,整个导航栈变空只剩黑屏。
if (navigator.canPop()) {
navigator.pop();
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text(AppStrings.configSaved)),
);
}
}
@override
@@ -139,11 +141,11 @@ class _SettingsPageState extends State<SettingsPage> {
]),
const SizedBox(height: 24),
_buildSection(theme, AppStrings.authServerSettings, [
_buildField(controller: _keychipIdController, label: AppStrings.labelKeychipId),
const SizedBox(height: 14),
_buildField(controller: _aimeUrlController, label: AppStrings.labelAimeUrl),
const SizedBox(height: 14),
_buildField(controller: _aimeSaltController, label: AppStrings.labelAimeSalt),
_buildField(
controller: _keychipIdController,
label: AppStrings.labelKeychipId,
help: AppStrings.helpKeychipId,
),
]),
const SizedBox(height: 32),
FilledButton.icon(
@@ -216,11 +218,14 @@ class _SettingsPageState extends State<SettingsPage> {
Widget _buildField({
required TextEditingController controller,
required String label,
String? help,
}) {
return TextFormField(
controller: controller,
decoration: InputDecoration(
labelText: label,
helperText: help,
helperStyle: const TextStyle(fontSize: 12),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),