Browse Source

用户相关的接口调试

liukai 8 months ago
parent
commit
1c2176cd09
33 changed files with 690 additions and 397 deletions
  1. 0 26
      app/lib/app_binding.dart
  2. 2 2
      app/lib/modules/splash/splash_controller.dart
  3. 8 17
      packages/cpt_auth/lib/modules/login/login_controller.dart
  4. 56 16
      packages/cpt_auth/lib/modules/main/main_controller.dart
  5. 23 18
      packages/cpt_auth/lib/modules/main/main_page.dart
  6. 8 12
      packages/cpt_auth/lib/modules/main/main_state.dart
  7. 26 4
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_controller.dart
  8. 15 3
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart
  9. 8 0
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_state.dart
  10. 21 2
      packages/cpt_auth/lib/modules/setting/setting_controller.dart
  11. 20 3
      packages/cpt_auth/lib/modules/sign_up/sign_up_controller.dart
  12. 7 0
      packages/cpt_auth/lib/router/auth_service_impl.dart
  13. 16 8
      packages/cs_domain/lib/constants/api_constants.dart
  14. 2 2
      packages/cs_domain/lib/entity/home_module.dart
  15. 63 0
      packages/cs_domain/lib/entity/response/hotel_info_entity.dart
  16. 0 28
      packages/cs_domain/lib/entity/response/user_login_entity.dart
  17. 0 27
      packages/cs_domain/lib/entity/response/user_profile.dart
  18. 8 1
      packages/cs_domain/lib/generated/json/attendance_entity.g.dart
  19. 13 10
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  20. 132 0
      packages/cs_domain/lib/generated/json/hotel_info_entity.g.dart
  21. 0 54
      packages/cs_domain/lib/generated/json/user_login_entity.g.dart
  22. 0 61
      packages/cs_domain/lib/generated/json/user_profile.g.dart
  23. 72 25
      packages/cs_domain/lib/repository/auth_repository.dart
  24. 8 4
      packages/cs_initializer/lib/global_services_injection.dart
  25. 2 2
      packages/cs_plugin_basic/lib/constants/app_constant.dart
  26. 64 0
      packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart
  27. 66 0
      packages/cs_plugin_basic/lib/dio_interceptors/interceptor_status_code_dio.dart
  28. 31 34
      packages/cs_plugin_basic/lib/service/user_service.dart
  29. 1 2
      packages/cs_plugin_platform/lib/engine/network/network_engine.dart
  30. 0 34
      packages/cs_plugin_platform/lib/http/dio/interceptor_auth_dio.dart
  31. 8 1
      packages/cs_resources/lib/local/language/en_US.dart
  32. 8 1
      packages/cs_resources/lib/local/language/zh_CN.dart
  33. 2 0
      packages/cs_router/lib/componentRouter/auth_service.dart

+ 0 - 26
app/lib/app_binding.dart

@@ -1,26 +0,0 @@
-//
-// import 'package:domain/constants/api_constants.dart';
-// import 'package:domain/repository/auth_repository.dart';
-// import 'package:get/get.dart';
-// import 'package:cpt_auth/intercept/interceptor_status_code_dio.dart';
-// import 'package:plugin_basic/service/user_service.dart';
-// import 'package:plugin_platform/http/http_provider.dart';
-//
-// ///异步注入构造方法中的对象 用于Api网络请求相关的注入
-// ///主要是在App初始化的时候就注入到依赖注入的池里面,并单例持久化
-// class AppBinding extends Bindings {
-//   @override
-//   void dependencies() async {
-//     Get.put(HttpProvider(ApiConstants.baseUrl, interceptors: [StatusCodeDioInterceptors()]), permanent: true);
-//
-//     Get.put(AuthRepository(httpProvider: Get.find()));
-//
-//     // 用户信息服务(用户信息相关业务类)
-//     Get.put(UserService(Get.find()));
-//     // Get.lazyPut(() => WXPlatformService());
-//     // Get.lazyPut(() => QQPlatformService());
-//     // Get.lazyPut(() => JVerifyService());
-//
-//     // Get.lazyPut<ProfileService>(() => ProfileServiceImpl());
-//   }
-// }

+ 2 - 2
app/lib/modules/splash/splash_controller.dart

@@ -15,7 +15,7 @@ class SplashController extends GetxController {
   @override
   void onReady() {
     super.onReady();
-
+    UserService.to;
     _gotoNextPage();
   }
 }
