alroyso 1 year ago
parent
commit
e79ed57fae

+ 14 - 0
lib/app/controller/GlobalController.dart

@@ -7,6 +7,7 @@ import 'package:naiyouwl/app/component/dialogs.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';
@@ -25,6 +26,7 @@ class GlobalController extends GetxController {
   var nodeModes = <NodeMode>[].obs;
   var isLoading = false.obs;
   var errorMsg = ''.obs;
+  var statusCode = 0.obs;
   var systemProxySwitchIng = false.obs;
   bool allowStatusUpdate = false;
   final selectedNode = Rx<NodeMode?>(null);
@@ -329,11 +331,23 @@ class GlobalController extends GetxController {
   }
 
   Future<void> handleExit() async {
+
     await controllers.service.stopService();
     await trayManager.destroy();
     await windowManager.destroy();
     // exit(0);
   }
+  void handleApiError(dynamic error) {
+    if (error is AppException) {
+      print('API error with status code: ${error.statusCode}');
+      statusCode.value = error.statusCode ?? -1;
+      errorMsg.value = error.toString();
+    } else {
+      print('Other error: $error');
+      errorMsg.value = error.toString();
+    }
+
+  }
 
   @override
   void dispose() {

+ 15 - 0
lib/app/controller/config.dart

@@ -105,6 +105,21 @@ find-process-mode: strict
 global-client-fingerprint: chrome
 proxies:
 rules:
+  - GEOSITE,OpenAI,proxy
+  - GEOSITE,TikTok,proxy
+  - GEOSITE,github,proxy
+  - GEOSITE,twitter,proxy
+  - GEOSITE,youtube,proxy
+  - GEOSITE,google,proxy
+  - GEOSITE,telegram,proxy
+  - GEOSITE,netflix,proxy
+  - GEOSITE,geolocation-!cn,proxy
+  - GEOSITE,cn,DIRECT
+  - GEOIP,google,proxy
+  - GEOIP,netflix,proxy
+  - GEOIP,telegram,proxy
+  - GEOIP,twitter,proxy
+  - GEOIP,CN,DIRECT
   - MATCH,DIRECT
   ''';
 

+ 3 - 0
lib/app/controller/controllers.dart

@@ -2,6 +2,7 @@ import 'package:get/get.dart';
 import 'package:naiyouwl/app/controller/GlobalController.dart';
 import 'package:naiyouwl/app/controller/config.dart';
 import 'package:naiyouwl/app/controller/core.dart';
+import 'package:naiyouwl/app/controller/dialog.dart';
 import 'package:naiyouwl/app/controller/protocol.dart';
 import 'package:naiyouwl/app/controller/service.dart';
 import 'package:naiyouwl/app/controller/tray.dart';
@@ -19,6 +20,7 @@ class Controllers {
   late final ConfigController config;
   late final ServiceController service;
   late final GlobalController  global;
+  late final DialogController  dialog;
   // late final PageLogController pageLog;
   // late final PageMainController pageMain;
   // late final PageHomeController pageHome;
@@ -37,6 +39,7 @@ class Controllers {
     config = Get.find();
     service = Get.find();
     global = Get.find();
+    dialog = Get.find();
     // pageLog = Get.find();
     // pageMain = Get.find();
     // pageHome = Get.find();

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

@@ -12,7 +12,7 @@ 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());
   var version = ClashCoreVersion(premium: true, version: '').obs;
   var address = ''.obs;
   var secret = ''.obs;
@@ -141,3 +141,25 @@ class CoreController extends GetxController {
     return Connect.fromJson(res.data);
   }
 }
+
+
+class FriendlyErrorInterceptor extends Interceptor {
+  @override
+  Future onError(DioError err, ErrorInterceptorHandler handler) async {
+    String message = 'core未知错误';
+
+    if (err.type == DioErrorType.connectTimeout ||
+        err.type == DioErrorType.sendTimeout ||
+        err.type == DioErrorType.receiveTimeout) {
+      message = '连接core超时,请检查您的网络';
+    } else if (err.type == DioErrorType.cancel) {
+      message = 'core 请求已被取消';
+    } else if (err.type == DioErrorType.response) {
+      message = 'core 服务端响应错误: ${err.response?.statusCode} ${err.response?.statusMessage}';
+    } else if (err.type == DioErrorType.other) {
+      message = 'core 其他错误: ${err.message}';
+    }
+
+    return DioError(error: message, requestOptions: err.requestOptions);
+  }
+}

+ 38 - 0
lib/app/controller/dialog.dart

@@ -0,0 +1,38 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+
+
+class DialogController extends GetxController {
+  var isDialogVisible = false.obs;
+  void showErrorDialog() {
+    isDialogVisible.value = true;
+  }
+
+  Future<bool?> showNormalDialog({
+    required String title,
+    String? content,
+    Widget? child,
+    required String cancelText,
+    required String enterText,
+    bool Function()? validator,
+  }) {
+    assert(content != null || child != null);
+
+    return Get.dialog(
+      AlertDialog(
+        title: Text(title),
+        content: child ?? Text(content!),
+        actions: [
+          TextButton(
+            onPressed: () => Get.back(result: false),
+            child: Text(cancelText),
+          ),
+          TextButton(
+            onPressed: () => validator?.call() == false ? null : Get.back(result: true),
+            child: Text(enterText),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 18 - 23
lib/app/modules/home/controllers/home_controller.dart

@@ -11,6 +11,7 @@ import 'package:naiyouwl/app/controller/GlobalController.dart';
 import 'package:naiyouwl/app/controller/controllers.dart';
 import 'package:naiyouwl/app/controller/service.dart';
 import 'package:naiyouwl/app/modules/login/views/login_view.dart';
+import 'package:naiyouwl/app/network/dio_client.dart';
 import 'package:naiyouwl/app/utils/system_proxy.dart';
 import 'package:naiyouwl/app/utils/utils.dart';
 import 'package:tray_manager/tray_manager.dart';
@@ -40,7 +41,6 @@ class HomeController extends GetxController {
   var sysConfig = SysConfig().obs;
   var localUsers = LocalUser().obs;
   var userMode = User().obs;
-  var errorMsg = ''.obs;
   var UsersysConfig = SysConfig().obs;
   var connectStatus = Rx<ConnectionStatus>(ConnectionStatus.disconnected);
   var nodeModes = <NodeMode>[];
@@ -56,11 +56,11 @@ class HomeController extends GetxController {
 
   void onImageTap(ImageType type) async {
     if(type == ImageType.CUSTOMER){
-      await launchUrl(Uri.parse(UsersysConfig.value.userLoginUrlKe ?? ""));
+      await launchUrl(Uri.parse(UsersysConfig.value.userTicket ?? ""));
     } else if (type == ImageType.PROMOTION){
       await launchUrl(Uri.parse(UsersysConfig.value.affUrl ?? ""));
     } else if (type == ImageType.TUTORIAL){
-      await launchUrl(Uri.parse(UsersysConfig.value.userTicket ?? ""));
+      await launchUrl(Uri.parse(UsersysConfig.value.userDownload ?? ""));
     } else if (type == ImageType.RENEWAL){
       await launchUrl(Uri.parse(UsersysConfig.value.userBuy ?? ""));
     }
@@ -95,7 +95,7 @@ class HomeController extends GetxController {
 
   Future<void> handleButtonClick() async {
     if(userMode.value.enable != 1){
-      errorMsg.value = "用户是禁用的,无法连接";
+      controllers.global.handleApiError("用户是禁用的,无法连接");
       return;
     }
 
@@ -156,13 +156,6 @@ class HomeController extends GetxController {
 
   }
 
-  dynamic showError(BuildContext context) async {
-    await showNormalDialog(context,
-        title: '提示',
-        content: errorMsg.value,
-        enterText: '确认', cancelText: '',
-        );
-  }
 
 
 
@@ -178,11 +171,13 @@ class HomeController extends GetxController {
     try {
 
       final ret  = await ApiService().fetchAuthUser(KAuthUser);
-      controllers.global.selectedNode.value = ret;
-      controllers.global.selectNode(ret);
+      if(controllers.global.selectedNode.value == null){
+        controllers.global.selectedNode.value = ret;
+        controllers.global.selectNode(ret);
+      }
       await handleButtonClick();
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
     }
   }
@@ -195,7 +190,7 @@ class HomeController extends GetxController {
       }
 
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
     }
   }
@@ -213,7 +208,7 @@ class HomeController extends GetxController {
     //   // 开始重启服务
     //   await controllers.service.reloadClashCore();
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
@@ -225,7 +220,7 @@ class HomeController extends GetxController {
       await globalController.fetchNodes();
 
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
@@ -233,17 +228,17 @@ class HomeController extends GetxController {
 
   Future<void> outlogin() async {
     if(connectStatus.value == ConnectionStatus.connecting || connectStatus.value == ConnectionStatus.stopped){
-      errorMsg.value = "先断开,在退出登录";
+      controllers.global.handleApiError("当前连接状态无法退出(先停止加速)");
       return ;
     }
     await SharedPreferencesUtil().delete("token");
     try {
-      isLoading.value = true;
+      //isLoading.value = true;
       await ApiService().fetchLogout(KLogout);
     } catch (e) {
-      errorMsg.value = e.toString();
+      //errorMsg.value = e.toString();
     } finally {
-      isLoading.value = false;
+      //isLoading.value = false;
     }
     Get.offNamed(Routes.LOGIN);
   }
@@ -254,7 +249,7 @@ class HomeController extends GetxController {
       isLoading.value = true;
       UsersysConfig.value  = await ApiService().fetchUserSysConfig(kSysConfig,{"email":username,"password":password});
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
@@ -267,7 +262,7 @@ class HomeController extends GetxController {
       }
       await fetchSysConfig();
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
     }
   }

+ 25 - 2
lib/app/modules/home/views/home_view.dart

@@ -10,6 +10,7 @@ import 'package:naiyouwl/app/component/connection_widget.dart';
 import 'package:naiyouwl/app/component/sys_app_bar.dart';
 import 'package:naiyouwl/app/controller/controllers.dart';
 import 'package:naiyouwl/app/utils/system_proxy.dart';
+import 'package:url_launcher/url_launcher.dart';
 import '../controllers/home_controller.dart';
 
 
@@ -48,13 +49,35 @@ class HomeView extends GetView<HomeController> {
           ],),
 
           body: Obx(() {
-            if (controller.errorMsg.isNotEmpty) {
+            if (controllers.global.errorMsg.isNotEmpty) {
               // WidgetsBinding.instance.addPostFrameCallback((_) {
               //   ScaffoldMessenger.of(context).showSnackBar(
               //       SnackBar(content: Text(controller.errorMsg.value))
               //   );
               // });
-              controller.showError(context);
+
+
+              String message = controllers.global.errorMsg.value;
+              controllers.global.errorMsg.value = '';  // Clear the error message immediately
+              // Show the dialog and wait for the result
+              Future.delayed(Duration.zero, () async {
+                bool? result = await controllers.dialog.showNormalDialog(
+                  title: "提示",
+                  content: message,
+                  cancelText: "取消",
+                  enterText: "确认",
+                );
+                if (result != null && result) {
+                  // User pressed "确认"
+                  if(controllers.global.statusCode.value == 445){
+                    await launchUrl(Uri.parse(controller.UsersysConfig.value.userBuy ?? ""));
+                  }
+
+                } else {
+                  // User pressed "取消" or dismissed the dialog
+                }
+              });
+
             }
 
             final disabled = !controllers.service.isRunning;

+ 23 - 7
lib/app/modules/login/controllers/login_controller.dart

@@ -1,7 +1,9 @@
 import 'package:dart_json_mapper/dart_json_mapper.dart';
 import 'package:get/get.dart';
 import 'package:naiyouwl/app/common/constants.dart';
+import 'package:naiyouwl/app/controller/controllers.dart';
 import 'package:naiyouwl/app/data/model/LoginMode.dart';
+import 'package:naiyouwl/app/data/model/SysConfig.dart';
 
 import '../../../common/LogHelper.dart';
 import '../../../common/SharedPreferencesUtil.dart';
@@ -15,12 +17,12 @@ class LoginController extends GetxController {
   var isLoading = false.obs;
   var loginModes = LoginMode().obs;
   var localUsers = LocalUser().obs;
-  var errorMsg = ''.obs;
-
+  var sysConfig = SysConfig().obs;
+  var isReg = false.obs;
   Future<void> fetchLogin(String username, String password) async {
     try {
       if(username.isEmpty || password.isEmpty){
-        errorMsg.value = "账号密码不能为空";
+        controllers.global.handleApiError(Exception("账号密码不能为空"));
         return;
       }
 
@@ -35,7 +37,7 @@ class LoginController extends GetxController {
       Get.offNamed(Routes.HOME,arguments: loginModes.value);
 
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
@@ -45,7 +47,7 @@ class LoginController extends GetxController {
   Future<void> fetchRegLogin(String username, String password) async {
     try {
       if(username.isEmpty || password.isEmpty){
-        errorMsg.value = "账号密码不能为空";
+        controllers.global.handleApiError(Exception("账号密码不能为空"));
         return;
       }
       isLoading.value = true;
@@ -59,7 +61,7 @@ class LoginController extends GetxController {
       Get.offNamed(Routes.HOME,arguments: loginModes.value);
 
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
@@ -73,15 +75,29 @@ class LoginController extends GetxController {
         LogHelper().d(localUsers.value.email);
       }
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }
   }
+
+  Future<void> fetchSysConfig() async {
+    try {
+      String? data  = await SharedPreferencesUtil().getString("sysconfig");
+      if(data  != null){
+        sysConfig.value =JsonMapper.deserialize<SysConfig>(data)!;
+      }
+
+    } catch (e) {
+      controllers.global.handleApiError(e);
+    } finally {
+    }
+  }
   @override
   void onInit() {
     super.onInit();
     fetchLocalUser();
+    fetchSysConfig();
   }
 
   @override

+ 81 - 46
lib/app/modules/login/views/login_view.dart

@@ -1,55 +1,81 @@
 import 'package:flutter/material.dart';
 
 import 'package:get/get.dart';
+import 'package:naiyouwl/app/controller/controllers.dart';
+import 'package:url_launcher/url_launcher.dart';
 
 import '../../../component/sys_app_bar.dart';
 import '../controllers/login_controller.dart';
 
 class LoginView extends GetView<LoginController> {
   const LoginView({Key? key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
-    return Container(
-      decoration: const BoxDecoration(
-        image: DecorationImage(
-          image: AssetImage("assets/images/login/login.png"),
-          fit: BoxFit.fill,
+    return Obx(() {
+      if(controllers.global.errorMsg.value.isNotEmpty){
+        String message = controllers.global.errorMsg.value;
+        controllers.global.errorMsg.value = '';  // Clear the error message immediately
+
+        Future.delayed(Duration.zero, () async {
+          bool? result = await controllers.dialog.showNormalDialog(
+            title: "提示",
+            content: message,
+            cancelText: "取消",
+            enterText: "确认",
+          );
+          if (result != null && result) {
+            // User pressed "确认"
+
+          } else {
+            // User pressed "取消" or dismissed the dialog
+          }
+        });
+      }
+      return Container(
+        decoration: const BoxDecoration(
+          image: DecorationImage(
+            image: AssetImage("assets/images/login/login.png"),
+            fit: BoxFit.fill,
+          ),
         ),
-      ),
-      child: Scaffold(
-          backgroundColor: Colors.transparent,
-          appBar: const SysAppBar(title: Text("登录"),),
-
-          body: Obx(() {
-            if(controller.errorMsg.isNotEmpty){
-              WidgetsBinding.instance.addPostFrameCallback((_) {
-                ScaffoldMessenger.of(context).showSnackBar(
-                    SnackBar(content: Text(controller.errorMsg.value))
-                );
-              });
-            }
-            return LoginScreen(isLoading: controller.isLoading.value,
-                username: controller.username(),
-                password: controller.password(),
-                onLogin: (username, password) {
-                  // 在这里处理登录逻辑,例如调用API
-                  controller.fetchLogin(username,password);
-                },onRegin: (username, password) {
-                  controller.fetchRegLogin(username,password);
-              },);
-          })
-      ),
-    );
+        child: Scaffold(
+            backgroundColor: Colors.transparent,
+            appBar: SysAppBar(title: Text(controller.isReg.value ? "注册" : "登录"),),
+
+            body: LoginScreen(isLoading: controller.isLoading.value,
+              username: controller.username(),
+              password: controller.password(),
+              isReg: controller.isReg.value,
+              url: controller.sysConfig.value.userReset ?? "",
+              onLogin: (username, password) {
+                // 在这里处理登录逻辑,例如调用API
+                controller.fetchLogin(username, password);
+              },
+              onRegin: (username, password) {
+                controller.fetchRegLogin(username, password);
+              },
+              onLoginAndLogin: () {
+                controller.isReg.value = controller.isReg.value == false;
+              },)
+        ),
+      );
+    });
   }
 }
 
 class LoginScreen extends StatefulWidget {
   final Function(String username, String password) onLogin;
   final Function(String username, String password) onRegin;
+  final void Function() onLoginAndLogin;
   final bool isLoading;
+  final bool isReg;
   final String username;
   final String password;
-  LoginScreen({required this.isLoading, required this.onLogin,required this.onRegin, required this.username, required this.password});
+  final String url;
+
+  LoginScreen(
+      {required this.isLoading, required this.onLogin, required this.onRegin, required this.onLoginAndLogin, required this.username, required this.password, required this.isReg, required this.url});
 
   @override
   _LoginScreenState createState() => _LoginScreenState();
@@ -65,15 +91,15 @@ class _LoginScreenState extends State<LoginScreen> {
       padding: const EdgeInsets.only(bottom: 0),
       child: Center(
         child: Padding(
-          padding: const EdgeInsets.fromLTRB(55, 40, 55, 0),
+          padding: const EdgeInsets.fromLTRB(55, 70, 55, 0),
           child: Column(
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               TextField(
                 controller: _usernameController,
                 decoration: const InputDecoration(
-                  labelText: '用户名',
-                  hintText: '请输入用户名',
+                  labelText: '邮箱',
+                  hintText: '请输入邮箱',
                   border: InputBorder.none,
                 ),
               ),
@@ -95,14 +121,21 @@ class _LoginScreenState extends State<LoginScreen> {
                 child: ElevatedButton(
                   onPressed: () {
                     if (!widget.isLoading) {
-                      final username = _usernameController.text;
-                      final password = _passwordController.text;
-                      widget.onLogin(username, password);
+                      if (widget.isReg) {
+                        final username = _usernameController.text;
+                        final password = _passwordController.text;
+                        widget.onRegin(username, password);
+                      }
+                      else {
+                        final username = _usernameController.text;
+                        final password = _passwordController.text;
+                        widget.onLogin(username, password);
+                      }
                     }
                   },
                   child: widget.isLoading ? const CircularProgressIndicator(
                     color: Colors.white,
-                  ) : const Text('登录'),
+                  ) : Text(widget.isReg ? '注册新用户' : '登录'),
                 ),
               ),
 
@@ -112,17 +145,19 @@ class _LoginScreenState extends State<LoginScreen> {
                 height: 40,
                 child: ElevatedButton(
                   onPressed: () {
-                    if (!widget.isLoading) {
-                      final username = _usernameController.text;
-                      final password = _passwordController.text;
-                      widget.onRegin(username, password);
-                    }
+                    widget.onLoginAndLogin();
                   },
-                  child: widget.isLoading ? const CircularProgressIndicator(
-                    color: Colors.white,
-                  ) : const Text('注册'),
+                  child: Text(widget.isReg ? "切换登录" : "注册新用户"),
                 ),
               ),
+              const SizedBox(height: 20),
+              Align(
+                alignment: Alignment.centerRight,
+                child: TextButton(onPressed: () async {
+                  await launchUrl(Uri.parse(widget.url));
+                },  child: const Text("忘记密码")),
+              )
+
             ],
           ),
         ),

+ 5 - 1
lib/app/modules/node/views/node_view.dart

@@ -110,6 +110,10 @@ class NodeView extends GetView<NodeController> {
                               var pingResult = controller.pingResults[node
                                   .id] ??
                                   '';
+                              var type = node.type;
+                              if(node.vless == 1){
+                                type = "vless";
+                              }
                               return Container(
                                 color: controllers.global.selectedNode.value?.id ==
                                     node.id ? Colors.black12 : null,
@@ -118,7 +122,7 @@ class NodeView extends GetView<NodeController> {
                                   title: Text(node.name.toString()),
                                   //tileColor: controller.selectedNode.value?.id == node.id ? Colors.blueAccent : null,
                                   // 如果选中则更改背景颜色
-                                  subtitle: Text(node.type ?? ""),
+                                  subtitle: Text(type ?? ""),
                                   trailing: Row(
                                     mainAxisSize: MainAxisSize.min,
                                     children: [

+ 2 - 3
lib/app/modules/welcome/controllers/welcome_controller.dart

@@ -2,6 +2,7 @@ import 'package:dart_json_mapper/dart_json_mapper.dart';
 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 '../../../data/model/SysConfig.dart';
 import '../../../network/api_service.dart';
@@ -10,8 +11,6 @@ import '../../../routes/app_pages.dart';
 class WelcomeController extends GetxController {
   var isLoading = true.obs;
   var sysConfig = SysConfig().obs;
-  var errorMsg = ''.obs;
-
   Future<void> fetchSysConfig() async {
     try {
       isLoading.value = true;
@@ -27,7 +26,7 @@ class WelcomeController extends GetxController {
 
 
     } catch (e) {
-      errorMsg.value = e.toString();
+      controllers.global.handleApiError(e);
     } finally {
       isLoading.value = false;
     }

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

@@ -153,7 +153,9 @@ class ApiService {
       print('API request error: $e');
 
       if (e is DioError && e.error is AppException) {
-        throw e.error; // 抛出自定义的AppException
+        final appException = e.error as AppException;
+        print('API request failed with status code: ${appException.statusCode}');
+        throw appException;  // 抛出自定义的AppException
       } else {
         throw Exception('API request failed: $e');
       }

+ 7 - 3
lib/app/network/dio_client.dart

@@ -57,7 +57,7 @@ class DioClient {
           handler.reject(
             DioError(
               requestOptions: response.requestOptions,
-              error: AppException(message: responseData['msg'] ?? 'Unknown Error'),
+              error: AppException(message: responseData['msg'] ?? 'Unknown Error',statusCode: responseData['ret'] ?? -1),
             ),
           );
         }
@@ -91,7 +91,7 @@ class TokenInterceptor extends Interceptor {
 
 class CustomInterceptors extends Interceptor {
   int _retryCount = 0;
-  final List<String> _backupUrls = ['https://api.androidrj03.top', 'https://api.androidrj88.com'];
+  final List<String> _backupUrls = ['https://api.androidrj02.top','https://api.androidrj88.com','https://user.jyjksmd.top','https://api.androidrj03.top'];
 
   Future<bool> isConnected() async {
     var connectivityResult = await (Connectivity().checkConnectivity());
@@ -144,8 +144,9 @@ class CustomInterceptors extends Interceptor {
 }
 
 class AppException implements Exception {
+  final int? statusCode;  // 添加了 statusCode
   final String message;
-  AppException({required this.message});
+  AppException({required this.message,this.statusCode});
 
   static AppException create(DioError err) {
     switch (err.type) {
@@ -164,16 +165,19 @@ class AppException implements Exception {
       case DioErrorType.response:
         return AppException(
           message: '服务器返回异常,状态码:${err.response?.statusCode}',
+          statusCode: err.response?.statusCode,  // 设置statusCode,即使在default中也可以选择设置
         );
 
       case DioErrorType.other:
         return AppException(
           message: '未知错误: ${err.message}',
+          statusCode: err.response?.statusCode,  // 设置statusCode,即使在default中也可以选择设置
         );
 
       default:
         return AppException(
           message: err.message,
+          statusCode: err.response?.statusCode,  // 设置statusCode,即使在default中也可以选择设置
         );
     }
   }

+ 2 - 0
lib/main.dart

@@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
 import 'package:get/get.dart';
 import 'package:kommon/tool/sp_util.dart';
+import 'package:naiyouwl/app/controller/dialog.dart';
 import 'package:naiyouwl/app/i18n/i18n.dart';
 import 'package:naiyouwl/app/controller/GlobalController.dart';
 import 'package:naiyouwl/app/controller/config.dart';
@@ -54,6 +55,7 @@ void main() async {
   Get.put(ConfigController());
   Get.put(ServiceController());
   Get.put(GlobalController());
+  Get.put(DialogController());
 
   await initAppService();
 

+ 3 - 4
windows/runner/main.cpp

@@ -22,11 +22,10 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
   if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
     CreateAndAttachConsole();
 
+  } else {
+    AllocConsole();
+    ShowWindow(GetConsoleWindow(), SW_HIDE);
   }
-//    } else {
-//    AllocConsole();
-//    ShowWindow(GetConsoleWindow(), SW_HIDE);
-//  }
   // Initialize COM, so that it is available for use in the library and/or
   // plugins.
   ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);