Parcourir la source

访客的创建表单

liukai il y a 1 semaine
Parent
commit
2dd91b38e3
24 fichiers modifiés avec 781 ajouts et 8 suppressions
  1. 1 1
      packages/cpt_main/lib/modules/home/home_view_model.g.dart
  2. 1 1
      packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.g.dart
  3. 3 1
      packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart
  4. 3 1
      packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart
  5. 305 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_page.dart
  6. 78 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_state.dart
  7. 139 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.dart
  8. 27 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.g.dart
  9. 2 0
      packages/cpt_main/lib/router/page/main_page_router.dart
  10. 20 0
      packages/cpt_main/lib/router/page/main_page_router.gr.dart
  11. BIN
      packages/cs_resources/assets/main/feedback_waiting_icon.webp
  12. BIN
      packages/cs_resources/assets/main/success_icon.webp
  13. BIN
      packages/cs_resources/assets/main/visitor_register_date.webp
  14. 3 0
      packages/cs_resources/lib/generated/assets.dart
  15. 19 0
      packages/cs_resources/lib/generated/intl/messages_en.dart
  16. 15 0
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  17. 15 0
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  18. 110 0
      packages/cs_resources/lib/generated/l10n.dart
  19. 11 0
      packages/cs_resources/lib/l10n/intl_en.arb
  20. 11 0
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  21. 11 0
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  22. 4 0
      packages/cs_router/lib/path/router_path.dart
  23. 0 1
      packages/cs_widgets/lib/my_load_image.dart
  24. 3 3
      packages/cs_widgets/lib/shatter/form_require_text.dart

+ 1 - 1
packages/cpt_main/lib/modules/home/home_view_model.g.dart

@@ -6,7 +6,7 @@ part of 'home_view_model.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$homeViewModelHash() => r'd9673254c6c42df4219e40fb9f7f49f89f7efffa';
+String _$homeViewModelHash() => r'9ad38aa4741b3216454b6652963eb10af930f3d8';
 
 /// See also [HomeViewModel].
 @ProviderFor(HomeViewModel)

+ 1 - 1
packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'management_guides_view_model.dart';
 // **************************************************************************
 
 String _$managementGuidesViewModelHash() =>
-    r'a3e25def771965687ff1aef7176fa1b569c49d61';
+    r'ece9e3ff3033f8bcccae545c543a58bbb083528e';
 
 /// See also [ManagementGuidesViewModel].
 @ProviderFor(ManagementGuidesViewModel)

+ 3 - 1
packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart

@@ -9,6 +9,8 @@ import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
+import '../register/visitor_register_page.dart';
+
 class VisitorNowLarge extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
