Bläddra i källkod

响应数据通用模型添加和使用。

PC\19500 3 veckor sedan
förälder
incheckning
c43d40d717

+ 52 - 21
lib/core/network/dio_client.dart

@@ -4,6 +4,7 @@ import 'package:sino_med_cloud/core/network/interceptors/auth_interceptor.dart';
 import 'package:sino_med_cloud/core/network/interceptors/error_interceptor.dart';
 import 'package:sino_med_cloud/core/network/interceptors/log_interceptor.dart';
 import 'package:sino_med_cloud/core/utils/logger.dart';
+import 'package:sino_med_cloud/base/common_response.dart';
 
 /// Dio 客户端 - 统一网络请求管理
 class DioClient {
@@ -53,26 +54,32 @@ class DioClient {
   /// GET 请求
   /// 
   /// [path] 请求路径(相对于 baseUrl)
+  /// [fromJsonT] JSON 转换为 T 类型的函数
   /// [queryParameters] 查询参数
   /// [options] 请求选项
   /// 
-  /// 返回 [Response] 对象
-  static Future<Response<T>> get<T>(
+  /// 返回 [BaseCommonResponse] 对象
+  static Future<BaseCommonResponse<T>> get<T>(
     String path, {
+    required T Function(Object? json) fromJsonT,
     Map<String, dynamic>? queryParameters,
     Options? options,
     CancelToken? cancelToken,
     ProgressCallback? onReceiveProgress,
   }) async {
     try {
-      final response = await dio.get<T>(
+      final response = await dio.get(
         path,
         queryParameters: queryParameters,
         options: options,
         cancelToken: cancelToken,
         onReceiveProgress: onReceiveProgress,
       );
-      return response;
+      
+      return BaseCommonResponse<T>.fromJson(
+        response.data as Map<String, dynamic>,
+        fromJsonT,
+      );
     } on DioException catch (e) {
       // 错误已由 ErrorInterceptor 处理,直接抛出
       rethrow;
@@ -84,13 +91,15 @@ class DioClient {
   /// POST 请求
   /// 
   /// [path] 请求路径(相对于 baseUrl)
+  /// [fromJsonT] JSON 转换为 T 类型的函数
   /// [data] 请求体数据
   /// [queryParameters] 查询参数
   /// [options] 请求选项
   /// 
-  /// 返回 [Response] 对象
-  static Future<Response<T>> post<T>(
+  /// 返回 [BaseCommonResponse] 对象
+  static Future<BaseCommonResponse<T>> post<T>(
     String path, {
+    required T Function(Object? json) fromJsonT,
     dynamic data,
     Map<String, dynamic>? queryParameters,
     Options? options,
@@ -99,7 +108,7 @@ class DioClient {
     ProgressCallback? onReceiveProgress,
   }) async {
     try {
-      final response = await dio.post<T>(
+      final response = await dio.post(
         path,
         data: data,
         queryParameters: queryParameters,
@@ -108,7 +117,11 @@ class DioClient {
         onSendProgress: onSendProgress,
         onReceiveProgress: onReceiveProgress,
       );
-      return response;
+      
+      return BaseCommonResponse<T>.fromJson(
+        response.data as Map<String, dynamic>,
+        fromJsonT,
+      );
     } on DioException catch (e) {
       // 错误已由 ErrorInterceptor 处理,直接抛出
       rethrow;
@@ -120,45 +133,53 @@ class DioClient {
   /// DELETE 请求
   /// 
   /// [path] 请求路径(相对于 baseUrl)
+  /// [fromJsonT] JSON 转换为 T 类型的函数
   /// [data] 请求体数据(可选)
   /// [queryParameters] 查询参数
   /// [options] 请求选项
   /// 
-  /// 返回 [Response] 对象
-  static Future<Response<T>> delete<T>(
+  /// 返回 [BaseCommonResponse] 对象
+  static Future<BaseCommonResponse<T>> delete<T>(
     String path, {
+    required T Function(Object? json) fromJsonT,
     dynamic data,
     Map<String, dynamic>? queryParameters,
     Options? options,
     CancelToken? cancelToken,
   }) async {
     try {
-      final response = await dio.delete<T>(
+      final response = await dio.delete(
         path,
         data: data,
         queryParameters: queryParameters,
         options: options,
         cancelToken: cancelToken,
       );
-      return response;
+      
+      return BaseCommonResponse<T>.fromJson(
+        response.data as Map<String, dynamic>,
+        fromJsonT,
+      );
     } on DioException catch (e) {
       // 错误已由 ErrorInterceptor 处理,直接抛出
       rethrow;
     }
   }
 
-  // ==================== PUT 请求====================
+  // ==================== PUT 请求 ====================
 
   /// PUT 请求
   /// 
   /// [path] 请求路径(相对于 baseUrl)
+  /// [fromJsonT] JSON 转换为 T 类型的函数
   /// [data] 请求体数据
   /// [queryParameters] 查询参数
   /// [options] 请求选项
   /// 
-  /// 返回 [Response] 对象
-  static Future<Response<T>> put<T>(
+  /// 返回 [BaseCommonResponse] 对象
+  static Future<BaseCommonResponse<T>> put<T>(
     String path, {
+    required T Function(Object? json) fromJsonT,
     dynamic data,
     Map<String, dynamic>? queryParameters,
     Options? options,
@@ -167,7 +188,7 @@ class DioClient {
     ProgressCallback? onReceiveProgress,
   }) async {
     try {
-      final response = await dio.put<T>(
+      final response = await dio.put(
         path,
         data: data,
         queryParameters: queryParameters,
@@ -176,7 +197,11 @@ class DioClient {
         onSendProgress: onSendProgress,
         onReceiveProgress: onReceiveProgress,
       );
-      return response;
+      
+      return BaseCommonResponse<T>.fromJson(
+        response.data as Map<String, dynamic>,
+        fromJsonT,
+      );
     } on DioException catch (e) {
       // 错误已由 ErrorInterceptor 处理,直接抛出
       rethrow;
@@ -188,13 +213,15 @@ class DioClient {
   /// PATCH 请求
   /// 
   /// [path] 请求路径(相对于 baseUrl)
+  /// [fromJsonT] JSON 转换为 T 类型的函数
   /// [data] 请求体数据
   /// [queryParameters] 查询参数
   /// [options] 请求选项
   /// 
-  /// 返回 [Response] 对象
-  static Future<Response<T>> patch<T>(
+  /// 返回 [BaseCommonResponse] 对象
+  static Future<BaseCommonResponse<T>> patch<T>(
     String path, {
+    required T Function(Object? json) fromJsonT,
     dynamic data,
     Map<String, dynamic>? queryParameters,
     Options? options,
@@ -203,7 +230,7 @@ class DioClient {
     ProgressCallback? onReceiveProgress,
   }) async {
     try {
-      final response = await dio.patch<T>(
+      final response = await dio.patch(
         path,
         data: data,
         queryParameters: queryParameters,
@@ -212,7 +239,11 @@ class DioClient {
         onSendProgress: onSendProgress,
         onReceiveProgress: onReceiveProgress,
       );
-      return response;
+      
+      return BaseCommonResponse<T>.fromJson(
+        response.data as Map<String, dynamic>,
+        fromJsonT,
+      );
     } on DioException catch (e) {
       // 错误已由 ErrorInterceptor 处理,直接抛出
       rethrow;

+ 19 - 20
lib/features/MinePage/domain/mine_service.dart

@@ -20,30 +20,29 @@ class MineService {
       AppLogger.d('退出登录请求参数: $parame');
       final response = await DioClient.post<Map<String, dynamic>>(
         path.join(ApiConstants.baseUrl, ApiConstants.logout),
+        fromJsonT: (json) => json as Map<String, dynamic>,
         data: parame,
       );
 
-      if (response.statusCode == 200) {
-        final data = response.data;
-        if (data != null && data['code'] == 20000) {
-          AppLogger.d('退出登录成功: $data');
-          
-          // 退出登录成功后,清除本地 Token 和用户信息
-          await LocalStorage.removeToken();
-          await LocalStorage.removeUserInfo();
-          await LocalStorage.removeInstitutionInfo();
-          
-          // 解析为 QuitModel
-          final authModel = QuitModel.fromJson(data);
-          return authModel;
-        } else {
-          final errorMsg = data?['message'] ?? '退出登录失败';
-          AppLogger.d('退出登录失败: $errorMsg');
-          throw Exception(errorMsg);
-        }
+      if (response.success && response.code == 20000) {
+        AppLogger.d('退出登录成功');
+        
+        // 退出登录成功后,清除本地 Token 和用户信息
+        await LocalStorage.removeToken();
+        await LocalStorage.removeUserInfo();
+        await LocalStorage.removeInstitutionInfo();
+        
+        // 创建 QuitModel
+        final quitModel = QuitModel(
+          code: response.code,
+          success: response.success,
+          msg: response.msg ?? '退出成功',
+        );
+        return quitModel;
       } else {
-        AppLogger.d('退出登录请求错误: ${response.statusCode}, ${response.statusMessage}');
-        throw Exception('请求失败: ${response.statusCode}');
+        final errorMsg = response.msg ?? '退出登录失败';
+        AppLogger.d('退出登录失败: $errorMsg');
+        throw Exception(errorMsg);
       }
     } catch (e) {
       AppLogger.e('退出登录错误', e);

+ 39 - 54
lib/features/auth/domain/login_service.dart

@@ -33,30 +33,25 @@ class LoginService {
 
       final response = await DioClient.post<Map<String, dynamic>>(
         path.join(ApiConstants.baseUrl, ApiConstants.login),
+        fromJsonT: (json) => json as Map<String, dynamic>,
         data: parame,
       );
 
-      if (response.statusCode == 200) {
-        final data = response.data;
-        if (data != null && data['code'] == 20000) {
-          AppLogger.d('密码登录成功: $data');
-          final jsonData = data['data'] as Map<String, dynamic>;
-          
-          // 解析为 AuthModel
-          final authModel = AuthModel.fromJson(jsonData);
-          
-          // 保存到本地存储
-          await _saveAuthData(authModel);
-          
-          return authModel;
-        } else {
-          final errorMsg = data?['message'] ?? '登录失败';
-          AppLogger.d('密码登录失败: $errorMsg');
-          throw Exception(errorMsg);
-        }
+      if (response.success && response.code == 20000) {
+        AppLogger.d('密码登录成功: ${response.data}');
+        final jsonData = response.data!;
+        
+        // 解析为 AuthModel
+        final authModel = AuthModel.fromJson(jsonData);
+        
+        // 保存到本地存储
+        await _saveAuthData(authModel);
+        
+        return authModel;
       } else {
-        AppLogger.d('密码登录请求错误: ${response.statusCode}, ${response.statusMessage}');
-        throw Exception('请求失败: ${response.statusCode}');
+        final errorMsg = response.msg ?? '登录失败';
+        AppLogger.d('密码登录失败: $errorMsg');
+        throw Exception(errorMsg);
       }
     } catch (e) {
       AppLogger.e('密码登录错误', e);
@@ -83,24 +78,19 @@ class LoginService {
 
       final response = await DioClient.post<Map<String, dynamic>>(
         path.join(ApiConstants.baseUrl, ApiConstants.sendSmsCode),
+        fromJsonT: (json) => json as Map<String, dynamic>,
         data: parame,
       );
 
-      if (response.statusCode == 200) {
-        final data = response.data;
-        if (data != null && data['code'] == 20000) {
-          AppLogger.d('发送验证码成功: $data');
-          final jsonData = data['data'] as Map<String, dynamic>;
-          final smsCode = jsonData['code'] as String;
-          return smsCode;
-        } else {
-          final errorMsg = data?['message'] ?? '发送验证码失败';
-          AppLogger.d('发送验证码失败: $errorMsg');
-          throw Exception(errorMsg);
-        }
+      if (response.success && response.code == 20000) {
+        AppLogger.d('发送验证码成功: ${response.data}');
+        final jsonData = response.data!;
+        final smsCode = jsonData['code'] as String;
+        return smsCode;
       } else {
-        AppLogger.d('发送验证码请求错误: ${response.statusCode}, ${response.statusMessage}');
-        throw Exception('请求失败: ${response.statusCode}');
+        final errorMsg = response.msg ?? '发送验证码失败';
+        AppLogger.d('发送验证码失败: $errorMsg');
+        throw Exception(errorMsg);
       }
     } catch (e) {
       AppLogger.e('发送验证码错误', e);
@@ -133,30 +123,25 @@ class LoginService {
 
       final response = await DioClient.post<Map<String, dynamic>>(
         path.join(ApiConstants.baseUrl, ApiConstants.login),
+        fromJsonT: (json) => json as Map<String, dynamic>,
         data: parame,
       );
 
-      if (response.statusCode == 200) {
-        final data = response.data;
-        if (data != null && data['code'] == 20000) {
-          AppLogger.d('验证码登录成功: $data');
-          final jsonData = data['data'] as Map<String, dynamic>;
-          
-          // 解析为 AuthModel
-          final authModel = AuthModel.fromJson(jsonData);
-          
-          // 保存到本地存储
-          await _saveAuthData(authModel);
-          
-          return authModel;
-        } else {
-          final errorMsg = data?['message'] ?? '登录失败';
-          AppLogger.d('验证码登录失败: $errorMsg');
-          throw Exception(errorMsg);
-        }
+      if (response.success && response.code == 20000) {
+        AppLogger.d('验证码登录成功: ${response.data}');
+        final jsonData = response.data!;
+        
+        // 解析为 AuthModel
+        final authModel = AuthModel.fromJson(jsonData);
+        
+        // 保存到本地存储
+        await _saveAuthData(authModel);
+        
+        return authModel;
       } else {
-        AppLogger.d('验证码登录请求错误: ${response.statusCode}, ${response.statusMessage}');
-        throw Exception('请求失败: ${response.statusCode}');
+        final errorMsg = response.msg ?? '登录失败';
+        AppLogger.d('验证码登录失败: $errorMsg');
+        throw Exception(errorMsg);
       }
     } catch (e) {
       AppLogger.e('验证码登录错误', e);