diff --git a/lib/app/common/app_config.dart b/lib/app/common/app_config.dart index 3c91f6a..5e752f9 100755 --- a/lib/app/common/app_config.dart +++ b/lib/app/common/app_config.dart @@ -5,7 +5,7 @@ import '../utils/kr_secure_storage.dart'; import '../utils/kr_log_util.dart'; import '../utils/kr_http_adapter_util.dart'; import '../services/singbox_imp/kr_sing_box_imp.dart'; -import '../utils/kr_init_log_collector.dart'; // 🔧 新增富入日志收集噚 +import '../utils/kr_init_log_collector.dart'; // 🔧 新增富入日志收集噚 import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -23,17 +23,18 @@ class KRProtocol { /// 域名配眮 class KRDomain { - - static const String kr_domainKey = "kr_base_domain"; static const String kr_domainsKey = "kr_domains_list"; - + // static List kr_baseDomains = ["apicn.bearvpn.top","apibear.nsdsox.com"]; // static String kr_currentDomain = "apicn.bearvpn.top"; - static List kr_baseDomains = ["api.hifast.biz", "api.airovpn.tel",]; + static List kr_baseDomains = [ + "api.hifast.biz", + "api.airovpn.tel", + ]; static String kr_currentDomain = "api.hifast.biz"; - + // 倇甚域名获取地址列衚 static List kr_backupDomainUrls = [ // "https://bear-1347601445.cos.ap-guangzhou.myqcloud.com/bear.txt", @@ -41,7 +42,7 @@ class KRDomain { // "https://gitee.com/karelink/getbr/raw/master/README.en.md", // "https://configfortrans.oss-cn-guangzhou.aliyuncs.com/bear/bear.txt", ]; - + // 本地倇甚域名列衚圓服务噚获取的域名郜䞍可甚时䜿甚 static List kr_localBackupDomains = [ "api.airovpn.tel", @@ -50,7 +51,7 @@ class KRDomain { // "apicn.bearvpn.top", // "apibear.nsdsox.com", ]; - + static final _storage = KRSecureStorage(); static Timer? _retryTimer; static const int kr_retryInterval = 2; // 基础重试闎隔秒 @@ -116,40 +117,40 @@ class KRDomain { static String kr_extractDomain(String url) { try { KRLogUtil.kr_i('🔍 提取域名原始数据: $url', tag: 'KRDomain'); - + if (url.isEmpty) { KRLogUtil.kr_w('⚠ 蟓入䞺空', tag: 'KRDomain'); return ''; } - + // 移陀协议前猀 String domain = url.replaceAll(RegExp(r'^https?://'), ''); - + // 移陀路埄郚分 domain = domain.split('/')[0]; - + // 移陀查询参数 domain = domain.split('?')[0]; - + // 移陀锚点 domain = domain.split('#')[0]; - + // 枅理空癜字笊 domain = domain.trim(); - + // 验证域名栌匏 if (domain.isEmpty) { KRLogUtil.kr_w('⚠ 提取后域名䞺空', tag: 'KRDomain'); return ''; } - + // 检查是吊包含有效的域名字笊 // 支持域名栌匏example.com, example.com:8080, 192.168.1.1, 192.168.1.1:8080 if (!RegExp(r'^[a-zA-Z0-9.-]+(:\d+)?$').hasMatch(domain)) { KRLogUtil.kr_w('⚠ 域名栌匏无效: $domain', tag: 'KRDomain'); return ''; } - + KRLogUtil.kr_i('✅ 成功提取域名: $domain', tag: 'KRDomain'); return domain; } catch (e) { @@ -163,28 +164,32 @@ class KRDomain { try { KRLogUtil.kr_i('⚡ 快速检测域名: $domain', tag: 'KRDomain'); final startTime = DateTime.now(); - + final response = await _dio.get( '${KRProtocol.kr_https}://$domain', options: Options( sendTimeout: Duration(seconds: 2), // 2秒超时 receiveTimeout: Duration(seconds: 2), // 允讞所有状态码只芁胜借连接就讀䞺域名可甚 - validateStatus: (status) => status != null && status >= 200 && status < 600, + validateStatus: (status) => + status != null && status >= 200 && status < 600, ), ); final endTime = DateTime.now(); - + // 记圕响应时闎 final responseTime = endTime.difference(startTime).inMilliseconds; _domainResponseTimes[domain] = responseTime; - + // 只芁胜借连接就讀䞺域名可甚包括404、403等状态码 if (response.statusCode != null) { - KRLogUtil.kr_i('✅ 快速检测成功域名 $domain 可甚状态码: ${response.statusCode}响应时闎: ${responseTime}ms', tag: 'KRDomain'); + KRLogUtil.kr_i( + '✅ 快速检测成功域名 $domain 可甚状态码: ${response.statusCode}响应时闎: ${responseTime}ms', + tag: 'KRDomain'); return true; } else { - KRLogUtil.kr_w('❌ 快速检测倱莥域名 $domain 响应匂垞状态码: ${response.statusCode}', tag: 'KRDomain'); + KRLogUtil.kr_w('❌ 快速检测倱莥域名 $domain 响应匂垞状态码: ${response.statusCode}', + tag: 'KRDomain'); return false; } } on DioException catch (e) { @@ -193,11 +198,14 @@ class KRDomain { e.type == DioExceptionType.receiveTimeout || e.type == DioExceptionType.sendTimeout || e.type == DioExceptionType.connectionError) { - KRLogUtil.kr_w('❌ 快速检测倱莥域名 $domain 连接超时或眑络错误: ${e.message}', tag: 'KRDomain'); + KRLogUtil.kr_w('❌ 快速检测倱莥域名 $domain 连接超时或眑络错误: ${e.message}', + tag: 'KRDomain'); return false; } else { // 其他错误劂未知错误、取消等讀䞺域名䞍可甚 - KRLogUtil.kr_w('❌ 快速检测倱莥域名 $domain 其他匂垞 (Type: ${e.type}): ${e.message}', tag: 'KRDomain'); + KRLogUtil.kr_w( + '❌ 快速检测倱莥域名 $domain 其他匂垞 (Type: ${e.type}): ${e.message}', + tag: 'KRDomain'); return false; } } catch (e) { @@ -210,7 +218,7 @@ class KRDomain { static Future kr_checkDomainAvailability(String domain) async { // 枅理过期猓存 _kr_clearExpiredCache(); - + // 检查猓存 final lastCheck = _domainLastCheck[domain]; if (lastCheck != null) { @@ -219,39 +227,46 @@ class KRDomain { // 🔧 修倍2攟宜猓存阈倌 5000ms → 10000ms // 䜿甚猓存的响应时闎刀断域名是吊可甚 final responseTime = _domainResponseTimes[domain]; - if (responseTime != null && responseTime < 10000) { // 10秒内响应讀䞺可甚 - KRLogUtil.kr_i('📋 䜿甚猓存结果域名 $domain 可甚猓存时闎: ${timeSinceLastCheck}s响应时闎: ${responseTime}ms', tag: 'KRDomain'); + if (responseTime != null && responseTime < 10000) { + // 10秒内响应讀䞺可甚 + KRLogUtil.kr_i( + '📋 䜿甚猓存结果域名 $domain 可甚猓存时闎: ${timeSinceLastCheck}s响应时闎: ${responseTime}ms', + tag: 'KRDomain'); return true; } } } - + try { KRLogUtil.kr_i('🔍 匀始检测域名: $domain', tag: 'KRDomain'); final startTime = DateTime.now(); - + final response = await _dio.get( '${KRProtocol.kr_https}://$domain', options: Options( sendTimeout: Duration(seconds: kr_domainTimeout), receiveTimeout: Duration(seconds: kr_domainTimeout), // 允讞所有状态码只芁胜借连接就讀䞺域名可甚 - validateStatus: (status) => status != null && status >= 200 && status < 600, + validateStatus: (status) => + status != null && status >= 200 && status < 600, ), ); final endTime = DateTime.now(); - + // 记圕响应时闎和检测时闎 final responseTime = endTime.difference(startTime).inMilliseconds; _domainResponseTimes[domain] = responseTime; _domainLastCheck[domain] = DateTime.now(); - + // 只芁胜借连接就讀䞺域名可甚包括404、403等状态码 if (response.statusCode != null) { - KRLogUtil.kr_i('✅ 域名 $domain 可甚状态码: ${response.statusCode}响应时闎: ${responseTime}ms', tag: 'KRDomain'); + KRLogUtil.kr_i( + '✅ 域名 $domain 可甚状态码: ${response.statusCode}响应时闎: ${responseTime}ms', + tag: 'KRDomain'); return true; } else { - KRLogUtil.kr_w('❌ 域名 $domain 响应匂垞状态码: ${response.statusCode}', tag: 'KRDomain'); + KRLogUtil.kr_w('❌ 域名 $domain 响应匂垞状态码: ${response.statusCode}', + tag: 'KRDomain'); return false; } } on DioException catch (e) { @@ -264,7 +279,8 @@ class KRDomain { return false; } else { // 其他错误劂未知错误、取消等讀䞺域名䞍可甚 - KRLogUtil.kr_w('❌ 域名 $domain 检查匂垞 (Type: ${e.type}): ${e.message}', tag: 'KRDomain'); + KRLogUtil.kr_w('❌ 域名 $domain 检查匂垞 (Type: ${e.type}): ${e.message}', + tag: 'KRDomain'); return false; } } catch (e) { @@ -276,27 +292,29 @@ class KRDomain { /// 获取最快的可甚域名 static Future kr_getFastestAvailableDomain() async { if (kr_baseDomains.isEmpty) return null; - + // 按响应时闎排序域名 final sortedDomains = kr_baseDomains.toList() ..sort((a, b) => (_domainResponseTimes[a] ?? double.infinity) .compareTo(_domainResponseTimes[b] ?? double.infinity)); - + // 检查最快的域名是吊可甚 for (String domain in sortedDomains) { if (await kr_checkDomainAvailability(domain)) { return domain; } } - + return null; } - /// 快速域名切换 - 并发检测所有域名 + /// 快速域名切换 - 并发检测所有域名 static Future kr_fastDomainSwitch() async { if (kr_baseDomains.isEmpty) return null; - KRLogUtil.kr_i('🚀 匀始快速域名切换检测 ${kr_baseDomains.length} 䞪䞻域名: $kr_baseDomains', tag: 'KRDomain'); + KRLogUtil.kr_i( + '🚀 匀始快速域名切换检测 ${kr_baseDomains.length} 䞪䞻域名: $kr_baseDomains', + tag: 'KRDomain'); final startTime = DateTime.now(); // 🔧 修倍5䞺敎䞪域名切换流皋添加总超时 @@ -304,7 +322,8 @@ class KRDomain { return await _executeFastDomainSwitch(startTime).timeout( Duration(seconds: kr_maxDomainSwitchTimeout), onTimeout: () { - KRLogUtil.kr_e('⏰ 域名切换总超时${kr_maxDomainSwitchTimeout}秒', tag: 'KRDomain'); + KRLogUtil.kr_e('⏰ 域名切换总超时${kr_maxDomainSwitchTimeout}秒', + tag: 'KRDomain'); return null; }, ); @@ -316,40 +335,44 @@ class KRDomain { /// 执行快速域名切换的栞心逻蟑 static Future _executeFastDomainSwitch(DateTime startTime) async { - // 先检查猓存劂果有可甚的域名盎接返回 for (String domain in kr_baseDomains) { final lastCheck = _domainLastCheck[domain]; if (lastCheck != null) { - final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds; + final timeSinceLastCheck = + DateTime.now().difference(lastCheck).inSeconds; if (timeSinceLastCheck < _domainCacheDuration) { final responseTime = _domainResponseTimes[domain]; // 🔧 修倍2攟宜猓存阈倌 2000ms → 5000ms - if (responseTime != null && responseTime < 5000) { // 5秒内响应讀䞺可甚 - KRLogUtil.kr_i('🎯 䜿甚猓存结果快速切换域名: $domain (响应时闎: ${responseTime}ms)', tag: 'KRDomain'); + if (responseTime != null && responseTime < 5000) { + // 5秒内响应讀䞺可甚 + KRLogUtil.kr_i( + '🎯 䜿甚猓存结果快速切换域名: $domain (响应时闎: ${responseTime}ms)', + tag: 'KRDomain'); return domain; } } } } - + // 创建并发任务列衚 - List>> tasks = kr_baseDomains.map((domain) async { + List>> tasks = + kr_baseDomains.map((domain) async { bool isAvailable = await kr_checkDomainAvailability(domain); return MapEntry(domain, isAvailable); }).toList(); - + // 等埅所有任务完成䜆讟眮总䜓超时 try { KRLogUtil.kr_i('⏱ 等埅并发检测结果超时时闎: ${kr_totalTimeout}秒', tag: 'KRDomain'); List> results = await Future.wait( tasks, ).timeout(Duration(seconds: kr_totalTimeout)); - + final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; KRLogUtil.kr_i('📊 䞻域名检测完成耗时: ${duration}ms', tag: 'KRDomain'); - + // 统计结果 int availableCount = 0; for (MapEntry result in results) { @@ -360,9 +383,10 @@ class KRDomain { KRLogUtil.kr_w('❌ 䞻域名䞍可甚: ${result.key}', tag: 'KRDomain'); } } - - KRLogUtil.kr_i('📈 䞻域名检测结果: $availableCount/${results.length} 可甚', tag: 'KRDomain'); - + + KRLogUtil.kr_i('📈 䞻域名检测结果: $availableCount/${results.length} 可甚', + tag: 'KRDomain'); + // 扟到第䞀䞪可甚的域名 for (MapEntry result in results) { if (result.value) { @@ -370,16 +394,16 @@ class KRDomain { return result.key; } } - + KRLogUtil.kr_w('⚠ 所有䞻域名郜䞍可甚匀始尝试倇甚域名', tag: 'KRDomain'); - + // 劂果䞻域名郜䞍可甚快速尝试倇甚域名 String? backupDomain = await kr_fastBackupDomainSwitch(); if (backupDomain != null) { KRLogUtil.kr_i('✅ 倇甚域名切换成功: $backupDomain', tag: 'KRDomain'); return backupDomain; } - + // 劂果倇甚域名也倱莥尝试䜿甚本地配眮的倇甚域名 KRLogUtil.kr_w('⚠ 倇甚域名也倱莥尝试䜿甚本地配眮的倇甚域名', tag: 'KRDomain'); String? localBackupDomain = await kr_tryLocalBackupDomains(); @@ -387,13 +411,14 @@ class KRDomain { KRLogUtil.kr_i('✅ 本地倇甚域名切换成功: $localBackupDomain', tag: 'KRDomain'); return localBackupDomain; } - + // 🔧 修倍4验证兜底域名是吊可甚 KRLogUtil.kr_w('⚠ 所有域名郜倱莥尝试兜底域名', tag: 'KRDomain'); const fallbackDomain = "api.airovpn.tel"; // 快速验证兜底域名 - bool isFallbackAvailable = await kr_fastCheckDomainAvailability(fallbackDomain); + bool isFallbackAvailable = + await kr_fastCheckDomainAvailability(fallbackDomain); if (isFallbackAvailable) { KRLogUtil.kr_i('✅ 兜底域名可甚: $fallbackDomain', tag: 'KRDomain'); return fallbackDomain; @@ -401,12 +426,11 @@ class KRDomain { KRLogUtil.kr_e('❌ 兜底域名也䞍可甚: $fallbackDomain', tag: 'KRDomain'); return null; // 所有域名郜倱莥返回 null - } catch (e) { final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; KRLogUtil.kr_e('⏰ 快速域名切换超时或匂垞 (${duration}ms): $e', tag: 'KRDomain'); - + // 超时或匂垞时尝试䜿甚本地配眮的倇甚域名 KRLogUtil.kr_w('⚠ 快速切换超时尝试䜿甚本地倇甚域名', tag: 'KRDomain'); String? localBackupDomain = await kr_tryLocalBackupDomains(); @@ -414,7 +438,7 @@ class KRDomain { KRLogUtil.kr_i('✅ 本地倇甚域名切换成功: $localBackupDomain', tag: 'KRDomain'); return localBackupDomain; } - + return null; } } @@ -434,7 +458,8 @@ class KRDomain { try { // 劂果圓前域名已经圚䞻域名列衚䞭先检查它是吊可甚 if (kr_baseDomains.contains(kr_currentDomain)) { - bool isCurrentAvailable = await kr_fastCheckDomainAvailability(kr_currentDomain); + bool isCurrentAvailable = + await kr_fastCheckDomainAvailability(kr_currentDomain); if (isCurrentAvailable) { KRLogUtil.kr_i('✅ 圓前域名可甚无需切换: $kr_currentDomain', tag: 'KRDomain'); return; // 圓前域名可甚䞍需芁切换 @@ -471,9 +496,10 @@ class KRDomain { static Future kr_fastBackupDomainSwitch() async { KRLogUtil.kr_i('🔄 匀始快速倇甚域名切换倇甚地址: $kr_backupDomainUrls', tag: 'KRDomain'); final startTime = DateTime.now(); - + // 并发获取所有倇甚地址的域名 - List>> backupTasks = kr_backupDomainUrls.map((url) async { + List>> backupTasks = + kr_backupDomainUrls.map((url) async { try { KRLogUtil.kr_i('📡 从倇甚地址获取域名: $url', tag: 'KRDomain'); final response = await _dio.get( @@ -483,7 +509,7 @@ class KRDomain { receiveTimeout: Duration(seconds: kr_domainTimeout), ), ); - + if (response.statusCode == 200 && response.data != null) { String responseData = response.data.toString(); KRLogUtil.kr_i('📥 倇甚地址 $url 返回数据: $responseData', tag: 'KRDomain'); @@ -491,50 +517,54 @@ class KRDomain { KRLogUtil.kr_i('🔍 解析到倇甚域名: $domains', tag: 'KRDomain'); return domains; } else { - KRLogUtil.kr_w('❌ 倇甚地址 $url 响应匂垞状态码: ${response.statusCode}', tag: 'KRDomain'); + KRLogUtil.kr_w('❌ 倇甚地址 $url 响应匂垞状态码: ${response.statusCode}', + tag: 'KRDomain'); } } catch (e) { KRLogUtil.kr_w('❌ 倇甚地址 $url 获取倱莥: $e', tag: 'KRDomain'); } return []; }).toList(); - + try { - KRLogUtil.kr_i('⏱ 等埅倇甚地址响应超时时闎: ${kr_totalTimeout - 1}秒', tag: 'KRDomain'); + KRLogUtil.kr_i('⏱ 等埅倇甚地址响应超时时闎: ${kr_totalTimeout - 1}秒', + tag: 'KRDomain'); List> backupResults = await Future.wait( backupTasks, ).timeout(Duration(seconds: kr_totalTimeout - 1)); // 留1秒给域名测试 - + // 合并所有倇甚域名并去重 Set uniqueBackupDomains = {}; for (List domains in backupResults) { uniqueBackupDomains.addAll(domains); } List allBackupDomains = uniqueBackupDomains.toList(); - + KRLogUtil.kr_i('📋 合并并去重后的倇甚域名: $allBackupDomains', tag: 'KRDomain'); - + if (allBackupDomains.isEmpty) { KRLogUtil.kr_w('⚠ 没有获取到倇甚域名', tag: 'KRDomain'); return null; } - - KRLogUtil.kr_i('🧪 匀始测试 ${allBackupDomains.length} 䞪倇甚域名', tag: 'KRDomain'); - + + KRLogUtil.kr_i('🧪 匀始测试 ${allBackupDomains.length} 䞪倇甚域名', + tag: 'KRDomain'); + // 并发测试所有倇甚域名 - List>> testTasks = allBackupDomains.map((domain) async { + List>> testTasks = + allBackupDomains.map((domain) async { bool isAvailable = await kr_checkDomainAvailability(domain); return MapEntry(domain, isAvailable); }).toList(); - + List> testResults = await Future.wait( testTasks, ).timeout(Duration(seconds: 2)); // 增加到2秒内完成测试 - + final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; KRLogUtil.kr_i('📊 倇甚域名检测完成总耗时: ${duration}ms', tag: 'KRDomain'); - + // 统计倇甚域名结果 int availableBackupCount = 0; for (MapEntry result in testResults) { @@ -545,35 +575,36 @@ class KRDomain { KRLogUtil.kr_w('❌ 倇甚域名䞍可甚: ${result.key}', tag: 'KRDomain'); } } - - KRLogUtil.kr_i('📈 倇甚域名检测结果: $availableBackupCount/${testResults.length} 可甚', tag: 'KRDomain'); - + + KRLogUtil.kr_i( + '📈 倇甚域名检测结果: $availableBackupCount/${testResults.length} 可甚', + tag: 'KRDomain'); + // 扟到第䞀䞪可甚的倇甚域名 for (MapEntry result in testResults) { if (result.value) { KRLogUtil.kr_i('🎯 快速切换选择倇甚域名: ${result.key}', tag: 'KRDomain'); - + // 曎新圓前域名并保存 kr_currentDomain = result.key; await kr_saveCurrentDomain(); KRLogUtil.kr_i('💟 已保存新域名: $kr_currentDomain', tag: 'KRDomain'); - + // 将倇甚域名添加到䞻域名列衚 if (!kr_baseDomains.contains(result.key)) { kr_baseDomains.add(result.key); await kr_saveDomains(kr_baseDomains); KRLogUtil.kr_i('📝 已将倇甚域名添加到䞻域名列衚', tag: 'KRDomain'); } - + // 重芁盎接返回可甚域名䞍再请求/v1/app/auth/config KRLogUtil.kr_i('✅ 倇甚域名切换成功盎接䜿甚: ${result.key}', tag: 'KRDomain'); return result.key; } } - + KRLogUtil.kr_w('⚠ 所有倇甚域名郜䞍可甚', tag: 'KRDomain'); return null; - } catch (e) { final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; @@ -585,11 +616,11 @@ class KRDomain { /// 从倇甚地址获取域名列衚 static Future> kr_getBackupDomains() async { List backupDomains = []; - + for (String backupUrl in kr_backupDomainUrls) { try { KRLogUtil.kr_i('尝试从倇甚地址获取域名: $backupUrl', tag: 'KRDomain'); - + final response = await _dio.get( backupUrl, options: Options( @@ -597,41 +628,42 @@ class KRDomain { receiveTimeout: const Duration(seconds: 10), ), ); - + if (response.statusCode == 200 && response.data != null) { String responseData = response.data.toString(); KRLogUtil.kr_i('倇甚地址返回数据: $responseData', tag: 'KRDomain'); - + // 倄理返回的JSON数据 List domains = kr_parseBackupDomains(responseData); backupDomains.addAll(domains); - + KRLogUtil.kr_i('解析到倇甚域名: $domains', tag: 'KRDomain'); } } catch (e) { KRLogUtil.kr_w('从倇甚地址 $backupUrl 获取域名倱莥: $e', tag: 'KRDomain'); } } - + return backupDomains; } /// 解析倇甚域名JSON数据 static List kr_parseBackupDomains(String jsonData) { List domains = []; - + try { KRLogUtil.kr_i('🔍 匀始解析倇甚域名数据: $jsonData', tag: 'KRDomain'); - + // 尝试解析䞺JSON数组 if (jsonData.startsWith('[') && jsonData.endsWith(']')) { List jsonList = json.decode(jsonData); KRLogUtil.kr_i('📋 解析䞺JSON数组长床: ${jsonList.length}', tag: 'KRDomain'); - + for (int i = 0; i < jsonList.length; i++) { dynamic item = jsonList[i]; - KRLogUtil.kr_i('🔍 倄理第 $i 项: $item (类型: ${item.runtimeType})', tag: 'KRDomain'); - + KRLogUtil.kr_i('🔍 倄理第 $i 项: $item (类型: ${item.runtimeType})', + tag: 'KRDomain'); + if (item is String) { // 字笊䞲栌匏 String domain = kr_extractDomain(item); @@ -642,11 +674,11 @@ class KRDomain { } else if (item is Map) { // 对象栌匏劂 {https:, 158.247.232.203:8080} KRLogUtil.kr_i('🔍 倄理对象栌匏: $item', tag: 'KRDomain'); - + // 遍历对象的键倌对 item.forEach((key, value) { KRLogUtil.kr_i('🔍 键: $key, 倌: $value', tag: 'KRDomain'); - + if (value is String && value.isNotEmpty) { // 劂果倌是字笊䞲盎接䜜䞺域名 String domain = kr_extractDomain(value); @@ -670,15 +702,16 @@ class KRDomain { } else if (jsonData.startsWith('{') && jsonData.endsWith('}')) { // 倄理类䌌 { "url1", "url2" } 的栌匏 KRLogUtil.kr_i('🔍 尝试解析䞺对象栌匏', tag: 'KRDomain'); - + try { // 尝试解析䞺JSON对象 Map jsonMap = json.decode(jsonData); - KRLogUtil.kr_i('📋 解析䞺JSON对象键数量: ${jsonMap.length}', tag: 'KRDomain'); - + KRLogUtil.kr_i('📋 解析䞺JSON对象键数量: ${jsonMap.length}', + tag: 'KRDomain'); + jsonMap.forEach((key, value) { KRLogUtil.kr_i('🔍 键: $key, 倌: $value', tag: 'KRDomain'); - + if (value is String && value.isNotEmpty) { String domain = kr_extractDomain(value); if (domain.isNotEmpty) { @@ -695,16 +728,16 @@ class KRDomain { }); } catch (e) { KRLogUtil.kr_w('⚠ JSON对象解析倱莥尝试字笊䞲解析: $e', tag: 'KRDomain'); - + // 劂果䞍是标准JSON尝试字笊䞲解析 String cleanData = jsonData .replaceAll('{', '') .replaceAll('}', '') .replaceAll('"', '') .replaceAll("'", ''); - + KRLogUtil.kr_i('🧹 枅理后的数据: $cleanData', tag: 'KRDomain'); - + // 按逗号分割 List parts = cleanData.split(','); for (String part in parts) { @@ -721,7 +754,7 @@ class KRDomain { } else { // 尝试解析䞺字笊䞲数组栌匏 KRLogUtil.kr_i('🔍 尝试解析䞺字笊䞲栌匏', tag: 'KRDomain'); - + // 移陀可胜的匕号和方括号 String cleanData = jsonData .replaceAll('[', '') @@ -730,9 +763,9 @@ class KRDomain { .replaceAll('}', '') .replaceAll('"', '') .replaceAll("'", ''); - + KRLogUtil.kr_i('🧹 枅理后的数据: $cleanData', tag: 'KRDomain'); - + // 按逗号分割 List parts = cleanData.split(','); for (String part in parts) { @@ -746,49 +779,49 @@ class KRDomain { } } } - - KRLogUtil.kr_i('📊 解析完成总共提取到 ${domains.length} 䞪域名: $domains', tag: 'KRDomain'); - + + KRLogUtil.kr_i('📊 解析完成总共提取到 ${domains.length} 䞪域名: $domains', + tag: 'KRDomain'); } catch (e) { KRLogUtil.kr_e('❌ 解析倇甚域名数据倱莥: $e', tag: 'KRDomain'); } - + return domains; } /// 测试并切换到倇甚域名 static Future kr_tryBackupDomains() async { KRLogUtil.kr_i('匀始尝试倇甚域名', tag: 'KRDomain'); - + // 获取倇甚域名列衚 List backupDomains = await kr_getBackupDomains(); - + if (backupDomains.isEmpty) { KRLogUtil.kr_w('没有获取到倇甚域名', tag: 'KRDomain'); return false; } - + KRLogUtil.kr_i('获取到倇甚域名: $backupDomains', tag: 'KRDomain'); - + // 测试倇甚域名的可甚性 for (String domain in backupDomains) { if (await kr_checkDomainAvailability(domain)) { KRLogUtil.kr_i('扟到可甚的倇甚域名: $domain', tag: 'KRDomain'); - + // 曎新圓前域名 kr_currentDomain = domain; await kr_saveCurrentDomain(); - + // 将倇甚域名添加到䞻域名列衚 if (!kr_baseDomains.contains(domain)) { kr_baseDomains.add(domain); await kr_saveDomains(kr_baseDomains); } - + return true; } } - + KRLogUtil.kr_w('所有倇甚域名郜䞍可甚', tag: 'KRDomain'); return false; } @@ -796,19 +829,20 @@ class KRDomain { /// 倄理域名列衚 static Future kr_handleDomains(List domains) async { // 提取所有域名 - List extractedDomains = domains.map((url) => kr_extractDomain(url)).toList(); - + List extractedDomains = + domains.map((url) => kr_extractDomain(url)).toList(); + // 劂果提取的域名䞺空䜿甚默讀域名 if (extractedDomains.isEmpty) { extractedDomains = ["kkmen.cc"]; } - + // 保存域名列衚 await kr_saveDomains(extractedDomains); - + // 曎新圓前域名列衚 kr_baseDomains = extractedDomains; - + // 劂果圓前域名䞍圚新列衚䞭䜿甚第䞀䞪域名 if (!kr_baseDomains.contains(kr_currentDomain)) { kr_currentDomain = kr_baseDomains[0]; @@ -835,7 +869,9 @@ class KRDomain { if (age < _domainCacheDuration && !_triedDomains.contains(domain)) { kr_currentDomain = domain; await kr_saveCurrentDomain(); - KRLogUtil.kr_i('✅ 䜿甚猓存的成功域名: $kr_currentDomain (响应时闎: ${responseTime}ms)', tag: 'KRDomain'); + KRLogUtil.kr_i( + '✅ 䜿甚猓存的成功域名: $kr_currentDomain (响应时闎: ${responseTime}ms)', + tag: 'KRDomain'); return true; } } @@ -848,7 +884,7 @@ class KRDomain { KRLogUtil.kr_i('✅ 䜿甚预检测成功的域名: $kr_currentDomain', tag: 'KRDomain'); return true; } - + // 劂果已经尝试过所有䞻域名䜿甚快速切换 if (_triedDomains.length >= kr_baseDomains.length) { KRLogUtil.kr_i('⚠ 所有䞻域名郜尝试过切换到快速暡匏', tag: 'KRDomain'); @@ -863,7 +899,7 @@ class KRDomain { KRLogUtil.kr_w('❌ 快速切换倱莥', tag: 'KRDomain'); return false; } - + // 尝试䜿甚最快的可甚域名 KRLogUtil.kr_i('🏃 尝试䜿甚最快的可甚域名', tag: 'KRDomain'); String? fastestDomain = await kr_getFastestAvailableDomain(); @@ -873,7 +909,7 @@ class KRDomain { KRLogUtil.kr_i('✅ 切换到最快域名: $kr_currentDomain', tag: 'KRDomain'); return true; } - + // 劂果最快的域名䞍可甚尝试其他域名 KRLogUtil.kr_i('🔍 逐䞪尝试其他域名', tag: 'KRDomain'); for (String domain in kr_baseDomains) { @@ -887,7 +923,7 @@ class KRDomain { } } } - + KRLogUtil.kr_w('❌ 没有扟到可甚的域名', tag: 'KRDomain'); return false; } @@ -899,7 +935,8 @@ class KRDomain { _triedDomains.clear(); // 创建新的重试定时噚 - _retryTimer = Timer.periodic(Duration(seconds: kr_retryInterval), (timer) async { + _retryTimer = + Timer.periodic(Duration(seconds: kr_retryInterval), (timer) async { // 切换到䞋䞀䞪域名 bool hasNextDomain = await kr_switchToNextDomain(); if (!hasNextDomain) { @@ -927,15 +964,15 @@ class KRDomain { /// 手劚测试倇甚域名功胜 static Future kr_testBackupDomains() async { KRLogUtil.kr_i('匀始手劚测试倇甚域名功胜', tag: 'KRDomain'); - + // 枅空圓前域名列衚暡拟所有䞻域名倱效 List originalDomains = List.from(kr_baseDomains); kr_baseDomains.clear(); - + try { // 尝试倇甚域名 bool success = await kr_tryBackupDomains(); - + if (success) { KRLogUtil.kr_i('倇甚域名测试成功圓前域名: $kr_currentDomain', tag: 'KRDomain'); } else { @@ -953,14 +990,14 @@ class KRDomain { KRLogUtil.kr_i('📋 圓前域名: $kr_currentDomain', tag: 'KRDomain'); KRLogUtil.kr_i('📋 䞻域名列衚: $kr_baseDomains', tag: 'KRDomain'); KRLogUtil.kr_i('📋 倇甚地址列衚: $kr_backupDomainUrls', tag: 'KRDomain'); - + final startTime = DateTime.now(); String? newDomain = await kr_fastDomainSwitch(); final endTime = DateTime.now(); - + final duration = endTime.difference(startTime).inMilliseconds; KRLogUtil.kr_i('⏱ 快速切换总耗时: ${duration}ms', tag: 'KRDomain'); - + if (newDomain != null) { kr_currentDomain = newDomain; await kr_saveCurrentDomain(); @@ -976,23 +1013,25 @@ class KRDomain { static Future kr_tryLocalBackupDomains() async { KRLogUtil.kr_i('🔄 匀始尝试本地倇甚域名: $kr_localBackupDomains', tag: 'KRDomain'); final startTime = DateTime.now(); - + // 并发检测所有本地倇甚域名 - List>> tasks = kr_localBackupDomains.map((domain) async { + List>> tasks = + kr_localBackupDomains.map((domain) async { bool isAvailable = await kr_checkDomainAvailability(domain); return MapEntry(domain, isAvailable); }).toList(); - + try { - KRLogUtil.kr_i('⏱ 等埅本地倇甚域名检测结果超时时闎: ${kr_totalTimeout}秒', tag: 'KRDomain'); + KRLogUtil.kr_i('⏱ 等埅本地倇甚域名检测结果超时时闎: ${kr_totalTimeout}秒', + tag: 'KRDomain'); List> results = await Future.wait( tasks, ).timeout(Duration(seconds: kr_totalTimeout)); - + final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; KRLogUtil.kr_i('📊 本地倇甚域名检测完成耗时: ${duration}ms', tag: 'KRDomain'); - + // 统计结果 int availableCount = 0; for (MapEntry result in results) { @@ -1003,33 +1042,33 @@ class KRDomain { KRLogUtil.kr_w('❌ 本地倇甚域名䞍可甚: ${result.key}', tag: 'KRDomain'); } } - - KRLogUtil.kr_i('📈 本地倇甚域名检测结果: $availableCount/${results.length} 可甚', tag: 'KRDomain'); - + + KRLogUtil.kr_i('📈 本地倇甚域名检测结果: $availableCount/${results.length} 可甚', + tag: 'KRDomain'); + // 扟到第䞀䞪可甚的本地倇甚域名 for (MapEntry result in results) { if (result.value) { KRLogUtil.kr_i('🎯 选择本地倇甚域名: ${result.key}', tag: 'KRDomain'); - + // 曎新圓前域名并保存 kr_currentDomain = result.key; await kr_saveCurrentDomain(); KRLogUtil.kr_i('💟 已保存本地倇甚域名: $kr_currentDomain', tag: 'KRDomain'); - + // 将本地倇甚域名添加到䞻域名列衚 if (!kr_baseDomains.contains(result.key)) { kr_baseDomains.add(result.key); await kr_saveDomains(kr_baseDomains); KRLogUtil.kr_i('📝 已将本地倇甚域名添加到䞻域名列衚', tag: 'KRDomain'); } - + return result.key; } } - + KRLogUtil.kr_w('⚠ 所有本地倇甚域名郜䞍可甚', tag: 'KRDomain'); return null; - } catch (e) { final endTime = DateTime.now(); final duration = endTime.difference(startTime).inMilliseconds; @@ -1041,7 +1080,7 @@ class KRDomain { /// 测试倇甚域名解析 static void kr_testBackupDomainParsing() { KRLogUtil.kr_i('🧪 匀始测试倇甚域名解析', tag: 'KRDomain'); - + // 测试数据 List testData = [ '["https://apicn.bearvpn.top", "http://158.247.232.203:8080"]', @@ -1052,7 +1091,7 @@ class KRDomain { // 䜠遇到的实际数据栌匏 '{\n"https://apicn.bearvpn.top",\n"http://158.247.232.203:8080"\n}' ]; - + for (int i = 0; i < testData.length; i++) { KRLogUtil.kr_i('🧪 测试数据 $i: ${testData[i]}', tag: 'KRDomain'); List domains = kr_parseBackupDomains(testData[i]); @@ -1107,7 +1146,8 @@ class KRDomain { } final totalDuration = DateTime.now().difference(startTime).inMilliseconds; - KRLogUtil.kr_i('✅ 域名加蜜完成耗时: ${totalDuration}ms圓前域名: $kr_currentDomain', tag: 'KRDomain'); + KRLogUtil.kr_i('✅ 域名加蜜完成耗时: ${totalDuration}ms圓前域名: $kr_currentDomain', + tag: 'KRDomain'); } /// 执行域名加蜜和验证 @@ -1115,7 +1155,8 @@ class KRDomain { // 加蜜域名列衚 String? savedDomains = await _storage.kr_readData(key: kr_domainsKey); if (savedDomains != null && savedDomains.isNotEmpty) { - kr_baseDomains = savedDomains.split(',').where((d) => d.isNotEmpty).toList(); + kr_baseDomains = + savedDomains.split(',').where((d) => d.isNotEmpty).toList(); KRLogUtil.kr_i('📋 从 Hive 加蜜的域名列衚: $kr_baseDomains', tag: 'KRDomain'); } else { KRLogUtil.kr_w('⚠ Hive 䞭没有保存的域名列衚䜿甚默讀配眮', tag: 'KRDomain'); @@ -1125,13 +1166,16 @@ class KRDomain { String? savedDomain = await _storage.kr_readData(key: kr_domainKey); KRLogUtil.kr_i('📌 从 Hive 加蜜的圓前域名: $savedDomain', tag: 'KRDomain'); - if (savedDomain != null && savedDomain.isNotEmpty && kr_baseDomains.contains(savedDomain)) { + if (savedDomain != null && + savedDomain.isNotEmpty && + kr_baseDomains.contains(savedDomain)) { // 🔧 Android 15 关键修倍验证 Hive 猓存的域名是吊仍然可甚 KRLogUtil.kr_i('🔍 验证 Hive 猓存域名的可甚性: $savedDomain', tag: 'KRDomain'); try { // 快速验证3 秒超时 - bool isAvailable = await kr_fastCheckDomainAvailability(savedDomain).timeout( + bool isAvailable = + await kr_fastCheckDomainAvailability(savedDomain).timeout( const Duration(seconds: 3), onTimeout: () { KRLogUtil.kr_w('⏱ 域名验证超时(3秒)视䞺䞍可甚', tag: 'KRDomain'); @@ -1141,7 +1185,8 @@ class KRDomain { if (isAvailable) { kr_currentDomain = savedDomain; - KRLogUtil.kr_i('✅ Hive 猓存域名验证通过继续䜿甚: $kr_currentDomain', tag: 'KRDomain'); + KRLogUtil.kr_i('✅ Hive 猓存域名验证通过继续䜿甚: $kr_currentDomain', + tag: 'KRDomain'); return; } else { KRLogUtil.kr_w('❌ Hive 猓存域名䞍可甚: $savedDomain需芁切换', tag: 'KRDomain'); @@ -1175,7 +1220,8 @@ class KRDomain { if (isAvailable) { kr_currentDomain = domain; await kr_saveCurrentDomain(); - KRLogUtil.kr_i('✅ 扟到可甚域名: $kr_currentDomain已保存到 Hive', tag: 'KRDomain'); + KRLogUtil.kr_i('✅ 扟到可甚域名: $kr_currentDomain已保存到 Hive', + tag: 'KRDomain'); return; } } catch (e) { @@ -1218,19 +1264,19 @@ class KRDomain { static void _kr_clearExpiredCache() { final now = DateTime.now(); final expiredDomains = []; - + for (MapEntry entry in _domainLastCheck.entries) { final timeSinceLastCheck = now.difference(entry.value).inSeconds; if (timeSinceLastCheck >= _domainCacheDuration) { expiredDomains.add(entry.key); } } - + for (String domain in expiredDomains) { _domainLastCheck.remove(domain); _domainResponseTimes.remove(domain); } - + if (expiredDomains.isNotEmpty) { KRLogUtil.kr_i('🧹 枅理过期猓存域名: $expiredDomains', tag: 'KRDomain'); } @@ -1300,8 +1346,6 @@ class AppConfig { /// 邀请铟接 String kr_invitation_link = ""; - /// 眑站ID - String kr_website_id = ""; /// 讟倇限制数量 String device_limit = '0'; @@ -1314,7 +1358,7 @@ class AppConfig { /// User API 实䟋 final KRUserApi _kr_userApi = KRUserApi(); - + /// 防重倍调甚标志 bool _isInitializing = false; @@ -1323,8 +1367,6 @@ class AppConfig { static const int kr_maxRetryCount = 2; // 最倧重试次数 - 重试䞀次 AppConfig._internal() { - // 初始化时加蜜保存的域名 - KRDomain.kr_loadBaseDomain(); } factory AppConfig() => _instance; @@ -1342,7 +1384,7 @@ class AppConfig { Future Function()? onSuccess, }) async { _initLog.logSeparator(); - _initLog.log('🌐 匀始应甚配眮初始化域名加蜜', tag: 'Domain'); + _initLog.log('🌐 匀始应甚配眮初始化跳过域名加蜜前眮已完成', tag: 'Domain'); if (_isInitializing) { _initLog.logWarning('配眮初始化已圚进行䞭跳过重倍调甚', tag: 'Domain'); @@ -1352,149 +1394,16 @@ class AppConfig { _isInitializing = true; try { - // 🔧 修倍6启劚时䌘先加蜜䞊次成功的域名 - _initLog.log('匀始加蜜基础域名配眮', tag: 'Domain'); - await KRDomain.kr_loadBaseDomain(); - _initLog.logSuccess('圓前䜿甚域名: ${KRDomain.kr_currentDomain}', tag: 'Domain'); - KRLogUtil.kr_i('📍 圓前䜿甚域名: ${KRDomain.kr_currentDomain}', tag: 'AppConfig'); - - // 所有暡匏郜走正垞的配眮请求流皋 - _initLog.log('匀始配眮请求流皋包含重试机制', tag: 'Domain'); - KRLogUtil.kr_i('🚀 匀始配眮初始化', tag: 'AppConfig'); - await _startAutoRetry(onSuccess); + // 跳过域名加蜜已圚 _kr_initSiteConfig / KRSiteConfigService.initializeDomains 䞭完成 + // 仅觊发后续成功回调 + if (onSuccess != null) { + await onSuccess(); + } } finally { _isInitializing = false; } } - Future _startAutoRetry(Future Function()? onSuccess) async { - _retryTimer?.cancel(); - int currentRetryCount = 0; - // 🔧 P0修倍添加总䜓尝试次数限制防止无限递園 - int totalAttempts = 0; - const int maxTotalAttempts = 5; // 最倚5次尝试包括域名切换后的重试 - - Future executeConfigRequest() async { - try { - // 🔧 P0修倍检查总䜓尝试次数 - totalAttempts++; - if (totalAttempts > maxTotalAttempts) { - KRLogUtil.kr_e('❌ 超过最倧总尝试次数($maxTotalAttempts)停止重试', tag: 'AppConfig'); - // 䜿甚默讀配眮继续启劚 - if (onSuccess != null) { - await onSuccess(); - } - return; - } - - // 检查是吊超过最倧重试次数 - if (currentRetryCount >= kr_maxRetryCount) { - KRLogUtil.kr_w('蟟到最倧重试次数尝试䜿甚倇甚域名', tag: 'AppConfig'); - // 最后䞀次尝试䜿甚倇甚域名 - String? newDomain = await KRDomain.kr_fastDomainSwitch(); - if (newDomain != null) { - KRDomain.kr_currentDomain = newDomain; - await KRDomain.kr_saveCurrentDomain(); - KRLogUtil.kr_i('✅ 最终切换到倇甚域名: $newDomain', tag: 'AppConfig'); - // 重眮圓前重试计数䜆保留总尝试次数 - currentRetryCount = 0; - // 继续重试配眮请求 - await executeConfigRequest(); - } else { - KRLogUtil.kr_e('❌ 倇甚域名切换倱莥䜿甚默讀配眮继续', tag: 'AppConfig'); - // 䜿甚默讀配眮继续启劚 - if (onSuccess != null) { - await onSuccess(); - } - } - return; - } - - _initLog.log('发起配眮请求 API (尝试 $totalAttempts/$maxTotalAttempts)', tag: 'Domain'); - final result = await _kr_userApi.kr_config(); - result.fold( - (error) async { - _initLog.logError('配眮请求倱莥 (重试 $currentRetryCount/$kr_maxRetryCount)', tag: 'Domain', error: error); - KRLogUtil.kr_e('配眮初始化倱莥: $error', tag: 'AppConfig'); - currentRetryCount++; - - // 计算重试延迟时闎 - final retryDelay = (kr_retryInterval * pow(kr_backoffFactor, currentRetryCount)).toInt(); - final actualDelay = max(retryDelay, 100); - _initLog.log('将圚 ${actualDelay}ms 后重试', tag: 'Domain'); - - // 尝试切换域名 - _initLog.log('尝试切换到䞋䞀䞪倇甚域名', tag: 'Domain'); - await KRDomain.kr_switchToNextDomain(); - _initLog.log('圓前域名: ${KRDomain.kr_currentDomain}', tag: 'Domain'); - - // 等埅后重试 - await Future.delayed(Duration(milliseconds: actualDelay)); - await executeConfigRequest(); - }, - (config) async { - _initLog.logSuccess('配眮请求成功', tag: 'Domain'); - _initLog.log('眑站ID: ${config.kr_website_id}', tag: 'Domain'); - _initLog.log('官眑: ${config.kr_official_website}', tag: 'Domain'); - _retryTimer?.cancel(); - currentRetryCount = 0; - - kr_official_email = config.kr_official_email; - kr_official_website = config.kr_official_website; - kr_official_telegram = config.kr_official_telegram; - kr_official_telephone = config.kr_official_telephone; - kr_invitation_link = config.kr_invitation_link; - // kr_website_id = config.kr_website_id; - if (config.kr_domains.isNotEmpty) { - KRDomain.kr_handleDomains(config.kr_domains); - } - - /// 刀断圓前是癜倩 - kr_is_daytime = await config.kr_update_application.kr_is_daytime() ; - - KRUpdateUtil().kr_initUpdateInfo(config.kr_update_application); - - if (onSuccess != null) { - onSuccess(); - } - }, - ); - } catch (e) { - KRLogUtil.kr_e('配眮初始化匂垞: $e', tag: 'AppConfig'); - currentRetryCount++; - - // 检查是吊超过最倧重试次数 - if (currentRetryCount >= kr_maxRetryCount) { - KRLogUtil.kr_w('蟟到最倧重试次数尝试䜿甚倇甚域名', tag: 'AppConfig'); - // 最后䞀次尝试䜿甚倇甚域名 - String? newDomain = await KRDomain.kr_fastDomainSwitch(); - if (newDomain != null) { - KRDomain.kr_currentDomain = newDomain; - await KRDomain.kr_saveCurrentDomain(); - KRLogUtil.kr_i('✅ 最终切换到倇甚域名: $newDomain', tag: 'AppConfig'); - // 继续重试配眮请求 - await executeConfigRequest(); - } - return; - } - - // 计算重试延迟时闎 - final retryDelay = (kr_retryInterval * pow(kr_backoffFactor, currentRetryCount)).toInt(); - - // 尝试切换域名 - await KRDomain.kr_switchToNextDomain(); - - // 等埅后重试至少延迟100ms避免立即重试 - final actualDelay = max(retryDelay, 100); - await Future.delayed(Duration(milliseconds: actualDelay)); - await executeConfigRequest(); - } - } - - // 匀始第䞀次请求 - await executeConfigRequest(); - } - /// 停止自劚重连 void kr_stopAutoRetry() { _retryTimer?.cancel(); diff --git a/lib/app/common/app_run_data.dart b/lib/app/common/app_run_data.dart index 8233567..6d1847e 100755 --- a/lib/app/common/app_run_data.dart +++ b/lib/app/common/app_run_data.dart @@ -52,9 +52,6 @@ class KRAppRunData { /// 䜣金 final RxInt kr_commission = 0.obs; - /// 登圕类型 - KRLoginType? kr_loginType; - /// 讟倇ID String? deviceId; @@ -72,6 +69,14 @@ class KRAppRunData { return _instance; } + DateTime _stepStartTime = DateTime.now(); + void _logStepTiming(String stepName) { + final now = DateTime.now(); + final stepMs = now.difference(_stepStartTime).inMilliseconds; + KRLogUtil.kr_i('[SPLASH_TIMING] ⏱ $stepName 耗时: ${stepMs}ms', + tag: 'AppRunData'); + _stepStartTime = now; + } /// 刀断是吊是讟倇登圕枞客暡匏 bool isDeviceLogin() { @@ -87,7 +92,8 @@ class KRAppRunData { // JWT栌匏检查: header.payload.signature (䞉段每段甚.分隔) final parts = token.split('.'); if (parts.length != 3) { - KRLogUtil.kr_w('❌ Token栌匏无效分段数䞍对 (${parts.length} != 3)', tag: 'AppRunData'); + KRLogUtil.kr_w('❌ Token栌匏无效分段数䞍对 (${parts.length} != 3)', + tag: 'AppRunData'); return false; } @@ -185,8 +191,7 @@ class KRAppRunData { Future kr_saveUserInfo( String token, String account, - KRLoginType loginType, - String? areaCode) async { + ) async { KRLogUtil.kr_i('匀始保存甚户信息', tag: 'AppRunData'); try { @@ -197,19 +202,15 @@ class KRAppRunData { // 曎新内存䞭的数据 kr_token = token; kr_account.value = accountText; - kr_loginType = loginType; - kr_areaCode = areaCode; final Map userInfo = { 'token': token, 'account': accountText, - 'loginType': loginType.value, - 'areaCode': areaCode ?? "", }; KRLogUtil.kr_i('准倇保存甚户信息到存傚', tag: 'AppRunData'); - + await KRSecureStorage().kr_saveData( key: _keyUserInfo, value: jsonEncode(userInfo), @@ -230,11 +231,11 @@ class KRAppRunData { kr_isLogin.value = true; KRLogUtil.kr_i('甚户信息-kr_isLogin$kr_isLogin', tag: 'AppRunData'); - // 🔧 非枞客暡匏䞋调甚甚户信息接口获取 refer_code 等信息 - KRLogUtil.kr_i('🔍 [AppRunData] 检查登圕暡匏: account=$account', tag: 'AppRunData'); + KRLogUtil.kr_i('🔍 [AppRunData] 检查登圕暡匏: account=$account', + tag: 'AppRunData'); - await _fetchUserInfo(); - + // 䞍等埅userinfo接口返回 + _fetchUserInfo(); } catch (e) { KRLogUtil.kr_e('保存甚户信息倱莥: $e', tag: 'AppRunData'); // 劂果出错重眮登圕状态 @@ -246,88 +247,89 @@ class KRAppRunData { /// 退出登圕(其实是讟倇重新登圕) Future kr_loginOut() async { HIDialog.show( - message: '圓前登圕已过期请重新登圕', - preventBackDismiss: true, - confirmText: '确定', - autoClose: false, - onConfirm: () async{ - // 先将登圕状态讟眮䞺 false防止重连 - kr_isLogin.value = false; - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'AppRunData'); - KRLogUtil.kr_i('匀始重新进行讟倇登圕', tag: 'AppRunData'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'AppRunData'); - // === 停止 VPN 服务 === - try { - // 检查 SingBox 服务状态并停止 - if (KRSingBoxImp.instance.kr_status.value is SingboxStarted) { - await KRSingBoxImp.instance.kr_stop(); - KRLogUtil.kr_i('VPN 服务已停止', tag: 'Logout'); + message: '圓前登圕已过期请重新登圕', + preventBackDismiss: true, + confirmText: '确定', + autoClose: false, + onConfirm: () async { + // 先将登圕状态讟眮䞺 false防止重连 + kr_isLogin.value = false; + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'AppRunData'); + KRLogUtil.kr_i('匀始重新进行讟倇登圕', tag: 'AppRunData'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'AppRunData'); + // === 停止 VPN 服务 === + try { + // 检查 SingBox 服务状态并停止 + if (KRSingBoxImp.instance.kr_status.value is SingboxStarted) { + await KRSingBoxImp.instance.kr_stop(); + KRLogUtil.kr_i('VPN 服务已停止', tag: 'Logout'); + } + } catch (e) { + KRLogUtil.kr_e('停止 VPN 服务倱莥: $e', tag: 'Logout'); } - } catch (e) { - KRLogUtil.kr_e('停止 VPN 服务倱莥: $e', tag: 'Logout'); - } - // 断匀 Socket 连接 - await _kr_disconnectSocket(); + // 断匀 Socket 连接 + await _kr_disconnectSocket(); - // 枅理甚户信息 - kr_token = null; - kr_account.value = null; - kr_userId.value = null; - kr_loginType = null; - kr_areaCode = null; + // 枅理甚户信息 + kr_token = null; + kr_account.value = null; + kr_userId.value = null; + kr_areaCode = null; - // 删陀存傚的甚户信息 - await KRSecureStorage().kr_deleteData(key: _keyUserInfo); + // 删陀存傚的甚户信息 + await KRSecureStorage().kr_deleteData(key: _keyUserInfo); - - // 🔧 修倍4: 枅理订阅服务数据 - 防止未登圕甚户访问订阅 - try { - final subscribeService = Get.find(tag: 'KRSubscribeService'); - if (subscribeService != null && subscribeService is KRSubscribeService) { - KRLogUtil.kr_i('🧹 枅理订阅服务数据...', tag: 'AppRunData'); - await subscribeService.kr_logout(); - KRLogUtil.kr_i('✅ 订阅服务数据已枅理', tag: 'AppRunData'); + // 🔧 修倍4: 枅理订阅服务数据 - 防止未登圕甚户访问订阅 + try { + final subscribeService = + Get.find(tag: 'KRSubscribeService'); + if (subscribeService != null && + subscribeService is KRSubscribeService) { + KRLogUtil.kr_i('🧹 枅理订阅服务数据...', tag: 'AppRunData'); + await subscribeService.kr_logout(); + KRLogUtil.kr_i('✅ 订阅服务数据已枅理', tag: 'AppRunData'); + } + } catch (e) { + // 応略匂垞劂果订阅服务未初始化或䞍可甚盎接继续 + KRLogUtil.kr_d('⚠ 无法获取订阅服务跳过枅理: $e', tag: 'AppRunData'); } - } catch (e) { - // 応略匂垞劂果订阅服务未初始化或䞍可甚盎接继续 - KRLogUtil.kr_d('⚠ 无法获取订阅服务跳过枅理: $e', tag: 'AppRunData'); - } - // 5⃣ 执行讟倇登圕 - final success = await kr_checkAndPerformDeviceLogin(); + // 5⃣ 执行讟倇登圕 + final success = await kr_checkAndPerformDeviceLogin(); - if (!success) { - // 讟倇登圕倱莥 → 提瀺甚户重试 - HIDialog.show( - message: '讟倇登圕倱莥请检查眑络或重试', - confirmText: '重试', - preventBackDismiss: true, - onConfirm: () async { - await kr_loginOut(); // 递園重试 - }, - ); - return; // 阻止跳銖页 - } + if (!success) { + // 讟倇登圕倱莥 → 提瀺甚户重试 + HIDialog.show( + message: '讟倇登圕倱莥请检查眑络或重试', + confirmText: '重试', + preventBackDismiss: true, + onConfirm: () async { + await kr_loginOut(); // 递園重试 + }, + ); + return; // 阻止跳銖页 + } - // 等埅䞀小段时闎确保登圕状态已经曎新 - await Future.delayed(const Duration(milliseconds: 300)); + // 等埅䞀小段时闎确保登圕状态已经曎新 + await Future.delayed(const Duration(milliseconds: 300)); - // 刷新订阅信息 - KRLogUtil.kr_i('🔄 匀始刷新订阅信息...', tag: 'DeviceManagement'); - try { - await KRSubscribeService().kr_refreshAll(); - KRLogUtil.kr_i('✅ 订阅信息刷新成功', tag: 'DeviceManagement'); - } catch (e) { - KRLogUtil.kr_e('订阅信息刷新倱莥: $e', tag: 'DeviceManagement'); - } + // 刷新订阅信息 + KRLogUtil.kr_i('🔄 匀始刷新订阅信息...', tag: 'DeviceManagement'); + try { + await KRSubscribeService().kr_refreshAll(); + KRLogUtil.kr_i('✅ 订阅信息刷新成功', tag: 'DeviceManagement'); + } catch (e) { + KRLogUtil.kr_e('订阅信息刷新倱莥: $e', tag: 'DeviceManagement'); + } - Get.offAllNamed(Routes.KR_HOME); - } - ); + Get.offAllNamed(Routes.KR_HOME); + }); } - Future kr_loginOut_loading() async{ + Future kr_loginOut_loading() async { KRCommonUtil.kr_showLoading(); // 先将登圕状态讟眮䞺 false防止重连 kr_isLogin.value = false; @@ -353,13 +355,11 @@ class KRAppRunData { kr_token = null; kr_account.value = null; kr_userId.value = null; - kr_loginType = null; kr_areaCode = null; // 删陀存傚的甚户信息 await KRSecureStorage().kr_deleteData(key: _keyUserInfo); - // 🔧 修倍4: 枅理订阅服务数据 - 防止未登圕甚户访问订阅 try { final subscribeService = Get.find(tag: 'KRSubscribeService'); @@ -413,35 +413,41 @@ class KRAppRunData { print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); print('🔍 匀始执行讟倇登圕...'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + _logStepTiming('讟倇登圕匀始'); // 初始化讟倇信息服务 await KRDeviceInfoService().initialize(); + _logStepTiming('初始化讟倇信息完成'); KRLogUtil.kr_i('🔐 匀始执行讟倇登圕', tag: 'AppRunData'); // 执行讟倇登圕 + _logStepTiming('匀始讟倇登圕请求'); final authApi = KRAuthApi(); final result = await authApi.kr_deviceLogin(); + _logStepTiming('讟倇登圕请求完成'); return await result.fold( - (error) { + (error) { print('❌ 讟倇登圕倱莥: ${error.msg}'); KRLogUtil.kr_e('❌ 讟倇登圕倱莥: ${error.msg}', tag: 'SplashController'); + _logStepTiming('讟倇登圕完成'); return false; }, - (token) async { + (token) async { print('✅ 讟倇登圕成功Token: $token'); KRLogUtil.kr_i('✅ 讟倇登圕成功', tag: 'SplashController'); final deviceId = KRDeviceInfoService().deviceId ?? 'unknown'; + _logStepTiming('匀始保存甚户信息'); await kr_saveUserInfo( token, 'device_$deviceId', // 䞎时莊号 - KRLoginType.kr_email, - null, // 讟倇登圕无需区号 ); + _logStepTiming('保存甚户信息完成'); kr_isLogin.value = true; print('✅ 已标记䞺登圕状态'); + _logStepTiming('讟倇登圕完成'); return true; }, ); @@ -456,37 +462,34 @@ class KRAppRunData { /// 初始化甚户信息 Future kr_initializeUserInfo() async { KRLogUtil.kr_i('匀始初始化甚户信息', tag: 'AppRunData'); - - try { + try { deviceId = KRDeviceInfoService().deviceId ?? 'unknown'; final String? userInfoString = await KRSecureStorage().kr_readData(key: _keyUserInfo); if (userInfoString != null && userInfoString.isNotEmpty) { KRLogUtil.kr_i('扟到存傚的甚户信息匀始解析', tag: 'AppRunData'); - + try { final Map userInfo = jsonDecode(userInfoString); kr_token = userInfo['token']; kr_account.value = userInfo['account']; - final loginTypeValue = userInfo['loginType']; - kr_loginType = KRLoginType.values.firstWhere( - (e) => e.value == loginTypeValue, - orElse: () => KRLoginType.kr_telephone, - ); - kr_areaCode = userInfo['areaCode'] ?? ""; // 从token䞭解析userId if (kr_token != null && kr_token!.isNotEmpty) { kr_userId.value = _kr_parseUserIdFromToken(kr_token!); } - KRLogUtil.kr_i('解析甚户信息成功: token=${kr_token != null}, account=${kr_account.value}', tag: 'AppRunData'); + KRLogUtil.kr_i( + '解析甚户信息成功: token=${kr_token != null}, account=${kr_account.value}', + tag: 'AppRunData'); // 🔧 修倍2验证token有效性和莊号信息完敎性 // 防止恢倍被污染的或过期的数据 - if (kr_token != null && kr_token!.isNotEmpty && _kr_isValidToken(kr_token!)) { + if (kr_token != null && + kr_token!.isNotEmpty && + _kr_isValidToken(kr_token!)) { // token栌匏验证通过JWT栌匏检查 if (kr_account.value != null && kr_account.value!.isNotEmpty) { // 莊号信息完敎 @@ -502,7 +505,9 @@ class KRAppRunData { // Token无效或栌匏错误枅理旧数据 KRLogUtil.kr_w('⚠ Token验证倱莥或栌匏错误枅理该条甚户数据', tag: 'AppRunData'); if (kr_token != null && kr_token!.isNotEmpty) { - KRLogUtil.kr_w(' ❌ 可胜的原因Token已过期或被污染栌匏: ${kr_token!.substring(0, min(30, kr_token!.length))}...', tag: 'AppRunData'); + KRLogUtil.kr_w( + ' ❌ 可胜的原因Token已过期或被污染栌匏: ${kr_token!.substring(0, min(30, kr_token!.length))}...', + tag: 'AppRunData'); } await kr_loginOut(); } @@ -518,7 +523,7 @@ class KRAppRunData { KRLogUtil.kr_e('初始化甚户信息过皋出错: $e', tag: 'AppRunData'); kr_isLogin.value = false; } - + KRLogUtil.kr_i('甚户信息初始化完成登圕状态: ${kr_isLogin.value}', tag: 'AppRunData'); } @@ -558,7 +563,8 @@ class KRAppRunData { /// 倄理连接状态变化 void _kr_handleConnectionState(bool isConnected) { - KRLogUtil.kr_i('WebSocket 连接状态: ${isConnected ? "已连接" : "已断匀"}', tag: 'AppRunData'); + KRLogUtil.kr_i('WebSocket 连接状态: ${isConnected ? "已连接" : "已断匀"}', + tag: 'AppRunData'); } /// 断匀 Socket 连接 @@ -569,42 +575,57 @@ class KRAppRunData { /// 获取甚户诊细信息登圕后调甚 Future _fetchUserInfo() async { try { - KRLogUtil.kr_i('📞 [AppRunData] 匀始调甚甚户信息接口 /v1/public/user/info ...', tag: 'AppRunData'); - KRLogUtil.kr_i('🔐 [AppRunData] 圓前 Token: ${kr_token ?? "null"}', tag: 'AppRunData'); + KRLogUtil.kr_i('📞 [AppRunData] 匀始调甚甚户信息接口 /v1/public/user/info ...', + tag: 'AppRunData'); + KRLogUtil.kr_i('🔐 [AppRunData] 圓前 Token: ${kr_token ?? "null"}', + tag: 'AppRunData'); final result = await KRUserApi.kr_getUserInfo(); result.fold( - (error) { - KRLogUtil.kr_e('❌ [AppRunData] 获取甚户信息倱莥: ${error.msg} (code: ${error.code})', tag: 'AppRunData'); + (error) { + KRLogUtil.kr_e( + '❌ [AppRunData] 获取甚户信息倱莥: ${error.msg} (code: ${error.code})', + tag: 'AppRunData'); }, - (userInfo) { - final authType = userInfo.authMethods.isNotEmpty - ? userInfo.authMethods[0].authType - : null; - final authIdentifier = userInfo.authMethods.isNotEmpty - ? userInfo.authMethods[0].authIdentifier - : null; + (userInfo) { + final authType = userInfo.authMethods.isNotEmpty + ? userInfo.authMethods[0].authType + : null; + final authIdentifier = userInfo.authMethods.isNotEmpty + ? userInfo.authMethods[0].authIdentifier + : null; KRLogUtil.kr_i('✅ [AppRunData] 获取甚户信息成功', tag: 'AppRunData'); - KRLogUtil.kr_i('📋 [AppRunData] refer_code: "${userInfo.referCode}"', tag: 'AppRunData'); - KRLogUtil.kr_i('💰 [AppRunData] balance: ${userInfo.balance}', tag: 'AppRunData'); - KRLogUtil.kr_i('💵 [AppRunData] commission: ${userInfo.commission}', tag: 'AppRunData'); - KRLogUtil.kr_i('📧 [AppRunData] 登圕类型: ${authType}', tag: 'AppRunData'); - KRLogUtil.kr_i('📧 [AppRunData] email: ${authIdentifier}', tag: 'AppRunData'); - KRLogUtil.kr_i('🆔 [AppRunData] id: ${userInfo.id}', tag: 'AppRunData'); + KRLogUtil.kr_i('📋 [AppRunData] refer_code: "${userInfo.referCode}"', + tag: 'AppRunData'); + KRLogUtil.kr_i('💰 [AppRunData] balance: ${userInfo.balance}', + tag: 'AppRunData'); + KRLogUtil.kr_i('💵 [AppRunData] commission: ${userInfo.commission}', + tag: 'AppRunData'); + KRLogUtil.kr_i('📧 [AppRunData] 登圕类型: ${authType}', + tag: 'AppRunData'); + KRLogUtil.kr_i('📧 [AppRunData] email: ${authIdentifier}', + tag: 'AppRunData'); + KRLogUtil.kr_i('🆔 [AppRunData] id: ${userInfo.id}', + tag: 'AppRunData'); // 保存到党局状态 kr_referCode.value = userInfo.referCode; kr_refererId.value = userInfo.refererId; - kr_account.value = authType == 'device' ? '9000${userInfo.id}' : authIdentifier; + kr_account.value = + authType == 'device' ? '9000${userInfo.id}' : authIdentifier; kr_balance.value = userInfo.balance; kr_commission.value = userInfo.commission; KRLogUtil.kr_i('💟 [AppRunData] 甚户信息已保存到党局状态:', tag: 'AppRunData'); - KRLogUtil.kr_i(' - kr_referCode: "${kr_referCode.value}"', tag: 'AppRunData'); - KRLogUtil.kr_i(' - kr_refererId: ${kr_refererId.value}', tag: 'AppRunData'); - KRLogUtil.kr_i(' - kr_balance: ${kr_balance.value}', tag: 'AppRunData'); - KRLogUtil.kr_i(' - kr_commission: ${kr_commission.value}', tag: 'AppRunData'); + KRLogUtil.kr_i(' - kr_referCode: "${kr_referCode.value}"', + tag: 'AppRunData'); + KRLogUtil.kr_i(' - kr_refererId: ${kr_refererId.value}', + tag: 'AppRunData'); + KRLogUtil.kr_i(' - kr_balance: ${kr_balance.value}', + tag: 'AppRunData'); + KRLogUtil.kr_i(' - kr_commission: ${kr_commission.value}', + tag: 'AppRunData'); }, ); } catch (e, stackTrace) { diff --git a/lib/app/model/response/kr_config_data.dart b/lib/app/model/response/kr_config_data.dart index a577a91..f2cb702 100755 --- a/lib/app/model/response/kr_config_data.dart +++ b/lib/app/model/response/kr_config_data.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:convert'; import 'package:package_info_plus/package_info_plus.dart'; import '../../utils/kr_log_util.dart'; @@ -41,7 +42,6 @@ class KRConfigData { /// 邀请铟接 final String kr_invitation_link; - final String kr_website_id; KRConfigData({ this.kr_config = '', @@ -56,16 +56,21 @@ class KRConfigData { this.kr_official_telegram = '', this.kr_official_telephone = '', this.kr_invitation_link = '', - this.kr_website_id = '', }) : this.kr_domains = kr_domains ?? [], this.kr_update_application = kr_update_application ?? KRUpdateApplication(); factory KRConfigData.fromJson(Map json) { - KRLogUtil.kr_e('配眮数据: $json', tag: 'KRConfigData'); + KRLogUtil.kr_i('配眮数据: $json', tag: 'KRConfigData'); + String _krConfigString = ''; + try { + _krConfigString = jsonEncode(json); + } catch (_) { + _krConfigString = ''; + } return KRConfigData( + kr_config: _krConfigString, kr_invitation_link: json['invitation_link'] ?? '', - kr_config: json['kr_config'] ?? '', kr_encryption_key: json['encryption_key'] ?? '', kr_encryption_method: json['encryption_method'] ?? '', kr_domains: List.from(json['domains'] ?? []), @@ -77,7 +82,6 @@ class KRConfigData { kr_official_website: json['official_website'] ?? '', kr_official_telegram: json['official_telegram'] ?? '', kr_official_telephone: json['official_telephone'] ?? '', - kr_website_id: json['kr_website_id'] ?? '', ); } } diff --git a/lib/app/model/response/kr_site_config.dart b/lib/app/model/response/kr_site_config.dart index 3cbee06..c5cdd04 100644 --- a/lib/app/model/response/kr_site_config.dart +++ b/lib/app/model/response/kr_site_config.dart @@ -81,17 +81,6 @@ class KRSiteInfo { String crispId = '0'; String deviceLimit = '0'; - // 尝试解析 custom_data 侭的 kr_website_id - try { - final customDataStr = json['custom_data'] ?? ''; - if (customDataStr.isNotEmpty) { - final customDataJson = jsonDecode(customDataStr) as Map; - crispId = customDataJson['kr_website_id'] ?? '0'; - } - } catch (e) { - // 解析倱莥时䜿甚默讀倌 - } - // 尝试解析 custom_data 侭的 deviceLimit try { final customDataStr = json['custom_data'] ?? ''; diff --git a/lib/app/modules/hi_user_info/controllers/hi_user_info_controller.dart b/lib/app/modules/hi_user_info/controllers/hi_user_info_controller.dart index ae406ef..e8aeb44 100755 --- a/lib/app/modules/hi_user_info/controllers/hi_user_info_controller.dart +++ b/lib/app/modules/hi_user_info/controllers/hi_user_info_controller.dart @@ -12,8 +12,10 @@ import 'package:kaer_with_panels/app/model/enum/kr_request_type.dart'; import 'package:kaer_with_panels/app/localization/app_translations.dart'; import 'dart:io'; import 'dart:math'; +import 'dart:convert'; import 'package:kaer_with_panels/utils/snackbar_util.dart'; import 'package:kaer_with_panels/app/routes/app_pages.dart'; +import 'package:kaer_with_panels/app/common/app_config.dart'; class HIUserInfoController extends GetxController { /// 订阅服务 @@ -32,6 +34,7 @@ class HIUserInfoController extends GetxController { void onInit() { super.onInit(); _initDeviceId(); + _initDeviceLimit(); loadDeviceList(); } @@ -55,13 +58,13 @@ class HIUserInfoController extends GetxController { final result = await KRUserApi().kr_getUserDevices(); result.fold( - (error) { + (error) { KRLogUtil.kr_e('加蜜讟倇列衚倱莥: ${error.msg}', tag: 'DeviceManagement'); KRSnackBarUtil.show(AppTranslations.kr_dialog.error, error.msg); }, - (deviceList) { - KRLogUtil.kr_i('获取到 ${deviceList.length} 䞪讟倇', tag: 'DeviceManagement'); - + (deviceList) { + KRLogUtil.kr_i('获取到 ${deviceList.length} 䞪讟倇', + tag: 'DeviceManagement'); // 蜬换讟倇数据栌匏 devices.value = deviceList.map((device) { @@ -89,7 +92,8 @@ class HIUserInfoController extends GetxController { } catch (e, stackTrace) { KRLogUtil.kr_e('加蜜讟倇列衚匂垞: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟螪: $stackTrace', tag: 'DeviceManagement'); - KRSnackBarUtil.show(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.loadDeviceListFailed); + KRSnackBarUtil.show(AppTranslations.kr_dialog.error, + AppTranslations.kr_deviceManagement.loadDeviceListFailed); } finally { isLoading.value = false; } @@ -99,24 +103,26 @@ class HIUserInfoController extends GetxController { Future deleteDevice(String id) async { try { final device = devices.firstWhere( - (d) => d['id'] == id, + (d) => d['id'] == id, orElse: () => {}, ); if (device.isEmpty) return false; final isCurrent = device['is_current'] ?? false; - KRLogUtil.kr_i('匀始解绑讟倇 - id: $id, isCurrent: $isCurrent', tag: 'DeviceManagement'); + KRLogUtil.kr_i('匀始解绑讟倇 - id: $id, isCurrent: $isCurrent', + tag: 'DeviceManagement'); final result = await KRUserApi().kr_unbindUserDevice(id); bool success = false; result.fold( - (error) { + (error) { KRLogUtil.kr_e('删陀讟倇倱莥: ${error.msg}', tag: 'DeviceManagement'); - KRSnackBarUtil.show(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.deleteFailed(error.msg)); + KRSnackBarUtil.show(AppTranslations.kr_dialog.error, + AppTranslations.kr_deviceManagement.deleteFailed(error.msg)); }, - (_) async { + (_) async { KRLogUtil.kr_i('讟倇删陀成功', tag: 'DeviceManagement'); success = true; @@ -127,7 +133,8 @@ class HIUserInfoController extends GetxController { await _reloginWithDevice(); } else { devices.removeWhere((device) => device['id'] == id); - KRSnackBarUtil.show(AppTranslations.kr_dialog.success, AppTranslations.kr_deviceManagement.deleteSuccess); + KRSnackBarUtil.show(AppTranslations.kr_dialog.success, + AppTranslations.kr_deviceManagement.deleteSuccess); } }, ); @@ -136,18 +143,20 @@ class HIUserInfoController extends GetxController { } catch (e, stackTrace) { KRLogUtil.kr_e('删陀讟倇匂垞: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟螪: $stackTrace', tag: 'DeviceManagement'); - KRSnackBarUtil.show(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.deleteFailed(e.toString())); + KRSnackBarUtil.show(AppTranslations.kr_dialog.error, + AppTranslations.kr_deviceManagement.deleteFailed(e.toString())); return false; } } - /// 重新䜿甚讟倇登圕 Future _reloginWithDevice() async { try { - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'DeviceManagement'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'DeviceManagement'); KRLogUtil.kr_i('匀始重新进行讟倇登圕', tag: 'DeviceManagement'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'DeviceManagement'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'DeviceManagement'); // 先枅陀圓前的甚户信息䜆䞍调甚 kr_loginOut避免星瀺登圕界面 final appRunData = KRAppRunData.getInstance(); @@ -166,26 +175,27 @@ class HIUserInfoController extends GetxController { final result = await authApi.kr_deviceLogin(); result.fold( - (error) { + (error) { // 讟倇登圕倱莥 KRLogUtil.kr_e('讟倇登圕倱莥: ${error.msg}', tag: 'DeviceManagement'); - KRSnackBarUtil.show(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.reloginFailed(error.msg)); + KRSnackBarUtil.show(AppTranslations.kr_dialog.error, + AppTranslations.kr_deviceManagement.reloginFailed(error.msg)); // 执行完敎退出登圕星瀺登圕界面 appRunData.kr_loginOut(); }, - (token) async { + (token) async { // 讟倇登圕成功 KRLogUtil.kr_i('✅ 讟倇登圕成功', tag: 'DeviceManagement'); - KRLogUtil.kr_i('🎫 Token: ${token.substring(0, min(20, token.length))}...', tag: 'DeviceManagement'); + KRLogUtil.kr_i( + '🎫 Token: ${token.substring(0, min(20, token.length))}...', + tag: 'DeviceManagement'); // 保存新的甚户信息 final deviceId = KRDeviceInfoService().deviceId ?? 'unknown'; await appRunData.kr_saveUserInfo( token, 'device_$deviceId', - KRLoginType.kr_email, - null, ); KRLogUtil.kr_i('✅ 讟倇重新登圕成功已曎新甚户信息', tag: 'DeviceManagement'); @@ -209,35 +219,53 @@ class HIUserInfoController extends GetxController { } catch (e, stackTrace) { KRLogUtil.kr_e('讟倇重新登圕匂垞: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟螪: $stackTrace', tag: 'DeviceManagement'); - KRSnackBarUtil.show(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.reloginFailedGeneric); + KRSnackBarUtil.show(AppTranslations.kr_dialog.error, + AppTranslations.kr_deviceManagement.reloginFailedGeneric); // 发生匂垞执行完敎退出登圕 await KRAppRunData.getInstance().kr_loginOut(); } } + Future _initDeviceLimit() async { + await KRSiteConfigService().fetchSiteConfig(); + } + /// 获取讟倇类型和囟标 Map getDeviceTypeInfo(String userAgent) { String deviceType = AppTranslations.kr_deviceManagement.deviceTypeUnknown; String iconName = 'devices'; - if (userAgent.contains('Android') || userAgent.toLowerCase().contains('android')) { - deviceType = 'Android' ;// AppTranslations.kr_deviceManagement.deviceTypeAndroid; + if (userAgent.contains('Android') || + userAgent.toLowerCase().contains('android')) { + deviceType = + 'Android'; // AppTranslations.kr_deviceManagement.deviceTypeAndroid; iconName = 'phone_android'; - } else if (userAgent.contains('iOS') || userAgent.contains('iPhone') || userAgent.toLowerCase().contains('ios')) { - deviceType = 'iPhone'; // AppTranslations.kr_deviceManagement.deviceTypeIos; + } else if (userAgent.contains('iOS') || + userAgent.contains('iPhone') || + userAgent.toLowerCase().contains('ios')) { + deviceType = + 'iPhone'; // AppTranslations.kr_deviceManagement.deviceTypeIos; iconName = 'phone_iphone'; } else if (userAgent.contains('iPad')) { - deviceType = 'iPad';// AppTranslations.kr_deviceManagement.deviceTypeIpad; + deviceType = + 'iPad'; // AppTranslations.kr_deviceManagement.deviceTypeIpad; iconName = 'tablet'; - } else if (userAgent.contains('macOS') || userAgent.contains('Mac') || userAgent.toLowerCase().contains('mac')) { - deviceType = 'Mac';// AppTranslations.kr_deviceManagement.deviceTypeMacos; + } else if (userAgent.contains('macOS') || + userAgent.contains('Mac') || + userAgent.toLowerCase().contains('mac')) { + deviceType = + 'Mac'; // AppTranslations.kr_deviceManagement.deviceTypeMacos; iconName = 'desktop_mac'; - } else if (userAgent.contains('Windows') || userAgent.toLowerCase().contains('windows')) { - deviceType = 'Windows'; //AppTranslations.kr_deviceManagement.deviceTypeWindows; + } else if (userAgent.contains('Windows') || + userAgent.toLowerCase().contains('windows')) { + deviceType = + 'Windows'; //AppTranslations.kr_deviceManagement.deviceTypeWindows; iconName = 'computer'; - } else if (userAgent.contains('Linux') || userAgent.toLowerCase().contains('linux')) { - deviceType = 'Linux';//AppTranslations.kr_deviceManagement.deviceTypeLinux; + } else if (userAgent.contains('Linux') || + userAgent.toLowerCase().contains('linux')) { + deviceType = + 'Linux'; //AppTranslations.kr_deviceManagement.deviceTypeLinux; iconName = 'computer'; } @@ -247,8 +275,6 @@ class HIUserInfoController extends GetxController { }; } - - @override void onReady() { super.onReady(); diff --git a/lib/app/modules/kr_crisp_chat/controllers/kr_crisp_controller.dart b/lib/app/modules/kr_crisp_chat/controllers/kr_crisp_controller.dart index 7133310..c5e3fb9 100755 --- a/lib/app/modules/kr_crisp_chat/controllers/kr_crisp_controller.dart +++ b/lib/app/modules/kr_crisp_chat/controllers/kr_crisp_controller.dart @@ -55,7 +55,7 @@ class KRCrispController extends GetxController { // 创建原生 SDK 配眮 _nativeConfig = native_crisp.CrispConfig( - websiteID: AppConfig.getInstance().kr_website_id, + websiteID: '47fcc1ac-9674-4ab1-9e3c-6b5666f59a38', user: native_crisp.User( email: null, nickName: identifier, diff --git a/lib/app/modules/kr_home/controllers/kr_home_controller.dart b/lib/app/modules/kr_home/controllers/kr_home_controller.dart index bf64355..8845046 100755 --- a/lib/app/modules/kr_home/controllers/kr_home_controller.dart +++ b/lib/app/modules/kr_home/controllers/kr_home_controller.dart @@ -33,9 +33,6 @@ import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart'; import 'package:flutter/foundation.dart'; import 'package:kaer_with_panels/app/utils/kr_init_log_collector.dart'; // 🔧 新增富入日志收集噚 import 'package:kaer_with_panels/app/utils/kr_latency_tester.dart'; // 🔧 新增富入真实延迟测试工具 -import 'package:kaer_with_panels/app/utils/account_guard.dart'; -import 'package:kaer_with_panels/app/services/iap/iap_service.dart'; - class KRHomeController extends GetxController with WidgetsBindingObserver { // 🔧 新增日志收集噚实䟋 @@ -44,7 +41,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { /// 订阅服务 final KRSubscribeService kr_subscribeService = KRSubscribeService(); - /// 圓前视囟状态,登圕状态 final Rx kr_currentViewStatus = KRHomeViewsStatus.kr_notLoggedIn.obs; @@ -52,25 +48,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { /// 圓前列衚视囟状态 final kr_currentListStatus = KRHomeViewsListStatus.kr_loading.obs; - /// 底郚面板高床垞量 - static const double kr_baseHeight = 120.0; // 基础高床连接选项 - static const double kr_subscriptionCardHeight = 200.0; // 订阅卡片高床 - static const double kr_connectionInfoHeight = 126.0; // 连接信息卡片高床修倍后 - static const double kr_trialCardHeight = 120.0; // 试甚卡片高床 - static const double kr_lastDayCardHeight = 120.0; // 最后䞀倩卡片高床 - static const double kr_nodeListHeight = 400.0; // 节点列衚高床 - static const double kr_errorHeight = 100.0; // 错误状态高床 - static const double kr_loadingHeight = 100.0; // 加蜜状态高床 - - /// 闎距垞量 - static const double kr_marginTop = 12.0; // 顶郚闎距 - static const double kr_marginBottom = 12.0; // 底郚闎距 - static const double kr_marginHorizontal = 16.0; // 氎平闎距 - static const double kr_marginVertical = 12.0; // 垂盎闎距 - - /// 底郚面板高床 - final kr_bottomPanelHeight = 200.0.obs; - /// 连接字笊䞲 final kr_connectText = AppTranslations.kr_home.disconnected.obs; @@ -223,6 +200,23 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { return; } + final current = kr_subscribeService.kr_currentSubscribe.value; + if (!KRAppRunData.getInstance().kr_isLogin.value || current == null) { + KRLogUtil.kr_w('未登圕或无可甚订阅阻止自劚连接', tag: 'QuickConnect'); + return; + } + bool isExpired = false; + if (current.expireTime.isNotEmpty) { + try { + isExpired = + DateTime.parse(current.expireTime).isBefore(DateTime.now()); + } catch (_) {} + } + if (isExpired) { + KRLogUtil.kr_w('订阅䞍可甚过期或流量耗尜阻止自劚连接', tag: 'QuickConnect'); + return; + } + await _kr_prepareCountrySelectionBeforeStart(); final selectedAfter = await KRSecureStorage().kr_readData(key: 'SELECTED_NODE_TAG'); @@ -260,45 +254,9 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { } } - /// 检查是吊满足自劚连接条件䞍执行连接 - bool canAutoConnect() { - return isQuickConnectEnabled.value && - KRAppRunData.getInstance().kr_isLogin.value && - !kr_isConnected.value; - } - @override void onInit() async { super.onInit(); - // 🔧 玧急诊断盎接写文件验证 onInit 是吊被调甚 - try { - final dir = await getApplicationDocumentsDirectory(); - final debugFile = File('${dir.path}/HOME_CONTROLLER_DEBUG.txt'); - await debugFile.writeAsString( - '=' * 60 + - '\n' - 'HomeController.onInit 被调甚\n' - 'æ—¶é—Ž: ${DateTime.now()}\n' - '实䟋 HashCode: ${hashCode}\n' - '线皋: ${Platform.isAndroid ? "Android" : "Unknown"}\n' - '=' * - 60 + - '\n', - mode: FileMode.append, - ); - } catch (e) { - // 応略错误确保䞍圱响䞻流皋 - } - - // 🔧 新增记圕 HomeController 初始化匀始 - _initLog.logPhaseStart('HomeController 初始化'); - _initLog.log('KRHomeController.onInit 被调甚', tag: 'Home'); - - // 🔧 Android 15 玧急修倍立即讟眮默讀高床确保底郚面板可见 - // kr_updateBottomPanelHeight(); - - /// 底郚面板高床倄理 - // _kr_initBottomPanelHeight(); // 加蜜闪连状态 _loadQuickConnectStatus(); // 加蜜已选择的囜家 @@ -320,7 +278,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { // 延迟同步连接状态确保状态正确 Future.delayed(const Duration(milliseconds: 500), () { - kr_forceSyncConnectionStatus(true); + kr_forceSyncConnectionStatus(); }); // 🔧 Android 15 新增5秒后再次区制曎新高床兜底保技 @@ -372,14 +330,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { } catch (_) {} } - /// 底郚面板高床倄理 - void _kr_initBottomPanelHeight() { - ever(kr_currentListStatus, (status) { - kr_updateBottomPanelHeight(); - KRLogUtil.kr_i(status.toString(), tag: "_kr_initBottomPanelHeight"); - }); - } - void _kr_initLoginStatus() { _initLog.log('匀始初始化登圕状态倄理', tag: 'Home'); KRLogUtil.kr_i('初始化登圕状态', tag: 'HomeController'); @@ -392,10 +342,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { KRLogUtil.kr_w('⏱ 订阅服务初始化超时(8秒)区制讟眮䞺无数据状态', tag: 'HomeController'); // 🔧 Android 15 䌘化超时讟眮䞺 none 而非 error避免底郚面板星瀺错误界面 kr_currentListStatus.value = KRHomeViewsListStatus.kr_none; - // 区制曎新底郚面板高床确保星瀺正垞 - kr_updateBottomPanelHeight(); - _initLog.log('已区制切换到默讀视囟, 底郚面板高床: ${kr_bottomPanelHeight.value}', - tag: 'Subscribe'); + KRLogUtil.kr_i('✅ 已区制切换到默讀视囟', tag: 'HomeController'); } }); @@ -458,8 +405,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { kr_currentViewStatus.value = KRHomeViewsStatus.kr_loggedIn; _initLog.logSuccess('甚户已登圕准倇加蜜订阅数据', tag: 'Home'); KRLogUtil.kr_i('讟眮䞺已登圕状态', tag: 'HomeController'); - - // 订阅服务已圚 splash 页面初始化歀倄无需重倍初始化 + _kr_ensureSubscribeServiceInitialized(); KRLogUtil.kr_i('订阅服务已圚启劚页初始化跳过重倍初始化', tag: 'HomeController'); } else { kr_currentViewStatus.value = KRHomeViewsStatus.kr_notLoggedIn; @@ -517,6 +463,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { throw TimeoutException('订阅服务初始化超时'); }, ).then((_) async { + _checkQuickConnectAutoStart(); final elapsed = DateTime.now().difference(startTime).inMilliseconds; _initLog.logSuccess('订阅服务初始化完成, 耗时: ${elapsed}ms', tag: 'Subscribe'); _initLog.log('最终列衚状态: ${kr_currentListStatus.value}', @@ -594,7 +541,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { kr_currentViewStatus.value = KRHomeViewsStatus.kr_loggedIn; KRLogUtil.kr_i('登圕状态变化讟眮䞺已登圕', tag: 'HomeController'); - // 订阅服务已圚 splash 页面初始化歀倄无需重倍初始化 KRLogUtil.kr_i('订阅服务已圚启劚页初始化跳过重倍初始化', tag: 'HomeController'); } else { @@ -681,7 +627,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { } else { // kr_updateBottomPanelHeight(); } - _checkQuickConnectAutoStart(); _kr_testLatencyWithoutVpn(); break; case KRSubscribeServiceStatus.kr_none: @@ -1872,18 +1817,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { @override void onReady() { super.onReady(); - - Future.delayed(const Duration(milliseconds: 200), () async { - ensureAccountExists().then((ok) { - print('ok'); - }); - }); - - Future.delayed(const Duration(milliseconds: 500), () async { - if (Get.isRegistered()) { - KRIAPService.instance.setup(); - } - }); } @override @@ -1958,100 +1891,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { }); } - // 曎新底郚面板高床 - void kr_updateBottomPanelHeight() { - // 🔧 Android 15 䌘化加蜜状态时也允讞曎新高床星瀺加蜜指瀺噚 - if (kr_subscribeService.kr_currentStatus == - KRHomeViewsListStatus.kr_loading && - kr_currentListStatus.value != KRHomeViewsListStatus.kr_loading) { - return; - } - - KRLogUtil.kr_i('曎新底郚面板高床', tag: 'HomeController'); - KRLogUtil.kr_i('圓前视囟状态: ${kr_currentViewStatus.value}', - tag: 'HomeController'); - - KRLogUtil.kr_i('圓前列衚状态: ${kr_currentListStatus.value}', - tag: 'HomeController'); - KRLogUtil.kr_i('是吊试甚: ${kr_subscribeService.kr_isTrial.value}', - tag: 'HomeController'); - KRLogUtil.kr_i( - '是吊最后䞀倩: ${kr_subscribeService.kr_isLastDayOfSubscription.value}', - tag: 'HomeController'); - - double targetHeight = 0.0; - - if (kr_currentViewStatus.value == KRHomeViewsStatus.kr_notLoggedIn) { - // 未登圕状态䞋高床由内容撑匀 - targetHeight = kr_subscriptionCardHeight + - kr_baseHeight + - kr_marginTop + - kr_marginBottom + - kr_marginVertical * 2; - KRLogUtil.kr_i('未登圕状态目标高床: $targetHeight', tag: 'HomeController'); - } else if (kr_currentListStatus.value == - KRHomeViewsListStatus.kr_serverList || - kr_currentListStatus.value == - KRHomeViewsListStatus.kr_countrySubscribeList || - kr_currentListStatus.value == - KRHomeViewsListStatus.kr_serverSubscribeList || - kr_currentListStatus.value == KRHomeViewsListStatus.kr_subscribeList) { - targetHeight = kr_nodeListHeight + kr_marginVertical * 2; - KRLogUtil.kr_i('节点列衚状态目标高床: $targetHeight', tag: 'HomeController'); - } - // 🔧 Android 15 新增倄理加蜜和错误状态 - else if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_loading || - kr_currentListStatus.value == KRHomeViewsListStatus.kr_error) { - // 加蜜或错误状态䞋星瀺最小高床 - targetHeight = kr_loadingHeight + kr_marginTop + kr_marginBottom; - KRLogUtil.kr_i('加蜜/错误状态目标高床: $targetHeight', tag: 'HomeController'); - } else { - // 已登圕状态䞋的默讀高床计算 - targetHeight = kr_baseHeight + kr_marginTop + kr_marginBottom; - KRLogUtil.kr_i('基础高床: $targetHeight', tag: 'HomeController'); - - // 🔧 关键修倍增加防埡性检查确保订阅服务访问匂垞时高床计算仍正垞 - try { - if (kr_subscribeService.kr_currentSubscribe.value != null) { - targetHeight += kr_connectionInfoHeight + kr_marginTop; - KRLogUtil.kr_i('添加连接信息卡片高床: $targetHeight', tag: 'HomeController'); - } else { - targetHeight += kr_subscriptionCardHeight + kr_marginTop; - KRLogUtil.kr_i('添加订阅卡片高床: $targetHeight', tag: 'HomeController'); - } - - // 劂果有试甚状态添加试甚卡片高床 - if (kr_subscribeService.kr_isTrial.value) { - targetHeight += kr_trialCardHeight + kr_marginTop; - KRLogUtil.kr_i('添加试甚卡片高床: $targetHeight', tag: 'HomeController'); - } - // 劂果是最后䞀倩添加最后䞀倩卡片高床 - else if (kr_subscribeService.kr_isLastDayOfSubscription.value) { - targetHeight += kr_lastDayCardHeight + kr_marginTop; - KRLogUtil.kr_i('添加最后䞀倩卡片高床: $targetHeight', tag: 'HomeController'); - } - } catch (e) { - // 🔧 修倍订阅服务访问匂垞时䜿甚默讀订阅卡片高床 - KRLogUtil.kr_e('访问订阅服务数据匂垞䜿甚默讀高床: $e', tag: 'HomeController'); - targetHeight += kr_subscriptionCardHeight + kr_marginTop; - KRLogUtil.kr_i('䜿甚默讀订阅卡片高床: $targetHeight', tag: 'HomeController'); - } - } - - // 🔧 Android 15 䌘化确保最小高床避免出现 0 高床 - if (targetHeight < 100) { - KRLogUtil.kr_w('计算的高床过小($targetHeight)讟眮䞺最小高床', tag: 'HomeController'); - targetHeight = kr_loadingHeight; - } - - KRLogUtil.kr_i('最终目标高床: $targetHeight', tag: 'HomeController'); - kr_bottomPanelHeight.value = targetHeight; - } - // 移劚到选䞭节点 - void kr_moveToSelectedNode() { - - } + void kr_moveToSelectedNode() {} // 简化移劚地囟方法 void kr_moveToLocation() { @@ -2436,7 +2277,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { } /// 区制同步连接状态 - void kr_forceSyncConnectionStatus([bool? isQuickConnect]) { + void kr_forceSyncConnectionStatus() { try { KRLogUtil.kr_i('🔄 区制同步连接状态...', tag: 'HomeController'); @@ -2479,10 +2320,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { // 区制曎新UI update(); - print('isQuickConnect$isQuickConnect'); - if (isQuickConnect == true) { - _checkQuickConnectAutoStart(); - } KRLogUtil.kr_i('✅ 连接状态同步完成', tag: 'HomeController'); } catch (e) { KRLogUtil.kr_e('❌ 区制同步连接状态倱莥: $e', tag: 'HomeController'); diff --git a/lib/app/modules/kr_home/views/hi_animated_connect_button.dart b/lib/app/modules/kr_home/views/hi_animated_connect_button.dart index 43dc748..28d4b95 100644 --- a/lib/app/modules/kr_home/views/hi_animated_connect_button.dart +++ b/lib/app/modules/kr_home/views/hi_animated_connect_button.dart @@ -11,7 +11,6 @@ import 'package:kaer_with_panels/app/widgets/kr_app_text_style.dart'; import 'package:kaer_with_panels/app/services/global_overlay_service.dart'; import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart'; import 'package:kaer_with_panels/singbox/model/singbox_status.dart'; -import 'package:kaer_with_panels/app/utils/account_guard.dart'; DateTime? _hiConnectBtnNextAllowedAt; const Duration _hiConnectBtnDebounce = Duration(milliseconds: 800); @@ -93,8 +92,6 @@ class HIAnimatedConnectButton extends GetView { child: InkWell( onTap: () async { HapticFeedback.lightImpact(); - final ok = await ensureAccountExists(); - if (!ok) return; final _now = DateTime.now(); if (_hiConnectBtnNextAllowedAt != null && _now.isBefore(_hiConnectBtnNextAllowedAt!)) { diff --git a/lib/app/modules/kr_home/views/hi_subscription_corner_button.dart b/lib/app/modules/kr_home/views/hi_subscription_corner_button.dart index 306f4b5..9ec156d 100644 --- a/lib/app/modules/kr_home/views/hi_subscription_corner_button.dart +++ b/lib/app/modules/kr_home/views/hi_subscription_corner_button.dart @@ -8,7 +8,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/kr_home_controller.dart'; import '../../../routes/app_pages.dart'; import 'package:kaer_with_panels/app/services/global_overlay_service.dart'; -import 'package:kaer_with_panels/app/utils/account_guard.dart'; // ======================= 1. Circular Clipper (保持䞍变) ======================= class CircularClipper extends CustomClipper { @@ -175,8 +174,6 @@ class _HISubscriptionCornerButtonState extends State Widget build(BuildContext context) { return GestureDetector( onTap: () async { - final ok = await ensureAccountExists(); - if (!ok) return; _startCircularTransition(context); }, child: Container( diff --git a/lib/app/modules/kr_home/views/kr_home_view.dart b/lib/app/modules/kr_home/views/kr_home_view.dart index 90cb36f..94bcd83 100755 --- a/lib/app/modules/kr_home/views/kr_home_view.dart +++ b/lib/app/modules/kr_home/views/kr_home_view.dart @@ -17,7 +17,6 @@ import 'package:kaer_with_panels/app/services/global_overlay_service.dart'; import 'package:kaer_with_panels/app/widgets/swipe/has_swipe_config.dart'; import 'package:kaer_with_panels/app/widgets/swipe/swipe_config.dart'; import 'package:kaer_with_panels/app/routes/app_pages.dart'; -import 'package:kaer_with_panels/app/utils/account_guard.dart'; class KRHomeView extends StatefulWidget implements HasSwipeConfig { const KRHomeView({super.key}); @@ -26,16 +25,10 @@ class KRHomeView extends StatefulWidget implements HasSwipeConfig { enableLeft: true, enableRight: true, onLeft: () { - ensureAccountExists().then((ok) { - if (!ok) return; - Get.toNamed(Routes.HI_MENU); - }); + Get.toNamed(Routes.HI_MENU); }, onRight: () { - ensureAccountExists().then((ok) { - if (!ok) return; - GlobalOverlayService.instance.triggerSubscriptionAnimation(); - }); + GlobalOverlayService.instance.triggerSubscriptionAnimation(); }, ); @@ -109,43 +102,37 @@ class _KRHomeViewState extends State { ); // 3. 匀始条件刀断 - if (currentSubscribe == null) { - // --- 情况1: 没有任䜕订阅信息 --- - content = Text( - '尚未莭买套逐', - style: highlightStyle, - ); + final listStatus = + controller.kr_currentListStatus.value; + if (listStatus == KRHomeViewsListStatus.kr_loading) { + content = Text('加蜜订阅䞭', style: normalStyle); } else { - // --- 情况2: 有订阅信息需芁刀断是吊过期 --- - final now = DateTime.now(); - DateTime? expireDateTime; - try { - expireDateTime = - DateTime.parse(currentSubscribe.expireTime); - } catch (e) { - // 日期栌匏解析倱莥 - } - - if (expireDateTime != null && - expireDateTime.isBefore(now)) { - // --- 情况2.1: 订阅已过期 --- - final formattedExpireDate = - '${expireDateTime.year}/${expireDateTime.month.toString().padLeft(2, '0')}/${expireDateTime.day.toString().padLeft(2, '0')}'; - // 䜿甚换行笊 \n 合并䞺单䞪 Text 组件 - content = Text( - '悚的套逐已于 $formattedExpireDate 到期\n请前埀莭买新套逐', - style: highlightStyle, - ); + if (currentSubscribe == null) { + content = Text('尚未莭买套逐', style: highlightStyle); } else { - // --- 情况2.2: 订阅有效 --- - final formattedExpireTime = expireDateTime != null + final now = DateTime.now(); + DateTime? expireDateTime; + try { + expireDateTime = + DateTime.parse(currentSubscribe.expireTime); + } catch (e) {} + if (expireDateTime != null && + expireDateTime.isBefore(now)) { + final formattedExpireDate = + '${expireDateTime.year}/${expireDateTime.month.toString().padLeft(2, '0')}/${expireDateTime.day.toString().padLeft(2, '0')}'; + content = Text( + '悚的套逐已于 $formattedExpireDate 到期\n请前埀莭买新套逐', + style: highlightStyle); + } else { + final formattedExpireTime = expireDateTime != + null ? '${expireDateTime.year}/${expireDateTime.month.toString().padLeft(2, '0')}/${expireDateTime.day.toString().padLeft(2, '0')} ${expireDateTime.hour.toString().padLeft(2, '0')}:${expireDateTime.minute.toString().padLeft(2, '0')}' : '未知'; - // 䜿甚换行笊 \n 合并䞺单䞪 Text 组件 content = Text( '套逐到期时闎$formattedExpireTime\n${controller.kr_isConnected.value ? '圓前线路${controller.kr_getRealConnectedNodeCountry()}' : '未连接'}', style: normalStyle, ); + } } } @@ -233,7 +220,7 @@ class _KRHomeViewState extends State { 10.w, ); } - + HIDialog.show( title: '闪连功胜', message: diff --git a/lib/app/modules/kr_login/controllers/kr_login_controller.dart b/lib/app/modules/kr_login/controllers/kr_login_controller.dart index 336306a..f82a49c 100755 --- a/lib/app/modules/kr_login/controllers/kr_login_controller.dart +++ b/lib/app/modules/kr_login/controllers/kr_login_controller.dart @@ -88,7 +88,6 @@ class KRLoginController extends GetxController RxBool kr_canSendCode = true.obs; /// 囜家猖码列衚 - late List kr_areaCodeList = KRAreaCode.kr_getCodeList(); var kr_cutSeleteCodeIndex = 0.obs; /// 是吊加密密码 @@ -556,8 +555,7 @@ class KRLoginController extends GetxController KRAppRunData.getInstance().kr_saveUserInfo( token, accountController.text, - KRLoginType.kr_email, - null); + ); kr_loginStatus.value = KRLoginProgressStatus.kr_check; // 登圕/泚册成功后发送消息觊发订阅服务刷新 diff --git a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart index 249c3c9..abc5f06 100755 --- a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart +++ b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart @@ -35,10 +35,10 @@ class KRSplashController extends GetxController { final _initLog = KRInitLogCollector(); // 加蜜状态 final RxBool kr_isLoading = true.obs; - + // 错误状态 final RxBool kr_hasError = false.obs; - + // 错误信息 final RxString kr_errorMessage = ''.obs; @@ -65,14 +65,8 @@ class KRSplashController extends GetxController { _stepStartTime = _startTime; // 䜿甚 print 确保日志䞀定䌚蟓出 - print('[SPLASH_TIMING] ═══════════════════════════════════════'); print('[SPLASH_TIMING] 🎬 KRSplashController onInit 被调甚了'); print('[SPLASH_TIMING] ⏰ 启劚匀始时闎: ${_startTime.toIso8601String()}'); - print('[SPLASH_TIMING] ═══════════════════════════════════════'); - - KRLogUtil.kr_i('[SPLASH_TIMING] ═══════════════════════════════════════', tag: 'SplashController'); - KRLogUtil.kr_i('[SPLASH_TIMING] 🎬 启劚页控制噚 onInit', tag: 'SplashController'); - KRLogUtil.kr_i('[SPLASH_TIMING] ═══════════════════════════════════════', tag: 'SplashController'); // 🔧 修倍1.0新增 - DEBUG暡匏䞋枅理旧数据 // ⚠ 仅圚DEBUG暡匏䞋执行防止误删生产环境甚户数据 @@ -85,15 +79,6 @@ class KRSplashController extends GetxController { print('🧹 枅理域名检测状态...'); KRDomain.kr_resetDomainState(); - // 🔧 P2䌘化眑站配眮䞍再后台执行改䞺䞲行执行以确保域名验证完成 - // print('🌐 启劚后台任务眑站配眮加蜜...'); - // KRLogUtil.kr_i('🌐 后台任务眑站配眮和讟倇登圕', tag: 'SplashController'); - // _kr_initSiteConfig(); // 移至 _kr_continueInitialization 䞭䞲行执行 - - // 🔧 关键修倍先初始化日志收集噚再匀始䞻流皋 - if (kDebugMode) { - print('🔧 初始化日志收集噚...'); - } _initializeAndStart(); } @@ -130,21 +115,15 @@ class KRSplashController extends GetxController { final totalMs = totalDuration.inMilliseconds; print('[SPLASH_TIMING] ⏱ $stepName 耗时: ${stepMs}ms | 环计: ${totalMs}ms'); - KRLogUtil.kr_i('[SPLASH_TIMING] ⏱ $stepName 耗时: ${stepMs}ms | 环计: ${totalMs}ms', tag: 'SplashController'); + KRLogUtil.kr_i( + '[SPLASH_TIMING] ⏱ $stepName 耗时: ${stepMs}ms | 环计: ${totalMs}ms', + tag: 'SplashController'); _stepStartTime = now; // 曎新步骀匀始时闎 } /// 初始化眑站配眮后台执行䞍阻塞䞻流皋 Future _kr_initSiteConfig() async { - print('[SPLASH_TIMING] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('[SPLASH_TIMING] 🌐 匀始初始化眑站配眮...'); - print('[SPLASH_TIMING] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - - KRLogUtil.kr_i('[SPLASH_TIMING] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); - KRLogUtil.kr_i('[SPLASH_TIMING] 🌐 初始化眑站配眮...', tag: 'SplashController'); - KRLogUtil.kr_i('[SPLASH_TIMING] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); - try { // 🔧 Android 15 䌘化延长超时保技到25秒匹配眑络请求超时20秒 + 5秒猓冲 await Future.any([ @@ -162,116 +141,20 @@ class KRSplashController extends GetxController { } print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'SplashController'); } /// 执行眑站配眮初始化 Future _executeSiteConfigInit() async { - print('📞 准倇调甚 KRSiteConfigService().initialize()...'); - final success = await KRSiteConfigService().initialize(); - final crispId = await KRSiteConfigService().getCrispId(); - final device_limit = await KRSiteConfigService().getDeviceLimit(); - print('📞 KRSiteConfigService().initialize() 返回: $success'); - - if (success) { - final config = AppConfig.getInstance(); - config.kr_website_id = crispId; - config.device_limit = device_limit; - print('📞 KRSiteConfigService().initialize() 返回: $crispId'); - print('AppConfig website_id 已曎新䞺: ${config.kr_website_id}'); - print('AppConfig device_limit 已曎新䞺: ${config.device_limit}'); - - // print('[SPLASH_TIMING] ✅ 眑站配眮初始化成功'); - // await _kr_checkAndPerformDeviceLogin(); - } else { - print('⚠ 眑站配眮初始化倱莥将䜿甚默讀配眮'); - KRLogUtil.kr_w('⚠ 眑站配眮初始化倱莥将䜿甚默讀配眮', tag: 'SplashController'); - } + print('📞 准倇调甚 KRDomain.kr_loadBaseDomain()...'); + await KRDomain.kr_loadBaseDomain(); + print('📞 KRDomain.kr_loadBaseDomain() 完成'); } - /// 检查并执行讟倇登圕后台执行有超时保技 - Future _kr_checkAndPerformDeviceLogin() async { - try { - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('🔍 检查是吊支持讟倇登圕...'); - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - - final siteConfigService = KRSiteConfigService(); - - // 检查是吊启甚讟倇登圕 - final isDeviceLoginEnabled = siteConfigService.isDeviceLoginEnabled(); - print('📱 讟倇登圕状态: ${isDeviceLoginEnabled ? "已启甚" : "未启甚"}'); - KRLogUtil.kr_i('📱 讟倇登圕状态: $isDeviceLoginEnabled', tag: 'SplashController'); - - if (!isDeviceLoginEnabled) { - print('⚠ 讟倇登圕未启甚跳过自劚登圕'); - KRLogUtil.kr_w('⚠ 讟倇登圕未启甚', tag: 'SplashController'); - return; - } - - print('✅ 讟倇登圕已启甚匀始初始化讟倇信息...'); - - // 🔧 Android 15 䌘化延长讟倇登圕超时到15秒匹配眑络请求超时 - await Future.any([ - _executeDeviceLogin(), - Future.delayed(const Duration(seconds: 15), () { - throw TimeoutException('讟倇登圕超时15秒'); - }), - ]); - - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - } on TimeoutException catch (e) { - print('⏱ 讟倇登圕超时应甚将继续启劚: $e'); - KRLogUtil.kr_w('⏱ 讟倇登圕超时: $e', tag: 'SplashController'); - } catch (e, stackTrace) { - print('❌ 讟倇登圕检查匂垞: $e'); - print('📚 堆栈跟螪: $stackTrace'); - KRLogUtil.kr_e('❌ 讟倇登圕检查匂垞: $e', tag: 'SplashController'); - } - } - - /// 执行讟倇登圕 - Future _executeDeviceLogin() async { - // 初始化讟倇信息服务 - await KRDeviceInfoService().initialize(); - - print('🔐 匀始执行讟倇登圕...'); - KRLogUtil.kr_i('🔐 匀始执行讟倇登圕', tag: 'SplashController'); - - // 执行讟倇登圕 - final authApi = KRAuthApi(); - final result = await authApi.kr_deviceLogin(); - - result.fold( - (error) { - print('❌ 讟倇登圕倱莥: ${error.msg}'); - KRLogUtil.kr_e('❌ 讟倇登圕倱莥: ${error.msg}', tag: 'SplashController'); - }, - (token) async { - print('✅ 讟倇登圕成功'); - print('🎫 Token: ${token.substring(0, min(20, token.length))}...'); - KRLogUtil.kr_i('✅ 讟倇登圕成功', tag: 'SplashController'); - - // 䜿甚 saveUserInfo 保存完敎的甚户信息 - // 讟倇登圕䜿甚特殊的莊号标识登圕类型讟䞺邮箱后续可以绑定真实莊号 - final deviceId = KRDeviceInfoService().deviceId ?? 'unknown'; - await KRAppRunData.getInstance().kr_saveUserInfo( - token, - 'device_$deviceId', // 䜿甚讟倇ID䜜䞺䞎时莊号 - KRLoginType.kr_email, // 默讀登圕类型 - null, // 讟倇登圕无需区号 - ); - print('💟 甚户信息已保存包括Token'); - print('✅ 已标记䞺登圕状态'); - KRLogUtil.kr_i('✅ 讟倇登圕流皋完成', tag: 'SplashController'); - }, - ); - } Future _kr_initialize() async { try { - _initLog.logPhaseStart('䞻初始化流皋'); - _initLog.log('匀始执行 _kr_initialize', tag: 'Splash'); KRLogUtil.kr_i('🔧 匀始执行 _kr_initialize', tag: 'SplashController'); // 🔧 Android 15 䌘化添加总䜓超时保技15秒曎快响应 @@ -304,7 +187,8 @@ class KRSplashController extends GetxController { _handleError('眑络连接倱莥', '请检查悚的眑络连接是吊正垞然后重试。'); } on DioException catch (e) { // 🔧 P2䌘化HTTP请求错误 - KRLogUtil.kr_e('❌ HTTP请求错误: ${e.type} - ${e.message}', tag: 'SplashController'); + KRLogUtil.kr_e('❌ HTTP请求错误: ${e.type} - ${e.message}', + tag: 'SplashController'); final errorMsg = _getDioErrorMessage(e); _handleError('服务请求倱莥', errorMsg); } catch (e) { @@ -328,10 +212,13 @@ class KRSplashController extends GetxController { // 1. 讟眮默讀域名确保应甚有可甚域名 try { _initLog.log('步骀1: 讟眮默讀域名', tag: 'Minimal'); - if (KRDomain.kr_currentDomain.isEmpty && KRDomain.kr_baseDomains.isNotEmpty) { + if (KRDomain.kr_currentDomain.isEmpty && + KRDomain.kr_baseDomains.isNotEmpty) { KRDomain.kr_currentDomain = KRDomain.kr_baseDomains[0]; - _initLog.logSuccess('讟眮默讀域名: ${KRDomain.kr_currentDomain}', tag: 'Minimal'); - KRLogUtil.kr_i('✅ 讟眮默讀域名: ${KRDomain.kr_currentDomain}', tag: 'SplashController'); + _initLog.logSuccess('讟眮默讀域名: ${KRDomain.kr_currentDomain}', + tag: 'Minimal'); + KRLogUtil.kr_i('✅ 讟眮默讀域名: ${KRDomain.kr_currentDomain}', + tag: 'SplashController'); if (kDebugMode) { print('✅ 讟眮默讀域名: ${KRDomain.kr_currentDomain}'); } @@ -509,21 +396,15 @@ class KRSplashController extends GetxController { Future _kr_continueInitialization() async { try { - _initLog.logSeparator(); - _initLog.log('🚀 启劚页䞻流皋匀始', tag: 'Continue'); - _initLog.logSeparator(); - - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); KRLogUtil.kr_i('🚀 启劚页䞻流皋匀始...', tag: 'SplashController'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); - // 🔧 Android 15 䌘化眑络连接检查改䞺非阻塞 if (Platform.isIOS || Platform.isAndroid) { _initLog.log('📱 检查眑络连接状态超时5秒', tag: 'Continue'); KRLogUtil.kr_i('📱 检查眑络连接...', tag: 'SplashController'); try { // 添加5秒超时保技 - final bool isConnected = await KRNetworkCheck.kr_checkNetworkConnection().timeout( + final bool isConnected = + await KRNetworkCheck.kr_checkNetworkConnection().timeout( const Duration(seconds: 5), onTimeout: () { _initLog.logWarning('眑络连接检查超时5秒继续初始化', tag: 'Continue'); @@ -550,8 +431,6 @@ class KRSplashController extends GetxController { KRLogUtil.kr_i('💻 桌面平台跳过眑络连接检查', tag: 'SplashController'); } - // 眑络检查完成后执行讟倇登圕始终支持 - // 🔧 关键修倍圚讟倇登圕前先初始化站点配眮确保域名可甚 // 这样劂果䞻域名䞍可甚initSiteConfig 䌚切换到倇甚域名 // 后续的讟倇登圕就胜䜿甚正确的域名 @@ -561,7 +440,8 @@ class KRSplashController extends GetxController { _logStepTiming('匀始讟倇登圕检查'); // 5⃣ 执行讟倇登圕 - final success = await KRAppRunData.getInstance().kr_checkAndPerformDeviceLogin(); + final success = + await KRAppRunData.getInstance().kr_checkAndPerformDeviceLogin(); if (!success) { // 讟倇登圕倱莥 → 提瀺甚户重试 @@ -582,7 +462,7 @@ class KRSplashController extends GetxController { // 䞋面AppConfig().initConfig䞻芁是做AppConfig层面的配眮加蜜可胜包含重倍的请求。 // 鉎于 AppConfig().initConfig 也䌚调甚 API䞺了保险起见 // 我们可以让 AppConfig().initConfig 䜿甚已经切换奜的域名。) - + _initLog.log('⚙ 匀始初始化应甚配眮域名加蜜等', tag: 'Continue'); KRLogUtil.kr_i('⚙ 匀始初始化应甚配眮...', tag: 'SplashController'); await AppConfig().initConfig( @@ -605,12 +485,7 @@ class KRSplashController extends GetxController { // 配眮初始化成功后的后续步骀 Future _kr_continueAfterConfig() async { try { - // 甚户信息初始化完成后立即初始化订阅服务 - print('[SPLASH_TIMING] 🔄 匀始初始化订阅服务...'); - KRLogUtil.kr_i('[SPLASH_TIMING] 🔄 匀始初始化订阅服务', tag: 'SplashController'); - _kr_ensureSubscribeServiceInitialized(); - - // 初始化SingBox + // 初始化SingBox必须先于订阅服务避免目圕未初始化 _logStepTiming('匀始SingBox初始化'); await KRSingBoxImp.instance.init(); _logStepTiming('SingBox初始化完成'); @@ -620,20 +495,12 @@ class KRSplashController extends GetxController { final token = KRAppRunData.getInstance().kr_token; final hasToken = token != null && token.isNotEmpty; - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('🎯 准倇进入䞻页'); - print('📊 最终登圕状态: $loginStatus'); - print('🎫 Token存圚: $hasToken'); if (hasToken) { print('🎫 Token前猀: ${token.substring(0, min(20, token.length))}...'); } - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); KRLogUtil.kr_i('🎯 准倇进入䞻页', tag: 'SplashController'); KRLogUtil.kr_i('📊 最终登圕状态: $loginStatus', tag: 'SplashController'); KRLogUtil.kr_i('🎫 Token存圚: $hasToken', tag: 'SplashController'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController'); // 🔧 记圕最终状态到日志 _initLog.logSeparator(); @@ -652,12 +519,13 @@ class KRSplashController extends GetxController { // 盎接富航到䞻页无论是吊登圕䞻页䌚根据登圕状态星瀺䞍同内容 _logStepTiming('匀始页面富航'); - if(loginStatus) { + if (loginStatus) { // 盎接富航到䞻页 Get.offAllNamed(Routes.KR_HOME); - }else { + } else { kr_hasError.value = true; - kr_errorMessage.value = '登圕${AppTranslations.kr_splash.kr_initializationFailed}'; + kr_errorMessage.value = + '登圕${AppTranslations.kr_splash.kr_initializationFailed}'; } _logStepTiming('页面富航完成'); } catch (e) { @@ -667,63 +535,22 @@ class KRSplashController extends GetxController { final totalMs = totalDuration.inMilliseconds; print('❌ 启劚倱莥时闎: ${endTime.toIso8601String()}'); - print('🕐 启劚倱莥总耗时: ${totalMs}ms (${totalDuration.inSeconds}.${(totalMs % 1000).toString().padLeft(3, '0')}s)'); + print( + '🕐 启劚倱莥总耗时: ${totalMs}ms (${totalDuration.inSeconds}.${(totalMs % 1000).toString().padLeft(3, '0')}s)'); // 后续步骀倱莥星瀺错误信息 _initLog.logError('启劚初始化倱莥', tag: 'Splash', error: e); KRLogUtil.kr_e('启劚初始化倱莥: $e', tag: 'SplashController'); KRLogUtil.kr_e('⏰ 启劚倱莥总耗时: ${totalMs}ms', tag: 'SplashController'); kr_hasError.value = true; - kr_errorMessage.value = '${AppTranslations.kr_splash.kr_initializationFailed}$e'; + kr_errorMessage.value = + '${AppTranslations.kr_splash.kr_initializationFailed}$e'; // 🔧 错误情况䞋也䞍关闭日志让后续的错误倄理也胜写入 // await _initLog.finalize(); // ❌ 泚释掉 } } - /// 确保订阅服务初始化 - Future _kr_ensureSubscribeServiceInitialized() async { - try { - // 检查订阅服务状态 - final currentStatus = kr_subscribeService.kr_currentStatus.value; - KRLogUtil.kr_i('订阅服务圓前状态: $currentStatus', tag: 'SplashController'); - - if (currentStatus == KRSubscribeServiceStatus.kr_none || - currentStatus == KRSubscribeServiceStatus.kr_error) { - KRLogUtil.kr_i( - '订阅服务未初始化或错误匀始初始化', tag: 'SplashController'); - - // 初始化订阅服务并等埅完成 - // 讟眮加蜜状态 - KRHomeController().kr_currentListStatus.value = KRHomeViewsListStatus.kr_loading; - try { - await kr_subscribeService.kr_refreshAll(); - KRLogUtil.kr_i('订阅服务初始化完成', tag: 'SplashController'); - } catch (error) { - KRLogUtil.kr_e('订阅服务初始化倱莥: $error', tag: 'SplashController'); - // 重新抛出匂垞让调甚方知道初始化倱莥 - KRHomeController().kr_currentListStatus.value = KRHomeViewsListStatus.kr_error; - rethrow; - } - } else if (currentStatus == KRSubscribeServiceStatus.kr_loading) { - KRLogUtil.kr_i('订阅服务正圚初始化䞭', tag: 'SplashController'); - // 劂果正圚加蜜䞭等埅加蜜完成 - while (kr_subscribeService.kr_currentStatus.value == KRSubscribeServiceStatus.kr_loading) { - await Future.delayed(Duration(milliseconds: 100)); - } - KRLogUtil.kr_i('订阅服务加蜜完成最终状态: ${kr_subscribeService.kr_currentStatus.value}', tag: 'SplashController'); - KRHomeController().kr_currentListStatus.value = KRHomeViewsListStatus.kr_loading; - } else if (currentStatus == KRSubscribeServiceStatus.kr_success) { - KRHomeController().kr_currentListStatus.value = KRHomeViewsListStatus.kr_none; - KRLogUtil.kr_i('订阅服务已成功初始化', tag: 'SplashController'); - } - } catch (e) { - KRLogUtil.kr_e('确保订阅服务初始化倱莥: $e', tag: 'SplashController'); - KRHomeController().kr_currentListStatus.value = KRHomeViewsListStatus.kr_error; - rethrow; - } - } - // 重试按钮点击事件 void kr_retry() { kr_hasError.value = false; @@ -749,15 +576,15 @@ class KRSplashController extends GetxController { /// 防止旧的测试莊号圚新安装时被恢倍 Future _kr_clearOldLocalData() async { try { - KRLogUtil.kr_i('🧹 匀始枅理旧本地存傚数据...', tag: 'SplashController'); + // KRLogUtil.kr_i('🧹 匀始枅理旧本地存傚数据...', tag: 'SplashController'); // 枅理甚户信息存傚 await KRSecureStorage().kr_deleteData(key: 'USER_INFO'); - KRLogUtil.kr_i('✅ 已枅理USER_INFO', tag: 'SplashController'); + // KRLogUtil.kr_i('✅ 已枅理USER_INFO', tag: 'SplashController'); // 枅理讟倇登圕状态 await KRSecureStorage().kr_deleteData(key: 'DEVICE_INFO'); - KRLogUtil.kr_i('✅ 已枅理DEVICE_INFO', tag: 'SplashController'); + // KRLogUtil.kr_i('✅ 已枅理DEVICE_INFO', tag: 'SplashController'); KRLogUtil.kr_i('✅ 旧本地存傚数据已党郚枅理', tag: 'SplashController'); } catch (e) { @@ -775,4 +602,4 @@ class KRSplashController extends GetxController { void onClose() { super.onClose(); } -} \ No newline at end of file +} diff --git a/lib/app/network/base_response.dart b/lib/app/network/base_response.dart index c14a15c..46db986 100755 --- a/lib/app/network/base_response.dart +++ b/lib/app/network/base_response.dart @@ -25,15 +25,14 @@ class BaseResponse { final dataMap = json['data'] ?? Map(); final cipherText = dataMap['data'] ?? ""; final nonce = dataMap['time'] ?? ""; - print('明文${cipherText}'); // 刀断是吊需芁解密根据站点配眮的 enable_security 字段 if (cipherText.isNotEmpty && nonce.isNotEmpty) { try { if (kDebugMode) { // print('═══════════════════════════════════════'); // print('🔐 检测到加密响应匀始解密...'); - print('📥 加密数据长床: ${cipherText.length} 字笊'); - print('⏰ 时闎戳: $nonce'); + // print('📥 加密数据长床: ${cipherText.length} 字笊'); + // print('⏰ 时闎戳: $nonce'); } final decrypted = KRAesUtil.decryptData(cipherText, nonce, AppConfig.kr_encryptionKey); diff --git a/lib/app/network/http_util.dart b/lib/app/network/http_util.dart index 3ccf8d9..f96acb7 100755 --- a/lib/app/network/http_util.dart +++ b/lib/app/network/http_util.dart @@ -24,7 +24,6 @@ import 'package:loggy/loggy.dart'; import '../utils/kr_aes_util.dart'; import '../utils/kr_log_util.dart'; -import 'package:flutter/foundation.dart'; // import 'package:video/app/utils/common_util.dart'; // import 'package:video/app/utils/log_util.dart'; @@ -144,70 +143,11 @@ class HttpUtil { } var map = {}; - // 刀断是吊需芁加密根据站点配眮的 enable_security 字段 - final shouldEncrypt = KRSiteConfigService().isDeviceSecurityEnabled(); - if (shouldEncrypt) { - KRLogUtil.kr_i('🔐 需芁加密请求数据', tag: 'HttpUtil'); - final plainText = jsonEncode(params); - map = KRAesUtil.encryptData(plainText, AppConfig.kr_encryptionKey); - } else { - map = params; - } + final plainText = jsonEncode(params); + map = KRAesUtil.encryptData(plainText, AppConfig.kr_encryptionKey); // 初始化请求倎 final headers = _initHeader('signature', 'userId', 'token'); - int? _kr_parseUserIdFromToken(String token) { - try { - // JWT栌匏: header.payload.signature - final parts = token.split('.'); - if (parts.length != 3) { - KRLogUtil.kr_e('JWT token栌匏错误', tag: 'AppRunData'); - return null; - } - - // 解码payload郚分base64 - String payload = parts[1]; - // 手劚添加必芁的paddingbase64芁求长床是4的倍数 - switch (payload.length % 4) { - case 0: - break; // 䞍需芁padding - case 2: - payload += '=='; - break; - case 3: - payload += '='; - break; - default: - KRLogUtil.kr_e('JWT payload长床无效', tag: 'AppRunData'); - return null; - } - - final decodedBytes = base64.decode(payload); - final decodedString = utf8.decode(decodedBytes); - - // 解析JSON - final Map payloadMap = jsonDecode(decodedString); - - // 获取UserId - if (payloadMap.containsKey('UserId')) { - final userId = payloadMap['UserId']; - KRLogUtil.kr_i('从JWT解析出userId: $userId', tag: 'AppRunData'); - return userId is int ? userId : int.tryParse(userId.toString()); - } - - return null; - } catch (e) { - KRLogUtil.kr_e('解析JWT token倱莥: $e', tag: 'AppRunData'); - return null; - } - } - - final userId = - _kr_parseUserIdFromToken(KRAppRunData().kr_token.toString()); - // 调试打印请求倎 - KRLogUtil.kr_i('🔍 请求倎: $headers', tag: 'HttpUtil'); - KRLogUtil.kr_i('🔍 请求userId: $userId', tag: 'HttpUtil'); - KRLogUtil.kr_i('🔍 请求倎map: $map', tag: 'HttpUtil'); Response> responseTemp; if (method == HttpMethod.GET) { @@ -316,193 +256,93 @@ class HttpUtil { } } -/// 拊截噚简掁栌匏无蟹框 -class MyInterceptor extends Interceptor { - @override - void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (kDebugMode) { - print('>>> Request │ ${options.method} │ ${options.uri}'); - } - if (options.data != null) { - if (kDebugMode) { - print('Body: ${options.data}'); - } - } - handler.next(options); - } - - @override - void onResponse(Response response, ResponseInterceptorHandler handler) { - if (kDebugMode) { - print( - '<<< Response │ ${response.requestOptions.method} │ ${response.statusCode} ${response.statusMessage} │ ${response.requestOptions.uri}'); - } - if (response.data != null) { - if (kDebugMode) { - print('Body: ${response.data}'); - } - } - handler.next(response); - } - - @override - void onError(DioException err, ErrorInterceptorHandler handler) { - if (kDebugMode) { - print( - '<<< Error │ ${err.requestOptions.method} │ ${err.requestOptions.uri}'); - } - if (kDebugMode) { - print('Error Type: ${err.type}'); - } - if (err.message != null) { - if (kDebugMode) { - print('Error Message: ${err.message}'); - } - } - if (err.response?.data != null) { - if (kDebugMode) { - print('Response Data: ${err.response?.data}'); - } - } - handler.next(err); - } -} - /// 自定义简掁 HTTP 拊截噚无蟹框笊号 class _KRSimpleHttpInterceptor extends Interceptor { + /// 垞量手劚控制是吊打印拊截噚日志䞎解密结果 + static const bool KR_HTTP_PRINT = true; final Dio _dio; _KRSimpleHttpInterceptor(this._dio); static String? _lastPath; static int _lastTsMs = 0; @override + + /// 请求拊截噚 + /// + /// 功胜圚调试暡匏䞋䌘先打印请求的解密明文若解密倱莥则打印原始数据并标识倱莥。 + /// 参数 + /// - options: 请求选项包含 data 侎 queryParameters + /// - handler: 拊截噚倄理噚 + /// 返回void void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (kDebugMode) { + if (KR_HTTP_PRINT) { print('>>> Request │ ${options.method} │ ${options.uri}'); } - if (options.data != null) { - if (kDebugMode) { - print('Body: ${options.data}'); - } - - // 检查是吊是加密数据包含 data 和 time 字段 + if (KR_HTTP_PRINT) { + Map? m; if (options.data is Map) { - final data = options.data as Map; - if (data.containsKey('data') && data.containsKey('time')) { - try { - if (kDebugMode) { - print(''); - } - // 尝试解密并打印原始数据 - final encryptedData = data['data'] as String; - final nonce = data['time'] as String; - final decrypted = KRAesUtil.decryptData( - encryptedData, - nonce, - AppConfig.kr_encryptionKey, - ); - if (kDebugMode) { - print('🔓 解密后的原始请求数据:'); - } - // 尝试栌匏化 JSON - try { - final jsonData = jsonDecode(decrypted); - final prettyJson = JsonEncoder.withIndent(' ').convert(jsonData); - if (kDebugMode) { - print(prettyJson); - } - } catch (_) { - if (kDebugMode) { - print(decrypted); - } - } - } catch (e) { - if (kDebugMode) { - print('⚠ 请求解密倱莥: $e'); - } - } - } + m = options.data as Map; + } else if (options.queryParameters.isNotEmpty) { + m = options.queryParameters; + } + if (m != null) { + final decrypted = _tryDecryptFromMap(m); + _printDecryptedOrFallback( + phase: 'Request', raw: m, decrypted: decrypted); } } handler.next(options); } @override + + /// 响应拊截噚 + /// + /// 功胜圚调试暡匏䞋䌘先打印响应的解密明文若解密倱莥则打印原始数据并标识倱莥。 + /// 参数 + /// - response: 响应对象䌘先识别 Map 栌匏 + /// - handler: 拊截噚倄理噚 + /// 返回void void onResponse(Response response, ResponseInterceptorHandler handler) { - if (kDebugMode) { + if (KR_HTTP_PRINT) { print( '<<< Response │ ${response.requestOptions.method} │ ${response.statusCode} ${response.statusMessage} │ ${response.requestOptions.uri}'); } - if (response.data != null) { - if (kDebugMode) { - print('Body: ${response.data}'); - } - - // 检查响应是吊是加密数据包含 data 和 time 字段 - if (response.data is Map) { - final dataMap = response.data as Map; - - // 检查是吊包含嵌套的 data 字段加密数据栌匏 - final nestedData = dataMap['data']; - if (nestedData is Map && - nestedData.containsKey('data') && - nestedData.containsKey('time')) { - try { - if (kDebugMode) { - print(''); - } - if (kDebugMode) { - print('🔐 检测到加密响应正圚解密...'); - } - // 尝试解密并打印原始响应数据 - final encryptedData = nestedData['data'] as String; - final nonce = nestedData['time'] as String; - final decrypted = KRAesUtil.decryptData( - encryptedData, - nonce, - AppConfig.kr_encryptionKey, - ); - if (kDebugMode) { - print('🔓 解密后的原始响应数据:'); - } - // 尝试栌匏化 JSON - try { - // final jsonData = jsonDecode(decrypted); - // final prettyJson = JsonEncoder.withIndent(' ').convert(jsonData); - // if (kDebugMode) { - // print(prettyJson); - // } - } catch (_) { - if (kDebugMode) { - print(decrypted); - } - } - } catch (e) { - if (kDebugMode) { - print('⚠ 响应解密倱莥: $e'); - } - } - } + if (KR_HTTP_PRINT && response.data is Map) { + final dataMap = response.data as Map; + String? decrypted = _tryDecryptFromMap(dataMap); + if (decrypted == null && dataMap['data'] is Map) { + decrypted = _tryDecryptFromMap(dataMap['data'] as Map); } + _printDecryptedOrFallback( + phase: 'Response', raw: dataMap, decrypted: decrypted); } handler.next(response); } @override + + /// 错误拊截噚 + /// + /// 功胜打印错误信息并保持原有的 Unknown 错误重试䞎倱莥提瀺去重逻蟑。 + /// 参数 + /// - err: Dio 错误对象 + /// - handler: 拊截噚倄理噚 + /// 返回void void onError(DioException err, ErrorInterceptorHandler handler) { - if (kDebugMode) { + if (KR_HTTP_PRINT) { print( '<<< Error │ ${err.requestOptions.method} │ ${err.requestOptions.uri}'); } - if (kDebugMode) { + if (KR_HTTP_PRINT) { print('Error Type: ${err.type}'); } if (err.message != null) { - if (kDebugMode) { + if (KR_HTTP_PRINT) { print('Error Message: ${err.message}'); } } if (err.response?.data != null) { - if (kDebugMode) { + if (KR_HTTP_PRINT) { print('Response Data: ${err.response?.data}'); } } @@ -545,4 +385,53 @@ class _KRSimpleHttpInterceptor extends Interceptor { } handler.next(err); } + + /// 尝试从 Map 䞭解密若存圚 data/time 字段则返回明文吊则返回 null + String? _tryDecryptFromMap(Map m) { + final data = m['data']; + final time = m['time']; + if (data is String && time is String) { + try { + return KRAesUtil.decryptData(data, time, AppConfig.kr_encryptionKey); + } catch (_) { + return null; + } + } + return null; + } + + /// 将字笊䞲尜量按 JSON 猩进栌匏化倱莥时返回原文 + String _prettyPrintJson(String s) { + try { + final jsonData = jsonDecode(s); + return JsonEncoder.withIndent(' ').convert(jsonData); + } catch (_) { + return s; + } + } + + /// 统䞀蟓出逻蟑成功仅打印解密明文倱莥打印倱莥标识䞎原文 + void _printDecryptedOrFallback({ + required String phase, + required Object? raw, + required String? decrypted, + }) { + if (!KR_HTTP_PRINT) return; + if (decrypted != null) { + print('🔓 $phase 明文:'); + print(_prettyPrintJson(decrypted)); + } else { + print('⚠ $phase 解密倱莥'); + print('原文:'); + if (raw is Map) { + try { + print(JsonEncoder.withIndent(' ').convert(raw)); + } catch (_) { + print(raw.toString()); + } + } else { + print(raw?.toString() ?? 'null'); + } + } + } } diff --git a/lib/app/services/api_service/kr_auth_api.dart b/lib/app/services/api_service/kr_auth_api.dart index 5f0ad0d..2d77829 100755 --- a/lib/app/services/api_service/kr_auth_api.dart +++ b/lib/app/services/api_service/kr_auth_api.dart @@ -379,23 +379,15 @@ class KRAuthApi { print('📀 原始请求数据: $data'); - // 检查是吊需芁加密 - final siteConfigService = KRSiteConfigService(); - final needEncryption = siteConfigService.isDeviceSecurityEnabled(); - - print('🔒 是吊需芁加密: $needEncryption'); - KRLogUtil.kr_i('🔒 是吊需芁加密: $needEncryption', tag: 'KRAuthApi'); - + final needEncryption = true; String? requestBody; if (needEncryption) { // 加密请求数据 - print('🔐 加密请求数据...'); final encrypted = KRAesUtil.encryptJson(data, AppConfig.kr_encryptionKey); requestBody = '{"data":"${encrypted['data']}","time":"${encrypted['time']}"}'; - print('🔐 加密后请求䜓: $requestBody'); - KRLogUtil.kr_i('🔐 加密后请求䜓', tag: 'KRAuthApi'); + // print('🔐 加密后请求䜓: $requestBody'); + // KRLogUtil.kr_i('🔐 加密后请求䜓', tag: 'KRAuthApi'); } else { - // 䜿甚明文 requestBody = jsonEncode(data); print('📝 明文请求䜓: $requestBody'); } @@ -439,10 +431,10 @@ class KRAuthApi { ), ); - print('📥 响应状态码: ${response.statusCode}'); - print('📥 响应数据: ${response.data}'); - KRLogUtil.kr_i('📥 响应状态码: ${response.statusCode}', tag: 'KRAuthApi'); - KRLogUtil.kr_i('📥 响应数据: ${response.data}', tag: 'KRAuthApi'); + // print('📥 响应状态码: ${response.statusCode}'); + // print('📥 响应数据: ${response.data}'); + // KRLogUtil.kr_i('📥 响应状态码: ${response.statusCode}', tag: 'KRAuthApi'); + // KRLogUtil.kr_i('📥 响应数据: ${response.data}', tag: 'KRAuthApi'); if (response.statusCode == 200) { Map responseData = response.data as Map; diff --git a/lib/app/services/kr_device_info_service.dart b/lib/app/services/kr_device_info_service.dart index b51dd34..78bb3ac 100644 --- a/lib/app/services/kr_device_info_service.dart +++ b/lib/app/services/kr_device_info_service.dart @@ -28,28 +28,23 @@ class KRDeviceInfoService { /// 初始化讟倇信息 Future initialize() async { try { - if (kDebugMode) { - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - print('📱 匀始初始化讟倇信息服务'); - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); - } KRLogUtil.kr_i('📱 匀始初始化讟倇信息', tag: 'KRDeviceInfoService'); _deviceId = await _getDeviceId(); _deviceDetails = await _getDeviceDetails(); if (kDebugMode) { - print('✅ 讟倇信息初始化成功'); - print('📱 讟倇ID: $_deviceId'); - print('📱 讟倇平台: ${getPlatformName()}'); - print('📱 讟倇型号: ${getDeviceModel()}'); - print('📱 系统版本: ${getOSVersion()}'); - print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + // print('✅ 讟倇信息初始化成功'); + // print('📱 讟倇ID: $_deviceId'); + // print('📱 讟倇平台: ${getPlatformName()}'); + // print('📱 讟倇型号: ${getDeviceModel()}'); + // print('📱 系统版本: ${getOSVersion()}'); + // print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); } KRLogUtil.kr_i('✅ 讟倇信息初始化成功', tag: 'KRDeviceInfoService'); - KRLogUtil.kr_i('📱 讟倇ID - $_deviceId', tag: 'KRDeviceInfoService'); - KRLogUtil.kr_i('📱 讟倇诊情 - $_deviceDetails', tag: 'KRDeviceInfoService'); + // KRLogUtil.kr_i('📱 讟倇ID - $_deviceId', tag: 'KRDeviceInfoService'); + // KRLogUtil.kr_i('📱 讟倇诊情 - $_deviceDetails', tag: 'KRDeviceInfoService'); } catch (e) { if (kDebugMode) { print('❌ 讟倇信息初始化倱莥: $e'); diff --git a/lib/app/services/kr_site_config_service.dart b/lib/app/services/kr_site_config_service.dart index 7f6d405..b852789 100644 --- a/lib/app/services/kr_site_config_service.dart +++ b/lib/app/services/kr_site_config_service.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; import 'package:flutter/foundation.dart'; @@ -7,6 +8,7 @@ import '../common/app_config.dart'; import '../utils/kr_log_util.dart'; import '../utils/kr_http_adapter_util.dart'; import 'singbox_imp/kr_sing_box_imp.dart'; +import 'api_service/kr_api.user.dart'; /// 眑站配眮服务 class KRSiteConfigService extends ChangeNotifier { @@ -18,15 +20,6 @@ class KRSiteConfigService extends ChangeNotifier { _dio.options.sendTimeout = const Duration(seconds: 20); _dio.options.receiveTimeout = const Duration(seconds: 20); - // 🔧 关键修倍眑站配眮请求䞍䜿甚代理 - // 原因眑站配眮是应甚启劚的第䞀步歀时 SingBox 还未初始化 - // 必须盎接连接服务噚获取配眮避免埪环䟝赖和初始化倱莥 - // 之前的代理配眮䌚富臎 DioExceptionType.unknown 错误 - KRLogUtil.kr_i( - '🌐 眑站配眮服务䜿甚盎连暡匏䞍通过代理', - tag: 'KRSiteConfigService', - ); - // 🔧 关键修倍添加 SSL 证乊验证跳过区制盎连 _dio.httpClientAdapter = KRHttpAdapterUtil.createAdapter( useSingBoxProxy: false, @@ -49,190 +42,126 @@ class KRSiteConfigService extends ChangeNotifier { /// 是吊已初始化 bool get isInitialized => _isInitialized; - /// 初始化站点配眮 Future initialize() async { - int retryCount = 0; - const int maxRetries = 5; + return await initializeDomains(); + } - while (retryCount < maxRetries) { - try { - if (kDebugMode) { - print('🔧 KRSiteConfigService.initialize() 匀始执行 (尝试 ${retryCount + 1}/$maxRetries)'); - } - KRLogUtil.kr_i('🔧 匀始初始化眑站配眮 (尝试 ${retryCount + 1}/$maxRetries)', tag: 'KRSiteConfigService'); - - // Debug 暡匏䞋䜿甚固定地址 - final baseUrl = AppConfig().baseUrl; - if (kDebugMode) { - print('📍 baseUrl = $baseUrl'); - } - final url = '$baseUrl/v1/common/site/config'; - if (kDebugMode) { - print('📍 完敎URL = $url'); - } - - KRLogUtil.kr_i('📀 请求眑站配眮 - $url', tag: 'KRSiteConfigService'); - if (kDebugMode) { - print('📀 准倇发送 GET 请求到: $url'); - } - if (kDebugMode) { - // 🔧 修正日志星瀺真实的超时配眮 - print('⏱ 超时配眮: connectTimeout=${_dio.options.connectTimeout}, sendTimeout=${_dio.options.sendTimeout}, receiveTimeout=${_dio.options.receiveTimeout}'); - } - - if (kDebugMode) { - print('⏳ 匀始发送请求...'); - } - final startTime = DateTime.now(); - final response = await _dio.get(url); - final endTime = DateTime.now(); - final duration = endTime.difference(startTime).inMilliseconds; - if (kDebugMode) { - print('⏱ 请求耗时: ${duration}ms'); - } - - if (kDebugMode) { - print('✅ 请求完成状态码: ${response.statusCode}'); - } - KRLogUtil.kr_i('📥 响应状态码 - ${response.statusCode}', tag: 'KRSiteConfigService'); - - if (response.statusCode == 200) { - final responseData = response.data; - if (kDebugMode) { - print('📥 响应数据类型: ${responseData.runtimeType}'); - } - if (kDebugMode) { - print('📥 响应数据: $responseData'); - } - KRLogUtil.kr_i('📥 响应数据 - $responseData', tag: 'KRSiteConfigService'); - - if (responseData['code'] == 200) { - _siteConfig = KRSiteConfig.fromJson(responseData['data']); - _isInitialized = true; - - final config = AppConfig.getInstance(); - config.kr_website_id = getCrispId(); - config.device_limit = getDeviceLimit(); - // 打印配眮信息 - _printConfigInfo(); - - // 通知监听者配眮已曎新 - notifyListeners(); - - return true; - } else { - KRLogUtil.kr_e('❌ API返回错误 - ${responseData['msg']}', tag: 'KRSiteConfigService'); - // API 返回䞚务错误䞀般䞍重试陀非是特定错误码 - return false; - } - } else { - KRLogUtil.kr_e('❌ HTTP错误 - ${response.statusCode}', tag: 'KRSiteConfigService'); - // HTTP 错误劂 404, 500通垞也意味着该域名有问题尝试切换 - // 䜆这里䞺了皳劥先只针对眑络匂垞重试劂果需芁也可以改䞺抛出匂垞进入 catch - throw DioException( - requestOptions: response.requestOptions, - response: response, - type: DioExceptionType.badResponse, - error: 'HTTP Error ${response.statusCode}', - ); - } - } on DioException catch (e, stackTrace) { - if (kDebugMode) { - print('❌ Dio请求匂垞: ${e.type}'); - } - KRLogUtil.kr_e('❌ Dio匂垞 - ${e.type}: ${e.message}', tag: 'KRSiteConfigService'); - - // 检查是吊是可以重试的错误类型 - if (e.type == DioExceptionType.connectionTimeout || - e.type == DioExceptionType.receiveTimeout || - e.type == DioExceptionType.sendTimeout || - e.type == DioExceptionType.connectionError || - e.type == DioExceptionType.unknown || // unknown 有时也是眑络问题 - e.type == DioExceptionType.badResponse) { // 503 等服务噚错误也倌埗重试 - - KRLogUtil.kr_w('⚠ 眑络或服务噚匂垞尝试切换域名重试...', tag: 'KRSiteConfigService'); - - // 尝试切换到䞋䞀䞪域名 - final switchSuccess = await KRDomain.kr_switchToNextDomain(); - if (switchSuccess) { - retryCount++; - KRLogUtil.kr_i('✅ 域名切换成功准倇第 ${retryCount + 1} 次尝试', tag: 'KRSiteConfigService'); - continue; // 重新进入埪环 - } else { - KRLogUtil.kr_e('❌ 域名切换倱莥无法继续重试', tag: 'KRSiteConfigService'); - return false; - } - } - - // 劂果是䞍可重试的错误盎接返回倱莥 - KRLogUtil.kr_e('📚 堆栈: $stackTrace', tag: 'KRSiteConfigService'); - return false; - } catch (e, stackTrace) { - if (kDebugMode) { - print('❌ 未知匂垞: $e'); - } - KRLogUtil.kr_e('❌ 初始化倱莥 - $e', tag: 'KRSiteConfigService'); - KRLogUtil.kr_e('📚 堆栈: $stackTrace', tag: 'KRSiteConfigService'); - return false; - } + Future initializeDomains() async { + try { + await KRDomain.kr_loadBaseDomain(); + _isInitialized = true; + notifyListeners(); + return true; + } catch (_) { + return false; + } + } + + Future fetchSiteConfig() async { + try { + final result = await KRUserApi().kr_config(); + return await result.fold( + (error) async { + return false; + }, + (cfg) async { + try { + if (cfg.kr_config.isNotEmpty) { + final Map root = jsonDecode(cfg.kr_config); + _siteConfig = KRSiteConfig.fromJson(root); + AppConfig.getInstance().device_limit = getDeviceLimit(); + notifyListeners(); + return true; + } + } catch (_) {} + return false; + }, + ); + } catch (_) { + return false; } - - KRLogUtil.kr_e('❌ 蟟到最倧重试次数 ($maxRetries)初始化倱莥', tag: 'KRSiteConfigService'); - return false; } /// 打印配眮信息 void _printConfigInfo() { if (_siteConfig == null) return; - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('📊 眑站配眮信息:', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); // 站点信息 - KRLogUtil.kr_i('🏠 站点名称: ${_siteConfig!.site.siteName}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('🏠 站点描述: ${_siteConfig!.site.siteDesc}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('🏠 站点域名: ${_siteConfig!.site.host}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('💬 Crisp ID: ${_siteConfig!.site.crispId}', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('🏠 站点名称: ${_siteConfig!.site.siteName}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('🏠 站点描述: ${_siteConfig!.site.siteDesc}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('🏠 站点域名: ${_siteConfig!.site.host}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('💬 Crisp ID: ${_siteConfig!.site.crispId}', + tag: 'KRSiteConfigService'); // 泚册盞关 - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('📝 泚册配眮:', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 匀攟泚册: ${isRegisterEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 手机号泚册: ${isMobileRegisterEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 邮箱泚册: ${isEmailRegisterEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 讟倇登圕: ${isDeviceLoginEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 匀攟泚册: ${isRegisterEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 手机号泚册: ${isMobileRegisterEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 邮箱泚册: ${isEmailRegisterEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 讟倇登圕: ${isDeviceLoginEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); // 验证盞关 - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('🔐 验证配眮:', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 邮箱验证: ${isEmailVerificationEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 手机验证: ${isMobileVerificationEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 登圕验证: ${isLoginVerificationEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 泚册验证: ${isRegisterVerificationEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 重眮密码验证: ${isResetPasswordVerificationEnabled() ? "是" : "吊"}', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 邮箱验证: ${isEmailVerificationEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 手机验证: ${isMobileVerificationEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 登圕验证: ${isLoginVerificationEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 泚册验证: ${isRegisterVerificationEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i( + ' ✓ 重眮密码验证: ${isResetPasswordVerificationEnabled() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); // 邀请盞关 - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('🎁 邀请配眮:', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 区制邀请码: ${isForcedInvite() ? "是" : "吊"}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 掚荐比䟋: ${_siteConfig!.invite.referralPercentage}%', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 区制邀请码: ${isForcedInvite() ? "是" : "吊"}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 掚荐比䟋: ${_siteConfig!.invite.referralPercentage}%', + tag: 'KRSiteConfigService'); // 莧垁盞关 - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('💰 莧垁配眮:', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 莧垁单䜍: ${_siteConfig!.currency.currencyUnit}', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i(' ✓ 莧垁笊号: ${_siteConfig!.currency.currencySymbol}', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 莧垁单䜍: ${_siteConfig!.currency.currencyUnit}', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i(' ✓ 莧垁笊号: ${_siteConfig!.currency.currencySymbol}', + tag: 'KRSiteConfigService'); // OAuth 方法 if (_siteConfig!.oauthMethods.isNotEmpty) { - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('🔑 OAuth 方法: ${_siteConfig!.oauthMethods.join(", ")}', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('🔑 OAuth 方法: ${_siteConfig!.oauthMethods.join(", ")}', + tag: 'KRSiteConfigService'); } - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); KRLogUtil.kr_i('✅ 眑站配眮初始化成功', tag: 'KRSiteConfigService'); - KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'KRSiteConfigService'); + KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', + tag: 'KRSiteConfigService'); } /// 是吊匀启手机号泚册 @@ -352,10 +281,12 @@ class KRSiteConfigService extends ChangeNotifier { return true; } - final allowedDomains = domainSuffixList.split(',').map((d) => d.trim()).toList(); + final allowedDomains = + domainSuffixList.split(',').map((d) => d.trim()).toList(); final emailDomain = email.split('@').last.toLowerCase(); - return allowedDomains.any((domain) => emailDomain.endsWith(domain.toLowerCase())); + return allowedDomains + .any((domain) => emailDomain.endsWith(domain.toLowerCase())); } /// 获取Crisp客服系统ID diff --git a/lib/app/utils/account_guard.dart b/lib/app/utils/account_guard.dart deleted file mode 100644 index 145ec85..0000000 --- a/lib/app/utils/account_guard.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:get/get.dart'; -import 'package:kaer_with_panels/app/common/app_run_data.dart'; -import 'package:kaer_with_panels/app/common/app_config.dart'; -import 'package:kaer_with_panels/app/widgets/dialogs/hi_dialog.dart'; -import 'package:kaer_with_panels/app/routes/app_pages.dart'; -import 'package:kaer_with_panels/app/utils/kr_common_util.dart'; -import 'package:kaer_with_panels/app/services/kr_site_config_service.dart'; - -Future ensureAccountExists() async { - final app = KRAppRunData.getInstance(); - final account = app.kr_account.value; - final isLoggedIn = app.kr_isLogin.value; - final config = AppConfig.getInstance(); - - if (account == null || - account.isEmpty || - !isLoggedIn - ) { - await HIDialog.show( - message: '未检测到莊号信息请重试初始化', - confirmText: '重试', - preventBackDismiss: true, - onConfirm: () { - Get.offAllNamed(Routes.KR_SPLASH); - }, - ); - return false; - } - - var crispId = config.kr_website_id; - var deviceLimitText = config.device_limit; - var deviceLimit = int.tryParse(deviceLimitText) ?? 0; - if ((crispId.isEmpty || crispId == '0') || deviceLimit == 0) { - KRSiteConfigService().initialize(); - } - return true; -} diff --git a/lib/app/utils/kr_common_util.dart b/lib/app/utils/kr_common_util.dart index bfc6ced..5c8820b 100755 --- a/lib/app/utils/kr_common_util.dart +++ b/lib/app/utils/kr_common_util.dart @@ -30,7 +30,7 @@ class KRCommonUtil { return; } - final websiteId = AppConfig.getInstance().kr_website_id; + final websiteId = '47fcc1ac-9674-4ab1-9e3c-6b5666f59a38'; // AppConfig.getInstance().kr_website_id; if (websiteId.isEmpty) { HIDialog.show( title: '提瀺', diff --git a/lib/app/utils/kr_http_adapter_util.dart b/lib/app/utils/kr_http_adapter_util.dart index 1193bf5..26b00d0 100644 --- a/lib/app/utils/kr_http_adapter_util.dart +++ b/lib/app/utils/kr_http_adapter_util.dart @@ -31,7 +31,7 @@ class KRHttpAdapterUtil { client.findProxy = (url) { try { final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule(); - KRLogUtil.kr_i('🔍 请求䜿甚代理: $proxyConfig, url: $url', tag: 'KRHttpAdapterUtil'); + // KRLogUtil.kr_i('🔍 请求䜿甚代理: $proxyConfig, url: $url', tag: 'KRHttpAdapterUtil'); return proxyConfig; } catch (e) { KRLogUtil.kr_w('⚠ 获取代理配眮匂垞回退到 DIRECT: $e', tag: 'KRHttpAdapterUtil'); diff --git a/lib/app/widgets/hi_base_scaffold.dart b/lib/app/widgets/hi_base_scaffold.dart index 0da257e..b7b4d7e 100644 --- a/lib/app/widgets/hi_base_scaffold.dart +++ b/lib/app/widgets/hi_base_scaffold.dart @@ -4,7 +4,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:kaer_with_panels/app/widgets/kr_local_image.dart'; import 'package:kaer_with_panels/app/routes/app_pages.dart'; -import 'package:kaer_with_panels/app/utils/account_guard.dart'; /// 🔹 HIBaseScaffold /// 甚于统䞀页面结构 @@ -114,8 +113,6 @@ class HIBaseScaffold extends StatelessWidget { if (showMenuButton) { return GestureDetector( onTap: () async { - final ok = await ensureAccountExists(); - if (!ok) return; Get.toNamed(Routes.HI_MENU); }, child: Container( diff --git a/lib/main.dart b/lib/main.dart index 9a4c36a..4046b76 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,7 +58,7 @@ void main() async { // 初始化䞻题 - await KRThemeService().init(); + // await KRThemeService().init(); // 初始化翻译 final translations = GetxTranslations();