@@ -47,7 +47,7 @@ void _gotoNextPage() async {
   if (UserService.to.isLogin) {
     //去Attendance页面签到
     Log.d("去Attendance页面签到");
-    ComponentRouterServices.jobService.startWithPopSignInSignOutPage();
+    ComponentRouterServices.authService.startPopAllMainPage();
   } else {
     //去登录页面
     Log.d("去登录页面");

+ 8 - 17
packages/cpt_auth/lib/modules/login/login_controller.dart

@@ -1,7 +1,6 @@
 import 'package:cpt_auth/modules/main/main_page.dart';
 import 'package:cpt_auth/modules/reset_psd/reset_psd_page.dart';
-import 'package:cpt_auth/modules/sign_up/sign_up_page.dart';
-import 'package:domain/entity/response/user_login_entity.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/repository/auth_repository.dart';
 import 'package:get/get.dart';
 import 'package:plugin_basic/service/user_service.dart';
@@ -11,6 +10,7 @@ import 'package:router/componentRouter/component_router_service.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
+import '../sign_up/sign_up_page.dart';
 import 'login_state.dart';
 
 class LoginController extends GetxController with DioCancelableMixin {
@@ -31,11 +31,6 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 执行账号密码的普通登录
   void doInputLogin() {
-
-    //todo 测试
-    MainPage.startWithPopAll();
-    return;
-
     state.codeErrorText = null;
     state.passwordErrorText = null;
     update();
@@ -46,7 +41,7 @@ class LoginController extends GetxController with DioCancelableMixin {
     state.code = codeController.text;
     state.password = passwordController.text;
 
-    Log.d('当前待提交的 code:${state.code} password:${state.password}');
+    Log.d('当前待提交的 email:${state.code} password:${state.password}');
 
     if (Utils.isEmpty(state.code)) {
       state.codeErrorText = "The email cannot be empty!".tr;
@@ -62,7 +57,7 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 请求接口执行登录
   void _request2LoginPassword() async {
-    var result = await authRepository.userLogin(state.code, state.password, registerId: "", cancelToken: cancelToken);
+    var result = await authRepository.userLogin(state.code, state.password, cancelToken: cancelToken);
 
     //处理数据
     if (result.isSuccess) {
@@ -74,16 +69,13 @@ class LoginController extends GetxController with DioCancelableMixin {
   }
 
   /// 登录成功的统一处理 - 去首页
-  void _handleLoginSuccess(UserLoginEntity result) {
+  void _handleLoginSuccess(HotelInfoEntity result) {
     //保存Token
     final token = result.token;
     UserService.to.setToken(token);
 
-    //发送通知请求用户详情数据
-    // bus.emit(AppConstant.eventProfile2Refresh, true);
-
-    //使用SingleTask启动模式去首页
-    ComponentRouterServices.jobService.startWithPopSignInSignOutPage();
+    //去首页
+    MainPage.startWithPopAll();
   }
 
   @override
@@ -93,7 +85,6 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 跳转登录页面
   void gotoSignUpPage() {
-    // SignUpPage.startInstance();
-    ResetPasswordPage.startInstance();
+    SignUpPage.startInstance();
   }
 }

+ 56 - 16
packages/cpt_auth/lib/modules/main/main_controller.dart

@@ -1,6 +1,9 @@
 import 'package:cpt_auth/modules/setting/setting_page.dart';
 import 'package:domain/entity/home_module.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
+import 'package:domain/repository/auth_repository.dart';
 import 'package:get/get.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
@@ -8,6 +11,7 @@ import 'package:widgets/widget_export.dart';
 import 'main_state.dart';
 
 class MainController extends GetxController {
+  final AuthRepository _authRepository = Get.find();
   final MainState state = MainState();
 
   var _needShowPlaceholder = true;
@@ -41,24 +45,60 @@ class MainController extends GetxController {
 
   /// 获取首页的数据
   void fetchHomeData() async {
-    //todo 这里需要调用接口实现
     if (_needShowPlaceholder) {
       changeLoadingState(LoadState.State_Loading);
     }
 
-    await Future.delayed(Duration(seconds: 1));
+    //获取到数据
+    var result = await _authRepository.fetchHotelInfo();
 
-    state.datas.clear();
-    state.datas.addAll(state.modules);
-    //更新状态
-    changeLoadingState(LoadState.State_Success);
+    //处理数据
+    if (result.isSuccess) {
+      final hotelInfo = result.data;
 
-    refreshController.finishRefresh();
+      if (hotelInfo != null){
+        UserService.to.hotelInfo.value = hotelInfo;
+
+        _handleList(hotelInfo.menus);
 
+      }else{
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+
+    //停止刷新
+    refreshController.finishRefresh();
     //最后赋值
     _needShowPlaceholder = false;
   }
 
+  // 处理数据与展示的逻辑
+  void _handleList(List<HotelInfoMenus>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      state.datas.clear();
+
+      //根据Key筛选需要展示的模块
+      for (var hotelInfo in list) {
+        if (hotelInfo.key != null) {
+          state.datas.addAll(_filterModulesByKey(hotelInfo.key!));
+        }
+      }
+      //更新状态
+      changeLoadingState(LoadState.State_Success);
+    } else {
+      //展示无数据的布局
+      state.datas.clear();
+      changeLoadingState(LoadState.State_Empty);
+    }
+  }
+
+  List<HomeModule> _filterModulesByKey(String key) {
+    return state.modules.where((module) => module.key == key).toList();
+  }
+
   @override
   void onReady() async {
     super.onReady();
@@ -67,29 +107,29 @@ class MainController extends GetxController {
 
   /// 跳转到指定的模块中去
   void gotoModulePage(HomeModule module) {
-    switch (module.moduleId) {
-      case '1':
+    switch (module.key) {
+      case 'labReq':
         ToastEngine.show("进入 Labour Request 模块");
         break;
-      case '2':
+      case 'jobList':
         ToastEngine.show("进入 Job List 模块");
         break;
-      case '3':
+      case 'sign':
         ToastEngine.show("进入 Sign in Sign out 模块");
         break;
-      case '4':
+      case 'devices':
         ToastEngine.show("进入 Devices 模块");
         break;
-      case '5':
+      case 'reqReview':
         ToastEngine.show("进入 Labour Request Review 模块");
         break;
-      case '6':
+      case 'attReview':
         ToastEngine.show("进入 Attendance Review 模块");
         break;
-      case '7':
+      case 'template':
         ToastEngine.show("进入 Default Job Title 模块");
         break;
-      case '8':
+      case 'report':
         ToastEngine.show("进入 Report 模块");
         break;
     }

+ 23 - 18
packages/cpt_auth/lib/modules/main/main_page.dart

@@ -7,6 +7,7 @@ import 'package:get/get.dart';
 import 'package:plugin_basic/base/base_stateful_page.dart';
 import 'package:plugin_basic/base/base_state.dart';
 import 'package:plugin_basic/base/mixin_state_lifecycle.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_basic/utils/ext_get_nav.dart';
 import 'package:cs_resources/local/theme/theme_config.dart';
 import 'package:router/path/router_path.dart';
@@ -126,30 +127,34 @@ class _MainPageState extends BaseState<MainPage, MainController> with StateLifec
                       crossAxisAlignment: CrossAxisAlignment.center,
                       children: [
                         // 酒店的名字
-                        MyTextView(
-                          "Shangri-la Hotel",
-                          textColor: ColorConstants.white,
-                          isTextEllipsis: true,
-                          maxLines: 2,
-                          isFontBold: true,
-                          fontSize: 21,
-                        ).expanded(),
+                        Obx(() {
+                          return MyTextView(
+                            UserService.to.getHotelInfo.hotelName ?? "-",
+                            textColor: ColorConstants.white,
+                            isTextEllipsis: true,
+                            maxLines: 2,
+                            isFontBold: true,
+                            fontSize: 21,
+                          );
+                        }).expanded(),
 
                         //设置图标,点击进入设置页面
                         MyAssetImage(Assets.mainHomeSetting, width: 33, height: 33).onTap(() => controller.gotoSettingPage()),
                       ],
                     ),
 
-                    //欢迎的文本
-                    MyTextView(
-                      "Welcome Admin",
-                      textColor: ColorConstants.textGray9EB0C1,
-                      isTextEllipsis: true,
-                      isFontMedium: true,
-                      marginTop: 5,
-                      marginBottom: 15,
-                      fontSize: 18,
-                    ),
+                    //欢迎的文本+姓名
+                    Obx(() {
+                      return MyTextView(
+                        "Welcome".tr + " ${UserService.to.getHotelInfo.name ?? "-"}",
+                        textColor: ColorConstants.textGray9EB0C1,
+                        isTextEllipsis: true,
+                        isFontMedium: true,
+                        marginTop: 5,
+                        marginBottom: 15,
+                        fontSize: 18,
+                      );
+                    }),
 
                     //底部的列表
                     EasyRefresh(

+ 8 - 12
packages/cpt_auth/lib/modules/main/main_state.dart

@@ -1,24 +1,20 @@
-
-
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/home_module.dart';
 import 'package:plugin_basic/basic_export.dart';
 
 class MainState {
-
   //当前显示的模块
   List<HomeModule> datas = [];
 
   //全部的模块
   final List<HomeModule> modules = [
-    HomeModule(moduleId: '1', moduleName: 'Labour Request'.tr, moduleIconPath: Assets.mainHomeLabourRequest,iconWidth: 50,iconHeight: 40.3),
-    HomeModule(moduleId: '2', moduleName: 'Job List'.tr, moduleIconPath: Assets.mainHomeJobList,iconWidth: 45,iconHeight: 45),
-    HomeModule(moduleId: '3', moduleName: 'Sign in Sign out'.tr, moduleIconPath: Assets.mainHomeSignInOut,iconWidth: 44.5,iconHeight: 44.5),
-    HomeModule(moduleId: '4', moduleName: 'Devices'.tr, moduleIconPath: Assets.mainHomeDevices,iconWidth: 45.5,iconHeight: 45.5),
-    HomeModule(moduleId: '5', moduleName: 'Labour Request Review'.tr, moduleIconPath:Assets.mainHomeLabourRequestReview,iconWidth: 50.5,iconHeight: 43),
-    HomeModule(moduleId: '6', moduleName: 'Attendance Review'.tr, moduleIconPath: Assets.mainHomeAttendanceReview,iconWidth: 47.5,iconHeight: 46),
-    HomeModule(moduleId: '7', moduleName: 'Default Job Title'.tr, moduleIconPath: Assets.mainHomeJobTemplate,iconWidth: 48.5,iconHeight: 46.5),
-    HomeModule(moduleId: '8', moduleName: 'Report'.tr, moduleIconPath: Assets.mainHomeReport,iconWidth: 50.5,iconHeight: 45.5),
+    HomeModule(key: 'labReq', moduleName: 'Labour Request'.tr, moduleIconPath: Assets.mainHomeLabourRequest, iconWidth: 50, iconHeight: 40.3),
+    HomeModule(key: 'jobList', moduleName: 'Job List'.tr, moduleIconPath: Assets.mainHomeJobList, iconWidth: 45, iconHeight: 45),
+    HomeModule(key: 'sign', moduleName: 'Sign in Sign out'.tr, moduleIconPath: Assets.mainHomeSignInOut, iconWidth: 44.5, iconHeight: 44.5),
+    HomeModule(key: 'devices', moduleName: 'Devices'.tr, moduleIconPath: Assets.mainHomeDevices, iconWidth: 45.5, iconHeight: 45.5),
+    HomeModule(key: 'reqReview', moduleName: 'Labour Request Review'.tr, moduleIconPath: Assets.mainHomeLabourRequestReview, iconWidth: 50.5, iconHeight: 43),
+    HomeModule(key: 'attReview', moduleName: 'Attendance Review'.tr, moduleIconPath: Assets.mainHomeAttendanceReview, iconWidth: 47.5, iconHeight: 46),
+    HomeModule(key: 'template', moduleName: 'Default Job Title'.tr, moduleIconPath: Assets.mainHomeJobTemplate, iconWidth: 48.5, iconHeight: 46.5),
+    HomeModule(key: 'report', moduleName: 'Report'.tr, moduleIconPath: Assets.mainHomeReport, iconWidth: 50.5, iconHeight: 45.5),
   ];
-
 }

+ 26 - 4
packages/cpt_auth/lib/modules/reset_psd/reset_psd_controller.dart

@@ -1,10 +1,15 @@
+import 'package:domain/repository/auth_repository.dart';
 import 'package:get/get.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'reset_psd_state.dart';
 
-class ResetPasswordController extends GetxController {
+class ResetPasswordController extends GetxController with DioCancelableMixin{
+  final AuthRepository _authRepository = Get.find();
   final ResetPasswordState state = ResetPasswordState();
 
   //执行注册操作
@@ -13,21 +18,26 @@ class ResetPasswordController extends GetxController {
     state.confirmPasswordErrorText = null;
     update();
 
+    var oldPasswordController = state.formData['old_password']!['controller'];
     var passwordController = state.formData['new_password']!['controller'];
     var confirmController = state.formData['confirm_password']!['controller'];
 
+    state.oldPassword = oldPasswordController.text;
     state.password = passwordController.text;
     state.confirmPassword = confirmController.text;
 
     Log.d('当前待提交的 password:${state.password} confirmPassword:${state.confirmPassword}');
 
-    if (Utils.isEmpty(state.password)) {
+    if (Utils.isEmpty(state.oldPassword)) {
       state.passwordErrorText = "The password cannot be empty!".tr;
       update();
+    } else if (Utils.isEmpty(state.password)) {
+      state.confirmPasswordErrorText = "The new password cannot be empty!".tr;
+      update();
     } else if (Utils.isEmpty(state.confirmPassword)) {
       state.confirmPasswordErrorText = "The confirm password cannot be empty!".tr;
       update();
-    }else if (state.confirmPassword != state.password) {
+    } else if (state.confirmPassword != state.password) {
       state.confirmPasswordErrorText = "Please confirm your confirmed password!".tr;
       update();
     } else {
@@ -37,5 +47,17 @@ class ResetPasswordController extends GetxController {
   }
 
   // 调用接口重置密码
-  void _request2ResetPassword() {}
+  void _request2ResetPassword() async {
+    var result = await _authRepository.resetPassword(state.oldPassword, state.password, state.confirmPassword, cancelToken: cancelToken);
+
+    //处理数据
+    if (result.isSuccess) {
+      //提交成功
+      NotifyEngine.showSuccess("Successful".tr);
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
 }

+ 15 - 3
packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart

@@ -34,11 +34,9 @@ class ResetPasswordPage extends BaseStatefulPage<ResetPasswordController> {
 
   @override
   State<ResetPasswordPage> createState() => _SignUpState();
-
 }
 
 class _SignUpState extends BaseState<ResetPasswordPage, ResetPasswordController> {
-
   late ResetPasswordState state;
 
   @override
@@ -78,7 +76,21 @@ class _SignUpState extends BaseState<ResetPasswordPage, ResetPasswordController>
                 mainAxisSize: MainAxisSize.max,
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
-                  //密码的设置
+                  //旧密码的设置
+                  FormRequireText(text: "Old Password".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "old_password",
+                    formData: state.formData,
+                    errorText: state.passwordErrorText,
+                    onSubmit: (key, value) {
+                      state.formData[key]!['focusNode'].unfocus();
+                      FocusScope.of(context).requestFocus(state.formData['new_password']!['focusNode']);
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //新密码的设置
                   FormRequireText(text: "New Password".tr).marginOnly(left: 15, top: 19),
 
                   CustomTextField(

+ 8 - 0
packages/cpt_auth/lib/modules/reset_psd/reset_psd_state.dart

@@ -4,6 +4,13 @@ import 'package:plugin_basic/basic_export.dart';
 class ResetPasswordState {
   //表单的校验与数据
   Map<String, Map<String, dynamic>> formData = {
+    'old_password': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter your password'.tr,
+      'obsecure': true,
+    },
     'new_password': {
       'value': '',
       'controller': TextEditingController(),
@@ -25,6 +32,7 @@ class ResetPasswordState {
   String? confirmPasswordErrorText;
 
   //待提交的数据
+  String? oldPassword;
   String? password;
   String? confirmPassword;
 }

+ 21 - 2
packages/cpt_auth/lib/modules/setting/setting_controller.dart

@@ -1,12 +1,17 @@
+import 'package:cpt_auth/modules/login/login_page.dart';
 import 'package:cpt_auth/modules/reset_psd/reset_psd_page.dart';
+import 'package:domain/repository/auth_repository.dart';
 import 'package:get/get.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 
 import 'setting_state.dart';
 
-class SettingController extends GetxController {
+class SettingController extends GetxController with DioCancelableMixin {
+  final AuthRepository _authRepository = Get.find();
   final SettingState state = SettingState();
 
   //切换账号
@@ -38,8 +43,22 @@ class SettingController extends GetxController {
       title: "Confirmation".tr,
       message: "Are you sure you need to exit the system?".tr,
       confirmAction: () {
-        ToastEngine.show("确定退出登录");
+        _requestLogout();
       },
     ));
   }
+
+  /// 请求接口退出账号
+  void _requestLogout() async {
+    var result = await _authRepository.userLogout(cancelToken: cancelToken);
+
+    //处理数据
+    if (result.isSuccess) {
+      //保存Token,去首页
+      UserService.to.handleLogoutParams();
+      LoginPage.startWithPopAll();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
 }

+ 20 - 3
packages/cpt_auth/lib/modules/sign_up/sign_up_controller.dart

@@ -1,10 +1,15 @@
+import 'package:domain/repository/auth_repository.dart';
 import 'package:get/get.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'sign_up_state.dart';
 
-class SignUpController extends GetxController {
+class SignUpController extends GetxController with DioCancelableMixin {
+  final AuthRepository _authRepository = Get.find();
   final SignUpState state = SignUpState();
 
   //执行注册操作
@@ -33,7 +38,7 @@ class SignUpController extends GetxController {
     } else if (Utils.isEmpty(state.confirmPassword)) {
       state.confirmPasswordErrorText = "The confirm password cannot be empty!".tr;
       update();
-    }else if (state.confirmPassword != state.password) {
+    } else if (state.confirmPassword != state.password) {
       state.confirmPasswordErrorText = "Please confirm your confirmed password!".tr;
       update();
     } else {
@@ -43,5 +48,17 @@ class SignUpController extends GetxController {
   }
 
   // 调用接口注册
-  void _request2Signup() {}
+  void _request2Signup() async {
+    var result = await _authRepository.hotelRegister(state.email, state.password, state.confirmPassword, cancelToken: cancelToken);
+
+    //处理数据
+    if (result.isSuccess) {
+      //提交成功
+      NotifyEngine.showSuccess("Successful".tr);
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
 }

+ 7 - 0
packages/cpt_auth/lib/router/auth_service_impl.dart

@@ -1,4 +1,5 @@
 import 'package:cpt_auth/modules/login/login_page.dart';
+import 'package:cpt_auth/modules/main/main_page.dart';
 import 'package:cpt_auth/modules/reset_psd/reset_psd_page.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/auth_service.dart';
@@ -36,4 +37,10 @@ class AuthServiceImpl extends GetxService implements AuthService {
   void startResetPasswordPage() {
     ResetPasswordPage.startInstance();
   }
+
+  //启动首页页面并关闭其他全部页面
+  @override
+  void startPopAllMainPage() {
+    MainPage.startWithPopAll();
+  }
 }

+ 16 - 8
packages/cs_domain/lib/constants/api_constants.dart

@@ -9,18 +9,26 @@ class ApiConstants {
 
 // =========================== 用户相关 ↓=========================================
 
-  // 用户登录
-  static const apiUserLogin = "/index.php/api/v1/sign/login";
+  // 酒店登录
+  static const apiUserLogin = "/index.php/api/v1/hotel/login";
 
   // 用户登出系统
-  static const apiUserLogout = "/index.php/api/v1/sign/logout";
+  static const apiUserLogout = "/index.php/api/v1/hotel/logout";
+
+  // 用户修改密码
+  static const apiResetPassword = "/index.php/api/v1/hotel/reset";
+
+  //获取用户的详情信息
+  static const apiHotelInfo = "/index.php/api/v1/hotel/info";
+
+  //用户注册
+  static const apiHotelRegister = "/index.php/api/v1/hotel/register";
+
+  // =========================== 签到签出 ↓=========================================
 
   // 用户签到签出列表
-  static const apiSignApplied = "/index.php/api/v1/sign/applied";
+  static const apiSignApplied = "/index.php/api/v1/hotel/sign/table";
 
   // 用户签到签出
-  static const apiSignInOut = "/index.php/api/v1/sign/applied/clock";
-
-  //获取用户的详情信息
-  static const apiUserProfile = "/index.php/api/v1/xx/xx/xx";
+  static const apiSignInOut = "/index.php/api/v1/hotel/sign/clock";
 }

+ 2 - 2
packages/cs_domain/lib/entity/home_module.dart

@@ -1,12 +1,12 @@
 class HomeModule {
-  final String moduleId;
+  final String key;
   final String moduleName;
   final String moduleIconPath;
   final double iconWidth;
   final double iconHeight;
 
   HomeModule({
-    required this.moduleId,
+    required this.key,
     required this.moduleName,
     required this.moduleIconPath,
     required this.iconWidth,

+ 63 - 0
packages/cs_domain/lib/entity/response/hotel_info_entity.dart

@@ -0,0 +1,63 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/hotel_info_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/hotel_info_entity.g.dart';
+
+@JsonSerializable()
+class HotelInfoEntity {
+	@JSONField(name: "admin_id")
+	int? adminId = 0;
+	String? name = '';
+	@JSONField(name: "hotel_id")
+	int? hotelId = 0;
+	@JSONField(name: "hotel_name")
+	String? hotelName = '';
+	List<HotelInfoMenus>? menus = [];
+	String? token = '';
+
+	HotelInfoEntity();
+
+	factory HotelInfoEntity.fromJson(Map<String, dynamic> json) => $HotelInfoEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class HotelInfoMenus {
+	String? key = '';
+	String? name = '';
+	List<HotelInfoMenusChildren>? children = [];
+
+	HotelInfoMenus();
+
+	factory HotelInfoMenus.fromJson(Map<String, dynamic> json) => $HotelInfoMenusFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoMenusToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class HotelInfoMenusChildren {
+	String? key = '';
+	String? name = '';
+
+	HotelInfoMenusChildren();
+
+	factory HotelInfoMenusChildren.fromJson(Map<String, dynamic> json) => $HotelInfoMenusChildrenFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoMenusChildrenToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 0 - 28
packages/cs_domain/lib/entity/response/user_login_entity.dart

@@ -1,28 +0,0 @@
-import 'package:domain/generated/json/base/json_field.dart';
-import 'package:domain/generated/json/user_login_entity.g.dart';
-import 'dart:convert';
-export 'package:domain/generated/json/user_login_entity.g.dart';
-
-@JsonSerializable()
-class UserLoginEntity {
-	@JSONField(name: "auth_id")
-	int? authId = 0;
-	@JSONField(name: "company_id")
-	int? companyId = 0;
-	@JSONField(name: "e_admin_id")
-	int? eAdminId = 0;
-	String? token = '';
-	@JSONField(name: "register_id")
-	dynamic registerId;
-
-	UserLoginEntity();
-
-	factory UserLoginEntity.fromJson(Map<String, dynamic> json) => $UserLoginEntityFromJson(json);
-
-	Map<String, dynamic> toJson() => $UserLoginEntityToJson(this);
-
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
-}

+ 0 - 27
packages/cs_domain/lib/entity/response/user_profile.dart

@@ -1,27 +0,0 @@
-import 'package:domain/generated/json/base/json_field.dart';
-import 'package:domain/generated/json/user_profile.g.dart';
-import 'dart:convert';
-
-@JsonSerializable()
-class UserProfile {
-  int? id;
-  String? name;
-  String? phone;
-  String? avatar;
-  @JSONField(name: "password_type")
-  String? passwordType;
-  @JSONField(name: "registration_id")
-  dynamic registrationId;
-
-  UserProfile();
-
-  factory UserProfile.fromJson(Map<String, dynamic> json) => $UserProfileFromJson(json);
-
-  Map<String, dynamic> toJson() => $UserProfileToJson(this);
-
-  @override
-  String toString() {
-    return jsonEncode(this);
-  }
-}
-

+ 8 - 1
packages/cs_domain/lib/generated/json/attendance_entity.g.dart

@@ -112,6 +112,10 @@ AttendanceList $AttendanceListFromJson(Map<String, dynamic> json) {
   if (statusShow != null) {
     attendanceList.statusShow = statusShow;
   }
+  final bool? isExpended = jsonConvert.convert<bool>(json['isExpended']);
+  if (isExpended != null) {
+    attendanceList.isExpended = isExpended;
+  }
   return attendanceList;
 }
 
@@ -131,6 +135,7 @@ Map<String, dynamic> $AttendanceListToJson(AttendanceList entity) {
   data['check_out_img'] = entity.checkOutImg;
   data['status'] = entity.status;
   data['status_show'] = entity.statusShow;
+  data['isExpended'] = entity.isExpended;
   return data;
 }
 
@@ -150,6 +155,7 @@ extension AttendanceListExtension on AttendanceList {
     String? checkOutImg,
     int? status,
     String? statusShow,
+    bool? isExpended,
   }) {
     return AttendanceList()
       ..appliedId = appliedId ?? this.appliedId
@@ -165,6 +171,7 @@ extension AttendanceListExtension on AttendanceList {
       ..checkOutTime = checkOutTime ?? this.checkOutTime
       ..checkOutImg = checkOutImg ?? this.checkOutImg
       ..status = status ?? this.status
-      ..statusShow = statusShow ?? this.statusShow;
+      ..statusShow = statusShow ?? this.statusShow
+      ..isExpended = isExpended ?? this.isExpended;
   }
 }

+ 13 - 10
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -6,9 +6,8 @@
 import 'package:flutter/material.dart' show debugPrint;
 import 'package:domain/entity/response/attendance_entity.dart';
 import 'package:domain/entity/response/check_success_entity.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/id_name_entity.dart';
-import 'package:domain/entity/response/user_login_entity.dart';
-import 'package:domain/entity/response/user_profile.dart';
 import 'package:domain/entity/server_time.dart';
 
 JsonConvert jsonConvert = JsonConvert();
@@ -146,14 +145,17 @@ class JsonConvert {
     if (<CheckSuccessEntity>[] is M) {
       return data.map<CheckSuccessEntity>((Map<String, dynamic> e) => CheckSuccessEntity.fromJson(e)).toList() as M;
     }
-    if (<IdNameEntity>[] is M) {
-      return data.map<IdNameEntity>((Map<String, dynamic> e) => IdNameEntity.fromJson(e)).toList() as M;
+    if (<HotelInfoEntity>[] is M) {
+      return data.map<HotelInfoEntity>((Map<String, dynamic> e) => HotelInfoEntity.fromJson(e)).toList() as M;
+    }
+    if (<HotelInfoMenus>[] is M) {
+      return data.map<HotelInfoMenus>((Map<String, dynamic> e) => HotelInfoMenus.fromJson(e)).toList() as M;
     }
-    if (<UserLoginEntity>[] is M) {
-      return data.map<UserLoginEntity>((Map<String, dynamic> e) => UserLoginEntity.fromJson(e)).toList() as M;
+    if (<HotelInfoMenusChildren>[] is M) {
+      return data.map<HotelInfoMenusChildren>((Map<String, dynamic> e) => HotelInfoMenusChildren.fromJson(e)).toList() as M;
     }
-    if (<UserProfile>[] is M) {
-      return data.map<UserProfile>((Map<String, dynamic> e) => UserProfile.fromJson(e)).toList() as M;
+    if (<IdNameEntity>[] is M) {
+      return data.map<IdNameEntity>((Map<String, dynamic> e) => IdNameEntity.fromJson(e)).toList() as M;
     }
     if (<ServerTime>[] is M) {
       return data.map<ServerTime>((Map<String, dynamic> e) => ServerTime.fromJson(e)).toList() as M;
@@ -181,9 +183,10 @@ class JsonConvertClassCollection {
     (AttendanceEntity).toString(): AttendanceEntity.fromJson,
     (AttendanceList).toString(): AttendanceList.fromJson,
     (CheckSuccessEntity).toString(): CheckSuccessEntity.fromJson,
+    (HotelInfoEntity).toString(): HotelInfoEntity.fromJson,
+    (HotelInfoMenus).toString(): HotelInfoMenus.fromJson,
+    (HotelInfoMenusChildren).toString(): HotelInfoMenusChildren.fromJson,
     (IdNameEntity).toString(): IdNameEntity.fromJson,
-    (UserLoginEntity).toString(): UserLoginEntity.fromJson,
-    (UserProfile).toString(): UserProfile.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,
   };
 

+ 132 - 0
packages/cs_domain/lib/generated/json/hotel_info_entity.g.dart

@@ -0,0 +1,132 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
+
+HotelInfoEntity $HotelInfoEntityFromJson(Map<String, dynamic> json) {
+  final HotelInfoEntity hotelInfoEntity = HotelInfoEntity();
+  final int? adminId = jsonConvert.convert<int>(json['admin_id']);
+  if (adminId != null) {
+    hotelInfoEntity.adminId = adminId;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoEntity.name = name;
+  }
+  final int? hotelId = jsonConvert.convert<int>(json['hotel_id']);
+  if (hotelId != null) {
+    hotelInfoEntity.hotelId = hotelId;
+  }
+  final String? hotelName = jsonConvert.convert<String>(json['hotel_name']);
+  if (hotelName != null) {
+    hotelInfoEntity.hotelName = hotelName;
+  }
+  final List<HotelInfoMenus>? menus = (json['menus'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<HotelInfoMenus>(e) as HotelInfoMenus).toList();
+  if (menus != null) {
+    hotelInfoEntity.menus = menus;
+  }
+  final String? token = jsonConvert.convert<String>(json['token']);
+  if (token != null) {
+    hotelInfoEntity.token = token;
+  }
+  return hotelInfoEntity;
+}
+
+Map<String, dynamic> $HotelInfoEntityToJson(HotelInfoEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['admin_id'] = entity.adminId;
+  data['name'] = entity.name;
+  data['hotel_id'] = entity.hotelId;
+  data['hotel_name'] = entity.hotelName;
+  data['menus'] = entity.menus?.map((v) => v.toJson()).toList();
+  data['token'] = entity.token;
+  return data;
+}
+
+extension HotelInfoEntityExtension on HotelInfoEntity {
+  HotelInfoEntity copyWith({
+    int? adminId,
+    String? name,
+    int? hotelId,
+    String? hotelName,
+    List<HotelInfoMenus>? menus,
+    String? token,
+  }) {
+    return HotelInfoEntity()
+      ..adminId = adminId ?? this.adminId
+      ..name = name ?? this.name
+      ..hotelId = hotelId ?? this.hotelId
+      ..hotelName = hotelName ?? this.hotelName
+      ..menus = menus ?? this.menus
+      ..token = token ?? this.token;
+  }
+}
+
+HotelInfoMenus $HotelInfoMenusFromJson(Map<String, dynamic> json) {
+  final HotelInfoMenus hotelInfoMenus = HotelInfoMenus();
+  final String? key = jsonConvert.convert<String>(json['key']);
+  if (key != null) {
+    hotelInfoMenus.key = key;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoMenus.name = name;
+  }
+  final List<HotelInfoMenusChildren>? children = (json['children'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<HotelInfoMenusChildren>(e) as HotelInfoMenusChildren).toList();
+  if (children != null) {
+    hotelInfoMenus.children = children;
+  }
+  return hotelInfoMenus;
+}
+
+Map<String, dynamic> $HotelInfoMenusToJson(HotelInfoMenus entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['key'] = entity.key;
+  data['name'] = entity.name;
+  data['children'] = entity.children?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension HotelInfoMenusExtension on HotelInfoMenus {
+  HotelInfoMenus copyWith({
+    String? key,
+    String? name,
+    List<HotelInfoMenusChildren>? children,
+  }) {
+    return HotelInfoMenus()
+      ..key = key ?? this.key
+      ..name = name ?? this.name
+      ..children = children ?? this.children;
+  }
+}
+
+HotelInfoMenusChildren $HotelInfoMenusChildrenFromJson(Map<String, dynamic> json) {
+  final HotelInfoMenusChildren hotelInfoMenusChildren = HotelInfoMenusChildren();
+  final String? key = jsonConvert.convert<String>(json['key']);
+  if (key != null) {
+    hotelInfoMenusChildren.key = key;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoMenusChildren.name = name;
+  }
+  return hotelInfoMenusChildren;
+}
+
+Map<String, dynamic> $HotelInfoMenusChildrenToJson(HotelInfoMenusChildren entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['key'] = entity.key;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension HotelInfoMenusChildrenExtension on HotelInfoMenusChildren {
+  HotelInfoMenusChildren copyWith({
+    String? key,
+    String? name,
+  }) {
+    return HotelInfoMenusChildren()
+      ..key = key ?? this.key
+      ..name = name ?? this.name;
+  }
+}

+ 0 - 54
packages/cs_domain/lib/generated/json/user_login_entity.g.dart

@@ -1,54 +0,0 @@
-import 'package:domain/generated/json/base/json_convert_content.dart';
-import 'package:domain/entity/response/user_login_entity.dart';
-
-UserLoginEntity $UserLoginEntityFromJson(Map<String, dynamic> json) {
-  final UserLoginEntity userLoginEntity = UserLoginEntity();
-  final int? authId = jsonConvert.convert<int>(json['auth_id']);
-  if (authId != null) {
-    userLoginEntity.authId = authId;
-  }
-  final int? companyId = jsonConvert.convert<int>(json['company_id']);
-  if (companyId != null) {
-    userLoginEntity.companyId = companyId;
-  }
-  final int? eAdminId = jsonConvert.convert<int>(json['e_admin_id']);
-  if (eAdminId != null) {
-    userLoginEntity.eAdminId = eAdminId;
-  }
-  final String? token = jsonConvert.convert<String>(json['token']);
-  if (token != null) {
-    userLoginEntity.token = token;
-  }
-  final dynamic registerId = json['register_id'];
-  if (registerId != null) {
-    userLoginEntity.registerId = registerId;
-  }
-  return userLoginEntity;
-}
-
-Map<String, dynamic> $UserLoginEntityToJson(UserLoginEntity entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['auth_id'] = entity.authId;
-  data['company_id'] = entity.companyId;
-  data['e_admin_id'] = entity.eAdminId;
-  data['token'] = entity.token;
-  data['register_id'] = entity.registerId;
-  return data;
-}
-
-extension UserLoginEntityExtension on UserLoginEntity {
-  UserLoginEntity copyWith({
-    int? authId,
-    int? companyId,
-    int? eAdminId,
-    String? token,
-    dynamic registerId,
-  }) {
-    return UserLoginEntity()
-      ..authId = authId ?? this.authId
-      ..companyId = companyId ?? this.companyId
-      ..eAdminId = eAdminId ?? this.eAdminId
-      ..token = token ?? this.token
-      ..registerId = registerId ?? this.registerId;
-  }
-}

+ 0 - 61
packages/cs_domain/lib/generated/json/user_profile.g.dart

@@ -1,61 +0,0 @@
-import 'package:domain/generated/json/base/json_convert_content.dart';
-import 'package:domain/entity/response/user_profile.dart';
-
-UserProfile $UserProfileFromJson(Map<String, dynamic> json) {
-  final UserProfile userProfile = UserProfile();
-  final int? id = jsonConvert.convert<int>(json['id']);
-  if (id != null) {
-    userProfile.id = id;
-  }
-  final String? name = jsonConvert.convert<String>(json['name']);
-  if (name != null) {
-    userProfile.name = name;
-  }
-  final String? phone = jsonConvert.convert<String>(json['phone']);
-  if (phone != null) {
-    userProfile.phone = phone;
-  }
-  final String? avatar = jsonConvert.convert<String>(json['avatar']);
-  if (avatar != null) {
-    userProfile.avatar = avatar;
-  }
-  final String? passwordType = jsonConvert.convert<String>(json['password_type']);
-  if (passwordType != null) {
-    userProfile.passwordType = passwordType;
-  }
-  final dynamic registrationId = json['registration_id'];
-  if (registrationId != null) {
-    userProfile.registrationId = registrationId;
-  }
-  return userProfile;
-}
-
-Map<String, dynamic> $UserProfileToJson(UserProfile entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['id'] = entity.id;
-  data['name'] = entity.name;
-  data['phone'] = entity.phone;
-  data['avatar'] = entity.avatar;
-  data['password_type'] = entity.passwordType;
-  data['registration_id'] = entity.registrationId;
-  return data;
-}
-
-extension UserProfileExtension on UserProfile {
-  UserProfile copyWith({
-    int? id,
-    String? name,
-    String? phone,
-    String? avatar,
-    String? passwordType,
-    dynamic registrationId,
-  }) {
-    return UserProfile()
-      ..id = id ?? this.id
-      ..name = name ?? this.name
-      ..phone = phone ?? this.phone
-      ..avatar = avatar ?? this.avatar
-      ..passwordType = passwordType ?? this.passwordType
-      ..registrationId = registrationId ?? this.registrationId;
-  }
-}

+ 72 - 25
packages/cs_domain/lib/repository/auth_repository.dart

@@ -1,11 +1,10 @@
+import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/dio_export.dart';
 import 'package:plugin_platform/http/http_provider.dart';
 import 'package:plugin_platform/http/http_result.dart';
 
 import '../constants/api_constants.dart';
-import '../entity/response/user_login_entity.dart';
-import '../entity/response/user_profile.dart';
 
 /// 用户相关
 class AuthRepository extends GetxService {
@@ -13,22 +12,17 @@ class AuthRepository extends GetxService {
 
   AuthRepository({required this.httpProvider});
 
-  /// 用户登录
-  Future<HttpResult<UserLoginEntity>> userLogin(
-    String? code,
+  /// 酒店登录
+  Future<HttpResult<HotelInfoEntity>> userLogin(
+    String? email,
     String? password, {
-    String? registerId,
     CancelToken? cancelToken,
   }) async {
     //Post请求
     Map<String, String> params = {};
-    params['code'] = code ?? "";
+    params['email'] = email ?? "";
     params['password'] = password ?? "";
 
-    if (registerId != null && registerId.isNotEmpty) {
-      params['register_id'] = registerId;
-    }
-
     final result = await httpProvider.requestNetResult(
       method: HttpMethod.POST,
       ApiConstants.apiUserLogin,
@@ -41,24 +35,47 @@ class AuthRepository extends GetxService {
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       final json = result.getDataJson();
-      var data = UserLoginEntity.fromJson(json!);
+      var data = HotelInfoEntity.fromJson(json!);
       //重新赋值data
-      return result.convert<UserLoginEntity>(data: data);
+      return result.convert<HotelInfoEntity>(data: data);
     }
-    return result.convert<UserLoginEntity>();
+    return result.convert<HotelInfoEntity>();
   }
 
   /// 退出登录
-  Future<HttpResult> userLogout(
-    String? token, {
+  Future<HttpResult> userLogout({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiUserLogout,
+      method: HttpMethod.GET,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 修改密码
+  Future<HttpResult> resetPassword(
+    String? oldPassword,
+    String? password,
+    String? confirmPassword, {
     CancelToken? cancelToken,
   }) async {
     Map<String, String> params = {};
-    params['token'] = token ?? "";
+    params['old_password'] = oldPassword ?? "";
+    params['password'] = password ?? "";
+    params['password_confirmation'] = confirmPassword ?? "";
 
-    //POST请求
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiUserLogout,
+      ApiConstants.apiResetPassword,
       method: HttpMethod.POST,
       params: params,
       networkDebounce: true,
@@ -74,21 +91,51 @@ class AuthRepository extends GetxService {
     return result.convert();
   }
 
-  /// 获取用户详情数据
-  Future<HttpResult<UserProfile>> fetchUserProfile() async {
-    //POST请求
+  /// 获取酒店信息
+  Future<HttpResult<HotelInfoEntity>> fetchHotelInfo() async {
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiUserProfile,
+      ApiConstants.apiHotelInfo,
     );
 
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = UserProfile.fromJson(json!);
+      var data = HotelInfoEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<UserProfile>(data: data);
+      return result.convert<HotelInfoEntity>(data: data);
     }
     return result.convert();
   }
+
+  /// 酒店用户注册
+  Future<HttpResult> hotelRegister(
+    String? email,
+    String? password,
+    String? confirmPassword, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['email'] = email ?? "";
+    params['password'] = password ?? "";
+    params['password_confirmation'] = confirmPassword ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiHotelRegister,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
 }

+ 8 - 4
packages/cs_initializer/lib/global_services_injection.dart

@@ -2,6 +2,8 @@ import 'package:domain/constants/api_constants.dart';
 import 'package:domain/repository/auth_repository.dart';
 import 'package:domain/repository/job_repository.dart';
 import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_basic/dio_interceptors/interceptor_auth_dio.dart';
+import 'package:plugin_basic/dio_interceptors/interceptor_status_code_dio.dart';
 import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/http/http_provider.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -15,13 +17,17 @@ import 'package:shared/utils/log_utils.dart';
    全局单例服务的注入,在 main.dart 入口就可直接调用,注意手动调用
  */
 class GlobalServicesInjection {
-
   /// init
   static Future init({void Function()? additionalDependencies}) async {
     Log.d('----ConfigServicesInjection------start-----');
 
     //全局单例的 HttpProvider 用于发起网络请求
-    Get.put(HttpProvider(ApiConstants.baseUrl), permanent: true);
+    Get.put(
+        HttpProvider(
+          ApiConstants.baseUrl,
+          interceptors: [StatusCodeDioInterceptors(), AuthDioInterceptors()],  //需要加上与App关联的一些拦截处理
+        ),
+        permanent: true);
 
     //全局单例的用户数据仓库
     Get.put(AuthRepository(httpProvider: Get.find()));
@@ -36,7 +42,5 @@ class GlobalServicesInjection {
     if (additionalDependencies != null) {
       additionalDependencies();
     }
-
   }
-
 }

+ 2 - 2
packages/cs_plugin_basic/lib/constants/app_constant.dart

@@ -19,13 +19,13 @@ class AppConstant {
 
   //消息通知Key
   static const eventProfile2Refresh = 'event_profile_refresh'; //通知用户信息需要刷新
-  static const eventProfileRefreshFinish = 'event_profile_refresh_finish'; //用户信息已刷新完成
+  static const eventHotelInfoRefreshFinish = 'event_profile_refresh_finish'; //用户信息已刷新完成
   static const eventReportIssueSuccess = 'event_report_issue'; //工作意见报告提交成功
   static const eventHomeDataRefresh = 'event_home_data_refresh'; //只刷新首页的数据
 
   // navbar 导航栏高度
   static const double navBarHeight = kToolbarHeight;
+
   // tabbar  高度 (pt)
   static const double tabBarHeight = 44;
-
 }

+ 64 - 0
packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart

@@ -0,0 +1,64 @@
+import 'package:dio/dio.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_platform/engine/sp/sp_util.dart';
+import 'package:shared/utils/device_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+
+import '../constants/app_constant.dart';
+import '../service/app_config_service.dart';
+import '../service/user_service.dart';
+
+/*
+ * 用户授权加密等相关处理的拦截器
+ */
+class AuthDioInterceptors extends Interceptor {
+  @override
+  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
+    //拿到现有的Headers
+    Map<String, dynamic> headers = options.headers;
+
+    headers['accept'] = 'application/json';
+
+    // 设置需要添加平台信息,App版本信息等
+    if (DeviceUtils.isIOS) {
+      final systemVersion = ConfigService.to.iosDeviceInfo?.systemVersion;
+      final appVersion = ConfigService.to.version;
+      const platform = 'ios';
+
+      final agent = 'platform:$platform systemVersion:$systemVersion appVersion:$appVersion}';
+      headers['User-Agent'] = agent;
+    } else if (DeviceUtils.isAndroid) {
+      final device = '${ConfigService.to.androidDeviceInfo?.brand}-${ConfigService.to.androidDeviceInfo?.device}';
+      final systemVersion = ConfigService.to.androidDeviceInfo?.version.release;
+      final appVersion = ConfigService.to.version;
+      const platform = 'android';
+
+      final agent = 'platform:$platform device:$device systemVersion:$systemVersion appVersion:$appVersion';
+      headers['User-Agent'] = agent;
+    } else {
+      headers['User-Agent'] = 'Mozilla/5.0';
+    }
+
+    //每个接口添加自定义的设备UUID标识
+    final uuid = SPUtil.getString(AppConstant.storageDeviceUUID);
+    if (Utils.isNotEmpty(uuid)) {
+      headers['device-uuid'] = uuid!;
+    }
+
+    //如果有通行令牌,都带上通行令牌
+    String? token = UserService.to.token;
+    Log.d("AuthDioInterceptors 添加用户授权Token:$token");
+    if (!Utils.isEmpty(token)) {
+      headers['Authorization'] = 'Bearer $token';
+    }
+    // 参数加密
+
+    // 通讯加密
+
+    //设置给Option对象
+    options.headers = headers;
+
+    super.onRequest(options, handler);
+  }
+}

+ 66 - 0
packages/cs_plugin_basic/lib/dio_interceptors/interceptor_status_code_dio.dart

@@ -0,0 +1,66 @@
+import 'package:get/utils.dart';
+import 'package:plugin_platform/dio_export.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:router/componentRouter/component_router_service.dart';
+import 'package:widgets/dialog/app_default_dialog.dart';
+
+import '../service/user_service.dart';
+
+/*
+ * 特殊状态code处理的拦截器,
+ * 401 弹出弹窗提示用户重新登录
+ */
+class StatusCodeDioInterceptors extends Interceptor {
+  @override
+  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
+    super.onRequest(options, handler);
+  }
+
+  @override
+  void onResponse(Response response, ResponseInterceptorHandler handler) {
+    if (response.statusCode == 200) {
+      Map<String, dynamic> jsonMap = response.data;
+      if (jsonMap.containsKey('code')) {
+        int code = jsonMap['code'];
+        if (code == 401) {
+          _showExpiredDialog();
+        }
+      }
+    } else if (response.statusCode == 401) {
+      _showExpiredDialog();
+    }
+
+    super.onResponse(response, handler);
+  }
+
+  void _showExpiredDialog() {
+    bool isDialogShowing = false; // 控制弹窗是否正在显示
+    // 避免重复展示弹窗
+    if (!isDialogShowing) {
+      //弹框就清除了数据
+      UserService.to.handleLogoutParams();
+
+      //拦截 token 过期,弹出弹窗提示用户重新登录
+      DialogEngine.show(
+        keepSingle: true,
+        onDismiss: () {
+          isDialogShowing = false;
+        },
+        widget: AppDefaultDialog(
+          title: "Notice".tr,
+          message: "The login credential have expired, please log in again.".tr,
+          confirmAction: () {
+            ComponentRouterServices.authService.startPopAllLoginPage();
+          },
+        ),
+      );
+      //设置已经展示
+      isDialogShowing = true;
+    }
+  }
+
+  @override
+  Future onError(DioException err, ErrorInterceptorHandler handler) async {
+    super.onError(err, handler);
+  }
+}

+ 31 - 34
packages/cs_plugin_basic/lib/service/user_service.dart

@@ -1,5 +1,5 @@
 import 'dart:core';
-import 'package:domain/entity/response/user_profile.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/repository/auth_repository.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
@@ -24,9 +24,7 @@ class UserService extends GetxService {
   //用户是否已经登录 - 可变字段
   Rx<bool> haslogin = false.obs;
   //用户详情信息 - 可变字段
-  Rx<UserProfile> userProfile = UserProfile().obs;
-  //用户密码的类型 - 可变字段
-  RxString passwordType = ''.obs;
+  Rx<HotelInfoEntity> hotelInfo = HotelInfoEntity().obs;
   //极光推送的 registrationId - 可变字段
   RxString registrationId = ''.obs;
   //当前用户的未读消息数量
@@ -34,11 +32,11 @@ class UserService extends GetxService {
 
   bool get hasToken => token?.isNotEmpty ?? false;
   bool get isLogin => haslogin.value;
-  UserProfile get getUserProfile => userProfile.value;
+  HotelInfoEntity get getHotelInfo => hotelInfo.value;
   String get getRegistrationId => registrationId.value;
   int get getUnreadNotificationsCount => unreadNotificationsCount.value;
 
-  /// 设置全局的Token,同时更新haslogin 的值,赋值时机如下
+  /// 设置全局的Token,同时更新 hasLogin 的值,赋值时机如下
   /*
       1. 在登录或注册成功的时候赋值
       2. 在main.dart中初始化的时候查询是否有Token,如果有的话需要赋值
@@ -58,45 +56,44 @@ class UserService extends GetxService {
     Log.d('UserService =========> 设置Token为:$token');
   }
 
-  /// 请求接口获取用户详情
-  Future<UserProfile?> fetchUserProfile() async {
-    //获取到数据
-    var result = await _authRepository.fetchUserProfile();
-
-    //处理数据
-    if (result.isSuccess) {
-      final userProfile = result.data;
-      if (userProfile != null) {
-        //赋值给Rx对象
-        this.userProfile.value = userProfile;
-        passwordType.value = userProfile.passwordType ?? '';
-
-        bus.emit(AppConstant.eventProfileRefreshFinish, true);
-        return userProfile;
-      } else {
-        bus.emit(AppConstant.eventProfileRefreshFinish, true);
-        return null;
-      }
-    } else {
-      SmartDialog.showToast(result.errorMsg ?? '');
-      bus.emit(AppConstant.eventProfileRefreshFinish, true);
-      return null;
-    }
-
-  }
+  // /// 请求接口获取用户详情
+  // Future<HotelInfoEntity?> fetchHotelInfo() async {
+  //   //获取到数据
+  //   var result = await _authRepository.fetchHotelInfo();
+  //
+  //   //处理数据
+  //   if (result.isSuccess) {
+  //     final userProfile = result.data;
+  //     if (userProfile != null) {
+  //       //赋值给Rx对象
+  //       this.hotelInfo.value = userProfile;
+  //       bus.emit(AppConstant.eventHotelInfoRefreshFinish, true);
+  //
+  //       return userProfile;
+  //     } else {
+  //       bus.emit(AppConstant.eventHotelInfoRefreshFinish, true);
+  //       return null;
+  //     }
+  //   } else {
+  //     SmartDialog.showToast(result.errorMsg ?? '');
+  //     bus.emit(AppConstant.eventHotelInfoRefreshFinish, true);
+  //     return null;
+  //   }
+  //
+  // }
 
   /// 处理退出登录之后的数据清除
   void handleLogoutParams() {
     SPUtil.remove(AppConstant.storageToken);
     haslogin.value = false;
-    userProfile.value = UserProfile();
+    hotelInfo.value = HotelInfoEntity();
   }
 
   @override
   void onInit() {
     super.onInit();
     String? token = SPUtil.getString(AppConstant.storageToken);
-    Log.d('UserService - 查询SP token:$token');
+    Log.d('UserService - 查询SP token:$token 并赋值' );
     setToken(token);
   }
 }

+ 1 - 2
packages/cs_plugin_platform/lib/engine/network/network_engine.dart

@@ -7,7 +7,6 @@ import 'package:flutter_image_compress/flutter_image_compress.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/reg_utils.dart';
 import 'dart:typed_data';
-import '../../http/dio/interceptor_auth_dio.dart';
 import '../../http/dio/interceptor_cache_controller.dart';
 import '../../http/dio/interceptor_network_debounce.dart';
 import '../../http/http_provider.dart';
@@ -41,7 +40,7 @@ class NetworkEngine {
 
     // 设置Dio的拦截器
     dio.interceptors.add(NetworkDebounceInterceptor()); //处理网络请求去重逻辑
-    dio.interceptors.add(AuthDioInterceptors()); //处理请求之前的请求头(项目业务逻辑)
+    // dio.interceptors.add(AuthDioInterceptors()); //处理请求之前的请求头(项目业务逻辑)
     // dio.interceptors.add(StatusCodeDioInterceptors()); //处理响应之后的状态码(项目业务逻辑)
     dio.interceptors.add(CacheControlInterceptor()); //处理 Http Get 请求缓存策略
 

+ 0 - 34
packages/cs_plugin_platform/lib/http/dio/interceptor_auth_dio.dart

@@ -1,34 +0,0 @@
-import 'package:dio/dio.dart';
-
-
-/*
- * 用户授权加密等相关处理的拦截器
- */
-class AuthDioInterceptors extends Interceptor {
-  @override
-  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
-
-    //拿到现有的Headers
-    Map<String, dynamic> headers = options.headers;
-
-    headers['accept'] = 'application/json';
-
-    // 设置需要添加平台信息,App版本信息等
-
-    // 每个接口添加自定义的设备UUID标识
-
-    //如果有通行令牌,都带上通行令牌
-
-    // 参数加密
-
-    // 通讯加密
-
-
-    //设置给Option对象
-    options.headers = headers;
-
-    super.onRequest(options, handler);
-  }
-
-
-}

+ 8 - 1
packages/cs_resources/lib/local/language/en_US.dart

@@ -3,6 +3,7 @@ const Map<String, String> en_US = {
   'Please enter your password': 'Please enter your password',
   'The login code cannot be empty!': 'The login code cannot be empty!',
   'The password cannot be empty!': 'The password cannot be empty!',
+  'The new password cannot be empty!': 'The new password cannot be empty!',
   'Log in': 'Log in',
   'Password': 'Password',
   'Email': 'Email',
@@ -48,7 +49,11 @@ const Map<String, String> en_US = {
   'Are you sure you need to exit the system?': 'Are you sure you need to exit the system?',
   'Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.':
       'Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.',
-
+  'Welcome': 'Welcome',
+  'Switch Projects': 'Switch Projects',
+  'Account Deactivation': 'Account Deactivation',
+  'Logout': 'Logout',
+  'Old Password': 'Old Password',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',
@@ -65,4 +70,6 @@ const Map<String, String> en_US = {
   'Data loading failed! Please refresh and try again': 'Data loading failed! Please refresh and try again',
   'There is currently no content available': 'There is currently no content available',
   'Click again and exit the app': 'Click again and exit the app',
+  'The login credential have expired, please log in again.': 'The login credentials have expired, please log in again.',
+  'Successful': 'Successful',
 };

+ 8 - 1
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -3,6 +3,7 @@ const Map<String, String> zh_CN = {
   'Please enter your password': '请输入您的密码',
   'The login code cannot be empty!': '登录账号不能为空!',
   'The password cannot be empty!': '密码不能为空!',
+  'The new password cannot be empty!': '新密码不能为空!',
   'Log in': '登录',
   'Password': '密码',
   'Email': '邮箱',
@@ -48,7 +49,11 @@ const Map<String, String> zh_CN = {
   'Are you sure you need to exit the system?': '你是否确定要退出系统?',
   'Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.':
       '你确定要停用你的帐户吗?一旦您继续请求,您将无法登录到该应用程序。',
-
+  'Welcome': '欢迎你',
+  'Switch Projects': '切换项目',
+  'Account Deactivation': '停用账户',
+  'Logout': '登出',
+  'Old Password': '旧密码',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',
@@ -64,4 +69,6 @@ const Map<String, String> zh_CN = {
   'Data loading failed! Please refresh and try again': '数据加载失败!请刷新并重试',
   'There is currently no content available': '当前没有可用数据',
   'Click again and exit the app': '再次点击,退出应用',
+  'The login credential have expired, please log in again.': '您的登录凭证已过期,请重新登录。',
+  'Successful': '成功',
 };

+ 2 - 0
packages/cs_router/lib/componentRouter/auth_service.dart

@@ -8,4 +8,6 @@ abstract class AuthService {
   void startPopAllLoginPage();
 
   void startResetPasswordPage();
+
+  void startPopAllMainPage();
 }