fix: 1.修复域名切换失败; 2.动态域名添加核心白名单,3.修复windows字体

This commit is contained in:
speakeloudest 2026-01-09 17:50:21 -08:00
parent 12eb8348d3
commit 9b5e370f0b
4 changed files with 150 additions and 109 deletions

View File

@ -85,10 +85,10 @@ class KRSplashController extends GetxController {
print('🧹 清理域名检测状态...');
KRDomain.kr_resetDomainState();
// 🔧 P2优化
print('🌐 启动后台任务:网站配置加载...');
KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');
_kr_initSiteConfig(); //
// 🔧 P2优化
// print('🌐 启动后台任务:网站配置加载...');
// KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');
// _kr_initSiteConfig(); // _kr_continueInitialization
// 🔧
if (kDebugMode) {
@ -551,6 +551,14 @@ class KRSplashController extends GetxController {
}
//
// 🔧
// initSiteConfig
// 使
_logStepTiming('开始站点配置初始化');
await _kr_initSiteConfig();
_logStepTiming('站点配置初始化完成');
_logStepTiming('开始设备登录检查');
// 5
final success = await KRAppRunData.getInstance().kr_checkAndPerformDeviceLogin();
@ -569,7 +577,12 @@ class KRSplashController extends GetxController {
}
_logStepTiming('设备登录检查完成');
//
// (init会导致重复AppConfig内部有防重
// _kr_initSiteConfig(KRSiteConfig)
// AppConfig().initConfig主要是做AppConfig层面的配置加载
// AppConfig().initConfig API
// AppConfig().initConfig 使)
_initLog.log('⚙️ 开始初始化应用配置(域名加载等)', tag: 'Continue');
KRLogUtil.kr_i('⚙️ 开始初始化应用配置...', tag: 'SplashController');
await AppConfig().initConfig(

View File

@ -51,124 +51,134 @@ class KRSiteConfigService extends ChangeNotifier {
///
Future<bool> initialize() async {
try {
if (kDebugMode) {
print('🔧 KRSiteConfigService.initialize() 开始执行');
}
KRLogUtil.kr_i('🔧 开始初始化网站配置', tag: 'KRSiteConfigService');
int retryCount = 0;
const int maxRetries = 5;
// 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;
while (retryCount < maxRetries) {
try {
if (kDebugMode) {
print('📥 响应数据类型: ${responseData.runtimeType}');
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('📥 响应数据: $responseData');
// 🔧
print('⏱️ 超时配置: connectTimeout=${_dio.options.connectTimeout}, sendTimeout=${_dio.options.sendTimeout}, receiveTimeout=${_dio.options.receiveTimeout}');
}
KRLogUtil.kr_i('📥 响应数据 - $responseData', tag: 'KRSiteConfigService');
if (responseData['code'] == 200) {
_siteConfig = KRSiteConfig.fromJson(responseData['data']);
_isInitialized = true;
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');
}
final config = AppConfig.getInstance();
config.kr_website_id = getCrispId();
config.device_limit = getDeviceLimit();
//
_printConfigInfo();
if (kDebugMode) {
print('✅ 请求完成,状态码: ${response.statusCode}');
}
KRLogUtil.kr_i('📥 响应状态码 - ${response.statusCode}', tag: 'KRSiteConfigService');
//
notifyListeners();
if (response.statusCode == 200) {
final responseData = response.data;
if (kDebugMode) {
print('📥 响应数据类型: ${responseData.runtimeType}');
}
if (kDebugMode) {
print('📥 响应数据: $responseData');
}
KRLogUtil.kr_i('📥 响应数据 - $responseData', tag: 'KRSiteConfigService');
return true;
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('❌ API返回错误 - ${responseData['msg']}', tag: 'KRSiteConfigService');
return false;
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}',
);
}
} else {
KRLogUtil.kr_e('❌ HTTP错误 - ${response.statusCode}', tag: 'KRSiteConfigService');
} 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;
}
} on DioException catch (e, stackTrace) {
if (kDebugMode) {
print('❌ Dio请求异常: ${e.type}');
}
if (kDebugMode) {
print('❌ 错误信息: ${e.message}');
}
if (kDebugMode) {
print('❌ 请求URL: ${e.requestOptions.uri}');
}
if (kDebugMode) {
print('❌ 连接超时: ${e.requestOptions.connectTimeout}');
}
if (kDebugMode) {
print('❌ 发送超时: ${e.requestOptions.sendTimeout}');
}
if (kDebugMode) {
print('❌ 接收超时: ${e.requestOptions.receiveTimeout}');
}
if (e.response != null) {
if (kDebugMode) {
print('❌ 响应状态码: ${e.response?.statusCode}');
}
if (kDebugMode) {
print('❌ 响应数据: ${e.response?.data}');
}
}
if (kDebugMode) {
print('📚 堆栈跟踪: $stackTrace');
}
KRLogUtil.kr_e('❌ Dio异常 - ${e.type}: ${e.message}', tag: 'KRSiteConfigService');
KRLogUtil.kr_e('📚 堆栈: $stackTrace', tag: 'KRSiteConfigService');
return false;
} catch (e, stackTrace) {
if (kDebugMode) {
print('❌ 未知异常: $e');
}
if (kDebugMode) {
print('📚 堆栈跟踪: $stackTrace');
}
KRLogUtil.kr_e('❌ 初始化失败 - $e', tag: 'KRSiteConfigService');
KRLogUtil.kr_e('📚 堆栈: $stackTrace', tag: 'KRSiteConfigService');
return false;
}
KRLogUtil.kr_e('❌ 达到最大重试次数 ($maxRetries),初始化失败', tag: 'KRSiteConfigService');
return false;
}
///

View File

@ -689,6 +689,23 @@ class KRSingBoxImp {
List<Map<String, dynamic>> _kr_buildHiddifyRules() {
final rules = <Map<String, dynamic>>[];
rules.add({"domains": "domain:api.hifast.biz", "outbound": "bypass"});
// 使 domain:crisp.chat ()
rules.add({"domains": "domain:crisp.chat", "outbound": "bypass"});
// sing-box relay
rules.add({"domains": "domain:client.relay.crisp.chat", "outbound": "bypass"});
// 🔧 ()
// 使 Set
final baseDomains = KRDomain.kr_baseDomains.toSet();
KRLogUtil.kr_i('🔄 将 ${baseDomains.length} 个动态域名加入直连规则: $baseDomains', tag: 'SingBox');
for (final domain in baseDomains) {
if (domain.isNotEmpty) {
// Set去重了
// sing-box
rules.add({"domains": "domain:$domain", "outbound": "bypass"});
}
}
final nodeDomains = _kr_collectNodeDomains();
for (final d in nodeDomains) {

View File

@ -60,6 +60,7 @@ class _HICollapsibleItemWidgetState extends State<HICollapsibleItemWidget> {
text: linkText,
style: const TextStyle(
color: const Color(0xFFADFF5B), //
fontFamily: 'AlibabaPuHuiTi-Regular',
),
recognizer: TapGestureRecognizer()
..onTap = () async {