Browse Source

1.0 完成网络请求封装

alroyso 1 year ago
parent
commit
439a29cf2e

+ 25 - 0
lib/app/common/LogHelper.dart

@@ -0,0 +1,25 @@
+import 'package:logger/logger.dart';
+
+class LogHelper {
+  // 单例对象
+  static final LogHelper _singleton = LogHelper._internal();
+
+  // Logger实例
+  late Logger _logger;
+
+  // 私有构造函数
+  LogHelper._internal() {
+    _logger = Logger();
+  }
+
+  // 工厂构造函数返回单例对象
+  factory LogHelper() => _singleton;
+
+  // 输出不同级别的日志
+  void e(dynamic message, [dynamic error, StackTrace? stackTrace]) =>
+      _logger.e(message, error: error, stackTrace: stackTrace);
+  void w(dynamic message, [dynamic error, StackTrace? stackTrace]) =>
+      _logger.w(message, error: error, stackTrace: stackTrace);
+  void i(dynamic message) => _logger.i(message);
+  void d(dynamic message) => _logger.d(message);
+}

+ 0 - 48
lib/app/common/SecureStorageUtil.dart

@@ -1,48 +0,0 @@
-import 'dart:convert';
-import 'package:flutter_secure_storage/flutter_secure_storage.dart';
-
-class SecureStorageUtil {
-  // 单例对象
-  static final SecureStorageUtil _singleton = SecureStorageUtil._internal();
-
-  // 私有构造函数
-  SecureStorageUtil._internal();
-
-  // 工厂构造函数返回单例对象
-  factory SecureStorageUtil() => _singleton;
-
-  // Secure Storage 实例
-  final _storage = const FlutterSecureStorage();
-
-  // 存储字符串
-  Future<void> setString(String key, String value) async {
-    await _storage.write(key: key, value: value);
-  }
-
-  // 读取字符串
-  Future<String?> getString(String key) async {
-    return await _storage.read(key: key);
-  }
-
-  // 存储JSON数组
-  Future<void> setJsonList(String key, List<Map<String, dynamic>> jsonList) async {
-    final jsonString = jsonEncode(jsonList);
-    await _storage.write(key: key, value: jsonString);
-  }
-
-  // 读取JSON数组
-  Future<List<Map<String, dynamic>>?> getJsonList(String key) async {
-    final jsonString = await _storage.read(key: key);
-    return jsonString != null ? List<Map<String, dynamic>>.from(jsonDecode(jsonString)) : null;
-  }
-
-  // 删除指定键的数据
-  Future<void> delete(String key) async {
-    await _storage.delete(key: key);
-  }
-
-  // 删除所有数据
-  Future<void> deleteAll() async {
-    await _storage.deleteAll();
-  }
-}

+ 68 - 0
lib/app/common/SharedPreferencesUtil.dart