@@ -33,7 +35,7 @@ class VisitorNowLarge extends StatelessWidget {
             ),
             MyButton(
               onPressed: () {
-                ToastEngine.show("去填写表单");
+                VisitorRegisterPage.startInstance(context: context);
               },
               text: S.current.visitor_registration,
               textColor: Colors.white,

+ 3 - 1
packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart

@@ -9,6 +9,8 @@ import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
+import '../register/visitor_register_page.dart';
+
 class VisitorNowSmall extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
@@ -30,7 +32,7 @@ class VisitorNowSmall extends StatelessWidget {
           ),
           MyButton(
             onPressed: (){
-              ToastEngine.show("去填写表单");
+              VisitorRegisterPage.startInstance(context: context);
             },
             text: S.current.visitor_registration,
             textColor: Colors.white,

+ 305 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_page.dart

@@ -0,0 +1,305 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+
+import '../../../router/page/main_page_router.dart';
+import 'visitor_register_state.dart';
+import 'visitor_register_view_model.dart';
+
+@RoutePage()
+class VisitorRegisterPage extends HookConsumerWidget {
+  const VisitorRegisterPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const VisitorRegisterPageRoute());
+    } else {
+      appRouter.push(const VisitorRegisterPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(visitorRegisterViewModelProvider.notifier);
+    final state = ref.watch(visitorRegisterViewModelProvider);
+    final noteCount = useState(0);
+   
+    return Scaffold(
+      appBar: MyAppBar.appBar(context, S.current.visitor_registration),
+      backgroundColor: context.appColors.whiteBG,
+      body: SingleChildScrollView(
+        scrollDirection: Axis.vertical,
+        physics: const BouncingScrollPhysics(),
+        child: Container(
+          margin: const EdgeInsets.symmetric(horizontal: 15),
+          width: double.infinity,
+          child: Column(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              //全名
+              FormRequireText(
+                text: S.current.full_name,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                marginTop: 16,
+                "full_name",
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                errorText: state.fullNameErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['phone']!['focusNode']);
+                },
+              ),
+
+              //移动电话
+              FormRequireText(
+                text: S.current.mobile_phone,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "phone",
+                marginTop: 16,
+                textInputType: TextInputType.phone,
+                textInputAction: TextInputAction.next,
+                errorText: state.phoneErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['nric']!['focusNode']);
+                },
+              ),
+
+              // 身份证
+              FormRequireText(
+                text: S.current.nric_fin,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "nric",
+                marginTop: 15,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                errorText: state.nricErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['plate_number']!['focusNode']);
+                },
+              ),
+
+              // 车牌号
+              MyTextView(
+                S.current.license_plate_number,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "plate_number",
+                marginTop: 15,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['access_date']!['focusNode']);
+                },
+              ),
+
+              // 通行时间
+              MyTextView(
+                S.current.access_date,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "access_date",
+                marginTop: 15,
+                enable: false,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                showRightIcon: true,
+                rightWidget: const MyAssetImage(Assets.mainVisitorRegisterDate, width: 21, height: 20).paddingOnly(top: 13, bottom: 13),
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['note']!['focusNode']);
+                },
+              ).onTap(() {
+                viewModel.pickAccessDate();
+              }),
+
+              // 备注
+              MyTextView(
+                S.current.notes,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              //大文本框
+              IgnoreKeyboardDismiss(
+                child: Container(
+                  height: 177,
+                  margin: const EdgeInsets.only(top: 16),
+                  padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                  decoration: BoxDecoration(
+                    color: context.appColors.authFiledBG,
+                    borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  ),
+                  child: Stack(
+                    children: [
+                      TextField(
+                        cursorColor: context.appColors.authFiledText,
+                        cursorWidth: 1.5,
+                        autofocus: false,
+                        enabled: true,
+                        focusNode: state.formData["note"]!['focusNode'],
+                        controller: state.formData["note"]!['controller'],
+                        decoration: InputDecoration(
+                          isDense: true,
+                          isCollapsed: true,
+                          border: InputBorder.none,
+                          hintText: state.formData["note"]!['hintText'],
+                          hintStyle: TextStyle(
+                            color: context.appColors.authFiledHint,
+                            fontSize: 16.0,
+                            fontWeight: FontWeight.w500,
+                          ),
+                        ),
+                        style: TextStyle(
+                          color: context.appColors.authFiledText,
+                          fontSize: 16.0,
+                          fontWeight: FontWeight.w500,
+                        ),
+                        textInputAction: TextInputAction.done,
+                        onSubmitted: (value) {
+                          FocusScope.of(context).unfocus();
+                          viewModel.submitVisitorRegister();
+                        },
+                        maxLines: null,
+                        expands: true,
+                        onChanged: (text) {
+                          // 当文本改变时,更新字符数量
+                          noteCount.value = text.length;
+                        },
+                      ),
+                      Positioned(
+                        bottom: 0.0,
+                        right: 0.0,
+                        child: Text(
+                          S.current.characters(noteCount.value),
+                          style: TextStyle(
+                            color: context.appColors.textBlack,
+                            fontSize: 15.0,
+                          ),
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+
+              MyButton(
+                onPressed: viewModel.submitVisitorRegister,
+                text: S.current.submit,
+                textColor: Colors.white,
+                backgroundColor: context.appColors.btnBgDefault,
+                fontWeight: FontWeight.w500,
+                type: ClickType.throttle,
+                fontSize: 16,
+                minHeight: 50,
+                radius: 5,
+              ).marginOnly(top: 25, bottom: 25),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+
+  /// 输入框
+  Widget _buildInputLayout(
+    BuildContext context,
+    VisitorRegisterState state,
+    String key, {
+    double marginTop = 0,
+    bool? showRightIcon = false, //是否展示右侧的布局
+    Widget? rightWidget, //右侧的布局
+    TextInputType textInputType = TextInputType.text,
+    String? errorText,
+    bool obscureText = false,
+    bool enable = true,
+    TextInputAction textInputAction = TextInputAction.done,
+    Function? onSubmit,
+  }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        state.formData[key]!['value'],
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: state.formData[key]!['controller'],
+        focusNode: state.formData[key]!['focusNode'],
+        margin: EdgeInsets.only(top: marginTop),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
+      ),
+    );
+  }
+}

+ 78 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_state.dart

@@ -0,0 +1,78 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/material.dart';
+
+class VisitorRegisterState {
+  //表单的校验与数据
+  final Map<String, Map<String, dynamic>> formData;
+
+  //表单的错误信息展示
+  String? fullNameErrorText;
+  String? phoneErrorText;
+  String? nricErrorText;
+
+  DateTime? accessDate; //通行时间
+
+  // ===================================  Begin  ↓  ===================================
+
+  VisitorRegisterState({
+    Map<String, Map<String, dynamic>>? formData,
+    this.fullNameErrorText,
+    this.phoneErrorText,
+    this.nricErrorText,
+    this.accessDate,
+  }) : formData = formData ??
+            {
+              'full_name': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'phone': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'nric': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'plate_number': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'access_date': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'note': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'hintText': S.current.type_here,
+                'obsecure': false,
+              },
+            };
+
+  VisitorRegisterState copyWith({
+    String? fullNameErrorText,
+    String? phoneErrorText,
+    String? nricErrorText,
+    DateTime? accessDate,
+  }) {
+    return VisitorRegisterState(
+      formData: this.formData,
+      fullNameErrorText: fullNameErrorText,
+      phoneErrorText: phoneErrorText,
+      nricErrorText: nricErrorText,
+      accessDate: accessDate ?? this.accessDate,
+    );
+  }
+}

+ 139 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.dart

@@ -0,0 +1,139 @@
+
+import 'package:cpt_main/modules/main/main_page.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'visitor_register_state.dart';
+part 'visitor_register_view_model.g.dart';
+
+@riverpod
+class VisitorRegisterViewModel extends _$VisitorRegisterViewModel {
+
+  @override
+  VisitorRegisterState build(){
+    final state = VisitorRegisterState();
+    initListener(state);
+    ref.onDispose(() {
+      onDispose(state);
+    });
+    return state;
+  }
+
+  //提交表单
+  void submitVisitorRegister() {
+    state = state.copyWith(
+      fullNameErrorText: null,
+      phoneErrorText: null,
+      nricErrorText: null,
+    );
+
+    final FocusNode fullNameFocusNode = state.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = state.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = state.formData['nric']!['focusNode'];
+    final FocusNode plateNumberFocusNode = state.formData['plate_number']!['focusNode'];
+    final FocusNode noteFocusNode = state.formData['note']!['focusNode'];
+
+    fullNameFocusNode.unfocus();
+    phoneFocusNode.unfocus();
+    nricFocusNode.unfocus();
+    plateNumberFocusNode.unfocus();
+    noteFocusNode.unfocus();
+
+    final TextEditingController fullNameController = state.formData['full_name']!['controller'];
+    final TextEditingController phoneController = state.formData['phone']!['controller'];
+    final TextEditingController nricController = state.formData['nric']!['controller'];
+    final TextEditingController plateNumberController = state.formData['plate_number']!['controller'];
+    final TextEditingController noteController = state.formData['note']!['controller'];
+
+    final fullName = fullNameController.text;
+    final phone = phoneController.text;
+    final nric = nricController.text;
+    final plateNumber = plateNumberController.text;
+    final note = noteController.text;
+    final accessDate = state.accessDate == null ?  null : DateTimeUtils.formatDate(state.accessDate!,format: 'yyyy-MM-dd');
+
+    Log.d('当前待提交的 fullName:$fullName phone:$phone nric:$nric plateNumber:$plateNumber note:$note accessDate:$accessDate');
+
+    if (Utils.isEmpty(fullName)) {
+      state = state.copyWith(fullNameErrorText: "Full Name cannot be empty!");
+      return;
+    }
+
+    if (Utils.isEmpty(phone)) {
+      state = state.copyWith(phoneErrorText: "Mobile Number cannot be empty!");
+      return;
+    }
+
+    if (Utils.isEmpty(nric)) {
+      state = state.copyWith(nricErrorText: "NRIC/FIN cannot be empty!");
+      return;
+    }
+
+    //执行密码登录
+    ToastEngine.show('准备执行请求发送验证码 fullName:$fullName phone:$phone nric:$nric plateNumber:$plateNumber note:$note accessDate:$accessDate');
+
+    //去首页
+    MainPage.startInstance();
+  }
+
+  //选择通行时间
+  void pickAccessDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.accessDate ?? DateTime.now(),
+      mode: CupertinoDatePickerMode.date,
+      onDateTimeChanged: (date) {
+       state = state.copyWith(accessDate: date);
+       final TextEditingController accessDateController = state.formData['access_date']!['controller'];
+       accessDateController.text = DateTimeUtils.formatDate(date,format: 'dd MMM yyyy');
+      },
+      title: S.current.access_date,
+    );
+  }
+
+  //初始化监听
+  void initListener(VisitorRegisterState initState) {
+    final FocusNode fullNameFocusNode = initState.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = initState.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = initState.formData['nric']!['focusNode'];
+
+    fullNameFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (fullNameFocusNode.hasFocus) {
+        state = state.copyWith(fullNameErrorText: null);
+      }
+    });
+
+    phoneFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (phoneFocusNode.hasFocus) {
+        state = state.copyWith(phoneErrorText: null);
+      }
+    });
+
+    nricFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (nricFocusNode.hasFocus) {
+        state = state.copyWith(nricErrorText: null);
+      }
+    });
+  }
+
+  //销毁资源
+  void onDispose(VisitorRegisterState initState) {
+    final FocusNode fullNameFocusNode = initState.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = initState.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = initState.formData['nric']!['focusNode'];
+    fullNameFocusNode.dispose();
+    phoneFocusNode.dispose();
+    nricFocusNode.dispose();
+
+    Log.d("VisitorRegisterViewModel 销毁 onDispose");
+  }
+
+}

