diff --git a/lib/modules/login/bindings/user_Info.dart b/lib/data/models/user_Info.dart similarity index 92% rename from lib/modules/login/bindings/user_Info.dart rename to lib/data/models/user_Info.dart index 2725b8405..32662c615 100644 --- a/lib/modules/login/bindings/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -14,16 +14,16 @@ class User { } // 最终属性(不可变) - final String name; - final String uid; - final String avatar; - final String deviceid; - final String language; - final String token; - final String mail; - final String phone; - final String phonemac; - final String password; + String name; + String uid; + String avatar; + String deviceid; + String language; + String token; + String mail; + String phone; + String phonemac; + String password; // final Int64 lastbettime; // final Int64 createtime; // final String wxopenid; diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart new file mode 100644 index 000000000..84ff33446 --- /dev/null +++ b/lib/data/services/network/api.dart @@ -0,0 +1,31 @@ +import 'dio_manager.dart'; +import 'nw_method.dart'; + +class Api { + // 登录 + static login([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/user_sgin', + params: params, + ); + } + + // 获取验证码 + static getCode([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/user_verification', + params: params, + ); + } + + // 获取阿里token + static getAliToken([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/auth_alitoken', + params: params, + ); + } +} diff --git a/lib/data/services/network/auth_interceptor.dart b/lib/data/services/network/auth_interceptor.dart new file mode 100644 index 000000000..655751e4c --- /dev/null +++ b/lib/data/services/network/auth_interceptor.dart @@ -0,0 +1,65 @@ +// import 'package:dio/dio.dart'; +// import 'package:flutter_easyloading/flutter_easyloading.dart'; +// import 'package:get/get.dart' hide Response; + +// import '../scenes/start/start_logic.dart'; +// import 'entity/base_entity.dart'; + +// class AuthInterceptor extends Interceptor { +// final state = Get.find().state; + +// @override +// void onRequest(RequestOptions options, RequestInterceptorHandler handler) { +// options.headers['Authorization'] = state.loginModel.token; +// handler.next(options); +// } + +// @override +// void onResponse(Response response, ResponseInterceptorHandler handler) async { +// BaseEntity entity = BaseEntity.fromJson(response.data); +// if (entity.code == 0) { +// response.data = entity.data ?? {}; +// handler.resolve(response); +// } else { +// response.data = null; +// handler.next(response); +// return EasyLoading.showError(entity.message ?? 'unknownError'.tr); +// } +// } + +// @override +// void onError(DioException err, ErrorInterceptorHandler handler) { +// switch (err.type) { +// case DioExceptionType.cancel: +// { +// EasyLoading.showError('requestCancellation'.tr); +// } +// case DioExceptionType.connectionTimeout: +// { +// EasyLoading.showError('connectionTimeout'.tr); +// } +// case DioExceptionType.sendTimeout: +// { +// EasyLoading.showError('requestTimeout'.tr); +// } +// case DioExceptionType.receiveTimeout: +// { +// EasyLoading.showError('responseTimeout'.tr); +// } +// case DioExceptionType.badResponse: +// { +// try { +// String? errMsg = err.response?.statusMessage; +// EasyLoading.showError(errMsg ?? 'unknownError'.tr); +// } on Exception catch (_) { +// EasyLoading.showError('unknownError'.tr); +// } +// } +// default: +// { +// EasyLoading.showError(err.message ?? 'unknownError'.tr); +// } +// } +// handler.next(err); +// } +// } diff --git a/lib/data/services/network/dio_manager.dart b/lib/data/services/network/dio_manager.dart new file mode 100644 index 000000000..a41e81228 --- /dev/null +++ b/lib/data/services/network/dio_manager.dart @@ -0,0 +1,45 @@ +import 'package:dio/dio.dart'; + +import 'auth_interceptor.dart'; +import 'nw_api.dart'; +import 'nw_method.dart'; + +class DioManager { + static final DioManager _shared = DioManager._internal(); + factory DioManager() => _shared; + + late Dio dio; + + DioManager._internal() { + BaseOptions options = BaseOptions( + baseUrl: NWApi.baseApi, + contentType: Headers.jsonContentType, + responseType: ResponseType.json, + connectTimeout: const Duration(seconds: 30), + receiveTimeout: const Duration(seconds: 30), + ); + + dio = Dio(options); + + // dio.interceptors.add(AuthInterceptor()); + } + + // 请求,返回参数为 T + // method:请求方法,NWMethod.POST等 + // path:请求地址 + // params:请求参数 + Future request( + NWMethod method, + String path, { + Map? params, + Map? queryParameters, + }) async { + Response response = await dio.request( + path, + data: params, + queryParameters: queryParameters, + options: Options(method: nwMethodValues[method]), + ); + return response.data; + } +} diff --git a/lib/data/services/network/entity/base_entity.dart b/lib/data/services/network/entity/base_entity.dart new file mode 100644 index 000000000..fde0289ef --- /dev/null +++ b/lib/data/services/network/entity/base_entity.dart @@ -0,0 +1,17 @@ +import 'entity_factory.dart'; + +class BaseEntity { + int? code; + String? message; + T? data; + + BaseEntity({this.code, this.message, this.data}); + + factory BaseEntity.fromJson(json) { + return BaseEntity( + code: json["code"], + message: json["msg"], + data: EntityFactory.generateOBJ(json["data"]), + ); + } +} diff --git a/lib/data/services/network/entity/entity_factory.dart b/lib/data/services/network/entity/entity_factory.dart new file mode 100644 index 000000000..e11cb6d3c --- /dev/null +++ b/lib/data/services/network/entity/entity_factory.dart @@ -0,0 +1,9 @@ +class EntityFactory { + static T? generateOBJ(json) { + if (json == null) { + return null; + } else { + return json as T; + } + } +} diff --git a/lib/data/services/network/nw_api.dart b/lib/data/services/network/nw_api.dart new file mode 100644 index 000000000..875a166b6 --- /dev/null +++ b/lib/data/services/network/nw_api.dart @@ -0,0 +1,4 @@ +class NWApi { + // static const baseApi = "https://www.deapsound.com"; + static const baseApi = "https://www.deapsound.com"; +} diff --git a/lib/data/services/network/nw_method.dart b/lib/data/services/network/nw_method.dart new file mode 100644 index 000000000..f79ca96e3 --- /dev/null +++ b/lib/data/services/network/nw_method.dart @@ -0,0 +1,8 @@ +enum NWMethod { get, post, delete, put } + +const nwMethodValues = { + NWMethod.get: "get", + NWMethod.post: "post", + NWMethod.delete: "delete", + NWMethod.put: "put" +}; diff --git a/lib/modules/login/controllers/googleLogin.dart b/lib/modules/login/controllers/googleLogin.dart index ce3ebbd44..36a080cc6 100644 --- a/lib/modules/login/controllers/googleLogin.dart +++ b/lib/modules/login/controllers/googleLogin.dart @@ -18,10 +18,14 @@ class Google { print('Future响应数据: $currentUser'); if (currentUser != null) { // 这里处理您需要使用这个JWT令牌的逻辑,例如将它存储到本地存储中作为凭据。 - + email = currentUser.email; + displayName = currentUser.displayName; + id = currentUser.uid; token = await currentUser.getIdToken(); print('Future响应数据tokenResult: $token'); + // IdTokenResult token1 = await currentUser.getIdTokenResult(); + // print('Future响应数据token1: $token1'); return true; } else { diff --git a/lib/modules/login/controllers/login_controller.dart b/lib/modules/login/controllers/login_controller.dart index 66bf81d62..142c71ca7 100644 --- a/lib/modules/login/controllers/login_controller.dart +++ b/lib/modules/login/controllers/login_controller.dart @@ -8,8 +8,9 @@ import 'facebookLogin.dart'; import 'googleLogin.dart'; import 'weixinLogin.dart'; import '../entity/api.dart'; -import '../bindings/user_Info.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import '../../../../data/models/user_Info.dart'; +//import 'package:shared_preferences/shared_preferences.dart'; +import 'package:get_storage/get_storage.dart'; enum LoginViewState { welcome, // 欢迎页面 @@ -18,7 +19,7 @@ enum LoginViewState { class LoginController extends GetxController { static LoginController get to => Get.find(); - + final GetStorage _storage = GetStorage(); // 状态管理 final _viewState = LoginViewState.welcome.obs; final _isLoading = false.obs; @@ -365,8 +366,8 @@ class LoginController extends GetxController { if (response != null) { print("请求后台数据login回复数据=${response}"); - final instance = await SharedPreferences.getInstance(); - await instance.setString('loginInfo', jsonEncode(response)); + // final instance = await GetStorage(); + await _storage.write('loginInfo', jsonEncode(response)); // 2. 将响应数据转换为User对象 try { print('响应数据: ${response.toString()}'); // 调试输出原始数据 @@ -379,8 +380,8 @@ class LoginController extends GetxController { print('用户初始化成功: ${user.name}'); // 存储到 SharedPreferences (仅存储用户数据) - final prefs = await SharedPreferences.getInstance(); - await prefs.setString( + //final prefs = await GetStorage(); + await _storage.write( 'user', jsonEncode(user.toJson())); // 使用 user.toJson() Get.offAllNamed(Routes.pairing); diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 89d2bf72b..e545a083c 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -5,7 +5,7 @@ import 'dart:ui'; import '../controllers/settings_controller.dart'; import '../../../core/widgets/common_bottom_nav.dart'; import '../../../routes/app_routes.dart'; -import '../../login/bindings/user_Info.dart'; +import '../../../data/models/user_Info.dart'; class SettingsView extends GetView { const SettingsView({Key? key}) : super(key: key); diff --git a/pubspec.yaml b/pubspec.yaml index 1a36a1b08..b023e3efe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: flutter_image_compress: ^2.4.0 # image_cropper: ^9.0.0 dio: ^5.8.0+1 - shared_preferences: ^2.5.1 + flutter_easyloading: ^3.0.5 dev_dependencies: flutter_test: sdk: flutter