alroyso 1 year ago
parent
commit
2be7ff3909

+ 4 - 1
lib/app/common/constants.dart

@@ -1,8 +1,11 @@
 
 
 const kSysConfig = "/api/client/v3/getconfig";
+const kUpdateVersion = "/api/client/v3/version";
 const kLogin = "/api/client/v3/login";
 const KReg = "/api/client/v2/register";
 const KLogout = "/api/client/v2/logout";
 const KAuthUser = "/api/client/v2/authUser";
-const kNode = '';
+const kNode = '';
+
+const kVersion = '1.1.0';

+ 32 - 26
lib/app/controller/GlobalController.dart

@@ -2,13 +2,11 @@ import 'dart:io';
 import 'package:flutter/widgets.dart';
 import 'package:get/get.dart';
 import 'package:naiyouwl/app/bean/proxie.dart';
-import 'package:naiyouwl/app/common/constants.dart';
-import 'package:naiyouwl/app/component/dialogs.dart';
+import 'package:naiyouwl/app/common/LogHelper.dart';
 import 'package:naiyouwl/app/controller/controllers.dart';
 import 'package:naiyouwl/app/data/model/NodeMode.dart';
 import 'package:naiyouwl/app/network/api_service.dart';
 import 'package:naiyouwl/app/network/dio_client.dart';
-import 'package:naiyouwl/app/utils/logger.dart';
 import 'package:naiyouwl/app/utils/system_proxy.dart';
 import 'package:naiyouwl/app/utils/utils.dart';
 import 'package:shared_preferences/shared_preferences.dart';
@@ -67,9 +65,9 @@ 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();
   }
 
@@ -156,7 +154,7 @@ class GlobalController extends GetxController {
         if (it.chains.contains(name)) controllers.core.fetchCloseConnections(it.id);
       }
     }catch (e) {
-      log.debug(e.toString());
+      LogHelper().d(e.toString());
     }
 
 