+ 27 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'visitor_register_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$visitorRegisterViewModelHash() =>
+    r'efcd5105243eb7a8ec68d0ff5d428e7eb72fded0';
+
+/// See also [VisitorRegisterViewModel].
+@ProviderFor(VisitorRegisterViewModel)
+final visitorRegisterViewModelProvider = AutoDisposeNotifierProvider<
+    VisitorRegisterViewModel, VisitorRegisterState>.internal(
+  VisitorRegisterViewModel.new,
+  name: r'visitorRegisterViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$visitorRegisterViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$VisitorRegisterViewModel = AutoDisposeNotifier<VisitorRegisterState>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 2 - 0
packages/cpt_main/lib/router/page/main_page_router.dart

@@ -22,6 +22,7 @@ import '../../modules/home/latest_news/property/latest_news_property_screen.dart
 import '../../modules/home/latest_news/publish/latest_news_publish_screen.dart';
 import '../../modules/home/latest_news/latest_news_page.dart';
 import '../../modules/home/management_guides/management_guides_page.dart';
+import '../../modules/visitor/register/visitor_register_page.dart';
 
 part 'main_page_router.gr.dart';
 
@@ -73,5 +74,6 @@ class MainPageRouter extends _$MainPageRouter {
           ],
         ),
         CustomRoute(page: ManagementGuidesPageRoute.page, path: RouterPath.homeManagementGuides, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: VisitorRegisterPageRoute.page, path: RouterPath.visitorRegister, transitionsBuilder: applySlideTransition),
       ];
 }