@@ -0,0 +1,68 @@
+import 'dart:convert';
+import 'package:shared_preferences/shared_preferences.dart';
+
+class SharedPreferencesUtil {
+  // 单例对象
+  static final SharedPreferencesUtil _singleton = SharedPreferencesUtil._internal();
+
+  // 私有构造函数
+  SharedPreferencesUtil._internal();
+
+  // 工厂构造函数返回单例对象
+  factory SharedPreferencesUtil() => _singleton;
+
+  // 获取 SharedPreferences 实例
+  Future<SharedPreferences> get _instance async => await SharedPreferences.getInstance();
+
+  // 存储字符串
+  Future<void> setString(String key, String value) async {
+    final prefs = await _instance;
+    prefs.setString(key, value);
+  }
+
+  // 读取字符串
+  Future<String?> getString(String key) async {
+    final prefs = await _instance;
+    return prefs.getString(key);
+  }
+
+  // 存储JSON数组
+  Future<void> setJsonList(String key, List<Map<String, dynamic>> jsonList) async {
+    final prefs = await _instance;
+    final jsonString = jsonEncode(jsonList);
+    prefs.setString(key, jsonString);
+  }
+
+  // 读取JSON数组
+  Future<List<Map<String, dynamic>>?> getJsonList(String key) async {
+    final prefs = await _instance;
+    final jsonString = prefs.getString(key);
+    return jsonString != null ? List<Map<String, dynamic>>.from(jsonDecode(jsonString)) : null;
+  }
+
+  // 存储可以转化为 JSON 的对象
+  Future<void> setObject(String key, Map<String, dynamic> jsonValue) async {
+    final prefs = await _instance;
+    final jsonString = jsonEncode(jsonValue);
+    prefs.setString(key, jsonString);
+  }
+
+  // 读取 JSON 对象,并返回 Map<String, dynamic>
+  Future<Map<String, dynamic>?> getObject(String key) async {
+    final prefs = await _instance;
+    final jsonString = prefs.getString(key);
+    return jsonString != null ? jsonDecode(jsonString) as Map<String, dynamic> : null;
+  }
+
+  // 删除指定键的数据
+  Future<void> delete(String key) async {
+    final prefs = await _instance;
+    prefs.remove(key);
+  }
+
+  // 删除所有数据
+  Future<void> deleteAll() async {
+    final prefs = await _instance;
+    prefs.clear();
+  }
+}

+ 8 - 3
lib/app/modules/home/controllers/home_controller.dart