@@ -229,26 +227,34 @@ class GlobalController extends GetxController {
   }
 
   Future<void> updateDate() async {
-    log.debug('controller.proxie.updateDate()');
-    await controllers.core.updateConfig();
-    await _updateProxie();
-    await _updateProxieProvider();
-    allProxies.clear();
-    for (final provide in proxieProviders) {
-      for (final it in provide.proxies) {
+    LogHelper().d('controller.proxie.updateDate()');
+    try
+    {
+      await controllers.core.updateConfig();
+      await _updateProxie();
+      await _updateProxieProvider();
+      allProxies.clear();
+      for (final provide in proxieProviders) {
+        for (final it in provide.proxies) {
+          allProxies[it.name] = it;
+        }
+      }
+      for (final it in proxieProxies) {
         allProxies[it.name] = it;
+        LogHelper().d('controller.proxieProxies');
       }
+      for (final it in proxieGroups) {
+        allProxies[it.name] = it;
+        LogHelper().d('controller.proxieGroups');
+      }
+      proxieGroups.refresh();
+      proxieProxies.refresh();
+      proxieProviders.refresh();
+      allProxies.refresh();
+    } catch (e){
+      LogHelper().d("updateDate -- ${e.toString()}");
     }
-    for (final it in proxieProxies) {
-      allProxies[it.name] = it;
-    }
-    for (final it in proxieGroups) {
-      allProxies[it.name] = it;
-    }
-    proxieGroups.refresh();
-    proxieProxies.refresh();
-    proxieProviders.refresh();
-    allProxies.refresh();
+
   }
 
 
@@ -341,11 +347,11 @@ class GlobalController extends GetxController {
   }
   void handleApiError(dynamic error) {
     if (error is AppException) {
-      print('API error with status code: ${error.statusCode}');
+      LogHelper().d('API error with status code: ${error.statusCode}');
       statusCode.value = error.statusCode ?? -1;
       errorMsg.value = error.toString();
     } else {
-      print('Other error: $error');
+      LogHelper().d('Other error: $error');
       errorMsg.value = error.toString();
     }
 

+ 21 - 5
lib/app/controller/core.dart

@@ -4,16 +4,18 @@ import 'package:naiyouwl/app/bean/clash_core.dart';
 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/common/LogHelper.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';
 
 
 class CoreController extends GetxController {
   late final dio  = Dio(BaseOptions(
-       baseUrl: 'http://127.0.0.1:9090',
-  ))..interceptors.add(FriendlyErrorInterceptor());
+       baseUrl: 'http://127.0.0.1:9799',
+  ));
+  late final LogHelper _logger = LogHelper();
   var version = ClashCoreVersion(premium: true, version: '').obs;
   var address = ''.obs;
   var secret = ''.obs;
@@ -33,7 +35,16 @@ class CoreController extends GetxController {
   var ruleProvider = RuleProvider(providers: {}).obs;
   var rule = Rule(rules: []).obs;
 
-  CoreController();
+  CoreController(){
+    // dio.interceptors.add(LogInterceptor(
+    //   request: true,
+    //   requestBody: true,
+    //   responseBody: true,
+    //   error: true,
+    //   logPrint: _logger.d, // 使用 Logger 插件打印日志
+    // ));
+   //dio.interceptors.add(FriendlyErrorInterceptor());
+  }
 
   SystemProxyConfig get proxyConfig {
     final mixedPort = config.value.mixedPort == 0 ? null : config.value.mixedPort;
@@ -66,6 +77,7 @@ class CoreController extends GetxController {
   Future<void> updateConfig() async {
     final res = await dio.get('/configs');
     config.value = ClashCoreConfig.fromJson(res.data);
+    LogHelper().d("update-config ${config.value}");
   }
 
   Future<void> fetchConfigUpdate(Map<String, dynamic> config) async {
@@ -139,6 +151,10 @@ class CoreController extends GetxController {
 
   Future<Connect> fetchConnection() async {
     final res = await dio.get('/connections');
+    if(res.data !=null){
+      LogHelper().d("没有连接");
+      //return Connect();
+    }
     return Connect.fromJson(res.data);
   }
 }
@@ -160,7 +176,7 @@ class FriendlyErrorInterceptor extends Interceptor {
     } else if (err.type == DioErrorType.other) {
       message = 'core 其他错误: ${err.message}';
     }
-    log.debug(message);
+    LogHelper().d(message);
     return DioError(error: message, requestOptions: err.requestOptions);
   }
 }

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

@@ -220,6 +220,11 @@ class ServiceController extends GetxController {
     Future<void> startClashCore() async {
       try {
         //controllers.global.updateMsg("启动内核");
+        if( controllers.config.config.value.selected == 'init_proxy.yaml'){
+          controllers.global.updateMsg("启动内核初始化");
+        } else {
+          controllers.global.updateMsg("启动内核");
+        }
         coreStatus.value = RunningState.starting;
         await fetchStart(controllers.config.config.value.selected);
         log.debug("api${controllers.config.clashCoreApiAddress.value}");
@@ -230,10 +235,12 @@ class ServiceController extends GetxController {
           print("core --- info $info");
           if (info.status == 'running') {
             try {
-              await controllers.core.fetchHello();
+              final ret = await controllers.core.fetchHello();
+              log.debug("请求内核结果$ret---服务器状态${info.status}...");
+             // controllers.global.updateMsg("请求内核结果$ret---服务器状态${info.status}...");
               break;
-            } catch (e) {
-              controllers.global.updateMsg("请求内核错误${e.toString()}---服务器状态${info.status}...");
+            } catch (_) {
+              //controllers.global.updateMsg("请求内核错误${e.toString()}---服务器状态${info.status}...");
             }
           } else {
             controllers.global.updateMsg("启动内核错误---等待中...");
@@ -249,6 +256,8 @@ class ServiceController extends GetxController {
         }
         if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(controllers.core.proxyConfig);
         coreStatus.value = RunningState.running;
+        controllers.global.updateMsg("内核状态:${coreStatus.value == RunningState.running} ");
+        controllers.global.updateDate();
       } catch (e) {
         log.error("core -- $e");
         controllers.global.updateMsg("启动内核错误");

+ 13 - 0
lib/app/data/model/UpdateVersion.dart

@@ -0,0 +1,13 @@
+
+import 'package:dart_json_mapper/dart_json_mapper.dart';
+
+@jsonSerializable
+class UpdateVersion {
+  String? appname;
+  String? appmsg;
+  String? appdownload;
+  String? appversion;
+  int? versionupdate;
+
+  UpdateVersion({this.appname,this.appmsg,this.appdownload,this.appversion,this.versionupdate});
+}

+ 21 - 26
lib/app/modules/home/controllers/home_controller.dart

@@ -72,26 +72,19 @@ class HomeController extends GetxController {
   }
 
   void _handleStateChange([dynamic _]) async {
-    // final coreStatus = controllers.service.coreStatus.value;
-    // final isVisible = controllers.window.isVisible.value;
-    // final serviceStatus =  controllers.service.serviceStatus.value;
-    // if(serviceStatus != RunningState.running){
-    //   updateStatus(ConnectionStatus.disconnected);
-    //   return;
-    // }
-    // if (coreStatus == RunningState.running && isVisible &&  controllers.global.allowStatusUpdate) {
-    //   updateStatus(ConnectionStatus.connecting);
-    //   await Future.delayed(const Duration(seconds: 3));
-    //   updateStatus(ConnectionStatus.stopped);
-    // } else {
-    //   LogHelper().d("stop coreStatus serivce");
-    //   // var routeModes = controllers.global.routeModesSelect.value;
-    //   // if(routeModes != "tun"){
-    //   //   controllers.config.clashCoreTunEnable.value = false;
-    //   // }
-    //   // await controllers.global.systemProxySwitch(false);
-    //   updateStatus(ConnectionStatus.disconnected);
-    // }
+    final coreStatus = controllers.service.coreStatus.value;
+    final isVisible = controllers.window.isVisible.value;
+    final serviceStatus =  controllers.service.serviceStatus.value;
+    if(serviceStatus != RunningState.running){
+      updateStatus(ConnectionStatus.disconnected);
+      return;
+    }
+    if (coreStatus == RunningState.running && isVisible &&  controllers.global.allowStatusUpdate) {
+      // if(connectStatus.value == ConnectionStatus.connecting){
+      //   controllers.global.updateMsg("连接完成...");
+      // }
+
+    }
   }
 
   Future<void> handleButtonClick() async {
@@ -153,14 +146,16 @@ class HomeController extends GetxController {
       updateStatus(ConnectionStatus.connecting);
       Future.delayed(const Duration(seconds: 3), () async {
         updateStatus(ConnectionStatus.stopped);
+        await controllers.global.updateDate();
         await controllers.global.updateNode();
-       // await controllers.global.updateDate();
+        //
         await controllers.tray.updateTray();
-        controllers.global.updateMsg("连接完成...");
-        if(routeModes != "tun"){
-          await controllers.global.systemProxySwitch(true);
+
+        if(routeModes == "tun"){
+
         }
         else{
+          await controllers.global.systemProxySwitch(true);
           controllers.global.updateMsg("设置系统代理完成...");
         }
       });
@@ -184,8 +179,8 @@ class HomeController extends GetxController {
 
     // // 停止服务
     await controllers.service.stopClashCore();
-    controllers.global.updateMsg("正在停止.等待5秒防止端口无法释放");
-    Future.delayed(const Duration(seconds: 5), () async {
+    controllers.global.updateMsg("正在停止.等待3秒防止端口无法释放");
+    Future.delayed(const Duration(seconds: 3), () async {
       controllers.global.allowStatusUpdate = false;
       updateStatus(ConnectionStatus.disconnected);
       controllers.global.updateMsg("停止完成,点击立即加速");

+ 39 - 1
lib/app/modules/welcome/controllers/welcome_controller.dart

@@ -3,6 +3,7 @@ import 'package:get/get.dart';
 import 'package:naiyouwl/app/common/SharedPreferencesUtil.dart';
 import 'package:naiyouwl/app/common/constants.dart';
 import 'package:naiyouwl/app/controller/controllers.dart';
+import 'package:naiyouwl/app/data/model/UpdateVersion.dart';
 
 import '../../../data/model/SysConfig.dart';
 import '../../../network/api_service.dart';
@@ -11,9 +12,13 @@ import '../../../routes/app_pages.dart';
 class WelcomeController extends GetxController {
   var isLoading = true.obs;
   var sysConfig = SysConfig().obs;
+  var verModes = UpdateVersion().obs;
   var error = "".obs;
+  var msgStatus = "".obs;
+  var isUPdateVerion = false.obs;
   Future<void> fetchSysConfig() async {
     try {
+      msgStatus.value = "获取系统配置";
       isLoading.value = true;
       sysConfig.value = await ApiService().fetchSysConfig(kSysConfig);
       await SharedPreferencesUtil().setString("sysconfig", JsonMapper.serialize(sysConfig.value));
@@ -27,20 +32,53 @@ class WelcomeController extends GetxController {
 
 
     } catch (e) {
+      msgStatus.value = "获取系统配置错误";
       controllers.global.handleApiError(e);
       error.value = controllers.global.errorMsg.value;
       controllers.global.errorMsg.value = ''; // Clear the error message immediately
 
     } finally {
       isLoading.value = false;
+      msgStatus.value = "获取系统配置完成";
     }
   }
+  Future<void> fetchUpdateVersion() async {
+    try {
+      msgStatus.value = "正在检测版本...";
+      isLoading.value = true;
+      var tag = "win";
+      if(GetPlatform.isMacOS){
+        tag = "mac";
+      }
+      verModes.value = await ApiService().fetchUpdateVersion(kUpdateVersion,{"tag":tag,"appverion":kVersion});
+      if(verModes.value.versionupdate != null){
+        if(verModes.value.versionupdate == 1){
+          msgStatus.value = "有更新...";
+          isUPdateVerion.value = true;
+        } else {
+          await fetchSysConfig();
+        }
+      }
+
+
+    } catch (e) {
+      msgStatus.value = "获取版本数据失败";
+      controllers.global.handleApiError(e);
+      error.value = controllers.global.errorMsg.value;
+      controllers.global.errorMsg.value = ''; // Clear the error message immediately
+
+    } finally {
+      isLoading.value = false;
+      msgStatus.value = "检测版本号完成";
+    }
+  }
+  //app_update
 
 
   @override
   void onInit() {
     super.onInit();
-    fetchSysConfig();
+    fetchUpdateVersion();
   }
 
   @override

+ 28 - 6
lib/app/modules/welcome/views/welcome_view.dart

@@ -3,6 +3,7 @@ import 'dart:ffi';
 import 'package:flutter/material.dart';
 
 import 'package:get/get.dart';
+import 'package:url_launcher/url_launcher.dart';
 
 import '../../../controller/controllers.dart';
 import '../controllers/welcome_controller.dart';
@@ -29,19 +30,40 @@ class WelcomeView extends GetView<WelcomeController> {
               // User pressed "确认"
               await controller.fetchSysConfig();
             } else {
-              // User pressed "取消" or dismissed the dialog
+
+            }
+          });
+        }
+        if(controller.isUPdateVerion.value){
+          controller.isUPdateVerion.value = false;
+          Future.delayed(Duration.zero, () async {
+            bool? result = await controllers.dialog.showNormalDialog(
+              title: "提示",
+              content: controller.verModes.value.appmsg ?? "有更新",
+              cancelText: "取消",
+              enterText: "确认",
+            );
+            if (result != null && result) {
+              // User pressed "确认"
+              if(controller.verModes.value.appdownload != null){
+                await launchUrl(Uri.parse(controller.verModes.value.appdownload ?? ""));
+                await controller.fetchSysConfig();
+              }
+
+            } else {
+              await controller.fetchSysConfig();
             }
           });
         }
-        return const Center(
+        return Center(
           child: Column(
             mainAxisAlignment: MainAxisAlignment.center,
             children: <Widget>[
-              CircularProgressIndicator(), // 菊花加载指示器
-              SizedBox(height: 20), // 用于给加载指示器和文字之间增加一些空间
+             controller.isLoading.value == true ? const CircularProgressIndicator() : Container(), // 菊花加载指示器
+              const SizedBox(height: 20), // 用于给加载指示器和文字之间增加一些空间
               Text(
-                '正在获取系统配置',
-                style: TextStyle(
+                controller.msgStatus.value,
+                style: const TextStyle(
                   fontSize: 16,
                   fontWeight: FontWeight.w600,
                 ),

+ 10 - 1
lib/app/network/api_service.dart

@@ -2,6 +2,7 @@ import 'package:dart_json_mapper/dart_json_mapper.dart';
 import 'package:dio/dio.dart';
 import 'package:naiyouwl/app/data/model/LoginMode.dart';
 import 'package:naiyouwl/app/data/model/NodeMode.dart';
+import 'package:naiyouwl/app/data/model/UpdateVersion.dart';
 
 import '../data/model/SysConfig.dart';
 import '../data/model/UserMode.dart';
@@ -47,7 +48,15 @@ class ApiService {
       throw Exception("Failed API response is NUll");
     }
   }
-
+  Future<UpdateVersion> fetchUpdateVersion(String path, Map<String, dynamic> data) async {
+    final  ret = await _requestWrapper(() => _dioClient.get(path,queryParameters: data));
+    final result = JsonMapper.deserialize<UpdateVersion>(ret);
+    if (result != null) {
+      return result;
+    } else {
+      throw Exception("Failed API response is NUll");
+    }
+  }
   Future<SysConfig> fetchUserSysConfig(String path, Map<String, dynamic> data) async {
     final  ret = await _requestWrapper(() => _dioClient.get(path,queryParameters: data));
     final result = JsonMapper.deserialize<SysConfig>(ret);

+ 1 - 1
lib/app/network/dio_client.dart

@@ -18,7 +18,7 @@ class DioClient {
 
   DioClient._internal() {
     _dio = Dio(BaseOptions(
-      baseUrl: 'https://api.androidrj011.top', // 你的API地址
+      baseUrl: 'https://api.androidrj01.top', // 你的API地址
       connectTimeout: 5000,
       receiveTimeout: 3000,
     ));

BIN
windows/runner/resources/app_icon.ico