Browse Source

主页与设置页面

liukai 8 months ago
parent
commit
ce9dafca95
47 changed files with 1406 additions and 302 deletions
  1. 26 18
      packages/cpt_auth/lib/modules/login/login_controller.dart
  2. 120 117
      packages/cpt_auth/lib/modules/login/login_page.dart
  3. 13 2
      packages/cpt_auth/lib/modules/login/login_state.dart
  4. 88 2
      packages/cpt_auth/lib/modules/main/main_controller.dart
  5. 44 0
      packages/cpt_auth/lib/modules/main/main_item_module.dart
  6. 95 69
      packages/cpt_auth/lib/modules/main/main_page.dart
  7. 19 0
      packages/cpt_auth/lib/modules/main/main_state.dart
  8. 41 0
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_controller.dart
  9. 133 0
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart
  10. 30 0
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_state.dart
  11. 45 0
      packages/cpt_auth/lib/modules/setting/setting_controller.dart
  12. 77 0
      packages/cpt_auth/lib/modules/setting/setting_page.dart
  13. 5 0
      packages/cpt_auth/lib/modules/setting/setting_state.dart
  14. 47 0
      packages/cpt_auth/lib/modules/sign_up/sign_up_controller.dart
  15. 145 0
      packages/cpt_auth/lib/modules/sign_up/sign_up_page.dart
  16. 40 0
      packages/cpt_auth/lib/modules/sign_up/sign_up_state.dart
  17. 9 1
      packages/cpt_auth/lib/router/auth_service_impl.dart
  18. 22 0
      packages/cpt_auth/lib/router/page_router.dart
  19. 3 0
      packages/cpt_job/lib/widget/attendance_sign_in_out.dart
  20. 16 0
      packages/cs_domain/lib/entity/home_module.dart
  21. BIN
      packages/cs_resources/assets/main/home_attendance_review.webp
  22. BIN
      packages/cs_resources/assets/main/home_devices.webp
  23. BIN
      packages/cs_resources/assets/main/home_job_list.webp
  24. BIN
      packages/cs_resources/assets/main/home_job_template.webp
  25. BIN
      packages/cs_resources/assets/main/home_labour_request.webp
  26. BIN
      packages/cs_resources/assets/main/home_labour_request_review.webp
  27. BIN
      packages/cs_resources/assets/main/home_report.webp
  28. BIN
      packages/cs_resources/assets/main/home_setting.webp
  29. BIN
      packages/cs_resources/assets/main/home_sign_in_out.webp
  30. BIN
      packages/cs_resources/assets/main/item_more_icon.webp
  31. BIN
      packages/cs_resources/assets/main/setting_account_delectivation.webp
  32. BIN
      packages/cs_resources/assets/main/setting_log_out.webp
  33. BIN
      packages/cs_resources/assets/main/setting_reset_password.webp
  34. BIN
      packages/cs_resources/assets/main/setting_switch_project.webp
  35. 2 0
      packages/cs_resources/lib/constants/color_constants.dart
  36. 14 0
      packages/cs_resources/lib/generated/assets.dart
  37. 26 3
      packages/cs_resources/lib/local/language/en_US.dart
  38. 29 6
      packages/cs_resources/lib/local/language/zh_CN.dart
  39. 1 0
      packages/cs_resources/pubspec.yaml
  40. 1 0
      packages/cs_router/lib/componentRouter/auth_service.dart
  41. 3 0
      packages/cs_router/lib/path/router_path.dart
  42. 151 74
      packages/cs_widgets/lib/dialog/app_default_dialog.dart
  43. 1 1
      packages/cs_widgets/lib/double_tap_back_exit_app.dart
  44. 8 9
      packages/cs_widgets/lib/my_appbar.dart
  45. 30 0
      packages/cs_widgets/lib/shatter/form_require_text.dart
  46. 75 0
      packages/cs_widgets/lib/shatter/round_my_text_field.dart
  47. 47 0
      packages/cs_widgets/lib/shatter/setting_item_container.dart

+ 26 - 18
packages/cpt_auth/lib/modules/login/login_controller.dart

@@ -1,3 +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/repository/auth_repository.dart';
 import 'package:get/get.dart';