@@ -1,21 +1,26 @@
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 
+import '../../../common/LogHelper.dart';
+import '../../../common/SharedPreferencesUtil.dart';
 import '../../../data/model/SysConfig.dart';
 import '../../../network/api_service.dart';
 
 class HomeController extends GetxController {
   //TODO: Implement HomeController
 
-  var isLoading = true.obs;
+  var isLoading = false.obs;
   var sysConfig = SysConfig().obs;
   var errorMsg = ''.obs;
 
   Future<void> fetchSysConfig() async {
     try {
       isLoading.value = true;
-      sysConfig.value = await ApiService().fetchSysConfig("/api/client/v3/getconfig");
-      print(sysConfig.value.affurl);
+      Map<String, dynamic>? data  = await SharedPreferencesUtil().getObject("sysconfig");
+      if(data  != null){
+        sysConfig.value = SysConfig.fromJson(data);
+        LogHelper().d(sysConfig.value.toJson());
+      }
     } catch (e) {
       errorMsg.value = e.toString();
     } finally {

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

@@ -11,6 +11,7 @@ import '../controllers/home_controller.dart';
 
 class HomeView extends GetView<HomeController> {
   const HomeView({Key? key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return Container(
@@ -20,24 +21,29 @@ class HomeView extends GetView<HomeController> {
           fit: BoxFit.fill,
         ),
       ),
-      child:  Scaffold(
-        backgroundColor: Colors.transparent,
-        appBar: const SysAppBar(title: Text("登录"),),
+      child: Scaffold(
+          backgroundColor: Colors.transparent,
+          appBar: const SysAppBar(title: Text("登录"),),
 
-        body: LoginScreen(onLogin: (username,password) {
-          controller.fetchSysConfig();
-          // 在这里处理登录逻辑,例如调用API
-          print('Username: $username');
-          print('Password: $password');
-        })
+          body: Obx(() {
+            return LoginScreen(isLoading: controller.isLoading.value,
+                onLogin: (username, password) {
+                  controller.fetchSysConfig();
+                  // 在这里处理登录逻辑,例如调用API
+                  print('Username: $username');
+                  print('Password: $password');
+                });
+          })
       ),
     );
   }
 }
+
 class LoginScreen extends StatefulWidget {
   final Function(String username, String password) onLogin;
+  final bool isLoading;
 
-  LoginScreen({required this.onLogin});
+  LoginScreen({required this.isLoading, required this.onLogin});
 
   @override
   _LoginScreenState createState() => _LoginScreenState();
@@ -82,11 +88,15 @@ class _LoginScreenState extends State<LoginScreen> {
                 height: 40,
                 child: ElevatedButton(
                   onPressed: () {
-                    final username = _usernameController.text;
-                    final password = _passwordController.text;
-                    widget.onLogin(username, password);
+                    if (!widget.isLoading) {
+                      final username = _usernameController.text;
+                      final password = _passwordController.text;
+                      widget.onLogin(username, password);
+                    }
                   },
-                  child: const Text('登录'),
+                  child: widget.isLoading ? const CircularProgressIndicator(
+                    color: Colors.white,
+                  ) : const Text('登录'),
                 ),
               ),
             ],

+ 12 - 0
lib/app/modules/welcome/bindings/welcome_binding.dart

@@ -0,0 +1,12 @@
+import 'package:get/get.dart';
+
+import '../controllers/welcome_controller.dart';
+
+class WelcomeBinding extends Bindings {
+  @override
+  void dependencies() {
+    Get.lazyPut<WelcomeController>(
+      () => WelcomeController(),
+    );
+  }
+}

+ 44 - 0
lib/app/modules/welcome/controllers/welcome_controller.dart

@@ -0,0 +1,44 @@
+import 'package:get/get.dart';
+import 'package:naiyouwl/app/common/SharedPreferencesUtil.dart';
+
+import '../../../data/model/SysConfig.dart';
+import '../../../network/api_service.dart';
+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;
+      sysConfig.value = await ApiService().fetchSysConfig("/api/client/v3/getconfig");
+      await SharedPreferencesUtil().setObject("sysconfig", sysConfig.value.toJson());
+
+      Get.offNamed(Routes.HOME);
+
+    } catch (e) {
+      errorMsg.value = e.toString();
+    } finally {
+      isLoading.value = false;
+    }
+  }
+  @override
+  void onInit() {
+    super.onInit();
+    fetchSysConfig();
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+  }
+
+
+}

+ 41 - 0
lib/app/modules/welcome/views/welcome_view.dart

@@ -0,0 +1,41 @@
+import 'package:flutter/material.dart';
+
+import 'package:get/get.dart';
+
+import '../controllers/welcome_controller.dart';
+
+class WelcomeView extends GetView<WelcomeController> {
+  const WelcomeView({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: Colors.white,
+      body: Obx(() {
+        return Center(
+          child: controller.isLoading.value
+              ? const Column(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: <Widget>[
+              CircularProgressIndicator(), // 菊花加载指示器
+              SizedBox(height: 20), // 用于给加载指示器和文字之间增加一些空间
+              Text(
+                '正在获取系统配置',
+                style: TextStyle(
+                  fontSize: 16,
+                  fontWeight: FontWeight.w600,
+                ),
+              ),
+            ],
+          )
+              : Container(), // 当不在加载时,你可能想要显示其他的 Widget
+        );
+
+      }),
+    );
+  }
+}
+
+
+
+

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

@@ -6,7 +6,7 @@ import 'package:dio/dio.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:logger/logger.dart';
 
-import '../common/SecureStorageUtil.dart';
+import '../common/SharedPreferencesUtil.dart';
 //import 'custom_interceptors.dart';
 
 class DioClient {
@@ -74,7 +74,7 @@ class TokenInterceptor extends Interceptor {
   // 这里假设您有一个方法来从安全存储中获取Token
   Future<String?> getToken() async {
     // 从您存储Token的地方获取Token,例如从SharedPreferences或SecureStorage
-    String? token = await SecureStorageUtil().getString("token");
+    String? token = await SharedPreferencesUtil().getString("token");
     return token;
     //return "Your_Token";
   }

+ 8 - 1
lib/app/routes/app_pages.dart

@@ -2,13 +2,15 @@ import 'package:get/get.dart';
 
 import '../modules/home/bindings/home_binding.dart';
 import '../modules/home/views/home_view.dart';
+import '../modules/welcome/bindings/welcome_binding.dart';
+import '../modules/welcome/views/welcome_view.dart';
 
 part 'app_routes.dart';
 
 class AppPages {
   AppPages._();
 
-  static const INITIAL = Routes.HOME;
+  static const INITIAL = Routes.WELCOME;
 
   static final routes = [
     GetPage(
@@ -16,5 +18,10 @@ class AppPages {
       page: () => const HomeView(),
       binding: HomeBinding(),
     ),
+    GetPage(
+      name: _Paths.WELCOME,
+      page: () => const WelcomeView(),
+      binding: WelcomeBinding(),
+    ),
   ];
 }

+ 2 - 0
lib/app/routes/app_routes.dart

@@ -4,9 +4,11 @@ part of 'app_pages.dart';
 abstract class Routes {
   Routes._();
   static const HOME = _Paths.HOME;
+  static const WELCOME = _Paths.WELCOME;
 }
 
 abstract class _Paths {
   _Paths._();
   static const HOME = '/home';
+  static const WELCOME = '/welcome';
 }

+ 2 - 0
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -8,11 +8,13 @@ import Foundation
 import connectivity_plus_macos
 import flutter_secure_storage_macos
 import screen_retriever
+import shared_preferences_foundation
 import window_manager
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
   ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
   FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin"))
   ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
+  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
   WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
 }

+ 7 - 0
macos/Podfile.lock

@@ -8,6 +8,9 @@ PODS:
   - ReachabilitySwift (5.0.0)
   - screen_retriever (0.0.1):
     - FlutterMacOS
+  - shared_preferences_foundation (0.0.1):
+    - Flutter
+    - FlutterMacOS
   - window_manager (0.2.0):
     - FlutterMacOS
 
@@ -16,6 +19,7 @@ DEPENDENCIES:
   - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
   - FlutterMacOS (from `Flutter/ephemeral`)
   - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
+  - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
   - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
 
 SPEC REPOS:
@@ -31,6 +35,8 @@ EXTERNAL SOURCES:
     :path: Flutter/ephemeral
   screen_retriever:
     :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos
+  shared_preferences_foundation:
+    :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
   window_manager:
     :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
 
@@ -40,6 +46,7 @@ SPEC CHECKSUMS:
   FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
   ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
   screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
+  shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
   window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
 
 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367

+ 3 - 1
macos/Runner.xcodeproj/project.pbxproj

@@ -195,7 +195,6 @@
 				FD354C14BA617EF920BFC23E /* Pods-RunnerTests.release.xcconfig */,
 				F22037C6F2DC502814A8D8C9 /* Pods-RunnerTests.profile.xcconfig */,
 			);
-			name = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 		};
@@ -568,6 +567,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;
@@ -694,6 +694,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;
@@ -714,6 +715,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;

+ 2 - 2
macos/Runner/DebugProfile.entitlements

@@ -6,9 +6,9 @@
 	<true/>
 	<key>com.apple.security.cs.allow-jit</key>
 	<true/>
+	<key>com.apple.security.network.client</key>
+	<true/>
 	<key>com.apple.security.network.server</key>
 	<true/>
-	<key>com.apple.security.network.client</key>
-    <true/>
 </dict>
 </plist>

+ 1 - 1
macos/Runner/Release.entitlements

@@ -5,6 +5,6 @@
 	<key>com.apple.security.app-sandbox</key>
 	<true/>
 	<key>com.apple.security.network.client</key>
-    <true/>
+	<true/>
 </dict>
 </plist>

+ 2 - 1
pubspec.yaml

@@ -5,7 +5,8 @@ description: naiyou
 environment: 
   sdk: '>=3.1.1 <4.0.0'
 
-dependencies: 
+dependencies:
+  shared_preferences: ^2.0.10
   cupertino_icons: ^1.0.2
   window_manager: ^0.3.6
   http: ^1.1.0