+ 20 - 0
packages/cpt_main/lib/router/page/main_page_router.gr.dart

@@ -129,6 +129,12 @@ abstract class _$MainPageRouter extends RootStackRouter {
         child: const VisitorPage(),
       );
     },
+    VisitorRegisterPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const VisitorRegisterPage(),
+      );
+    },
   };
 }
 
@@ -397,3 +403,17 @@ class VisitorPageRoute extends PageRouteInfo<void> {
 
   static const PageInfo<void> page = PageInfo<void>(name);
 }
+
+/// generated route for
+/// [VisitorRegisterPage]
+class VisitorRegisterPageRoute extends PageRouteInfo<void> {
+  const VisitorRegisterPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorRegisterPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorRegisterPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}

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


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


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


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

@@ -54,6 +54,7 @@ class Assets {
   static const String mainFeedbackItemIcon = 'assets/main/feedback_item_icon.webp';
   static const String mainFeedbackSend = 'assets/main/feedback_send.webp';
   static const String mainFeedbackSendImg = 'assets/main/feedback_send_img.webp';
+  static const String mainFeedbackWaitingIcon = 'assets/main/feedback_waiting_icon.webp';
   static const String mainHomeBoticeBoardIcon = 'assets/main/home_botice_board_icon.webp';
   static const String mainHomeCommunityIcon = 'assets/main/home_community_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
@@ -81,6 +82,7 @@ class Assets {
   static const String mainNotificationItemIcon = 'assets/main/notification_item_icon.webp';
   static const String mainPropertyGuide = 'assets/main/property_guide.webp';
   static const String mainRolesGuide = 'assets/main/roles_guide.webp';
+  static const String mainSuccessIcon = 'assets/main/success_icon.webp';
   static const String mainTabFeedbackSelected = 'assets/main/tab_feedback_selected.webp';
   static const String mainTabFeedbackUnselected = 'assets/main/tab_feedback_unselected.webp';
   static const String mainTabHomeSelected = 'assets/main/tab_home_selected.webp';
@@ -93,6 +95,7 @@ class Assets {
   static const String mainVisitorHistory = 'assets/main/visitor_history.webp';
   static const String mainVisitorNow = 'assets/main/visitor_now.webp';
   static const String mainVisitorNowImg = 'assets/main/visitor_now_img.webp';
+  static const String mainVisitorRegisterDate = 'assets/main/visitor_register_date.webp';
   static const String noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';

+ 19 - 0
packages/cs_resources/lib/generated/intl/messages_en.dart

@@ -26,13 +26,18 @@ class MessageLookup extends MessageLookupByLibrary {
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images": MessageLookupByLibrary.simpleMessage(
+            "(Up to 10 images can be uploaded)"),
         "access_date": MessageLookupByLibrary.simpleMessage("Access Date"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "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."),
         "account_deactivation":
             MessageLookupByLibrary.simpleMessage("Account Deactivation"),
+        "administrator_reply":
+            MessageLookupByLibrary.simpleMessage("Administrator Reply"),
         "agree_to": MessageLookupByLibrary.simpleMessage("Agree to"),
         "alert": MessageLookupByLibrary.simpleMessage("Alert"),
+        "back_home": MessageLookupByLibrary.simpleMessage("Back Home"),
         "block": MessageLookupByLibrary.simpleMessage("Block"),
         "block_desc": MessageLookupByLibrary.simpleMessage(
             "Block refers to the street number of the unit\'s official mailing address"),
@@ -44,6 +49,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "change_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Change Mobile Phone"),
         "characters": m0,
+        "choose_category":
+            MessageLookupByLibrary.simpleMessage("Choose a Category"),
         "community": MessageLookupByLibrary.simpleMessage("Community"),
         "confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
         "confirm_new_password":
@@ -54,6 +61,8 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Create New FeedBack"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("Create New YY Home Account"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("Describe Your FeedBack"),
         "did_not_receive":
             MessageLookupByLibrary.simpleMessage("Did Not Receive?"),
         "email": MessageLookupByLibrary.simpleMessage("Email"),
@@ -141,11 +150,16 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Property Guide"),
         "property_news": MessageLookupByLibrary.simpleMessage("Property News"),
         "publish": MessageLookupByLibrary.simpleMessage("Publish"),
+        "published_successful_txt": MessageLookupByLibrary.simpleMessage(
+            "Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!"),
+        "published_successfully":
+            MessageLookupByLibrary.simpleMessage("Published Successfully"),
         "rate_us": MessageLookupByLibrary.simpleMessage("Rate Us"),
         "resend_code": MessageLookupByLibrary.simpleMessage("Resend Code"),
         "reset_password":
             MessageLookupByLibrary.simpleMessage("Reset Password"),
         "rewards": MessageLookupByLibrary.simpleMessage("Rewards"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("Send FeedBack"),
         "sent": MessageLookupByLibrary.simpleMessage("Sent"),
         "service": MessageLookupByLibrary.simpleMessage("Service"),
         "settings": MessageLookupByLibrary.simpleMessage("Settings"),
@@ -173,6 +187,7 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Terms & Conditions"),
         "terms_of_service":
             MessageLookupByLibrary.simpleMessage("Terms of Service"),
+        "title": MessageLookupByLibrary.simpleMessage("Title"),
         "tries_left": MessageLookupByLibrary.simpleMessage("Tries Left"),
         "type_here": MessageLookupByLibrary.simpleMessage("Type Here"),
         "unit_number": MessageLookupByLibrary.simpleMessage("Unit Number"),
@@ -185,6 +200,8 @@ class MessageLookup extends MessageLookupByLibrary {
             "(2)Tenancy Agreement Stamp Duty receipt"),
         "upload_documents":
             MessageLookupByLibrary.simpleMessage("Upload Documents"),
+        "upload_pictures":
+            MessageLookupByLibrary.simpleMessage("Upload Pictures"),
         "verification_code":
             MessageLookupByLibrary.simpleMessage("Verification Code"),
         "version_no": MessageLookupByLibrary.simpleMessage("Version No."),
@@ -195,6 +212,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "visitor_now": MessageLookupByLibrary.simpleMessage("Now"),
         "visitor_registration":
             MessageLookupByLibrary.simpleMessage("Visitor Registration"),
+        "waiting_for_the_administrator": MessageLookupByLibrary.simpleMessage(
+            "Waiting for the administrator"),
         "welcome_name": m1,
         "who_are_owners":
             MessageLookupByLibrary.simpleMessage("Who are owners?"),

+ 15 - 0
packages/cs_resources/lib/generated/intl/messages_zh_CN.dart

@@ -26,12 +26,16 @@ class MessageLookup extends MessageLookupByLibrary {
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images":
+            MessageLookupByLibrary.simpleMessage("(您最多可以上传10张图片)"),
         "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
+        "administrator_reply": MessageLookupByLibrary.simpleMessage("管理员回复"),
         "agree_to": MessageLookupByLibrary.simpleMessage("同意"),
         "alert": MessageLookupByLibrary.simpleMessage("提示"),
+        "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -41,6 +45,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m0,
+        "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
@@ -48,6 +53,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("描述您的反馈"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "email": MessageLookupByLibrary.simpleMessage("邮箱"),
         "enable_notification": MessageLookupByLibrary.simpleMessage("允许通知"),
@@ -116,10 +123,14 @@ class MessageLookup extends MessageLookupByLibrary {
         "property_guide": MessageLookupByLibrary.simpleMessage("物业指南"),
         "property_news": MessageLookupByLibrary.simpleMessage("资产新闻"),
         "publish": MessageLookupByLibrary.simpleMessage("公布"),
+        "published_successful_txt":
+            MessageLookupByLibrary.simpleMessage("您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!"),
+        "published_successfully": MessageLookupByLibrary.simpleMessage("发布成功"),
         "rate_us": MessageLookupByLibrary.simpleMessage("评价我们"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("奖励"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("发送反馈"),
         "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
@@ -141,6 +152,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "tenants_desc4": MessageLookupByLibrary.simpleMessage("管理员将相应地验证您的申请"),
         "terms_conditions": MessageLookupByLibrary.simpleMessage("服务条款"),
         "terms_of_service": MessageLookupByLibrary.simpleMessage("服务条款"),
+        "title": MessageLookupByLibrary.simpleMessage("标题"),
         "tries_left": MessageLookupByLibrary.simpleMessage("次尝试机会"),
         "type_here": MessageLookupByLibrary.simpleMessage("在此输入"),
         "unit_number": MessageLookupByLibrary.simpleMessage("单元"),
@@ -152,6 +164,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "upload_doc_desc2":
             MessageLookupByLibrary.simpleMessage("(2)租赁协议印花税收据"),
         "upload_documents": MessageLookupByLibrary.simpleMessage("上传文档"),
+        "upload_pictures": MessageLookupByLibrary.simpleMessage("上传图片"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
@@ -160,6 +173,8 @@ class MessageLookup extends MessageLookupByLibrary {
             "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
         "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
         "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
+        "waiting_for_the_administrator":
+            MessageLookupByLibrary.simpleMessage("等待管理员回复"),
         "welcome_name": m1,
         "who_are_owners": MessageLookupByLibrary.simpleMessage("怎样才算业主?"),
         "who_are_tenants": MessageLookupByLibrary.simpleMessage("怎样才算租户?"),

+ 15 - 0
packages/cs_resources/lib/generated/intl/messages_zh_HK.dart

@@ -26,12 +26,16 @@ class MessageLookup extends MessageLookupByLibrary {
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images":
+            MessageLookupByLibrary.simpleMessage("(您最多可以上传10张图片)"),
         "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
+        "administrator_reply": MessageLookupByLibrary.simpleMessage("管理员回复"),
         "agree_to": MessageLookupByLibrary.simpleMessage("同意"),
         "alert": MessageLookupByLibrary.simpleMessage("提示"),
+        "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -41,6 +45,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m0,
+        "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
@@ -48,6 +53,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("描述您的反馈"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "email": MessageLookupByLibrary.simpleMessage("邮箱"),
         "enable_notification": MessageLookupByLibrary.simpleMessage("允许通知"),
@@ -108,10 +115,14 @@ class MessageLookup extends MessageLookupByLibrary {
         "property_guide": MessageLookupByLibrary.simpleMessage("物业指南"),
         "property_news": MessageLookupByLibrary.simpleMessage("资产新闻"),
         "publish": MessageLookupByLibrary.simpleMessage("公布"),
+        "published_successful_txt":
+            MessageLookupByLibrary.simpleMessage("您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!"),
+        "published_successfully": MessageLookupByLibrary.simpleMessage("发布成功"),
         "rate_us": MessageLookupByLibrary.simpleMessage("评价我们"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("獎勵"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("发送反馈"),
         "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
@@ -128,6 +139,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "submit": MessageLookupByLibrary.simpleMessage("提交"),
         "terms_conditions": MessageLookupByLibrary.simpleMessage("服务条款"),
         "terms_of_service": MessageLookupByLibrary.simpleMessage("服务条款"),
+        "title": MessageLookupByLibrary.simpleMessage("标题"),
         "tries_left": MessageLookupByLibrary.simpleMessage("次尝试机会"),
         "type_here": MessageLookupByLibrary.simpleMessage("在此输入"),
         "unit_number": MessageLookupByLibrary.simpleMessage("单元"),
@@ -139,6 +151,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "upload_doc_desc2":
             MessageLookupByLibrary.simpleMessage("(2)租赁协议印花税收据"),
         "upload_documents": MessageLookupByLibrary.simpleMessage("上传文档"),
+        "upload_pictures": MessageLookupByLibrary.simpleMessage("上传图片"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
@@ -147,6 +160,8 @@ class MessageLookup extends MessageLookupByLibrary {
             "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
         "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
         "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
+        "waiting_for_the_administrator":
+            MessageLookupByLibrary.simpleMessage("等待管理员回复"),
         "welcome_name": m1,
         "yes": MessageLookupByLibrary.simpleMessage("是"),
         "you_have": MessageLookupByLibrary.simpleMessage("你还有"),

+ 110 - 0
packages/cs_resources/lib/generated/l10n.dart

@@ -1270,6 +1270,116 @@ class S {
     );
   }
 
+  /// `Choose a Category`
+  String get choose_category {
+    return Intl.message(
+      'Choose a Category',
+      name: 'choose_category',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Title`
+  String get title {
+    return Intl.message(
+      'Title',
+      name: 'title',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Describe Your FeedBack`
+  String get describe_your_feedback {
+    return Intl.message(
+      'Describe Your FeedBack',
+      name: 'describe_your_feedback',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Upload Pictures`
+  String get upload_pictures {
+    return Intl.message(
+      'Upload Pictures',
+      name: 'upload_pictures',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Send FeedBack`
+  String get send_feedback {
+    return Intl.message(
+      'Send FeedBack',
+      name: 'send_feedback',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `(Up to 10 images can be uploaded)`
+  String get Up_to_max_images {
+    return Intl.message(
+      '(Up to 10 images can be uploaded)',
+      name: 'Up_to_max_images',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Published Successfully`
+  String get published_successfully {
+    return Intl.message(
+      'Published Successfully',
+      name: 'published_successfully',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!`
+  String get published_successful_txt {
+    return Intl.message(
+      'Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!',
+      name: 'published_successful_txt',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Back Home`
+  String get back_home {
+    return Intl.message(
+      'Back Home',
+      name: 'back_home',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Waiting for the administrator`
+  String get waiting_for_the_administrator {
+    return Intl.message(
+      'Waiting for the administrator',
+      name: 'waiting_for_the_administrator',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Administrator Reply`
+  String get administrator_reply {
+    return Intl.message(
+      'Administrator Reply',
+      name: 'administrator_reply',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Other`
   String get other {
     return Intl.message(

+ 11 - 0
packages/cs_resources/lib/l10n/intl_en.arb

@@ -121,5 +121,16 @@
   "feedback_msg_2": "there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!",
   "create_new_feedback": "Create New FeedBack",
   "mark_all": "Mark All",
+  "choose_category": "Choose a Category",
+  "title": "Title",
+  "describe_your_feedback": "Describe Your FeedBack",
+  "upload_pictures": "Upload Pictures",
+  "send_feedback": "Send FeedBack",
+  "Up_to_max_images": "(Up to 10 images can be uploaded)",
+  "published_successfully": "Published Successfully",
+  "published_successful_txt": "Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!",
+  "back_home": "Back Home",
+  "waiting_for_the_administrator": "Waiting for the administrator",
+  "administrator_reply": "Administrator Reply",
   "other": "Other"
 }

+ 11 - 0
packages/cs_resources/lib/l10n/intl_zh_CN.arb

@@ -121,5 +121,16 @@
   "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
   "create_new_feedback": "创建新的反馈",
   "mark_all": "标记全部",
+  "choose_category": "选择类型",
+  "title": "标题",
+  "describe_your_feedback": "描述您的反馈",
+  "upload_pictures": "上传图片",
+  "send_feedback": "发送反馈",
+  "Up_to_max_images": "(您最多可以上传10张图片)",
+  "published_successfully": "发布成功",
+  "published_successful_txt": "您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!",
+  "back_home": "返回首页",
+  "waiting_for_the_administrator": "等待管理员回复",
+  "administrator_reply": "管理员回复",
   "other": "其他"
 }

+ 11 - 0
packages/cs_resources/lib/l10n/intl_zh_HK.arb

@@ -107,5 +107,16 @@
   "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
   "create_new_feedback": "创建新的反馈",
   "mark_all": "标记全部",
+  "choose_category": "选择类型",
+  "title": "标题",
+  "describe_your_feedback": "描述您的反馈",
+  "upload_pictures": "上传图片",
+  "send_feedback": "发送反馈",
+  "Up_to_max_images": "(您最多可以上传10张图片)",
+  "published_successfully": "发布成功",
+  "published_successful_txt": "您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!",
+  "back_home": "返回首页",
+  "waiting_for_the_administrator": "等待管理员回复",
+  "administrator_reply": "管理员回复",
   "other": "其他"
 }

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

@@ -26,6 +26,10 @@ class RouterPath {
   static const homePropertyNews = '/home/property/news';
   static const homeLatestNews = '/home/latest/news';
   static const homeManagementGuides = '/home/management/guides';
+  static const visitorRegister = '/visitor/register';
+  static const feedbackCreate = '/feedback/create';
+  static const feedbackCreateSuccess = '/feedback/create/success';
+  static const feedbackDetail = '/feedback/detail';
 
   //用户
   static const profileEdit = '/profile/edit';

+ 0 - 1
packages/cs_widgets/lib/my_load_image.dart

@@ -256,7 +256,6 @@ class MyAssetImage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     var finalPath = ImagePathUtils.getImgPath(image);
-    print("finalPath:$finalPath");
     return Image.asset(
       finalPath,
       package: 'cs_resources',

+ 3 - 3
packages/cs_widgets/lib/shatter/form_require_text.dart

@@ -6,8 +6,8 @@ import 'package:flutter/material.dart';
  */
 class FormRequireText extends StatelessWidget {
   final String text;
-  FontWeight? fontWeight = FontWeight.w400;
-  Color? textColor = Colors.white;
+  FontWeight? fontWeight;
+  Color? textColor = Colors.black;
   double? fontSize = 15.0;
 
   FormRequireText({required this.text, this.textColor, this.fontSize, this.fontWeight});
@@ -16,7 +16,7 @@ class FormRequireText extends StatelessWidget {
   Widget build(BuildContext context) {
     return RichText(
       text: TextSpan(
-        style: TextStyle(fontSize: fontSize, fontWeight: fontWeight, color: textColor),
+        style: TextStyle(fontSize: fontSize, fontWeight: fontWeight ?? FontWeight.w500, color: textColor),
         children: <TextSpan>[
           TextSpan(
             text: text,