@@ -14,43 +17,42 @@ class LoginController extends GetxController with DioCancelableMixin {
   final AuthRepository authRepository = Get.find();
   final LoginState state = LoginState();
 
-  bool pwdVisibility = false; //是否明文展示密码
-  String? codeErrorText; //表单的错误信息展示
-  String? passwordErrorText;
-  String? code; //待提交的表单数据
-  String? password;
-
   // 切换隐藏密码框
   void switchPwdVisibility() {
-    pwdVisibility = !pwdVisibility;
+    state.pwdVisibility = !state.pwdVisibility;
     update();
   }
 
   // 重置电话的错误文本
   void resetCodeErrorText() {
-    codeErrorText = null;
+    state.codeErrorText = null;
     update();
   }
 
   /// 执行账号密码的普通登录
   void doInputLogin() {
-    codeErrorText = null;
-    passwordErrorText = null;
+
+    //todo 测试
+    MainPage.startWithPopAll();
+    return;
+
+    state.codeErrorText = null;
+    state.passwordErrorText = null;
     update();
 
     var codeController = state.formData['code']!['controller'];
     var passwordController = state.formData['password']!['controller'];
 
-    code = codeController.text;
-    password = passwordController.text;
+    state.code = codeController.text;
+    state.password = passwordController.text;
 
-    Log.d('当前待提交的 code:$code password:$password');
+    Log.d('当前待提交的 code:${state.code} password:${state.password}');
 
-    if (Utils.isEmpty(code)) {
-      codeErrorText = "The login code cannot be empty!".tr;
+    if (Utils.isEmpty(state.code)) {
+      state.codeErrorText = "The email cannot be empty!".tr;
       update();
-    } else if (Utils.isEmpty(password)) {
-      passwordErrorText = "The password cannot be empty!".tr;
+    } else if (Utils.isEmpty(state.password)) {
+      state.passwordErrorText = "The password cannot be empty!".tr;
       update();
     } else {
       //执行密码登录
@@ -60,7 +62,7 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 请求接口执行登录
   void _request2LoginPassword() async {
-    var result = await authRepository.userLogin(code, password, registerId: "", cancelToken: cancelToken);
+    var result = await authRepository.userLogin(state.code, state.password, registerId: "", cancelToken: cancelToken);
 
     //处理数据
     if (result.isSuccess) {
@@ -88,4 +90,10 @@ class LoginController extends GetxController with DioCancelableMixin {
   void onReady() async {
     super.onReady();
   }
+
+  /// 跳转登录页面
+  void gotoSignUpPage() {
+    // SignUpPage.startInstance();
+    ResetPasswordPage.startInstance();
+  }
 }

+ 120 - 117
packages/cpt_auth/lib/modules/login/login_page.dart

@@ -1,5 +1,6 @@
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:get/get.dart';
@@ -102,132 +103,129 @@ class _MainPageState extends BaseState<LoginPage, LoginController> with StateLif
 
                 // 底部滚动的布局
                 SingleChildScrollView(
-                  scrollDirection: Axis.vertical,
-                  physics: const BouncingScrollPhysics(),
-                  child: Column(
-                    mainAxisSize: MainAxisSize.max,
-                    crossAxisAlignment: CrossAxisAlignment.center,
-                    children: [
-                      MyTextView(
-                        "Casual Labour System",
-                        textColor: ColorConstants.white,
-                        isFontBold: true,
-                        fontSize: 35,
-                        marginTop: 20,
-                        fontStyle: FontStyle.italic,
-                        textAlign: TextAlign.center,
-                        marginLeft: 50,
-                        marginRight: 50,
-                      ),
-
-                      //中间的输入框布局
-                      Container(
-                        width: double.infinity,
-                        margin: EdgeInsets.symmetric(vertical: 45, horizontal: 15),
-                        padding: EdgeInsets.symmetric(vertical: 33, horizontal: 20),
-                        decoration: BoxDecoration(
-                          color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
-                          borderRadius: BorderRadius.circular(5.0), // 设置圆角
+                    scrollDirection: Axis.vertical,
+                    physics: const BouncingScrollPhysics(),
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        MyTextView(
+                          "Casual Labour System",
+                          textColor: ColorConstants.white,
+                          isFontBold: true,
+                          fontSize: 35,
+                          marginTop: 20,
+                          fontStyle: FontStyle.italic,
+                          textAlign: TextAlign.center,
+                          marginLeft: 50,
+                          marginRight: 50,
                         ),
-                        child: Center(
-                          child: Column(
-                            crossAxisAlignment: CrossAxisAlignment.start,
-                            children: [
-                              //登录文本
-                              MyTextView(
-                                "Login Code".tr,
-                                isFontMedium: true,
-                                fontSize: 17,
-                                textColor: ColorConstants.white,
-                              ),
-
-                              // 登录表单 - 账号
-                              _buildInputLayout(
-                                "code",
-                                textInputAction: TextInputAction.next,
-                                errorText: controller.codeErrorText,
-                                onSubmit: (formKey, value) {
-                                  state.formData[formKey]!['focusNode'].unfocus();
-                                  FocusScope.of(context).requestFocus(state.formData['password']!['focusNode']);
-                                },
-                              ),
 
-                              //密码文本
-                              MyTextView(
-                                "Password".tr,
-                                isFontMedium: true,
-                                fontSize: 17,
-                                textColor: ColorConstants.white,
-                                marginTop: 18,
-                              ),
+                        //中间的输入框布局
+                        Container(
+                          width: double.infinity,
+                          margin: EdgeInsets.symmetric(vertical: 45, horizontal: 15),
+                          padding: EdgeInsets.symmetric(vertical: 33, horizontal: 20),
+                          decoration: BoxDecoration(
+                            color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                            borderRadius: BorderRadius.circular(5.0), // 设置圆角
+                          ),
+                          child: Center(
+                            child: Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                //登录文本
+                                MyTextView(
+                                  "Email".tr,
+                                  isFontMedium: true,
+                                  fontSize: 17,
+                                  textColor: ColorConstants.white,
+                                ),
 
-                              // 登录表单 - 密码
-                              _buildInputLayout(
-                                "password",
-                                obscureText: !controller.pwdVisibility,
-                                errorText: controller.passwordErrorText,
-                                showRightIcon: true,
-                                rightWidget: IconButton(
-                                  highlightColor: Colors.transparent,
-                                  splashColor: Colors.transparent,
-                                  icon: controller.pwdVisibility
-                                      ? const MyAssetImage(
-                                          Assets.cptAuthPasswordShowIcon,
-                                          width: 21,
-                                          height: 21,
-                                          color: ColorConstants.white,
-                                        )
-                                      : const MyAssetImage(
-                                          Assets.cptAuthPasswordHideIcon,
-                                          width: 21,
-                                          height: 21,
-                                          color: ColorConstants.white,
-                                        ),
-                                  onPressed: () {
-                                    controller.switchPwdVisibility();
+                                // 登录表单 - 账号
+                                _buildInputLayout(
+                                  "code",
+                                  textInputAction: TextInputAction.next,
+                                  errorText: state.codeErrorText,
+                                  onSubmit: (formKey, value) {
+                                    state.formData[formKey]!['focusNode'].unfocus();
+                                    FocusScope.of(context).requestFocus(state.formData['password']!['focusNode']);
                                   },
                                 ),
-                                onSubmit: (formKey, value) {
-                                  state.formData[formKey]!['focusNode'].unfocus();
-                                  controller.doInputLogin();
-                                },
-                              ),
 
-                              //选择签到功能还是全功能
-                              CustomRadioCheck(
-                                options: state.loginOption,
-                                onOptionSelected: (index, text) {
-                                  state.loginOptionPosition = index;
-                                },
-                              ).marginSymmetric(vertical: 20),
+                                //密码文本
+                                MyTextView(
+                                  "Password".tr,
+                                  isFontMedium: true,
+                                  fontSize: 17,
+                                  textColor: ColorConstants.white,
+                                  marginTop: 18,
+                                ),
 
-                              //登录按钮
-                              MyButton(
-                                type: ClickType.throttle,
-                                milliseconds: 500,
-                                onPressed: () {
-                                  FocusScope.of(context).unfocus();
-                                  controller.doInputLogin();
-                                },
-                                text: "Log in".tr,
-                                textColor: ColorConstants.white,
-                                fontSize: 16,
-                                radius: 22.5,
-                                backgroundColor: hexToColor("#FFBB1B"),
-                                fontWeight: FontWeight.w500,
-                              ),
+                                // 登录表单 - 密码
+                                _buildInputLayout(
+                                  "password",
+                                  obscureText: !state.pwdVisibility,
+                                  errorText: state.passwordErrorText,
+                                  showRightIcon: true,
+                                  rightWidget: IconButton(
+                                    highlightColor: Colors.transparent,
+                                    splashColor: Colors.transparent,
+                                    icon: state.pwdVisibility
+                                        ? const MyAssetImage(
+                                            Assets.cptAuthPasswordShowIcon,
+                                            width: 21,
+                                            height: 21,
+                                            color: ColorConstants.white,
+                                          )
+                                        : const MyAssetImage(
+                                            Assets.cptAuthPasswordHideIcon,
+                                            width: 21,
+                                            height: 21,
+                                            color: ColorConstants.white,
+                                          ),
+                                    onPressed: () {
+                                      controller.switchPwdVisibility();
+                                    },
+                                  ),
+                                  onSubmit: (formKey, value) {
+                                    state.formData[formKey]!['focusNode'].unfocus();
+                                    controller.doInputLogin();
+                                  },
+                                ),
 
-                              //注册入口
-                              _buildRichText(),
+                                //选择签到功能还是全功能
+                                CustomRadioCheck(
+                                  options: state.loginOption,
+                                  onOptionSelected: (index, text) {
+                                    state.loginOptionPosition = index;
+                                  },
+                                ).marginSymmetric(vertical: 20),
 
-                              //注册入口
-                            ],
-                          ),
-                        ), // 传递子部件
-                      ),
-                    ],
-                  )
-                ).expanded(),
+                                //登录按钮
+                                MyButton(
+                                  type: ClickType.throttle,
+                                  milliseconds: 500,
+                                  onPressed: () {
+                                    FocusScope.of(context).unfocus();
+                                    controller.doInputLogin();
+                                  },
+                                  text: "Log in".tr,
+                                  textColor: ColorConstants.white,
+                                  fontSize: 16,
+                                  radius: 22.5,
+                                  backgroundColor: hexToColor("#FFBB1B"),
+                                  fontWeight: FontWeight.w500,
+                                ),
+
+                                //注册入口
+                                _buildRichText(),
+                              ],
+                            ),
+                          ), // 传递子部件
+                        ),
+                      ],
+                    )).expanded(),
               ],
             ),
           ),
@@ -251,6 +249,11 @@ class _MainPageState extends BaseState<LoginPage, LoginController> with StateLif
             TextSpan(
               text: "Sign up".tr,
               style: TextStyle(color: ColorConstants.textYellowFFBB1B),
+              recognizer: TapGestureRecognizer()
+                ..onTap = () {
+                  //去登录页面
+                  controller.gotoSignUpPage();
+                },
             ),
           ],
         ),

+ 13 - 2
packages/cpt_auth/lib/modules/login/login_state.dart

