alroyso 1 year ago
parent
commit
4dd046ae23

+ 7 - 5
lib/app/controller/GlobalController.dart

@@ -20,7 +20,7 @@ class GlobalController extends GetxController {
   late BuildContext context;
   final List<String> modes = ['rule', 'global'];
   final List<String> routeModes = ['sys', 'tun'];
-
+  var msgStatus = "未连接".obs;
   var routeModesSelect = "sys".obs;
   var modesSelect = "rule".obs;
   var nodeModes = <NodeMode>[].obs;
@@ -67,12 +67,15 @@ class GlobalController extends GetxController {
     // await controllers.service.serviceModeSwitch(true);
     // init clash core
 
-    await controllers.service.initClashCoreConfig();
-    if (controllers.service.coreStatus.value != RunningState.running) return;
-    await controllers.core.updateVersion();
+    // await controllers.service.initClashCoreConfig();
+    // if (controllers.service.coreStatus.value != RunningState.running) return;
+    // await controllers.core.updateVersion();
     //initRegularlyUpdate();
   }
 
+  void updateMsg(String msg) {
+    msgStatus.value = msg;
+  }
 
   Future<void> updateMode(String route) async {
     if(allowStatusUpdate){
@@ -227,7 +230,6 @@ class GlobalController extends GetxController {
 
   Future<void> updateDate() async {
     log.debug('controller.proxie.updateDate()');
-
     await controllers.core.updateConfig();
     await _updateProxie();
     await _updateProxieProvider();

+ 2 - 1
lib/app/controller/core.dart

@@ -5,6 +5,7 @@ import 'package:naiyouwl/app/bean/connect.dart';
 import 'package:naiyouwl/app/bean/proxie.dart';
 import 'package:naiyouwl/app/bean/rule.dart';
 import 'package:naiyouwl/app/controller/controllers.dart';
+import 'package:naiyouwl/app/utils/logger.dart';
 import 'package:naiyouwl/app/utils/system_proxy.dart';
 import 'package:web_socket_channel/io.dart';
 
@@ -159,7 +160,7 @@ class FriendlyErrorInterceptor extends Interceptor {
     } else if (err.type == DioErrorType.other) {
       message = 'core 其他错误: ${err.message}';
     }
-
+    log.debug(message);
     return DioError(error: message, requestOptions: err.requestOptions);
   }
 }

+ 12 - 6
lib/app/controller/service.dart

@@ -72,6 +72,7 @@ class ServiceController extends GetxController {
 
   }
   Future<void> startService() async {
+    controllers.global.updateMsg("开启服务");
     serviceStatus.value = RunningState.starting;
     if (Platform.isLinux) {
       await fixBinaryExecutePermissions(Files.assetsClashService);
@@ -80,11 +81,10 @@ class ServiceController extends GetxController {
     try {
       final data = await fetchInfo();
       serviceMode.value = data.mode == 'service-mode';
-      fetchStop();
+      controllers.global.updateMsg("服务模式");
     } catch (e) {
-      //await install();
-
       await startUserModeService();
+      controllers.global.updateMsg("开启用户服务");
       if (serviceStatus.value == RunningState.error) return;
     }
     serviceStatus.value = RunningState.running;
@@ -208,6 +208,7 @@ class ServiceController extends GetxController {
     Future<void> serviceModeSwitch(bool open) async {
       if (serviceStatus.value == RunningState.running) await stopService();
       try {
+        controllers.global.updateMsg(open ? "安装服务" : "卸载服务");
         open ? await install() : await uninstall();
       } catch (e) {
         BotToast.showText(text: e.toString());
@@ -218,8 +219,10 @@ class ServiceController extends GetxController {
 
     Future<void> startClashCore() async {
       try {
+        //controllers.global.updateMsg("启动内核");
         coreStatus.value = RunningState.starting;
         await fetchStart(controllers.config.config.value.selected);
+        log.debug("api${controllers.config.clashCoreApiAddress.value}");
         controllers.core.setApi(controllers.config.clashCoreApiAddress.value, controllers.config.clashCoreApiSecret.value);
         while (true) {
           await Future.delayed(const Duration(milliseconds: 200));
@@ -231,6 +234,7 @@ class ServiceController extends GetxController {
               break;
             } catch (_) {}
           } else {
+            controllers.global.updateMsg("启动内核错误---等待中...");
             throw 'clash-core start error';
           }
         }
@@ -245,6 +249,7 @@ class ServiceController extends GetxController {
         coreStatus.value = RunningState.running;
       } catch (e) {
         log.error("core -- $e");
+        controllers.global.updateMsg("启动内核错误");
         controllers.global.handleApiError(e);
        // BotToast.showText(text: e.toString());
         coreStatus.value = RunningState.error;
@@ -286,15 +291,16 @@ class ServiceController extends GetxController {
       // if( coreStatus.value == RunningState.running){
       //   await controllers.core.fetchReloadConfig({"path":  path.join(Paths.config.path, controllers.config.config.value.selected),"payload":""});
       // }
-      BotToast.showText(text: '正在重启 Core ……');
+      //BotToast.showText(text: '正在重启 Core ……');
+      controllers.global.updateMsg("停止内核...");
       await stopClashCore();
       await controllers.config.readClashCoreApi();
       await startClashCore();
       if (coreStatus.value == RunningState.error) {
-        BotToast.showText(text: '重启失败');
+        controllers.global.updateMsg("启动内核失败...");
       } else {
         await controllers.core.updateVersion();
-        BotToast.showText(text: '重启成功');
+        controllers.global.updateMsg("启动内核成功...");
       }
     }
 

+ 39 - 12
lib/app/modules/home/controllers/home_controller.dart

@@ -42,6 +42,7 @@ class HomeController extends GetxController {
   var localUsers = LocalUser().obs;
   var userMode = User().obs;
   var UsersysConfig = SysConfig().obs;
+
   var connectStatus = Rx<ConnectionStatus>(ConnectionStatus.disconnected);
   var nodeModes = <NodeMode>[];
   bool get isRunning => connectStatus.value == ConnectionStatus.stopped && controllers.global.allowStatusUpdate;
@@ -113,13 +114,18 @@ class HomeController extends GetxController {
       updateStatus(ConnectionStatus.disconnected);
       return;
     } else {
+      controllers.global.updateMsg("开始连接...");
       await controllers.config.setBreakConnections(true);
       controllers.global.allowStatusUpdate = true;
       var routeModes = controllers.global.routeModesSelect.value;
       if(routeModes == "tun"){
+        controllers.global.updateMsg("正在启动网卡模式...");
         controllers.config.clashCoreTunEnable.value = true;
         controllers.global.startTunMode();
-        await controllers.service.startTunService();
+        if(controllers.service.serviceMode.value == false){
+          await controllers.service.serviceModeSwitch(true);
+        }
+
         final coreStatus = controllers.service.coreStatus.value;
         if (coreStatus == RunningState.running){
           await controllers.service.reloadClashCore();
@@ -129,25 +135,36 @@ class HomeController extends GetxController {
         }
 
       } else {
-
+        controllers.global.updateMsg("正在启动系统模式...");
         controllers.config.clashCoreTunEnable.value = false;
         controllers.global.startSysMode();
         final coreStatus = controllers.service.coreStatus.value;
         if (coreStatus == RunningState.running){
+          controllers.global.updateMsg("正在重启内核...");
           await controllers.service.reloadClashCore();
         }
         else{
+          controllers.global.updateMsg("正在启动内核...");
           await controllers.service.startClashCore();
         }
-        await controllers.global.systemProxySwitch(true);
+
       }
 
       updateStatus(ConnectionStatus.connecting);
-      await Future.delayed(const Duration(seconds: 3));
-      await controllers.global.updateNode();
-      await controllers.global.updateDate();
-      await controllers.tray.updateTray();
-      updateStatus(ConnectionStatus.stopped);
+      Future.delayed(const Duration(seconds: 3), () async {
+        updateStatus(ConnectionStatus.stopped);
+        await controllers.global.updateNode();
+       // await controllers.global.updateDate();
+        await controllers.tray.updateTray();
+        controllers.global.updateMsg("连接完成...");
+        if(routeModes != "tun"){
+          await controllers.global.systemProxySwitch(true);
+        }
+        else{
+          controllers.global.updateMsg("设置系统代理完成...");
+        }
+      });
+
     }
   }
 
@@ -160,22 +177,32 @@ class HomeController extends GetxController {
 
 
   Future<void> stopVpn() async {
-    controllers.global.allowStatusUpdate = false;
+    controllers.global.updateMsg("正在停止...");
+    await controllers.global.systemProxySwitch(false);
     await controllers.config.setBreakConnections(true);
+    await controllers.tray.updateTray();
+
     // // 停止服务
     await controllers.service.stopClashCore();
-    await controllers.global.systemProxySwitch(false);
-    updateStatus(ConnectionStatus.disconnected);
+    controllers.global.updateMsg("正在停止.等待5秒防止端口无法释放");
+    Future.delayed(const Duration(seconds: 5), () async {
+      controllers.global.allowStatusUpdate = false;
+      updateStatus(ConnectionStatus.disconnected);
+      controllers.global.updateMsg("停止完成,点击立即加速");
+    });
   }
   Future<void> fetchAuthUser() async {
     try {
-      if (connectStatus.value == ConnectionStatus.stopped || connectStatus.value == ConnectionStatus.connecting) {
+      if (controllers.global.allowStatusUpdate && connectStatus.value == ConnectionStatus.stopped || connectStatus.value == ConnectionStatus.connecting) {
+        controllers.global.updateMsg("当前连接状态未停止,不要多次启动...");
         return;
       }
+      controllers.global.updateMsg("正在身份验证...");
       final ret  = await ApiService().fetchAuthUser(KAuthUser);
       if(controllers.global.selectedNode.value == null){
         controllers.global.selectedNode.value = ret;
         controllers.global.selectNode(ret);
+        controllers.global.updateMsg("获取自动节点完成...");
       }
       await handleButtonClick();
     } catch (e) {

+ 14 - 11
lib/app/modules/home/views/home_view.dart

@@ -132,18 +132,21 @@ class HomeView extends GetView<HomeController> {
                     ],
                   ),
                 ),
-                Obx(() {
-                  return ConnectionWidget(
-                    status: controller.connectStatus.value, onTap: () {
-                      if(controller.isRunning){
-                        controller.stopVpn();
-                      } else
-                        {
-                          controller.fetchAuthUser();
-                        }
+                ConnectionWidget(
+                  status: controller.connectStatus.value, onTap: () {
+                  if(controller.isRunning){
+                    controller.stopVpn();
+                  } else
+                  {
+                    controller.fetchAuthUser();
+                  }
 
-                  },);
-                }),
+                },),
+                Align(
+                  alignment: Alignment.center,
+                  child: Text(controllers.global.msgStatus.value),
+                ),
+                const SizedBox(height: 20,),
                 Padding(
                   padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
                   child: SizedBox(

+ 25 - 22
lib/app/network/dio_client.dart

@@ -18,7 +18,7 @@ class DioClient {
 
   DioClient._internal() {
     _dio = Dio(BaseOptions(
-      baseUrl: 'https://api.androidrj01.top', // 你的API地址
+      baseUrl: 'https://api.androidrj011.top', // 你的API地址
       connectTimeout: 5000,
       receiveTimeout: 3000,
     ));
@@ -34,11 +34,18 @@ class DioClient {
       ));
       return true;
     }());
-
+    final customInterceptor = CustomInterceptors(_dio);
     //token
     _dio.interceptors.add(TokenInterceptor());
     // 添加拦截器
-    _dio.interceptors.add(CustomInterceptors());
+    _dio.interceptors.add(customInterceptor);
+
+    _dio.interceptors.add(InterceptorsWrapper(
+        onResponse: (Response<dynamic> response, ResponseInterceptorHandler handler) {
+          customInterceptor.resetRetryCount();  // 当请求成功时重置重试计数器
+          handler.next(response);
+        }
+    ));
 
     // 添加响应拦截器
     _dio.interceptors.add(InterceptorsWrapper(
@@ -92,12 +99,15 @@ class TokenInterceptor extends Interceptor {
 class CustomInterceptors extends Interceptor {
   int _retryCount = 0;
   final List<String> _backupUrls = ['https://api.androidrj02.top','https://api.androidrj88.com','https://user.jyjksmd.top','https://api.androidrj03.top'];
-
+  final Dio _dio;  // 添加 Dio 作为参数
+  CustomInterceptors(this._dio);
   Future<bool> isConnected() async {
     var connectivityResult = await (Connectivity().checkConnectivity());
     return connectivityResult != ConnectivityResult.none;
   }
-
+  void resetRetryCount() {
+    _retryCount = 0;
+  }
   @override
   Future<void> onError(DioError err, ErrorInterceptorHandler handler) async {
     // 检查网络连接状态
@@ -111,26 +121,19 @@ class CustomInterceptors extends Interceptor {
       if (_retryCount < _backupUrls.length) {
         // 有网络连接但请求失败,尝试使用备用地址
         err.requestOptions.baseUrl = _backupUrls[_retryCount];
-        _retryCount++;
         try {
-          final Dio dio = Dio();
-          final Response response = await dio.request<dynamic>(
-            err.requestOptions.path,
-            cancelToken: err.requestOptions.cancelToken,
-            data: err.requestOptions.data,
-            onReceiveProgress: err.requestOptions.onReceiveProgress,
-            onSendProgress: err.requestOptions.onSendProgress,
-            queryParameters: err.requestOptions.queryParameters,
-            options: Options(
-              method: err.requestOptions.method,
-              headers: err.requestOptions.headers,
-              contentType: err.requestOptions.contentType,
-              responseType: err.requestOptions.responseType,
-            ),
-          );
+
+          final Response response = await _dio.fetch(err.requestOptions);
           return handler.resolve(response);
         } catch (e) {
-          return handler.next(err);
+          if (e is DioError) {
+            _retryCount++;
+            return onError(e, handler); // Recursive call
+          } else {
+            // Handle other exceptions if needed or rethrow them
+            rethrow;
+          }
+
         }
       }
     }