@@ -3,12 +3,12 @@ import 'package:plugin_basic/basic_export.dart';
 
 class LoginState {
   //表单的校验与数据
-  Map<String, Map<String, dynamic>> formData = {
+  final Map<String, Map<String, dynamic>> formData = {
     'code': {
       'value': '',
       'controller': TextEditingController(),
       'focusNode': FocusNode(),
-      'hintText': 'Please enter your login code'.tr,
+      'hintText': 'Please enter your email'.tr,
       'obsecure': false,
     },
     'password': {
@@ -22,7 +22,18 @@ class LoginState {
 
   //登录的功能选项
   final loginOption = ['Sign in/Sign out'.tr, 'Admin'.tr];
+
   //登录选项默认选中索引为0
   int loginOptionPosition = 0;
 
+  //是否明文展示密码
+  bool pwdVisibility = false;
+
+  //表单的错误信息展示
+  String? codeErrorText;
+  String? passwordErrorText;
+
+  //待提交的表单数据
+  String? code;
+  String? password;
 }

+ 88 - 2
packages/cpt_auth/lib/modules/main/main_controller.dart

@@ -1,16 +1,102 @@
-
+import 'package:cpt_auth/modules/setting/setting_page.dart';
+import 'package:domain/entity/home_module.dart';
 import 'package:get/get.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 
 import 'main_state.dart';
 
 class MainController extends GetxController {
-
   final MainState state = MainState();
 
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: false,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    fetchHomeData();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _needShowPlaceholder = true;
+    fetchHomeData();
+  }
+
+  /// 获取首页的数据
+  void fetchHomeData() async {
+    //todo 这里需要调用接口实现
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    await Future.delayed(Duration(seconds: 1));
+
+    state.datas.clear();
+    state.datas.addAll(state.modules);
+    //更新状态
+    changeLoadingState(LoadState.State_Success);
+
+    refreshController.finishRefresh();
+
+    //最后赋值
+    _needShowPlaceholder = false;
+  }
 
   @override
   void onReady() async {
     super.onReady();
+    fetchHomeData();
+  }
+
+  /// 跳转到指定的模块中去
+  void gotoModulePage(HomeModule module) {
+    switch (module.moduleId) {
+      case '1':
+        ToastEngine.show("进入 Labour Request 模块");
+        break;
+      case '2':
+        ToastEngine.show("进入 Job List 模块");
+        break;
+      case '3':
+        ToastEngine.show("进入 Sign in Sign out 模块");
+        break;
+      case '4':
+        ToastEngine.show("进入 Devices 模块");
+        break;
+      case '5':
+        ToastEngine.show("进入 Labour Request Review 模块");
+        break;
+      case '6':
+        ToastEngine.show("进入 Attendance Review 模块");
+        break;
+      case '7':
+        ToastEngine.show("进入 Default Job Title 模块");
+        break;
+      case '8':
+        ToastEngine.show("进入 Report 模块");
+        break;
+    }
+  }
 
+  /// 跳转到设置页面
+  void gotoSettingPage() {
+    SettingPage.startInstance();
   }
 }

+ 44 - 0
packages/cpt_auth/lib/modules/main/main_item_module.dart

@@ -0,0 +1,44 @@
+// 自定义的模块项 Widget
+import 'package:domain/entity/home_module.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class ModuleItem extends StatelessWidget {
+  final HomeModule item;
+  final VoidCallback onTap;
+
+  ModuleItem(this.item, this.onTap);
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: onTap,
+      child: Container(
+        decoration: BoxDecoration(
+          color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+          borderRadius: BorderRadius.circular(7.5), // 设置圆角
+        ),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            // 模块的名称
+            MyTextView(
+              item.moduleName,
+              textColor: Colors.white,
+              isTextEllipsis: true,
+              maxLines: 2,
+              isFontBold: true,
+              margin: 20,
+              fontSize: 17,
+            ).constrained(minHeight: 80),
+            Center(
+              child: MyAssetImage(item.moduleIconPath, width: item.iconWidth, height: item.iconHeight),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 95 - 69
packages/cpt_auth/lib/modules/main/main_page.dart

@@ -1,21 +1,26 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
-import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 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/utils/ext_get_nav.dart';
-import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/local/theme/theme_config.dart';
-import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/path/router_path.dart';
 import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/screen_util.dart';
 import 'package:widgets/double_tap_back_exit_app.dart';
 import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_appbar.dart';
-import 'package:widgets/my_button.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+
 import 'main_controller.dart';
+import 'main_item_module.dart';
 import 'main_state.dart';
 
 /*
@@ -27,7 +32,7 @@ class MainPage extends BaseStatefulPage<MainController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.MAIN, launchModel: LaunchModel.singleTask);
+    return Get.start(RouterPath.MAIN);
   }
 
   static void startWithPopAll() {
@@ -92,73 +97,94 @@ class _MainPageState extends BaseState<MainPage, MainController> with StateLifec
         value: ThemeConfig.systemUiOverlayStyleLightThemeWhite,
         child: autoCtlGetBuilder(builder: (controller) {
           return Scaffold(
-            appBar: MyAppBar.appBar(context, "首页".tr, backCallback: () {
-              SmartDialog.showToast("你别点我了,没用!");
-            }),
             body: SafeArea(
               bottom: true,
               top: false,
               //真正的 Content 布局,使用PageView保存状态
-              child: Scrollbar(
-                  child: SingleChildScrollView(
-                child: Column(mainAxisSize: MainAxisSize.min, children: [
-                  MyButton(
-                    onPressed: () {
-
-                    },
-                    text: "去登陆页面",
-                    minWidth: 150,
-                    fontSize: 15,
-                    backgroundColor: ColorConstants.appBlue,
-                    textColor: ColorConstants.white,
-                    elevation: 3,
-                  ).center().marginOnly(top: 10),
-                  MyButton(
-                    onPressed: () {
-
-                    },
-                    text: "去设置页面",
-                    minWidth: 150,
-                    fontSize: 15,
-                    backgroundColor: ColorConstants.appBlue,
-                    textColor: ColorConstants.white,
-                    elevation: 3,
-                  ).center().marginOnly(top: 10),
-                  MyButton(
-                    onPressed: () {
-
-                    },
-                    text: "Form表单页面",
-                    minWidth: 150,
-                    fontSize: 15,
-                    backgroundColor: ColorConstants.appBlue,
-                    textColor: ColorConstants.white,
-                    elevation: 3,
-                  ).center().marginOnly(top: 10),
-                  MyButton(
-                    onPressed: () async {
-
-                    },
-                    text: "路由获取",
-                    minWidth: 150,
-                    fontSize: 15,
-                    backgroundColor: ColorConstants.appBlue,
-                    textColor: ColorConstants.white,
-                    elevation: 3,
-                  ).center().marginOnly(top: 10),
-                  MyButton(
-                    onPressed: () {
-
-                    },
-                    text: "申请多媒体权限,进入相册选择",
-                    minWidth: 150,
-                    fontSize: 15,
-                    backgroundColor: ColorConstants.appBlue,
-                    textColor: ColorConstants.white,
-                    elevation: 3,
-                  ).center().marginOnly(top: 10),
-                ]),
-              )),
+              child: Container(
+                width: double.infinity,
+                height: double.infinity,
+                padding: EdgeInsets.only(top: ScreenUtil.getStatusBarH(context)),
+                decoration: const BoxDecoration(
+                  gradient: LinearGradient(
+                    colors: [
+                      Color(0xFF091D44),
+                      Color(0xFF245A8A),
+                      Color(0xFF7F7CEC),
+                    ],
+                    begin: Alignment.topCenter,
+                    end: Alignment.bottomCenter,
+                  ),
+                ),
+                child: Column(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    Row(
+                      mainAxisSize: MainAxisSize.max,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        // 酒店的名字
+                        MyTextView(
+                          "Shangri-la Hotel",
+                          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,
+                    ),
+
+                    //底部的列表
+                    EasyRefresh(
+                      controller: controller.refreshController,
+                      onRefresh: controller.onRefresh,
+                      child: LoadStateLayout(
+                        state: controller.loadingState,
+                        errorMessage: controller.errorMessage,
+                        errorRetry: () {
+                          controller.retryRequest();
+                        },
+                        successSliverWidget: [
+                          //接口控制显示的模块
+                          SliverGrid(
+                            delegate: SliverChildBuilderDelegate(
+                              (context, index) {
+                                return ModuleItem(state.datas[index], () {
+                                  controller.gotoModulePage(state.datas[index]);
+                                });
+                              },
+                              childCount: state.datas.length,
+                            ),
+                            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                              crossAxisCount: 2, // 每行2个项目
+                              mainAxisSpacing: 5, // 主轴方向的间距
+                              crossAxisSpacing: 5, // 交叉轴方向的间距
+                              childAspectRatio: 171 / 161, // 子项目的宽高比
+                            ),
+                          ),
+                        ],
+                      ),
+                    ).expanded(),
+                  ],
+                ).paddingSymmetric(horizontal: 15, vertical: 17),
+              ),
             ),
           );
         }),

+ 19 - 0
packages/cpt_auth/lib/modules/main/main_state.dart

@@ -1,5 +1,24 @@
 
 
+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),
+  ];
+
 }

+ 41 - 0
packages/cpt_auth/lib/modules/reset_psd/reset_psd_controller.dart

@@ -0,0 +1,41 @@
+import 'package:get/get.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+
+import 'reset_psd_state.dart';
+
+class ResetPasswordController extends GetxController {
+  final ResetPasswordState state = ResetPasswordState();
+
+  //执行注册操作
+  void doResetPassword() {
+    state.passwordErrorText = null;
+    state.confirmPasswordErrorText = null;
+    update();
+
+    var passwordController = state.formData['new_password']!['controller'];
+    var confirmController = state.formData['confirm_password']!['controller'];
+
+    state.password = passwordController.text;
+    state.confirmPassword = confirmController.text;
+
+    Log.d('当前待提交的 password:${state.password} confirmPassword:${state.confirmPassword}');
+
+    if (Utils.isEmpty(state.password)) {
+      state.passwordErrorText = "The 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) {
+      state.confirmPasswordErrorText = "Please confirm your confirmed password!".tr;
+      update();
+    } else {
+      //执行密码登录
+      _request2ResetPassword();
+    }
+  }
+
+  // 调用接口重置密码
+  void _request2ResetPassword() {}
+}

+ 133 - 0
packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart

@@ -0,0 +1,133 @@
+import 'package:cpt_auth/modules/reset_psd/reset_psd_controller.dart';
+import 'package:cpt_auth/modules/reset_psd/reset_psd_state.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/shatter/round_my_text_field.dart';
+
+class ResetPasswordPage extends BaseStatefulPage<ResetPasswordController> {
+  ResetPasswordPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.AUTH_RESET_PSD);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+
+  @override
+  ResetPasswordController createRawController() {
+    return ResetPasswordController();
+  }
+
+  @override
+  State<ResetPasswordPage> createState() => _SignUpState();
+
+}
+
+class _SignUpState extends BaseState<ResetPasswordPage, ResetPasswordController> {
+
+  late ResetPasswordState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Reset Password".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: SingleChildScrollView(
+              scrollDirection: Axis.vertical,
+              physics: const BouncingScrollPhysics(),
+              child: Column(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  //密码的设置
+                  FormRequireText(text: "New Password".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "new_password",
+                    formData: state.formData,
+                    errorText: state.passwordErrorText,
+                    onSubmit: (key, value) {
+                      state.formData[key]!['focusNode'].unfocus();
+                      FocusScope.of(context).requestFocus(state.formData['confirm_password']!['focusNode']);
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //确认密码的设置
+                  FormRequireText(text: "Confirm Password".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "confirm_password",
+                    formData: state.formData,
+                    errorText: state.confirmPasswordErrorText,
+                    textInputAction: TextInputAction.done,
+                    onSubmit: (key, value) {
+                      FocusScope.of(context).unfocus();
+                      controller.doResetPassword();
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //提交按钮
+                  MyButton(
+                    type: ClickType.throttle,
+                    milliseconds: 500,
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      controller.doResetPassword();
+                    },
+                    text: "Submit".tr,
+                    textColor: ColorConstants.white,
+                    fontSize: 16,
+                    radius: 22.5,
+                    backgroundColor: hexToColor("#FFBB1B"),
+                    fontWeight: FontWeight.w500,
+                  ).marginSymmetric(horizontal: 15, vertical: 25),
+                ],
+              ),
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

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

@@ -0,0 +1,30 @@
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class ResetPasswordState {
+  //表单的校验与数据
+  Map<String, Map<String, dynamic>> formData = {
+    'new_password': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter your new password'.tr,
+      'obsecure': true,
+    },
+    'confirm_password': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter confirm password'.tr,
+      'obsecure': true,
+    },
+  };
+
+  //表单的错误信息展示
+  String? passwordErrorText;
+  String? confirmPasswordErrorText;
+
+  //待提交的数据
+  String? password;
+  String? confirmPassword;
+}

+ 45 - 0
packages/cpt_auth/lib/modules/setting/setting_controller.dart

@@ -0,0 +1,45 @@
+import 'package:cpt_auth/modules/reset_psd/reset_psd_page.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/dialog/app_default_dialog.dart';
+
+import 'setting_state.dart';
+
+class SettingController extends GetxController {
+  final SettingState state = SettingState();
+
+  //切换账号
+  void switchProjects() {
+    ToastEngine.show("切换账号");
+  }
+
+  //去重置密码页面
+  void gotoResetPasswordPage() {
+    ResetPasswordPage.startInstance();
+  }
+
+  //确定删除账号
+  void doAccountDelete() {
+    DialogEngine.show(
+        widget: AppDefaultDialog(
+      title: "Confirmation".tr,
+      message: "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.".tr,
+      confirmAction: () {
+        ToastEngine.show("确定删除账号");
+      },
+    ));
+  }
+
+  //确定退出登录
+  void doLogout() {
+    DialogEngine.show(
+        widget: AppDefaultDialog(
+      title: "Confirmation".tr,
+      message: "Are you sure you need to exit the system?".tr,
+      confirmAction: () {
+        ToastEngine.show("确定退出登录");
+      },
+    ));
+  }
+}

+ 77 - 0
packages/cpt_auth/lib/modules/setting/setting_page.dart

@@ -0,0 +1,77 @@
+import 'package:cpt_auth/modules/setting/setting_state.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/base/base_stateless_page.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/shatter/setting_item_container.dart';
+
+import 'setting_controller.dart';
+
+class SettingPage extends BaseStatelessPage<SettingController> {
+  SettingPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.SETTINGS);
+  }
+
+  late SettingState state;
+
+  @override
+  void initState() {
+    state = controller.state;
+  }
+
+  @override
+  SettingController createRawController() {
+    return SettingController();
+  }
+
+  @override
+  Widget buildWidget(BuildContext context) {
+    return Scaffold(
+      extendBodyBehindAppBar: true,
+      appBar: MyAppBar.appBar(context, "Settings".tr),
+      body: SafeArea(
+        bottom: true,
+        top: false,
+        child: Container(
+          width: double.infinity,
+          height: double.infinity,
+          padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+          decoration: const BoxDecoration(
+            gradient: LinearGradient(
+              colors: [
+                Color(0xFF091D44),
+                Color(0xFF245A8A),
+                Color(0xFF7F7CEC),
+              ],
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+            ),
+          ),
+          child: Column(children: [
+            SizedBox(height: 10),
+            SettingItemContainer(iconPath: Assets.mainSettingSwitchProject, title: "Switch Projects".tr).onTap(() {
+              controller.switchProjects();
+            }),
+            SettingItemContainer(iconPath: Assets.mainSettingResetPassword, title: "Reset Password".tr).onTap(() {
+              controller.gotoResetPasswordPage();
+            }),
+            SettingItemContainer(iconPath: Assets.mainSettingAccountDelectivation, title: "Account Deactivation".tr).onTap(() {
+              controller.doAccountDelete();
+            }),
+            SettingItemContainer(iconPath: Assets.mainSettingLogOut, title: "Logout".tr).onTap(() {
+              controller.doLogout();
+            }),
+          ]),
+        ),
+      ),
+    );
+  }
+}

+ 5 - 0
packages/cpt_auth/lib/modules/setting/setting_state.dart

@@ -0,0 +1,5 @@
+class SettingState {
+  SettingState() {
+    ///Initialize variables
+  }
+}

+ 47 - 0
packages/cpt_auth/lib/modules/sign_up/sign_up_controller.dart

@@ -0,0 +1,47 @@
+import 'package:get/get.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+
+import 'sign_up_state.dart';
+
+class SignUpController extends GetxController {
+  final SignUpState state = SignUpState();
+
+  //执行注册操作
+  void doSignUp() {
+    state.emailErrorText = null;
+    state.passwordErrorText = null;
+    state.confirmPasswordErrorText = null;
+    update();
+
+    var emailController = state.formData['email']!['controller'];
+    var passwordController = state.formData['password']!['controller'];
+    var confirmController = state.formData['confirm_password']!['controller'];
+
+    state.email = emailController.text;
+    state.password = passwordController.text;
+    state.confirmPassword = confirmController.text;
+
+    Log.d('当前待提交的 email:${state.email} password:${state.password} confirmPassword:${state.confirmPassword}');
+
+    if (Utils.isEmpty(state.email)) {
+      state.emailErrorText = "The email cannot be empty!".tr;
+      update();
+    } else if (Utils.isEmpty(state.password)) {
+      state.passwordErrorText = "The 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) {
+      state.confirmPasswordErrorText = "Please confirm your confirmed password!".tr;
+      update();
+    } else {
+      //执行密码登录
+      _request2Signup();
+    }
+  }
+
+  // 调用接口注册
+  void _request2Signup() {}
+}

+ 145 - 0
packages/cpt_auth/lib/modules/sign_up/sign_up_page.dart

@@ -0,0 +1,145 @@
+import 'package:cpt_auth/modules/sign_up/sign_up_controller.dart';
+import 'package:cpt_auth/modules/sign_up/sign_up_state.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/shatter/round_my_text_field.dart';
+
+class SignUpPage extends BaseStatefulPage<SignUpController> {
+  SignUpPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.AUTH_SIGNUP);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+
+  @override
+  SignUpController createRawController() {
+    return SignUpController();
+  }
+
+  @override
+  State<SignUpPage> createState() => _SignUpState();
+}
+
+class _SignUpState extends BaseState<SignUpPage, SignUpController> {
+  late SignUpState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Sign up".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: SingleChildScrollView(
+              scrollDirection: Axis.vertical,
+              physics: const BouncingScrollPhysics(),
+              child: Column(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  //邮箱的设置
+                  FormRequireText(text: "Email".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "email",
+                    formData: state.formData,
+                    errorText: state.emailErrorText,
+                    onSubmit: (key, value) {
+                      state.formData[key]!['focusNode'].unfocus();
+                      FocusScope.of(context).requestFocus(state.formData['password']!['focusNode']);
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //密码的设置
+                  FormRequireText(text: "Password".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "password",
+                    formData: state.formData,
+                    errorText: state.passwordErrorText,
+                    onSubmit: (key, value) {
+                      state.formData[key]!['focusNode'].unfocus();
+                      FocusScope.of(context).requestFocus(state.formData['confirm_password']!['focusNode']);
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //确认密码的设置
+                  FormRequireText(text: "Confirm Password".tr).marginOnly(left: 15, top: 19),
+
+                  CustomTextField(
+                    formKey: "confirm_password",
+                    formData: state.formData,
+                    errorText: state.confirmPasswordErrorText,
+                    textInputAction: TextInputAction.done,
+                    onSubmit: (key, value) {
+                      FocusScope.of(context).unfocus();
+                      controller.doSignUp();
+                    },
+                    marginTop: 10,
+                  ),
+
+                  //注册按钮
+                  MyButton(
+                    type: ClickType.throttle,
+                    milliseconds: 500,
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      controller.doSignUp();
+                    },
+                    text: "Submit".tr,
+                    textColor: ColorConstants.white,
+                    fontSize: 16,
+                    radius: 22.5,
+                    backgroundColor: hexToColor("#FFBB1B"),
+                    fontWeight: FontWeight.w500,
+                  ).marginSymmetric(horizontal: 15, vertical: 25),
+                ],
+              ),
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 40 - 0
packages/cpt_auth/lib/modules/sign_up/sign_up_state.dart

@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class SignUpState {
+  //表单的校验与数据
+  Map<String, Map<String, dynamic>> formData = {
+    'email': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter your email'.tr,
+      'obsecure': false,
+    },
+    'password': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter your password'.tr,
+      'obsecure': true,
+    },
+    'confirm_password': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Please enter confirm password'.tr,
+      'obsecure': true,
+    },
+  };
+
+  //表单的错误信息展示
+  String? emailErrorText;
+  String? passwordErrorText;
+  String? confirmPasswordErrorText;
+
+  //待提交的数据
+  String? email;
+  String? password;
+  String? confirmPassword;
+
+}

+ 9 - 1
packages/cpt_auth/lib/router/auth_service_impl.dart

@@ -1,10 +1,10 @@
 import 'package:cpt_auth/modules/login/login_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';
 import 'package:shared/utils/log_utils.dart';
 
 class AuthServiceImpl extends GetxService implements AuthService {
-
   @override
   void onInit() {
     super.onInit();
@@ -19,13 +19,21 @@ class AuthServiceImpl extends GetxService implements AuthService {
     Log.d("AuthServiceImpl 销毁资源");
   }
 
+  //默认启动登录页面
   @override
   void startLoginPage() {
     LoginPage.startInstance();
   }
 
+  //启动登录页面并关闭其他全部页面
   @override
   void startPopAllLoginPage() {
     LoginPage.startWithPopAll();
   }
+
+  //默认启动重置密码页面
+  @override
+  void startResetPasswordPage() {
+    ResetPasswordPage.startInstance();
+  }
 }

+ 22 - 0
packages/cpt_auth/lib/router/page_router.dart

@@ -1,9 +1,12 @@
+import 'package:cpt_auth/modules/setting/setting_page.dart';
+import 'package:cpt_auth/modules/sign_up/sign_up_page.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
 import '../modules/login/login_page.dart';
 import '../modules/main/main_page.dart';
+import '../modules/reset_psd/reset_psd_page.dart';
 
 class AuthPageRouter {
   static final routes = [
@@ -18,5 +21,24 @@ class AuthPageRouter {
       name: RouterPath.AUTH_LOGIN,
       page: () => LoginPage(),
     ),
+
+    //注册
+    GetPage(
+      name: RouterPath.AUTH_SIGNUP,
+      page: () => SignUpPage(),
+    ),
+
+    //重置密码
+    GetPage(
+      name: RouterPath.AUTH_RESET_PSD,
+      page: () => ResetPasswordPage(),
+    ),
+
+    //重置密码
+    GetPage(
+      name: RouterPath.SETTINGS,
+      page: () => SettingPage(),
+    ),
+
   ];
 }

+ 3 - 0
packages/cpt_job/lib/widget/attendance_sign_in_out.dart

@@ -11,6 +11,9 @@ import 'package:cs_resources/constants/color_constants.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
 
+/**
+ * 签到签出的签名弹窗
+ */
 class AttendanceSignInOut extends StatelessWidget {
   VoidCallback? cancelAction;
   void Function(ByteData byteData)? confirmAction;

+ 16 - 0
packages/cs_domain/lib/entity/home_module.dart

@@ -0,0 +1,16 @@
+class HomeModule {
+  final String moduleId;
+  final String moduleName;
+  final String moduleIconPath;
+  final double iconWidth;
+  final double iconHeight;
+
+  HomeModule({
+    required this.moduleId,
+    required this.moduleName,
+    required this.moduleIconPath,
+    required this.iconWidth,
+    required this.iconHeight,
+  });
+
+}

BIN
packages/cs_resources/assets/main/home_attendance_review.webp


BIN
packages/cs_resources/assets/main/home_devices.webp


BIN
packages/cs_resources/assets/main/home_job_list.webp


BIN
packages/cs_resources/assets/main/home_job_template.webp


BIN
packages/cs_resources/assets/main/home_labour_request.webp


BIN
packages/cs_resources/assets/main/home_labour_request_review.webp


BIN
packages/cs_resources/assets/main/home_report.webp


BIN
packages/cs_resources/assets/main/home_setting.webp


BIN
packages/cs_resources/assets/main/home_sign_in_out.webp


BIN
packages/cs_resources/assets/main/item_more_icon.webp


BIN
packages/cs_resources/assets/main/setting_account_delectivation.webp


BIN
packages/cs_resources/assets/main/setting_log_out.webp


BIN
packages/cs_resources/assets/main/setting_reset_password.webp


BIN
packages/cs_resources/assets/main/setting_switch_project.webp


+ 2 - 0
packages/cs_resources/lib/constants/color_constants.dart

@@ -14,6 +14,7 @@ class ColorConstants {
   static const Color black = Color(0xFF000000);
   static const Color white = Color(0xFFFFFFFF);
   static const Color dividerA6 = Color(0x4da6a6a6);
+  static const Color dividerBar = Color(0x334DCFF6);
   static const Color dividerItem = Color(0xffEDF0F3);
   static const Color appBlue = Color(0xff0689fb);
   static const Color blue1578fe = Color(0xFF1578FE);
@@ -22,6 +23,7 @@ class ColorConstants {
   static const Color whitefe = Color(0xffFEFEFE);
   static const Color greye0 = Color(0xffE0E0E0);
   static const Color textGrayAECAE5 = Color(0xFFAECAE5);
+  static const Color textGray9EB0C1 = Color(0xFF9EB0C1);
   static const Color textYellowFFBB1B = Color(0xFFFFBB1B);
 
   //黑暗模式的一些色值

+ 14 - 0
packages/cs_resources/lib/generated/assets.dart

@@ -18,5 +18,19 @@ class Assets {
   static const String cptJobArrawUpIcon = 'assets/cpt_job/arraw_up_icon.webp';
   static const String cptJobExportIcon = 'assets/cpt_job/export_icon.webp';
   static const String cptJobSearchIcon = 'assets/cpt_job/search_icon.webp';
+  static const String mainHomeAttendanceReview = 'assets/main/home_attendance_review.webp';
+  static const String mainHomeDevices = 'assets/main/home_devices.webp';
+  static const String mainHomeJobList = 'assets/main/home_job_list.webp';
+  static const String mainHomeJobTemplate = 'assets/main/home_job_template.webp';
+  static const String mainHomeLabourRequest = 'assets/main/home_labour_request.webp';
+  static const String mainHomeLabourRequestReview = 'assets/main/home_labour_request_review.webp';
+  static const String mainHomeReport = 'assets/main/home_report.webp';
+  static const String mainHomeSetting = 'assets/main/home_setting.webp';
+  static const String mainHomeSignInOut = 'assets/main/home_sign_in_out.webp';
+  static const String mainItemMoreIcon = 'assets/main/item_more_icon.webp';
+  static const String mainSettingAccountDelectivation = 'assets/main/setting_account_delectivation.webp';
+  static const String mainSettingLogOut = 'assets/main/setting_log_out.webp';
+  static const String mainSettingResetPassword = 'assets/main/setting_reset_password.webp';
+  static const String mainSettingSwitchProject = 'assets/main/setting_switch_project.webp';
 
 }

+ 26 - 3
packages/cs_resources/lib/local/language/en_US.dart

@@ -1,12 +1,11 @@
 const Map<String, String> en_US = {
   'app_name': 'YYBusiness',
-  'Please enter your login code': 'Please enter your login code',
   '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!',
   'Log in': 'Log in',
-  'Login Code': 'Login Code',
   'Password': 'Password',
+  'Email': 'Email',
   'Name/Mobile': 'Name/Mobile',
   'Check In': 'Check In',
   'Check Out': 'Check Out',
@@ -26,8 +25,32 @@ const Map<String, String> en_US = {
   'Admin': 'Admin',
   'Don’t have an account?': 'Don’t have an account?',
   'Sign up': 'Sign up',
+  'Confirm Password': 'Confirm Password',
+  'Please enter your email': 'Please enter your email',
+  'Please enter confirm password': 'Please enter confirm password',
+  'Submit': 'Submit',
+  'The email cannot be empty!': 'The email cannot be empty!',
+  'The confirm password cannot be empty!': 'The confirm password cannot be empty!',
+  'Please confirm your confirmed password!': 'Please confirm your confirmed password!',
+  'Reset Password': 'Reset Password',
+  'New Password': 'New Password',
+  'Please enter your new password': 'Please enter your new password',
+  'Labour Request': 'Labour Request',
+  'Job List': 'Job List',
+  'Sign in Sign out': 'Sign in Sign out',
+  'Devices': 'Devices',
+  'Labour Request Review': 'Labour Request Review',
+  'Attendance Review': 'Attendance Review',
+  'Default Job Title': 'Default Job Title',
+  'Report': 'Report',
+  'Confirmation': 'Confirmation',
+  'Notice': 'Notice',
+  '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.',
 
 
+  //插件的国际化
   'Pull to refresh': 'Pull to refresh',
   'Release ready': 'Release ready',
   'Refreshing...': 'Refreshing...',
@@ -41,5 +64,5 @@ const Map<String, String> en_US = {
   'Loading...': 'Loading...',
   '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',
 };

+ 29 - 6
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -1,12 +1,11 @@
 const Map<String, String> zh_CN = {
   'app_name': 'YYBusiness',
-  'Please enter your login code': '请输入您的登录账号',
   'Please enter your password': '请输入您的密码',
-  'The login code cannot be empty!': '登录账号不能为空',
-  'The password cannot be empty!': '密码不能为空',
+  'The login code cannot be empty!': '登录账号不能为空',
+  'The password cannot be empty!': '密码不能为空',
   'Log in': '登录',
-  'Login Code': '登录账号',
   'Password': '密码',
+  'Email': '邮箱',
   'Name/Mobile': '请输入姓名或电话',
   'Check In': '签到',
   'Check Out': '签出',
@@ -25,9 +24,33 @@ const Map<String, String> zh_CN = {
   'Sign in/Sign out': '签到/签出',
   'Admin': '管理员',
   'Don’t have an account?': '没有账号?',
-  'Sign up': '点击注册',
+  'Sign up': '注册账号',
+  'Confirm Password': '确认密码',
+  'Please enter your email': '请输入您的邮箱',
+  'Please enter confirm password': '请输入确认密码',
+  'Submit': '提交',
+  'The email cannot be empty!': '邮箱不能为空!',
+  'The confirm password cannot be empty!': '确认密码不能为空!',
+  'Please confirm your confirmed password!': '请确认您的确认密码!',
+  'Reset Password': '重置密码',
+  'New Password': '新密码',
+  'Please enter your new password': '请输入您的新密码',
+  'Labour Request': '用工申请',
+  'Job List': '工作列表',
+  'Sign in Sign out': '签到与签出',
+  'Devices': '设备',
+  'Labour Request Review': '用工申请审核',
+  'Attendance Review': '考勤审核',
+  'Default Job Title': '用工申请模版',
+  'Report': '报表',
+  'Confirmation': '确认',
+  'Notice': '提示',
+  '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.':
+      '你确定要停用你的帐户吗?一旦您继续请求,您将无法登录到该应用程序。',
 
 
+  //插件的国际化
   'Pull to refresh': '下拉刷新',
   'Release ready': '释放刷新',
   'Refreshing...': '刷新中...',
@@ -36,9 +59,9 @@ const Map<String, String> zh_CN = {
   'Failed': '失败',
   'Last updated at %T': '最近更新于 %T',
   'Pull to load': '上拉加载',
-
   'Network Load Error': '网络加载错误',
   'Loading...': '加载中...',
   'Data loading failed! Please refresh and try again': '数据加载失败!请刷新并重试',
   'There is currently no content available': '当前没有可用数据',
+  'Click again and exit the app': '再次点击,退出应用',
 };

+ 1 - 0
packages/cs_resources/pubspec.yaml

@@ -26,3 +26,4 @@ flutter:
     - assets/base_service/
     - assets/cpt_auth/
     - assets/cpt_job/
+    - assets/main/

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

@@ -7,4 +7,5 @@ abstract class AuthService {
 
   void startPopAllLoginPage();
 
+  void startResetPasswordPage();
 }

+ 3 - 0
packages/cs_router/lib/path/router_path.dart

@@ -5,11 +5,14 @@ class RouterPath {
 
   static const GUIDE = '/guide'; //指引页面
 
+  //用户
   static const AUTH_LOGIN = '/auth/login';  //用户登录注册
   static const AUTH_SIGNUP = '/auth/signup'; //注册
+  static const AUTH_RESET_PSD = '/auth/rest_psd'; //重置密码
 
   //首页
   static const MAIN = '/main';
+  static const SETTINGS = '/settings';
 
 
   //工作-签到签出

+ 151 - 74
packages/cs_widgets/lib/dialog/app_default_dialog.dart

@@ -9,86 +9,83 @@ import '../my_text_view.dart';
 import '../no_shadow_scroll_behavior.dart';
 import '../utils/dark_theme_util.dart';
 
+import 'dart:typed_data';
+import 'dart:ui';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:get/get.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+
+/**
+ * 签到签出的签名弹窗
+ */
 class AppDefaultDialog extends StatelessWidget {
-  VoidCallback? cancelAction;
-  VoidCallback? confirmAction;
-  String? cancelText;
-  String? confirmText;
-  String? title;
+  String title;
   String message;
+  VoidCallback confirmAction;
+  VoidCallback? cancelAction;
 
-  AppDefaultDialog(this.message, {this.cancelText, this.cancelAction, this.confirmText, this.confirmAction, this.title});
+  AppDefaultDialog({
+    required this.title,
+    required this.message,
+    required this.confirmAction,
+    this.cancelAction,
+  });
 
   @override
   Widget build(BuildContext context) {
+    //使用一个 Column 为最外层容器,可以方便的视线 wrap_content 的效果
     return Column(
       crossAxisAlignment: CrossAxisAlignment.center,
       mainAxisAlignment: MainAxisAlignment.center,
       children: [
-        //Title
+        //Title (如果使用 Container 为最外层容器则默认为 match_parent 的效果,除非我们限制宽度和最大高度最小高度)
         Container(
+          width: double.infinity,
           decoration: BoxDecoration(
-            color: DarkThemeUtil.multiColors(ColorConstants.appBlue, darkColor: ColorConstants.darkBlackItemLight),
-            borderRadius: const BorderRadius.only(
-              topLeft: Radius.circular(5),
-              topRight: Radius.circular(5),
-            ),
+            color: Colors.white,
+            borderRadius: const BorderRadius.all(Radius.circular(15)),
           ),
-          padding: const EdgeInsets.only(left: 30, right: 10, top: 5, bottom: 5),
-          child: Row(
+          child: Column(
             children: [
-              Expanded(
-                child: MyTextView(
-                  title ?? "提示".tr,
-                  fontSize: 18,
-                  marginTop: 14,
-                  marginBottom: 14,
-                  isFontMedium: true,
-                  textColor: ColorConstants.whitefe,
-                  textAlign: TextAlign.center,
-                ),
-              ),
-              //Cancel
-              InkWell(
-                onTap: onCancel,
-                child: MyLoadImage(
-                  Assets.baseLibDialogDeleteIcon,
-                  width: 26,
-                  height: 26,
-                ),
+              MyTextView(
+                title,
+                fontSize: 19,
+                isFontMedium: true,
+                textColor: ColorConstants.black,
+                marginTop: 15,
+                marginBottom: 15,
               ),
-            ],
-          ),
-        ),
 
-        DecoratedBox(
-          decoration: BoxDecoration(
-            color: DarkThemeUtil.multiColors(Colors.white, darkColor: ColorConstants.darkBlackItemLightMost),
-            borderRadius: const BorderRadius.only(
-              bottomLeft: Radius.circular(5),
-              bottomRight: Radius.circular(5),
-            ),
-          ),
-          child: Column(
-            children: [
-              //文本的高度限制,加入滚动并去除边界波纹效果
-              ScrollConfiguration(
+              Scrollbar(
+                child: ScrollConfiguration(
                   behavior: NoShadowScrollBehavior(),
                   child: SingleChildScrollView(
                     child: MyTextView(
                       message,
                       fontSize: 16,
-                      textColor: DarkThemeUtil.multiColors(const Color(0xff333333), darkColor: Colors.white),
+                      textColor: Colors.black,
                       isFontRegular: true,
                       textAlign: TextAlign.center,
                       paddingLeft: 30,
                       paddingRight: 30,
-                      paddingBottom: 25,
-                      marginTop: 25,
                     ),
-                  )).marginSymmetric(vertical: 10).constrained(maxHeight: 400),
+                  ),
+                ),
+              ).constrained(maxHeight: 210),
+
 
-              //Buttons
+              Container(
+                margin: EdgeInsets.only(top: 25),
+                color: Color(0XFFCECECE),
+                height: 0.5,
+              ),
               Row(
                 children: [
                   Expanded(
@@ -99,49 +96,129 @@ class AppDefaultDialog extends StatelessWidget {
                           cancelAction?.call();
                         },
                         child: MyTextView(
-                          cancelText ?? "Cancel".tr,
-                          marginLeft: 20,
-                          marginBottom: 35,
-                          paddingTop: 10,
-                          paddingBottom: 10,
-                          fontSize: 14,
-                          isFontRegular: true,
+                          "Cancel".tr,
+                          fontSize: 17.5,
+                          isFontMedium: true,
                           textAlign: TextAlign.center,
-                          textColor: DarkThemeUtil.multiColors(ColorConstants.blue1578fe, darkColor: Colors.white),
-                          borderColor: DarkThemeUtil.multiColors(ColorConstants.blue1578fe, darkColor: Colors.white),
+                          textColor: Color(0XFF0085C4),
                           cornerRadius: 3,
                           borderWidth: 1,
                         ),
                       )),
+                  Container(
+                    color: Color(0xff09141F).withOpacity(0.13),
+                    width: 0.5,
+                  ),
                   Expanded(
                       flex: 1,
                       child: InkWell(
-                        onTap: () {
+                        onTap: () async {
                           onCancel();
-                          confirmAction?.call();
+                          confirmAction();
                         },
                         child: MyTextView(
-                          confirmText ?? "Confirm".tr,
+                          "Confirm".tr,
                           marginLeft: 10,
-                          paddingTop: 10,
-                          paddingBottom: 10,
-                          fontSize: 14,
-                          isFontRegular: true,
-                          marginRight: 20,
-                          marginBottom: 35,
+                          fontSize: 17.5,
+                          isFontMedium: true,
                           textAlign: TextAlign.center,
-                          textColor: Colors.white,
-                          backgroundColor: ColorConstants.blue1578fe,
+                          textColor: Color(0XFF0085C4),
                           cornerRadius: 3,
                         ),
                       )),
                 ],
-              ),
+              ).constrained(height: 46),
             ],
           ),
         ),
       ],
     ).constrained(width: 295);
+
+    // return Container(
+    //   width: 283,
+    //   decoration: BoxDecoration(
+    //     color: Colors.white, // 设置背景颜色
+    //     borderRadius: BorderRadius.circular(15), // 设置圆角
+    //   ),
+    //   child: Column(
+    //     children: [
+    //       MyTextView(
+    //         title,
+    //         fontSize: 19,
+    //         isFontMedium: true,
+    //         textColor: ColorConstants.black,
+    //         marginTop: 15,
+    //         marginBottom: 12,
+    //       ),
+    //
+    //       ScrollConfiguration(
+    //           behavior: NoShadowScrollBehavior(),
+    //           child: SingleChildScrollView(
+    //             child: MyTextView(
+    //               message,
+    //               fontSize: 15,
+    //               textColor: Colors.black,
+    //               isFontMedium: true,
+    //               textAlign: TextAlign.center,
+    //               paddingLeft: 30,
+    //               paddingRight: 30,
+    //               paddingBottom: 20,
+    //               marginTop: 20,
+    //               marginBottom: 25,
+    //             ),
+    //           )).marginSymmetric(vertical: 10).constrained(maxHeight: 400),
+    //
+    //       Container(
+    //         color: Color(0XFFCECECE),
+    //         height: 0.5,
+    //       ),
+    //
+    //       //Buttons
+    //       Row(
+    //         children: [
+    //           Expanded(
+    //               flex: 1,
+    //               child: InkWell(
+    //                 onTap: () {
+    //                   onCancel();
+    //                   cancelAction?.call();
+    //                 },
+    //                 child: MyTextView(
+    //                   "Cancel".tr,
+    //                   fontSize: 17.5,
+    //                   isFontMedium: true,
+    //                   textAlign: TextAlign.center,
+    //                   textColor: Color(0XFF0085C4),
+    //                   cornerRadius: 3,
+    //                   borderWidth: 1,
+    //                 ),
+    //               )),
+    //           Container(
+    //             color: Color(0XFFCECECE),
+    //             width: 0.5,
+    //           ),
+    //           Expanded(
+    //               flex: 1,
+    //               child: InkWell(
+    //                 onTap: () async {
+    //                   onCancel();
+    //                   confirmAction();
+    //                 },
+    //                 child: MyTextView(
+    //                   "Confirm".tr,
+    //                   marginLeft: 10,
+    //                   fontSize: 17.5,
+    //                   isFontMedium: true,
+    //                   textAlign: TextAlign.center,
+    //                   textColor: Color(0XFF0085C4),
+    //                   cornerRadius: 3,
+    //                 ),
+    //               )),
+    //         ],
+    //       ).expanded(),
+    //     ],
+    //   ),
+    // ).constrained(maxHeight: 295);
   }
 
   //取消弹框

+ 1 - 1
packages/cs_widgets/lib/double_tap_back_exit_app.dart

@@ -34,7 +34,7 @@ class _DoubleTapBackExitAppState extends State<DoubleTapBackExitApp> {
   Future<bool> _isExit() async {
     if (_lastTime == null || DateTime.now().difference(_lastTime!) > widget.duration) {
       _lastTime = DateTime.now();
-      SmartDialog.showToast("再次返回,退出应用!".tr);
+      SmartDialog.showToast("Click again and exit the app".tr);
       return Future.value(false);
     }
     // ToastUtil.cancelToast();

+ 8 - 9
packages/cs_widgets/lib/my_appbar.dart

@@ -14,21 +14,19 @@ class MyAppBar {
       String? backIconPath,
       double? backIconWidth,
       double? backIconHeight,
-      Color textColor = Colors.black,
-      Color backgroundColor = Colors.white,
+      Color textColor = Colors.white,
+      Color backgroundColor = Colors.transparent,
       SystemUiOverlayStyle? systemUiOverlayStyle,
       List<Widget>? actions}) {
     return AppBar(
       //设置变色与背景颜色一致,避免滚动的时候AppBar变色
-      backgroundColor: DarkThemeUtil.multiColors(backgroundColor, darkColor: ColorConstants.darkBlackItem),
-      surfaceTintColor: DarkThemeUtil.multiColors(backgroundColor, darkColor: ColorConstants.darkBlackItem),
+      backgroundColor: backgroundColor,
+      surfaceTintColor: backgroundColor,
       systemOverlayStyle: systemUiOverlayStyle,
       leading: Container(
         padding: const EdgeInsets.only(top: 3.5),
         child: IconButton(
-          icon: Get.isDarkMode
-              ? MyAssetImage(backIconPath ?? Assets.baseLibWhiteBack, width: backIconWidth ?? 11, height: backIconHeight ?? 18)
-              : MyAssetImage(backIconPath ?? Assets.baseLibBlackBack, width: backIconWidth ?? 11, height: backIconHeight ?? 18),
+          icon: MyAssetImage(backIconPath ?? Assets.baseLibWhiteBack, width: backIconWidth ?? 11, height: backIconHeight ?? 18),
           onPressed: () {
             if (backCallback != null) {
               backCallback();
@@ -42,7 +40,7 @@ class MyAppBar {
       centerTitle: true,
       title: Text(
         title,
-        style: TextStyle(color: Get.isDarkMode ? Colors.white : textColor, fontSize: 18, fontWeight: FontWeight.w600),
+        style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.w500),
       ),
       actions: actions,
       elevation: 0.0,
@@ -51,7 +49,7 @@ class MyAppBar {
           child: Divider(
             height: 0.5,
             indent: 0.0,
-            color: DarkThemeUtil.multiColors(ColorConstants.dividerA6, darkColor: ColorConstants.darkBlackItemDivider),
+            color: ColorConstants.dividerBar,
           )),
     );
   }
@@ -66,6 +64,7 @@ class MyAppBar {
     return SizedBox(width: width);
   }
 
+
   /// 带搜索的AppBar
   static AppBar appSearchBar(BuildContext context,
       {void Function()? backCallback,

+ 30 - 0
packages/cs_widgets/lib/shatter/form_require_text.dart

@@ -0,0 +1,30 @@
+import 'package:flutter/material.dart';
+
+/**
+ * 表单中必填的文本描述,文本后加红色*标识
+ * 使用富文本的方式实现
+ */
+class FormRequireText extends StatelessWidget {
+
+  final String text;
+
+  FormRequireText({required this.text});
+
+  @override
+  Widget build(BuildContext context) {
+    return RichText(
+      text: TextSpan(
+        style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.w400, color: Colors.white),
+        children: <TextSpan>[
+          TextSpan(
+            text: text,
+          ),
+          TextSpan(
+            text: " *",
+            style: TextStyle(color: Colors.red),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 75 - 0
packages/cs_widgets/lib/shatter/round_my_text_field.dart

@@ -0,0 +1,75 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
+
+import '../my_text_field.dart';
+
+/**
+ * 基于 MyTextField 实现圆角背景的文本框表单。
+ *
+ * 主要用于注册,忘记密码等页面。
+ */
+class CustomTextField extends StatelessWidget {
+  final String formKey;
+  final double marginTop;
+  final double marginLeft;
+  final double marginRight;
+  final double paddingRight;
+  final double paddingLeft;
+  final TextInputType textInputType;
+  final String? errorText;
+  final TextInputAction textInputAction;
+  final Function onSubmit;
+  final Map<String, dynamic> formData;
+
+  CustomTextField({
+    required this.formKey,
+    required this.formData,
+    required this.onSubmit,
+    this.marginTop = 0,
+    this.marginLeft = 15,
+    this.marginRight = 15,
+    this.paddingRight = 15,
+    this.paddingLeft = 15,
+    this.textInputType = TextInputType.text,
+    this.errorText,
+    this.textInputAction = TextInputAction.next,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        formKey,
+        formData[formKey]!['value'],
+        hintText: formData[formKey]!['hintText'],
+        hintStyle: const TextStyle(
+          color: ColorConstants.textGrayAECAE5,
+          fontSize: 15.0,
+          fontWeight: FontWeight.w400,
+        ),
+        controller: formData[formKey]['controller'],
+        focusNode: formData[formKey]['focusNode'],
+        margin: EdgeInsets.only(left: marginLeft, right: marginRight, top: marginTop),
+        showDivider: false,
+        fillBackgroundColor: ColorConstants.dividerBar,
+        fillCornerRadius: 5,
+        padding: EdgeInsets.only(left: paddingLeft, right: paddingRight, top: 2.5, bottom: 2.5),
+        height: 50,
+        style: TextStyle(
+          color: ColorConstants.white,
+          fontSize: 15.0,
+          fontWeight: FontWeight.w400,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: ColorConstants.white,
+        obscureText: formData[formKey] != null ? formData[formKey]['obsecure'] : false,
+        errorText: errorText,
+        showLeftIcon: false,
+        showRightIcon: false,
+      ),
+    );
+  }
+}

+ 47 - 0
packages/cs_widgets/lib/shatter/setting_item_container.dart

@@ -0,0 +1,47 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/**
+ * 设置页面的Item容器,左侧图标,中间文本,右侧箭头
+ */
+class SettingItemContainer extends StatelessWidget {
+  final String iconPath;
+  final String title;
+
+  SettingItemContainer({required this.iconPath, required this.title});
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      height: 60,
+      margin: EdgeInsets.symmetric(vertical: 5, horizontal: 15),
+      padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16.5),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5.0), // 设置圆角
+      ),
+      child: Row(
+        mainAxisSize: MainAxisSize.max,
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          MyAssetImage(iconPath, width: 30.2, height: 30.2),
+          MyTextView(
+            title,
+            isFontRegular: true,
+            fontSize: 14,
+            marginLeft: 11,
+            marginRight: 11,
+            textColor: ColorConstants.textGrayAECAE5,
+          ).expanded(),
+          MyAssetImage(Assets.mainItemMoreIcon, width: 7.5, height: 13.5),
+        ],
+      ),
+    );
+  }
+}