Browse Source

main首页中visitor与feedbak的一级页面。
创建PageView与自定义Row的关联模版。
窗口LoadView与Refresh列表刷新加载更多的模版。

liukai 1 week ago
parent
commit
fdbd505bd9
62 changed files with 2451 additions and 405 deletions
  1. 0 6
      app/lib/main.dart
  2. 6 0
      app/lib/router/component/app_component_service_impl.dart
  3. 280 0
      packages/cpt_main/lib/modules/demo_page.dart
  4. 130 0
      packages/cpt_main/lib/modules/feedback/feedback_page.dart
  5. 56 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history.dart
  6. 31 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_state.dart
  7. 131 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.dart
  8. 27 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.g.dart
  9. 75 0
      packages/cpt_main/lib/modules/feedback/item_feedback.dart
  10. 0 77
      packages/cpt_main/lib/modules/feedback/page/feedback_page.dart
  11. 56 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress.dart
  12. 31 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_state.dart
  13. 130 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.dart
  14. 28 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.g.dart
  15. 18 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send.dart
  16. 58 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send_large.dart
  17. 55 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send_small.dart
  18. 11 0
      packages/cpt_main/lib/modules/home/home_page.dart
  19. 1 1
      packages/cpt_main/lib/modules/home/home_view_model.g.dart
  20. 1 1
      packages/cpt_main/lib/modules/home/item_home_category.dart
  21. 1 1
      packages/cpt_main/lib/modules/home/item_home_last_news.dart
  22. 1 1
      packages/cpt_main/lib/modules/home/item_home_last_trans.dart
  23. 1 1
      packages/cpt_main/lib/modules/home/item_home_manage_guide.dart
  24. 1 1
      packages/cpt_main/lib/modules/home/item_home_property_news.dart
  25. 1 1
      packages/cpt_main/lib/modules/main/main_state.dart
  26. 56 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active.dart
  27. 31 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_state.dart
  28. 133 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.dart
  29. 27 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.g.dart
  30. 55 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history.dart
  31. 31 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_state.dart
  32. 133 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.dart
  33. 27 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.g.dart
  34. 97 0
      packages/cpt_main/lib/modules/visitor/item_visitor.dart
  35. 22 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now.dart
  36. 52 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart
  37. 48 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart
  38. 109 257
      packages/cpt_main/lib/modules/visitor/visitor_page.dart
  39. 36 15
      packages/cpt_main/lib/router/page/main_page_router.dart
  40. 120 0
      packages/cpt_main/lib/router/page/main_page_router.gr.dart
  41. 2 1
      packages/cs_plugin_basic/lib/provider/app_config/app_config_service.dart
  42. BIN
      packages/cs_resources/assets/main/feedback_history.webp
  43. BIN
      packages/cs_resources/assets/main/feedback_in_progress.webp
  44. BIN
      packages/cs_resources/assets/main/feedback_item_icon.webp
  45. BIN
      packages/cs_resources/assets/main/feedback_send.webp
  46. BIN
      packages/cs_resources/assets/main/feedback_send_img.webp
  47. BIN
      packages/cs_resources/assets/main/visitor_active.webp
  48. BIN
      packages/cs_resources/assets/main/visitor_history.webp
  49. BIN
      packages/cs_resources/assets/main/visitor_now.webp
  50. BIN
      packages/cs_resources/assets/main/visitor_now_img.webp
  51. 9 0
      packages/cs_resources/lib/generated/assets.dart
  52. 30 6
      packages/cs_resources/lib/generated/intl/messages_en.dart
  53. 26 6
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  54. 26 6
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  55. 160 0
      packages/cs_resources/lib/generated/l10n.dart
  56. 16 0
      packages/cs_resources/lib/l10n/intl_en.arb
  57. 16 0
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  58. 16 0
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  59. 17 1
      packages/cs_resources/lib/theme/app_colors_theme.dart
  60. 2 0
      packages/cs_router/lib/componentRouter/app_service.dart
  61. 20 19
      packages/cs_widgets/lib/load_state_layout.dart
  62. 4 4
      packages/cs_widgets/lib/responsive_widget.dart

+ 0 - 6
app/lib/main.dart

@@ -74,9 +74,6 @@ class MyApp extends HookConsumerWidget {
           noMoreText: 'No more',
           noMoreText: 'No more',
           failedText: 'Failed',
           failedText: 'Failed',
           messageText: 'Last updated at %T',
           messageText: 'Last updated at %T',
-          textStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
-          messageStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
-          iconTheme: IconThemeData(color: Color(0XFFAECAE5)),
           backgroundColor: Colors.transparent,
           backgroundColor: Colors.transparent,
         );
         );
     EasyRefresh.defaultFooterBuilder = () => const ClassicFooter(
     EasyRefresh.defaultFooterBuilder = () => const ClassicFooter(
@@ -90,9 +87,6 @@ class MyApp extends HookConsumerWidget {
           showMessage: false,
           showMessage: false,
           triggerOffset: 50,
           triggerOffset: 50,
           iconDimension: 22,
           iconDimension: 22,
-          textStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
-          messageStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
-          iconTheme: IconThemeData(color: Color(0XFFAECAE5)),
           backgroundColor: Colors.transparent,
           backgroundColor: Colors.transparent,
         );
         );
 
 

+ 6 - 0
app/lib/router/component/app_component_service_impl.dart

@@ -3,6 +3,7 @@
  */
  */
 import 'package:app/router/page/app_page_router.dart';
 import 'package:app/router/page/app_page_router.dart';
 import 'package:auto_route/src/router/controller/routing_controller.dart';
 import 'package:auto_route/src/router/controller/routing_controller.dart';
+import 'package:plugin_basic/provider/app_config/app_config_service.dart';
 import 'package:router/componentRouter/app_service.dart';
 import 'package:router/componentRouter/app_service.dart';
 
 
 class AppComponentServiceImpl extends AppService {
 class AppComponentServiceImpl extends AppService {
@@ -10,4 +11,9 @@ class AppComponentServiceImpl extends AppService {
   RootStackRouter getAppRouter() {
   RootStackRouter getAppRouter() {
     return appRouter;
     return appRouter;
   }
   }
+
+  @override
+  bool isDeviceFullScreen() {
+    return AppConfigService.getState().isFullScreenDevice;
+  }
 }
 }

+ 280 - 0
packages/cpt_main/lib/modules/demo_page.dart

@@ -0,0 +1,280 @@
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:cs_resources/theme/theme_config.dart';
+import 'package:cs_resources/theme/theme_notifier.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
+import 'package:plugin_platform/engine/cache/local_cache_manager.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/directory/directory_util.dart';
+import 'package:plugin_platform/engine/image/image_preview.dart';
+import 'package:plugin_platform/engine/media/image_picker_utils.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/sp/sp_util.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/dialog/app_default_dialog.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+import 'package:widgets/picker/option_pick_util.dart';
+import 'package:plugin_platform/platform_export.dart';
+
+
+class DemoPage extends HookConsumerWidget {
+  const DemoPage({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final _userService = UserConfigService.getInstance(ref: ref);
+    final _userConfig = UserConfigService.getState(ref: ref);
+    Log.d("VisitorPage - build 了");
+
+    return Scaffold(
+      appBar: AppBar(title: Text("Visitor"),systemOverlayStyle: ThemeConfig.getSystemUiOverlayStyleByTheme(context)),
+      backgroundColor: context.appColors.backgroundDefault,
+      body: Center(
+        child: Column(
+          children: [
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                Text("当前的用户:${_userConfig.userName}"),
+                ElevatedButton(
+                  onPressed: () {
+                    _userService.setUserInfo("张三");
+                  },
+                  child: Text(
+                    '修改用户信息',
+                  ),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () {
+                   // fetchServerTime();
+                  },
+                  child: Text('网络请求'),
+                ),
+                ElevatedButton(
+                  onPressed: () {
+                    ToastEngine.show("这是一个吐司气泡");
+                  },
+                  child: Text('吐司/气泡'),
+                ),
+                ElevatedButton(
+                  onPressed: () async {
+                    NotifyEngine.showSuccess("操作成功");
+                    await Future.delayed(Duration(seconds: 3));
+                    NotifyEngine.showFailure("操作失败");
+                    await Future.delayed(Duration(seconds: 3));
+                    NotifyEngine.showError("操作错误");
+                  },
+                  child: Text('成功/失败通知'),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () {
+                    DialogEngine.show(
+                        widget: AppDefaultDialog(
+                          //这种布局自己自定义去
+                          title: "提示",
+                          message: "默认的弹窗,自定义的弹窗自己画去",
+                          confirmAction: () {
+                            ToastEngine.show("点击了确定");
+                          },
+                        ));
+                  },
+                  child: Text('弹窗'),
+                ),
+                ElevatedButton(
+                  onPressed: () {
+                    DateTime dateTime = DateTime.now();
+                    DatePickerUtil.showCupertinoDatePicker(
+                      mode: CupertinoDatePickerMode.date,
+                      selectedDateTime: dateTime,
+                      onDateTimeChanged: (date) {
+                        dateTime = date;
+                      },
+                      title: "选择日期",
+                    );
+                  },
+                  child: Text('时间选择'),
+                ),
+                ElevatedButton(
+                  onPressed: () {
+                    OptionPickerUtil.showCupertinoOptionPicker(
+                      items: ["前天", "昨天", "今天", "明天", "后天"],
+                      initialSelectIndex: 0,
+                      onPickerChanged: (_, index) {
+                        ToastEngine.show("选中的索引为:$index");
+                      },
+                    );
+                  },
+                  child: Text('条件选择'),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () {
+                    ImagePickerUtils().show(context, (filePath) {
+                      ToastEngine.show("图片的路径为:$filePath");
+                    });
+                  },
+                  child: Text('相册/相册'),
+                ),
+                ElevatedButton(
+                  onPressed: () async {
+                    final PermissionStatus permissionStatus = await Permission.phone.request();
+                    if (permissionStatus.isGranted) {
+                      final Uri launchUri = Uri(
+                        scheme: 'tel',
+                        path: "+8618571458165",
+                      );
+                      await launchUrl(launchUri);
+                    } else {
+                      // 权限被拒绝
+                      ToastEngine.show('Phone call permission denied');
+                    }
+                  },
+                  child: Text('App动态权限'),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () async {
+                    final tempPath = DirectoryUtil.getTempPath();
+                    final docPath = DirectoryUtil.getAppDocPath();
+                    final appSupportPath = DirectoryUtil.getAppSupportPath();
+                    final storagePath = DirectoryUtil.getStoragePath(); //只能拿沙盒路径,外置SD卡是拿不到的
+                    final cacheSize = await DirectoryUtil.getAppCacheSize();
+
+                    Log.d("沙盒路径 - tempPath:$tempPath docPath:$docPath appSupportPath:$appSupportPath storagePath:$storagePath "
+                        "cacheSize:$cacheSize");
+                  },
+                  child: Text('沙盒路径'),
+                ),
+                ElevatedButton(
+                  onPressed: () async {
+                    //Key-Value的重要信息持久化缓存(只存小东西如配置,token)
+                    await SPUtil.putBool("isVip", true);
+                    final isVip = SPUtil.getBool("isVip", defValue: false);
+                    Log.d("存入并取出SP的值 - isVip:$isVip");
+
+                    //沙盒缓存文件缓存(可存入对象,大文本,Json,网络请求数据)
+                    await localCache.put("name", "李四", expiry: const Duration(seconds: 10));
+                    await localCache.put("age", 28, expiry: const Duration(seconds: 10));
+                    await localCache.put("gender", 1);
+                    await localCache.put("skills", ["游泳", "跑步", "编程"]);
+                    await localCache.put("json", {"code": "200", "msg": "Success", "data": 2});
+
+                    String? name = await localCache.get("name");
+                    int? age = await localCache.get("age");
+                    int? gender = await localCache.get("gender");
+                    List<String>? skills = await localCache.get("skills");
+                    Map<String, dynamic>? json = await localCache.get("json");
+                    Log.d("获取缓存name:$name");
+                    Log.d("获取缓存age:$age");
+                    Log.d("获取缓存gender:$gender");
+                    Log.d("获取缓存skills:$skills");
+                    Log.d("获取缓存json:$json");
+                  },
+                  child: Text('缓存用法'),
+                ),
+                ElevatedButton(
+                  onPressed: () {},
+                  child: Text('图片预览'),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () {},
+                  child: Text('图片加载'),
+                ),
+                Hero(
+                    tag: '112cc8a34e13',
+                    child: MyLoadImage("https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", width: 80, height: 80),
+                ),
+                ElevatedButton(
+                  onPressed: () {
+                    //单图预览,支持hero
+                    ImagePreviewEngine.singleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", heroTag: '112cc8a34e13');
+                    //多图预览,支持hero
+                    // ImagePreviewEngine.multipleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws");
+                  },
+                  child: Text('图片预览'),
+                ),
+              ],
+            ).marginOnly(top: 10),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceAround,
+              children: [
+                ElevatedButton(
+                  onPressed: () {
+                    ref.read(themeProvider.notifier).toggleTheme();
+                  },
+                  child: Text('手动切换主题'),
+                  style: ButtonStyle(
+                    backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
+                    // 设置按钮的背景颜色
+                    foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
+                    // 设置按钮文字的颜色
+                    shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
+                    // 按钮阴影颜色
+                    elevation: WidgetStateProperty.all<double>(5),
+                    // 按钮阴影的高度
+                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
+                      RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(30), // 圆角边框
+                      ),
+                    ),
+                  ),
+                ),
+                ElevatedButton(
+                  onPressed: () {
+                    ref.read(themeProvider.notifier).followSystemTheme();
+                  },
+                  child: Text('跟随系统主题'),
+                  style: ButtonStyle(
+                    backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
+                    // 设置按钮的背景颜色
+                    foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
+                    // 设置按钮文字的颜色
+                    shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
+                    // 按钮阴影颜色
+                    elevation: WidgetStateProperty.all<double>(5),
+                    // 按钮阴影的高度
+                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
+                      RoundedRectangleBorder(
+                        borderRadius: BorderRadius.circular(30), // 圆角边框
+                      ),
+                    ),
+                  ),
+                ),
+              ],
+            ).marginOnly(top: 10),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 130 - 0
packages/cpt_main/lib/modules/feedback/feedback_page.dart

@@ -0,0 +1,130 @@
+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:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+import '../../router/page/main_page_router.dart';
+
+@RoutePage()
+class FeedbackPage extends StatelessWidget {
+  const FeedbackPage({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: MyAppBar.appBar(
+        context,
+        S.current.feedback,
+        showBackButton: false,
+        backgroundColor: context.appColors.whiteBG,
+      ),
+      backgroundColor: context.appColors.backgroundDark,
+      body: AutoTabsRouter.pageView(
+        routes: const [
+          FeedbackSendPageRoute(),
+          FeedbackProgressPageRoute(),
+          FeedbackHistoryPageRoute(),
+        ],
+        builder: (context, child, pageController) {
+          final tabsRouter = AutoTabsRouter.of(context);
+
+          return Column(
+            children: [
+              Container(
+                color: context.appColors.whiteBG,
+                height: 120,
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceAround,
+                  children: [
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainFeedbackSend,
+                      45,
+                      51.5,
+                      S.current.sent,
+                      tabsRouter.activeIndex == 0,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(0);
+                      },
+                    ),
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainFeedbackInProgress,
+                      48,
+                      46.5,
+                      S.current.in_progress,
+                      tabsRouter.activeIndex == 1,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(1);
+                      },
+                    ),
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainFeedbackHistory,
+                      38,
+                      45.5,
+                      S.current.history,
+                      tabsRouter.activeIndex == 2,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(2);
+                      },
+                    ),
+                  ],
+                ),
+              ),
+              Expanded(
+                child: child,
+              ),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  //顶部的Tab布局
+  Widget _buildFeedbackCategory(BuildContext context, String iconPath, double iconWidth, double iconHeight, String title, bool isSelected) {
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: <Widget>[
+        Container(
+          width: 70,
+          height: 70,
+          decoration: BoxDecoration(
+            color: context.appColors.lightBlueBg, // 设置圆形背景颜色
+            shape: BoxShape.circle, // 设置为圆形
+            boxShadow: isSelected
+                ? [
+                    BoxShadow(
+                      color: context.appColors.tabLightBlueShadow, // 设置阴影颜色
+                      blurRadius: 5, // 设置模糊半径
+                      spreadRadius: 0.05, // 控制阴影扩散
+                      offset: const Offset(0, 4), // 设置阴影偏移量
+                    ),
+                  ]
+                : [], // 未选中时无阴影,
+          ),
+          child: Center(
+            child: MyAssetImage(iconPath, width: iconWidth, height: iconHeight),
+          ),
+        ),
+        const SizedBox(height: 7),
+        MyTextView(
+          title,
+          fontSize: 15,
+          isFontMedium: true,
+          textColor: isSelected ? context.appColors.tabTextSelectedDefault : context.appColors.tabTextUnSelectedDefault,
+        ),
+      ],
+    );
+  }
+}

+ 56 - 0
packages/cpt_main/lib/modules/feedback/history/feedback_history.dart

@@ -0,0 +1,56 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../item_feedback.dart';
+import 'feedback_history_view_model.dart';
+
+
+@RoutePage()
+class FeedbackHistoryScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(feedbackHistoryViewModelProvider.notifier);
+    final state = ref.watch(feedbackHistoryViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+        Log.d("FeedbackHistoryScreen 组件卸载时执行");
+      };
+    }, []);
+
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      child: EasyRefresh(
+        controller: viewModel.refreshController,
+        onRefresh: viewModel.onRefresh,
+        onLoad: viewModel.loadMore,
+        child: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            viewModel.retryRequest();
+          },
+          successSliverWidget: [
+            SliverList(
+                delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                    return FeedbackItem(index: index, item: state.datas[index]);
+                  },
+                  childCount: state.datas.length,
+                ))
+          ],
+        ),
+      ).marginOnly(top: 5, bottom: 5),
+    );
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/feedback/history/feedback_history_state.dart

@@ -0,0 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
+class FeedbackHistoryState {
+
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  List<String> datas; //页面列表数据
+
+  // ===================================  Begin  ↓  ===================================
+
+  FeedbackHistoryState({
+    this.loadingState = LoadState.State_Loading,
+    this.errorMessage,
+    required this.datas,
+  });
+
+  FeedbackHistoryState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    bool? needShowPlaceholder,
+    List<String>? datas,
+  }) {
+    return FeedbackHistoryState(
+      errorMessage: errorMessage ?? this.errorMessage,
+      loadingState: loadingState ?? this.loadingState,
+      datas: datas ?? this.datas,
+    );
+  }
+}

+ 131 - 0
packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.dart

@@ -0,0 +1,131 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'feedback_history_state.dart';
+
+part 'feedback_history_view_model.g.dart';
+
+@riverpod
+class FeedbackHistoryViewModel extends _$FeedbackHistoryViewModel {
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  @override
+  FeedbackHistoryState build() {
+    final state = FeedbackHistoryState(datas: []);
+    return state;
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchList();
+  }
+
+  /// 获取服务器数据
+  Future fetchList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+
+    if (_curPage == 1) {
+      //刷新的方式
+      state = state.copyWith(datas: list);
+      refreshController.finishRefresh();
+
+      //更新展示的状态
+      changeLoadingState(LoadState.State_Success, null);
+    } else {
+      //加载更多
+      final allList = state.datas;
+      allList.addAll(list);
+      state.datas.addAll(list);
+
+      refreshController.finishLoad();
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+}

+ 27 - 0
packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'feedback_history_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$feedbackHistoryViewModelHash() =>
+    r'5869d2c0a3ce33d7f4a70a08c361142737840a18';
+
+/// See also [FeedbackHistoryViewModel].
+@ProviderFor(FeedbackHistoryViewModel)
+final feedbackHistoryViewModelProvider = AutoDisposeNotifierProvider<
+    FeedbackHistoryViewModel, FeedbackHistoryState>.internal(
+  FeedbackHistoryViewModel.new,
+  name: r'feedbackHistoryViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$feedbackHistoryViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$FeedbackHistoryViewModel = AutoDisposeNotifier<FeedbackHistoryState>;
+// 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

+ 75 - 0
packages/cpt_main/lib/modules/feedback/item_feedback.dart

@@ -0,0 +1,75 @@
+import 'package:cpt_main/modules/demo_page.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.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 FeedbackItem extends StatelessWidget {
+  final int index;
+  final String item;
+
+  const FeedbackItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: const EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      padding: const EdgeInsets.symmetric(vertical: 19, horizontal: 18.5),
+      decoration: BoxDecoration(
+        color: context.appColors.whiteBG,
+        borderRadius: BorderRadius.circular(6.0), // 圆角
+        boxShadow: [
+          BoxShadow(
+            color: const Color(0xFFB8BFD9).withOpacity(0.3), // 阴影颜色
+            offset: const Offset(0, 3), // 阴影的偏移量
+            blurRadius: 8.0, // 模糊半径
+            spreadRadius: 3.0, // 扩散半径
+          ),
+        ],
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Row(
+            children: [
+              const MyAssetImage(Assets.mainFeedbackItemIcon, width: 42.5, height: 44),
+              Column(
+                children: [
+
+                  MyTextView(
+                    "Exchange old houses for new ones",
+                    fontSize: 16,
+                    textColor: context.appColors.textBlack,
+                    isFontMedium: true,
+                  ),
+
+                  MyTextView(
+                    "Why are there no implementation rules and application methods for something",
+                    fontSize: 14,
+                    marginTop: 5,
+                    textColor: context.appColors.textBlack,
+                    isFontRegular: true,
+                  ),
+                ],
+              ).expanded(),
+            ],
+          ),
+
+          //备注
+          MyTextView(
+            "18 Sep 2024 18:00  |  Security  |  In Progress",
+            fontSize: 12,
+            marginTop: 10,
+            textColor: context.appColors.textDarkGray,
+            isFontRegular: true,
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 0 - 77
packages/cpt_main/lib/modules/feedback/page/feedback_page.dart

@@ -1,77 +0,0 @@
-import 'package:cs_resources/generated/assets.dart';
-import 'package:flutter/material.dart';
-import 'package:auto_route/auto_route.dart';
-import 'package:shared/utils/ext_dart.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_appbar.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/my_text_view.dart';
-import 'package:widgets/shatter/custom_check_box.dart';
-import 'package:widgets/shatter/custom_radio_check.dart';
-
-@RoutePage()
-class FeedbackPage extends StatelessWidget {
-  const FeedbackPage({Key? key}) : super(key: key);
-
-  @override
-  Widget build(BuildContext context) {
-    Log.d("FeedbackPage - build 了");
-
-    return Scaffold(
-      appBar: MyAppBar.appBar(context, "自定义Appbar",backgroundColor: context.theme.primaryColorDark),
-      body: Center(
-        child: Column(
-          mainAxisSize: MainAxisSize.max,
-          crossAxisAlignment: CrossAxisAlignment.center,
-          children: [
-            Text("文本使用").marginOnly(top: 10),
-            MyTextView(
-              "推荐使用统一方案管理",
-              textColor: Colors.black,
-              isFontMedium: true,
-              fontSize: 15,
-            ),
-            Text("图片的使用").marginOnly(top: 10),
-            Row(
-              mainAxisSize: MainAxisSize.max,
-              mainAxisAlignment: MainAxisAlignment.center,
-              children: [
-                MyAssetImage(Assets.baseServicePageNoData, width: 80, height: 80),
-                MyLoadImage("https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", width: 80, height: 80),
-              ],
-            ),
-            Text("Check/Radio 单选/多选").marginOnly(top: 10),
-            //真实开发肯定是后台配置,就算写死的也应该在State中定义状态
-            //多选
-            CustomCheckBox(
-              options: ["中文", "英文", "法语"],
-              onOptionsSelected: (selected) {
-                Log.d("当前选中的索引:$selected");
-              },
-              selectedOptions: ["中文", "英文"],
-              textColor: Colors.black,
-            ).marginOnly(left: 15, right: 15, top: 10),
-
-            //单选
-            CustomRadioCheck(
-              options: ["是", "否"],
-              onOptionSelected: (index, text) {
-                Log.d("当前选中的索引:$index");
-              },
-              textColor: Colors.black,
-              selectedPosition: 1,
-            ).marginOnly(left: 15, right: 15, top: 10),
-
-
-            ElevatedButton(
-              onPressed: () {},
-              child: Text('Loading页面状态'),
-            ).marginOnly(top: 10),
-
-          ],
-        ),
-      ),
-    );
-  }
-}

+ 56 - 0
packages/cpt_main/lib/modules/feedback/progress/feedback_progress.dart

@@ -0,0 +1,56 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../item_feedback.dart';
+import 'feedback_progress_view_model.dart';
+
+
+@RoutePage()
+class FeedbackProgressScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(feedbackProgressViewModelProvider.notifier);
+    final state = ref.watch(feedbackProgressViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+        Log.d("FeedbackProgressScreen 组件卸载时执行");
+      };
+    }, []);
+
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      child: EasyRefresh(
+        controller: viewModel.refreshController,
+        onRefresh: viewModel.onRefresh,
+        onLoad: viewModel.loadMore,
+        child: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            viewModel.retryRequest();
+          },
+          successSliverWidget: [
+            SliverList(
+                delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                    return FeedbackItem(index: index, item: state.datas[index]);
+                  },
+                  childCount: state.datas.length,
+                ))
+          ],
+        ),
+      ).marginOnly(top: 5, bottom: 5),
+    );
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/feedback/progress/feedback_progress_state.dart

@@ -0,0 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
+class FeedbackProgressState {
+
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  List<String> datas; //页面列表数据
+
+  // ===================================  Begin  ↓  ===================================
+
+  FeedbackProgressState({
+    this.loadingState = LoadState.State_Loading,
+    this.errorMessage,
+    required this.datas,
+  });
+
+  FeedbackProgressState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    bool? needShowPlaceholder,
+    List<String>? datas,
+  }) {
+    return FeedbackProgressState(
+      errorMessage: errorMessage ?? this.errorMessage,
+      loadingState: loadingState ?? this.loadingState,
+      datas: datas ?? this.datas,
+    );
+  }
+}

+ 130 - 0
packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.dart

@@ -0,0 +1,130 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'feedback_progress_state.dart';
+
+part 'feedback_progress_view_model.g.dart';
+
+@riverpod
+class FeedbackProgressViewModel extends _$FeedbackProgressViewModel {
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  @override
+  FeedbackProgressState build() {
+    return FeedbackProgressState(datas: []);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchList();
+  }
+
+  /// 获取服务器数据
+  Future fetchList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+
+    if (_curPage == 1) {
+      //刷新的方式
+      state = state.copyWith(datas: list);
+      refreshController.finishRefresh();
+
+      //更新展示的状态
+      changeLoadingState(LoadState.State_Success, null);
+    } else {
+      //加载更多
+      final allList = state.datas;
+      allList.addAll(list);
+      state.datas.addAll(list);
+
+      refreshController.finishLoad();
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+}

+ 28 - 0
packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.g.dart

@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'feedback_progress_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$feedbackProgressViewModelHash() =>
+    r'd9040263f4a23547763ff1f1325a1bff300f77f4';
+
+/// See also [FeedbackProgressViewModel].
+@ProviderFor(FeedbackProgressViewModel)
+final feedbackProgressViewModelProvider = AutoDisposeNotifierProvider<
+    FeedbackProgressViewModel, FeedbackProgressState>.internal(
+  FeedbackProgressViewModel.new,
+  name: r'feedbackProgressViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$feedbackProgressViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$FeedbackProgressViewModel
+    = AutoDisposeNotifier<FeedbackProgressState>;
+// 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

+ 18 - 0
packages/cpt_main/lib/modules/feedback/send/feedback_send.dart

@@ -0,0 +1,18 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:widgets/responsive_widget.dart';
+import 'feedback_send_large.dart';
+import 'feedback_send_small.dart';
+
+@RoutePage()
+class FeedbackSendScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return ResponsiveWidget(
+      smallScreen: FeedbackSendSmall(),
+      smallFullScreen: FeedbackSendLarge(),
+    );
+  }
+}

+ 58 - 0
packages/cpt_main/lib/modules/feedback/send/feedback_send_large.dart

@@ -0,0 +1,58 @@
+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:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class FeedbackSendLarge extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+
+    return Container(
+      padding: const EdgeInsets.symmetric(horizontal: 38),
+      width: double.infinity,
+      height: double.infinity,
+      child: Center(
+        child: Column(
+          mainAxisSize: MainAxisSize.min,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            const MyAssetImage(Assets.mainFeedbackSendImg, width: 237.5, height: 177).marginOnly(top: 15, bottom: 26),
+            MyTextView(
+              S.current.feedback_msg_1,
+              fontSize: 17,
+              textAlign: TextAlign.center,
+              isFontBold: true,
+              textColor: context.appColors.textBlack,
+            ),
+            MyTextView(
+              S.current.feedback_msg_2,
+              fontSize: 15,
+              marginTop: 12,
+              textAlign: TextAlign.center,
+              isFontMedium: true,
+              textColor: context.appColors.textBlack,
+            ),
+            MyButton(
+              onPressed: () {
+                ToastEngine.show("去填写表单");
+              },
+              text: S.current.create_new_feedback,
+              textColor: Colors.white,
+              disabledTextColor: Colors.white,
+              backgroundColor: context.appColors.btnBgDefault,
+              fontWeight: FontWeight.w500,
+              type: ClickType.throttle,
+              minHeight: 50,
+              radius: 5,
+            ).marginOnly(top: 20, bottom: 30),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 55 - 0
packages/cpt_main/lib/modules/feedback/send/feedback_send_small.dart

@@ -0,0 +1,55 @@
+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:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class FeedbackSendSmall extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return SingleChildScrollView(
+      scrollDirection: Axis.vertical,
+      physics: const BouncingScrollPhysics(),
+      child: Container(
+        margin: const EdgeInsets.symmetric(horizontal: 38),
+        width: double.infinity,
+        child: Column(mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [
+          const MyAssetImage(Assets.mainFeedbackSendImg, width: 237.5, height: 177).marginOnly(top: 15, bottom: 26),
+          MyTextView(
+            S.current.feedback_msg_1,
+            fontSize: 17,
+            textAlign: TextAlign.center,
+            isFontBold: true,
+            textColor: context.appColors.textBlack,
+          ),
+          MyTextView(
+            S.current.feedback_msg_2,
+            fontSize: 15,
+            marginTop: 12,
+            textAlign: TextAlign.center,
+            isFontMedium: true,
+            textColor: context.appColors.textBlack,
+          ),
+          MyButton(
+            onPressed: () {
+              ToastEngine.show("去填写表单");
+            },
+            text: S.current.create_new_feedback,
+            textColor: Colors.white,
+            disabledTextColor: Colors.white,
+            backgroundColor: context.appColors.btnBgDefault,
+            fontWeight: FontWeight.w500,
+            type: ClickType.throttle,
+            minHeight: 50,
+            radius: 5,
+          ).marginOnly(top: 20, bottom: 30),
+        ]),
+      ),
+    );
+    ;
+  }
+}

+ 11 - 0
packages/cpt_main/lib/modules/home/home_page.dart

@@ -6,6 +6,9 @@ import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/componentRouter/community_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
@@ -29,7 +32,15 @@ class HomePage extends HookConsumerWidget {
 
 
     return Scaffold(
     return Scaffold(
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
+          backIconPath: Assets.mainTabMeSelected,
+          backIconWidth: 18.5,
+          backIconHeight: 20,
+          showBackButton: true,
           backgroundColor: context.appColors.whiteBG,
           backgroundColor: context.appColors.whiteBG,
+          backCallback: (){
+          ToastEngine.show("测试去登录页面");
+          ComponentServiceManager().authService.startLoginPage();
+          },
           actions: [
           actions: [
             Center(
             Center(
                     child: Stack(
                     child: Stack(

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

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

+ 1 - 1
packages/cpt_main/lib/modules/home/item_home_category.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';

+ 1 - 1
packages/cpt_main/lib/modules/home/item_home_last_news.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';

+ 1 - 1
packages/cpt_main/lib/modules/home/item_home_last_trans.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:shared/utils/util.dart';
 import 'package:shared/utils/util.dart';

+ 1 - 1
packages/cpt_main/lib/modules/home/item_home_manage_guide.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';

+ 1 - 1
packages/cpt_main/lib/modules/home/item_home_property_news.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:shared/utils/util.dart';
 import 'package:shared/utils/util.dart';

+ 1 - 1
packages/cpt_main/lib/modules/main/main_state.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/feedback/page/feedback_page.dart';
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';

+ 56 - 0
packages/cpt_main/lib/modules/visitor/active/visitor_active.dart

@@ -0,0 +1,56 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:cpt_main/modules/visitor/item_visitor.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'visitor_active_view_model.dart';
+
+@RoutePage()
+class VisitorActiveScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(visitorActiveViewModelProvider.notifier);
+    final state = ref.watch(visitorActiveViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchAppliedStaffList());
+      return () {
+        // 组件卸载时执行
+        Log.d("VisitorActiveScreen 组件卸载时执行");
+      };
+    }, []);
+
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      child: EasyRefresh(
+        controller: viewModel.refreshController,
+        onRefresh: viewModel.onRefresh,
+        onLoad: viewModel.loadMore,
+        child: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            viewModel.retryRequest();
+          },
+          successSliverWidget: [
+            SliverList(
+                delegate: SliverChildBuilderDelegate(
+              (context, index) {
+                return VisitorItem(index: index, item: state.datas[index]);
+              },
+              childCount: state.datas.length,
+            ))
+          ],
+        ),
+      ).marginOnly(top: 5, bottom: 5),
+    );
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/visitor/active/visitor_active_state.dart

@@ -0,0 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
+class VisitorActiveState {
+
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  List<String> datas; //页面列表数据
+
+  // ===================================  Begin  ↓  ===================================
+
+  VisitorActiveState({
+    this.loadingState = LoadState.State_Loading,
+    this.errorMessage,
+    required this.datas,
+  });
+
+  VisitorActiveState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    bool? needShowPlaceholder,
+    List<String>? datas,
+  }) {
+    return VisitorActiveState(
+      errorMessage: errorMessage ?? this.errorMessage,
+      loadingState: loadingState ?? this.loadingState,
+      datas: datas ?? this.datas,
+    );
+  }
+}

+ 133 - 0
packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.dart

@@ -0,0 +1,133 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'visitor_active_state.dart';
+
+part 'visitor_active_view_model.g.dart';
+
+@riverpod
+class VisitorActiveViewModel extends _$VisitorActiveViewModel {
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  @override
+  VisitorActiveState build() {
+    final state = VisitorActiveState(datas: []);
+    //初始化默认调用接口
+    Log.d("VisitorActiveViewModel 执行build");
+    return state;
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchAppliedStaffList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchAppliedStaffList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchAppliedStaffList();
+  }
+
+  /// 获取服务器数据
+  Future fetchAppliedStaffList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+
+    if (_curPage == 1) {
+      //刷新的方式
+      state = state.copyWith(datas: list);
+      refreshController.finishRefresh();
+
+      //更新展示的状态
+      changeLoadingState(LoadState.State_Success, null);
+    } else {
+      //加载更多
+      final allList = state.datas;
+      allList.addAll(list);
+      state.datas.addAll(list);
+
+      refreshController.finishLoad();
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+}

+ 27 - 0
packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'visitor_active_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$visitorActiveViewModelHash() =>
+    r'ccfe9470f3380aff60724bec5ba2166ab2c74d29';
+
+/// See also [VisitorActiveViewModel].
+@ProviderFor(VisitorActiveViewModel)
+final visitorActiveViewModelProvider = AutoDisposeNotifierProvider<
+    VisitorActiveViewModel, VisitorActiveState>.internal(
+  VisitorActiveViewModel.new,
+  name: r'visitorActiveViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$visitorActiveViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$VisitorActiveViewModel = AutoDisposeNotifier<VisitorActiveState>;
+// 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

+ 55 - 0
packages/cpt_main/lib/modules/visitor/history/visitor_history.dart

@@ -0,0 +1,55 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../item_visitor.dart';
+import 'visitor_history_view_model.dart';
+
+@RoutePage()
+class VisitorHistoryScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(visitorHistoryViewModelProvider.notifier);
+    final state = ref.watch(visitorHistoryViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+        Log.d("VisitorHistoryScreen 组件卸载时执行");
+      };
+    }, []);
+
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      child: EasyRefresh(
+        controller: viewModel.refreshController,
+        onRefresh: viewModel.onRefresh,
+        onLoad: viewModel.loadMore,
+        child: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            viewModel.retryRequest();
+          },
+          successSliverWidget: [
+            SliverList(
+                delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                    return VisitorItem(index: index, item: state.datas[index]);
+                  },
+                  childCount: state.datas.length,
+                ))
+          ],
+        ),
+      ).marginOnly(top: 5, bottom: 5),
+    );
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/visitor/history/visitor_history_state.dart

@@ -0,0 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
+class VisitorHistoryState {
+
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  List<String> datas; //页面列表数据
+
+  // ===================================  Begin  ↓  ===================================
+
+  VisitorHistoryState({
+    this.loadingState = LoadState.State_Loading,
+    this.errorMessage,
+    required this.datas,
+  });
+
+  VisitorHistoryState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    bool? needShowPlaceholder,
+    List<String>? datas,
+  }) {
+    return VisitorHistoryState(
+      errorMessage: errorMessage ?? this.errorMessage,
+      loadingState: loadingState ?? this.loadingState,
+      datas: datas ?? this.datas,
+    );
+  }
+}

+ 133 - 0
packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.dart

@@ -0,0 +1,133 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'visitor_history_state.dart';
+
+part 'visitor_history_view_model.g.dart';
+
+@riverpod
+class VisitorHistoryViewModel extends _$VisitorHistoryViewModel {
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  @override
+  VisitorHistoryState build() {
+    final state = VisitorHistoryState(datas: []);
+    //初始化默认调用接口
+    Log.d("VisitorActiveViewModel 执行build");
+    return state;
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchList();
+  }
+
+  /// 获取服务器数据
+  Future fetchList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+
+    if (_curPage == 1) {
+      //刷新的方式
+      state = state.copyWith(datas: list);
+      refreshController.finishRefresh();
+
+      //更新展示的状态
+      changeLoadingState(LoadState.State_Success, null);
+    } else {
+      //加载更多
+      final allList = state.datas;
+      allList.addAll(list);
+      state.datas.addAll(list);
+
+      refreshController.finishLoad();
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+}

+ 27 - 0
packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'visitor_history_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$visitorHistoryViewModelHash() =>
+    r'b6bffd6da51c0ad0bf00707554c1b22e8152b928';
+
+/// See also [VisitorHistoryViewModel].
+@ProviderFor(VisitorHistoryViewModel)
+final visitorHistoryViewModelProvider = AutoDisposeNotifierProvider<
+    VisitorHistoryViewModel, VisitorHistoryState>.internal(
+  VisitorHistoryViewModel.new,
+  name: r'visitorHistoryViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$visitorHistoryViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$VisitorHistoryViewModel = AutoDisposeNotifier<VisitorHistoryState>;
+// 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

+ 97 - 0
packages/cpt_main/lib/modules/visitor/item_visitor.dart

@@ -0,0 +1,97 @@
+import 'package:cpt_main/modules/demo_page.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_text_view.dart';
+
+class VisitorItem extends StatelessWidget {
+  final int index;
+  final String item;
+
+  const VisitorItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: const EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      padding: const EdgeInsets.symmetric(vertical: 19, horizontal: 18.5),
+      decoration: BoxDecoration(
+        color: context.appColors.whiteBG,
+        borderRadius: BorderRadius.circular(6.0), // 圆角
+        boxShadow: [
+          BoxShadow(
+            color: const Color(0xFFB8BFD9).withOpacity(0.3), // 阴影颜色
+            offset: const Offset(0, 3), // 阴影的偏移量
+            blurRadius: 8.0, // 模糊半径
+            spreadRadius: 3.0, // 扩散半径
+          ),
+        ],
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //姓名
+          MyTextView(
+            "Wu Bing Bing",
+            fontSize: 16,
+            marginTop: 19,
+            marginBottom: 5,
+            textColor: context.appColors.textBlack,
+            isFontMedium: true,
+          ),
+
+          //电话/身份证
+          Row(
+            children: [
+              MyTextView(
+                "+86 12345678901",
+                fontSize: 14,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+              const Spacer(),
+              MyTextView(
+                "M12****7B",
+                fontSize: 14,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+            ],
+          ),
+
+          //车牌号/访问日期
+          Row(
+            children: [
+              MyTextView(
+                "EFG8878",
+                fontSize: 14,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+              const Spacer(),
+              MyTextView(
+                "Monday 13 Oct 2024",
+                fontSize: 14,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+            ],
+          ).marginOnly(top: 5),
+
+          //备注
+          MyTextView(
+            "Visiting a friend's house as a guest",
+            fontSize: 14,
+            marginTop: 6,
+            textColor: context.appColors.textDarkGray,
+            isFontRegular: true,
+            fontWeight: FontWeight.w500,
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 22 - 0
packages/cpt_main/lib/modules/visitor/now/visitor_now.dart

@@ -0,0 +1,22 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:shared/utils/log_utils.dart';
+
+import 'package:widgets/responsive_widget.dart';
+
+import 'visitor_now_large.dart';
+import 'visitor_now_small.dart';
+
+@RoutePage()
+class VisitorNowScreen extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return ResponsiveWidget(
+      smallScreen: VisitorNowSmall(),
+      smallFullScreen: VisitorNowLarge(),
+    );
+  }
+}

+ 52 - 0
packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart

@@ -0,0 +1,52 @@
+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:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class VisitorNowLarge extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    Log.d("VisitorNowLarge 初始化");
+
+    return Container(
+      padding: const EdgeInsets.symmetric(horizontal: 38),
+      width: double.infinity,
+      height: double.infinity,
+      child: Center(
+        child: Column(
+          mainAxisSize: MainAxisSize.min,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            const MyAssetImage(Assets.mainVisitorNowImg, width: 214, height: 164.5).marginOnly(top: 21, bottom: 25.5),
+            MyTextView(
+              S.current.visitor_msg,
+              fontSize: 15,
+              textAlign: TextAlign.center,
+              isFontMedium: true,
+              textColor: context.appColors.textBlack,
+            ),
+            MyButton(
+              onPressed: () {
+                ToastEngine.show("去填写表单");
+              },
+              text: S.current.visitor_registration,
+              textColor: Colors.white,
+              disabledTextColor: Colors.white,
+              backgroundColor: context.appColors.btnBgDefault,
+              fontWeight: FontWeight.w500,
+              type: ClickType.throttle,
+              minHeight: 50,
+              radius: 5,
+            ).marginOnly(top: 32, bottom: 48),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 48 - 0
packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart

@@ -0,0 +1,48 @@
+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:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class VisitorNowSmall extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    Log.d("VisitorNowSmall 初始化");
+    return SingleChildScrollView(
+      scrollDirection: Axis.vertical,
+      physics: const BouncingScrollPhysics(),
+      child: Container(
+        margin: const EdgeInsets.symmetric(horizontal: 38),
+        width: double.infinity,
+        child: Column(mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [
+          const MyAssetImage(Assets.mainVisitorNowImg, width: 214, height: 164.5).marginOnly(top: 21, bottom: 25.5),
+          MyTextView(
+            S.current.visitor_msg,
+            fontSize: 15,
+            textAlign: TextAlign.center,
+            isFontMedium: true,
+            textColor: context.appColors.textBlack,
+          ),
+          MyButton(
+            onPressed: (){
+              ToastEngine.show("去填写表单");
+            },
+            text: S.current.visitor_registration,
+            textColor: Colors.white,
+            disabledTextColor: Colors.white,
+            backgroundColor: context.appColors.btnBgDefault,
+            fontWeight: FontWeight.w500,
+            type: ClickType.throttle,
+            minHeight: 50,
+            radius: 5,
+          ).marginOnly(top: 32, bottom: 48),
+        ]),
+      ),
+    );;
+  }
+}

+ 109 - 257
packages/cpt_main/lib/modules/visitor/visitor_page.dart

@@ -1,28 +1,16 @@
+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:cs_resources/theme/app_colors_theme.dart';
-import 'package:cs_resources/theme/theme_config.dart';
-import 'package:cs_resources/theme/theme_notifier.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/basic_export.dart';
-import 'package:plugin_basic/provider/user_config/user_config_service.dart';
-import 'package:plugin_platform/engine/cache/local_cache_manager.dart';
-import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
-import 'package:plugin_platform/engine/directory/directory_util.dart';
-import 'package:plugin_platform/engine/image/image_preview.dart';
-import 'package:plugin_platform/engine/media/image_picker_utils.dart';
-import 'package:plugin_platform/engine/notify/notify_engine.dart';
-import 'package:plugin_platform/engine/sp/sp_util.dart';
-import 'package:plugin_platform/engine/toast/toast_engine.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
-import 'package:widgets/picker/date_picker_util.dart';
-import 'package:widgets/picker/option_pick_util.dart';
-import 'package:plugin_platform/platform_export.dart';
-
+import 'package:widgets/my_text_view.dart';
+import '../../router/page/main_page_router.dart';
 import 'visitor_view_model.dart';
 import 'visitor_view_model.dart';
 
 
 @RoutePage()
 @RoutePage()
@@ -31,253 +19,117 @@ class VisitorPage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
-    final _userService = UserConfigService.getInstance(ref: ref);
-    final _userConfig = UserConfigService.getState(ref: ref);
-    final _viewModel = ref.watch(visitorViewModelProvider.notifier);
-    Log.d("VisitorPage - build 了");
+    final viewModel = ref.watch(visitorViewModelProvider.notifier);
 
 
     return Scaffold(
     return Scaffold(
-      appBar: AppBar(title: Text("Visitor"),systemOverlayStyle: ThemeConfig.getSystemUiOverlayStyleByTheme(context)),
-      backgroundColor: context.appColors.backgroundDefault,
-      body: Center(
-        child: Column(
-          children: [
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                Text("当前的用户:${_userConfig.userName}"),
-                ElevatedButton(
-                  onPressed: () {
-                    _userService.setUserInfo("张三");
-                  },
-                  child: Text(
-                    '修改用户信息',
-                  ),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () {
-                    _viewModel.fetchServerTime();
-                  },
-                  child: Text('网络请求'),
-                ),
-                ElevatedButton(
-                  onPressed: () {
-                    ToastEngine.show("这是一个吐司气泡");
-                  },
-                  child: Text('吐司/气泡'),
-                ),
-                ElevatedButton(
-                  onPressed: () async {
-                    NotifyEngine.showSuccess("操作成功");
-                    await Future.delayed(Duration(seconds: 3));
-                    NotifyEngine.showFailure("操作失败");
-                    await Future.delayed(Duration(seconds: 3));
-                    NotifyEngine.showError("操作错误");
-                  },
-                  child: Text('成功/失败通知'),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () {
-                    DialogEngine.show(
-                        widget: AppDefaultDialog(
-                          //这种布局自己自定义去
-                          title: "提示",
-                          message: "默认的弹窗,自定义的弹窗自己画去",
-                          confirmAction: () {
-                            ToastEngine.show("点击了确定");
-                          },
-                        ));
-                  },
-                  child: Text('弹窗'),
-                ),
-                ElevatedButton(
-                  onPressed: () {
-                    DateTime dateTime = DateTime.now();
-                    DatePickerUtil.showCupertinoDatePicker(
-                      mode: CupertinoDatePickerMode.date,
-                      selectedDateTime: dateTime,
-                      onDateTimeChanged: (date) {
-                        dateTime = date;
+      appBar: MyAppBar.appBar(
+        context,
+        S.current.visitor,
+        showBackButton: false,
+        backgroundColor: context.appColors.whiteBG,
+      ),
+      backgroundColor: context.appColors.backgroundDark,
+      body: AutoTabsRouter.pageView(
+        routes: const [
+          VisitorNowPageRoute(),
+          VisitorActivePageRoute(),
+          VisitorHistoryPageRoute(),
+        ],
+        builder: (context, child, pageController) {
+          final tabsRouter = AutoTabsRouter.of(context);
+
+          return Column(
+            children: [
+              Container(
+                color: context.appColors.whiteBG,
+                height: 120,
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceAround,
+                  children: [
+                    _buildVisitorCategory(
+                      context,
+                      Assets.mainVisitorNow,
+                      54.5,
+                      48,
+                      S.current.visitor_now,
+                      tabsRouter.activeIndex == 0,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(0);
                       },
                       },
-                      title: "选择日期",
-                    );
-                  },
-                  child: Text('时间选择'),
-                ),
-                ElevatedButton(
-                  onPressed: () {
-                    OptionPickerUtil.showCupertinoOptionPicker(
-                      items: ["前天", "昨天", "今天", "明天", "后天"],
-                      initialSelectIndex: 0,
-                      onPickerChanged: (_, index) {
-                        ToastEngine.show("选中的索引为:$index");
+                    ),
+                    _buildVisitorCategory(
+                      context,
+                      Assets.mainVisitorActive,
+                      36.5,
+                      48,
+                      S.current.visitor_active,
+                      tabsRouter.activeIndex == 1,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(1);
                       },
                       },
-                    );
-                  },
-                  child: Text('条件选择'),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () {
-                    ImagePickerUtils().show(context, (filePath) {
-                      ToastEngine.show("图片的路径为:$filePath");
-                    });
-                  },
-                  child: Text('相册/相册'),
-                ),
-                ElevatedButton(
-                  onPressed: () async {
-                    final PermissionStatus permissionStatus = await Permission.phone.request();
-                    if (permissionStatus.isGranted) {
-                      final Uri launchUri = Uri(
-                        scheme: 'tel',
-                        path: "+8618571458165",
-                      );
-                      await launchUrl(launchUri);
-                    } else {
-                      // 权限被拒绝
-                      ToastEngine.show('Phone call permission denied');
-                    }
-                  },
-                  child: Text('App动态权限'),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () async {
-                    final tempPath = DirectoryUtil.getTempPath();
-                    final docPath = DirectoryUtil.getAppDocPath();
-                    final appSupportPath = DirectoryUtil.getAppSupportPath();
-                    final storagePath = DirectoryUtil.getStoragePath(); //只能拿沙盒路径,外置SD卡是拿不到的
-                    final cacheSize = await DirectoryUtil.getAppCacheSize();
-
-                    Log.d("沙盒路径 - tempPath:$tempPath docPath:$docPath appSupportPath:$appSupportPath storagePath:$storagePath "
-                        "cacheSize:$cacheSize");
-                  },
-                  child: Text('沙盒路径'),
-                ),
-                ElevatedButton(
-                  onPressed: () async {
-                    //Key-Value的重要信息持久化缓存(只存小东西如配置,token)
-                    await SPUtil.putBool("isVip", true);
-                    final isVip = SPUtil.getBool("isVip", defValue: false);
-                    Log.d("存入并取出SP的值 - isVip:$isVip");
-
-                    //沙盒缓存文件缓存(可存入对象,大文本,Json,网络请求数据)
-                    await localCache.put("name", "李四", expiry: const Duration(seconds: 10));
-                    await localCache.put("age", 28, expiry: const Duration(seconds: 10));
-                    await localCache.put("gender", 1);
-                    await localCache.put("skills", ["游泳", "跑步", "编程"]);
-                    await localCache.put("json", {"code": "200", "msg": "Success", "data": 2});
-
-                    String? name = await localCache.get("name");
-                    int? age = await localCache.get("age");
-                    int? gender = await localCache.get("gender");
-                    List<String>? skills = await localCache.get("skills");
-                    Map<String, dynamic>? json = await localCache.get("json");
-                    Log.d("获取缓存name:$name");
-                    Log.d("获取缓存age:$age");
-                    Log.d("获取缓存gender:$gender");
-                    Log.d("获取缓存skills:$skills");
-                    Log.d("获取缓存json:$json");
-                  },
-                  child: Text('缓存用法'),
-                ),
-                ElevatedButton(
-                  onPressed: () {},
-                  child: Text('图片预览'),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () {},
-                  child: Text('图片加载'),
-                ),
-                Hero(
-                    tag: '112cc8a34e13',
-                    child: MyLoadImage("https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", width: 80, height: 80),
-                ),
-                ElevatedButton(
-                  onPressed: () {
-                    //单图预览,支持hero
-                    ImagePreviewEngine.singleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", heroTag: '112cc8a34e13');
-                    //多图预览,支持hero
-                    // ImagePreviewEngine.multipleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws");
-                  },
-                  child: Text('图片预览'),
-                ),
-              ],
-            ).marginOnly(top: 10),
-            Row(
-              mainAxisAlignment: MainAxisAlignment.spaceAround,
-              children: [
-                ElevatedButton(
-                  onPressed: () {
-                    ref.read(themeProvider.notifier).toggleTheme();
-                  },
-                  child: Text('手动切换主题'),
-                  style: ButtonStyle(
-                    backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
-                    // 设置按钮的背景颜色
-                    foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
-                    // 设置按钮文字的颜色
-                    shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
-                    // 按钮阴影颜色
-                    elevation: WidgetStateProperty.all<double>(5),
-                    // 按钮阴影的高度
-                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
-                      RoundedRectangleBorder(
-                        borderRadius: BorderRadius.circular(30), // 圆角边框
-                      ),
                     ),
                     ),
-                  ),
-                ),
-                ElevatedButton(
-                  onPressed: () {
-                    ref.read(themeProvider.notifier).followSystemTheme();
-                  },
-                  child: Text('跟随系统主题'),
-                  style: ButtonStyle(
-                    backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
-                    // 设置按钮的背景颜色
-                    foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
-                    // 设置按钮文字的颜色
-                    shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
-                    // 按钮阴影颜色
-                    elevation: WidgetStateProperty.all<double>(5),
-                    // 按钮阴影的高度
-                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
-                      RoundedRectangleBorder(
-                        borderRadius: BorderRadius.circular(30), // 圆角边框
-                      ),
+                    _buildVisitorCategory(
+                      context,
+                      Assets.mainVisitorHistory,
+                      38,
+                      45.5,
+                      S.current.history,
+                      tabsRouter.activeIndex == 2,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(2);
+                      },
                     ),
                     ),
-                  ),
-                ),
-              ],
-            ).marginOnly(top: 10),
-          ],
-        ),
+                  ],
+                ),
+              ),
+              Expanded(
+                child: child,
+              ),
+            ],
+          );
+        },
       ),
       ),
     );
     );
   }
   }
+
+  //顶部的Tab布局
+  Widget _buildVisitorCategory(BuildContext context, String iconPath, double iconWidth, double iconHeight, String title, bool isSelected) {
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: <Widget>[
+        Container(
+          width: 70,
+          height: 70,
+          decoration: BoxDecoration(
+            color: context.appColors.lightBlueBg, // 设置圆形背景颜色
+            shape: BoxShape.circle, // 设置为圆形
+            boxShadow: isSelected
+                ? [
+                    BoxShadow(
+                      color: context.appColors.tabLightBlueShadow, // 设置阴影颜色
+                      blurRadius: 5, // 设置模糊半径
+                      spreadRadius: 0.05, // 控制阴影扩散
+                      offset: const Offset(0, 4), // 设置阴影偏移量
+                    ),
+                  ]
+                : [], // 未选中时无阴影,
+          ),
+          child: Center(
+            child: MyAssetImage(iconPath, width: iconWidth, height: iconHeight),
+          ),
+        ),
+        const SizedBox(height: 7),
+        MyTextView(
+          title,
+          fontSize: 15,
+          isFontMedium: true,
+          textColor: isSelected ? context.appColors.tabTextSelectedDefault : context.appColors.tabTextUnSelectedDefault,
+        ),
+      ],
+    );
+  }
 }
 }

+ 36 - 15
packages/cpt_main/lib/router/page/main_page_router.dart

@@ -3,13 +3,18 @@ import 'package:flutter/material.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/path/router_path.dart';
 import 'package:router/path/router_path.dart';
 
 
-import '../../modules/feedback/page/feedback_page.dart';
+import '../../modules/feedback/feedback_page.dart';
+import '../../modules/feedback/progress/feedback_progress.dart';
+import '../../modules/feedback/history/feedback_history.dart';
+import '../../modules/feedback/send/feedback_send.dart';
 import '../../modules/home/home_page.dart';
 import '../../modules/home/home_page.dart';
 import '../../modules/main/main_page.dart';
 import '../../modules/main/main_page.dart';
 import '../../modules/me/me_page.dart';
 import '../../modules/me/me_page.dart';
 import '../../modules/notification/notification_page.dart';
 import '../../modules/notification/notification_page.dart';
 import '../../modules/visitor/visitor_page.dart';
 import '../../modules/visitor/visitor_page.dart';
-
+import '../../modules/visitor/now/visitor_now.dart';
+import '../../modules/visitor/active/visitor_active.dart';
+import '../../modules/visitor/history/visitor_history.dart';
 
 
 part 'main_page_router.gr.dart';
 part 'main_page_router.gr.dart';
 
 
@@ -20,17 +25,33 @@ part 'main_page_router.gr.dart';
 class MainPageRouter extends _$MainPageRouter {
 class MainPageRouter extends _$MainPageRouter {
   @override
   @override
   List<AutoRoute> get routes => [
   List<AutoRoute> get routes => [
-    CustomRoute(
-      page: MainPageRoute.page,
-      transitionsBuilder: applySlideTransition,
-      path: RouterPath.main,
-      children: [
-        AutoRoute(page: HomePageRoute.page, path: 'home'),
-        AutoRoute(page: VisitorPageRoute.page, path: 'visitor'),
-        AutoRoute(page: FeedbackPageRoute.page, path: 'feedback'),
-        AutoRoute(page: MePageRoute.page, path: 'me'),
-      ],
-    ),
-    CustomRoute(page: NotificationPageRoute.page, path: RouterPath.notification, transitionsBuilder: applySlideTransition),
-  ];
+        CustomRoute(
+          page: MainPageRoute.page,
+          transitionsBuilder: applySlideTransition,
+          path: RouterPath.main,
+          children: [
+            AutoRoute(page: HomePageRoute.page, path: 'home'),
+            AutoRoute(
+              page: VisitorPageRoute.page,
+              path: 'visitor',
+              children: [
+                AutoRoute(page: VisitorNowPageRoute.page, path: 'now'),
+                AutoRoute(page: VisitorActivePageRoute.page, path: 'active'),
+                AutoRoute(page: VisitorHistoryPageRoute.page, path: 'history'),
+              ],
+            ),
+            AutoRoute(
+              page: FeedbackPageRoute.page,
+              path: 'feedback',
+              children: [
+                AutoRoute(page: FeedbackSendPageRoute.page, path: 'sent'),
+                AutoRoute(page: FeedbackProgressPageRoute.page, path: 'progress'),
+                AutoRoute(page: FeedbackHistoryPageRoute.page, path: 'history'),
+              ],
+            ),
+            AutoRoute(page: MePageRoute.page, path: 'me'),
+          ],
+        ),
+        CustomRoute(page: NotificationPageRoute.page, path: RouterPath.notification, transitionsBuilder: applySlideTransition),
+      ];
 }
 }

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

@@ -15,12 +15,30 @@ abstract class _$MainPageRouter extends RootStackRouter {
 
 
   @override
   @override
   final Map<String, PageFactory> pagesMap = {
   final Map<String, PageFactory> pagesMap = {
+    FeedbackHistoryPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FeedbackHistoryScreen(),
+      );
+    },
     FeedbackPageRoute.name: (routeData) {
     FeedbackPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         routeData: routeData,
         child: const FeedbackPage(),
         child: const FeedbackPage(),
       );
       );
     },
     },
+    FeedbackProgressPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FeedbackProgressScreen(),
+      );
+    },
+    FeedbackSendPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FeedbackSendScreen(),
+      );
+    },
     HomePageRoute.name: (routeData) {
     HomePageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         routeData: routeData,
@@ -45,6 +63,24 @@ abstract class _$MainPageRouter extends RootStackRouter {
         child: const NotificationPage(),
         child: const NotificationPage(),
       );
       );
     },
     },
+    VisitorActivePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: VisitorActiveScreen(),
+      );
+    },
+    VisitorHistoryPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: VisitorHistoryScreen(),
+      );
+    },
+    VisitorNowPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: VisitorNowScreen(),
+      );
+    },
     VisitorPageRoute.name: (routeData) {
     VisitorPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         routeData: routeData,
@@ -55,6 +91,20 @@ abstract class _$MainPageRouter extends RootStackRouter {
 }
 }
 
 
 /// generated route for
 /// generated route for
+/// [FeedbackHistoryScreen]
+class FeedbackHistoryPageRoute extends PageRouteInfo<void> {
+  const FeedbackHistoryPageRoute({List<PageRouteInfo>? children})
+      : super(
+          FeedbackHistoryPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'FeedbackHistoryPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [FeedbackPage]
 /// [FeedbackPage]
 class FeedbackPageRoute extends PageRouteInfo<void> {
 class FeedbackPageRoute extends PageRouteInfo<void> {
   const FeedbackPageRoute({List<PageRouteInfo>? children})
   const FeedbackPageRoute({List<PageRouteInfo>? children})
@@ -69,6 +119,34 @@ class FeedbackPageRoute extends PageRouteInfo<void> {
 }
 }
 
 
 /// generated route for
 /// generated route for
+/// [FeedbackProgressScreen]
+class FeedbackProgressPageRoute extends PageRouteInfo<void> {
+  const FeedbackProgressPageRoute({List<PageRouteInfo>? children})
+      : super(
+          FeedbackProgressPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'FeedbackProgressPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [FeedbackSendScreen]
+class FeedbackSendPageRoute extends PageRouteInfo<void> {
+  const FeedbackSendPageRoute({List<PageRouteInfo>? children})
+      : super(
+          FeedbackSendPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'FeedbackSendPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [HomePage]
 /// [HomePage]
 class HomePageRoute extends PageRouteInfo<void> {
 class HomePageRoute extends PageRouteInfo<void> {
   const HomePageRoute({List<PageRouteInfo>? children})
   const HomePageRoute({List<PageRouteInfo>? children})
@@ -125,6 +203,48 @@ class NotificationPageRoute extends PageRouteInfo<void> {
 }
 }
 
 
 /// generated route for
 /// generated route for
+/// [VisitorActiveScreen]
+class VisitorActivePageRoute extends PageRouteInfo<void> {
+  const VisitorActivePageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorActivePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorActivePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [VisitorHistoryScreen]
+class VisitorHistoryPageRoute extends PageRouteInfo<void> {
+  const VisitorHistoryPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorHistoryPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorHistoryPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [VisitorNowScreen]
+class VisitorNowPageRoute extends PageRouteInfo<void> {
+  const VisitorNowPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorNowPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorNowPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [VisitorPage]
 /// [VisitorPage]
 class VisitorPageRoute extends PageRouteInfo<void> {
 class VisitorPageRoute extends PageRouteInfo<void> {
   const VisitorPageRoute({List<PageRouteInfo>? children})
   const VisitorPageRoute({List<PageRouteInfo>? children})

+ 2 - 1
packages/cs_plugin_basic/lib/provider/app_config/app_config_service.dart

@@ -72,7 +72,7 @@ class AppConfigService extends _$AppConfigService {
         width: width,
         width: width,
         height: height,
         height: height,
         whRatio: height / width,
         whRatio: height / width,
-        isFullScreenDevice: (height / width) > 1.9,
+        isFullScreenDevice: (height / width) > 1.88,
         topPadding: MediaQuery.of(context).padding.top,
         topPadding: MediaQuery.of(context).padding.top,
         bottomPadding: MediaQuery.of(context).padding.bottom,
         bottomPadding: MediaQuery.of(context).padding.bottom,
         textScaleFactor: MediaQuery.of(context).textScaleFactor,
         textScaleFactor: MediaQuery.of(context).textScaleFactor,
@@ -122,5 +122,6 @@ class AppConfigService extends _$AppConfigService {
     Log.d('AppConfig---disableAnimations: ${state.disableAnimations}');
     Log.d('AppConfig---disableAnimations: ${state.disableAnimations}');
     Log.d('AppConfig---boldText: ${state.boldText}');
     Log.d('AppConfig---boldText: ${state.boldText}');
     Log.d('AppConfig---orientation:${state.orientation}');
     Log.d('AppConfig---orientation:${state.orientation}');
+    Log.d('AppConfig---宽高比:${(state.mSize!.height / state.mSize!.width)} isFullScreenDevice:${state.isFullScreenDevice}');
   }
   }
 }
 }

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


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


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


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


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


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


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


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


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


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

@@ -48,6 +48,11 @@ class Assets {
   static const String communityNesFeed = 'assets/community/nes_feed.webp';
   static const String communityNesFeed = 'assets/community/nes_feed.webp';
   static const String communityShare = 'assets/community/share.webp';
   static const String communityShare = 'assets/community/share.webp';
   static const String mainAccountDeactivationImg = 'assets/main/account_deactivation_img.webp';
   static const String mainAccountDeactivationImg = 'assets/main/account_deactivation_img.webp';
+  static const String mainFeedbackHistory = 'assets/main/feedback_history.webp';
+  static const String mainFeedbackInProgress = 'assets/main/feedback_in_progress.webp';
+  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 mainHomeBoticeBoardIcon = 'assets/main/home_botice_board_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 mainHomeCommunityIcon = 'assets/main/home_community_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
@@ -73,6 +78,10 @@ class Assets {
   static const String mainTabMeUnselected = 'assets/main/tab_me_unselected.webp';
   static const String mainTabMeUnselected = 'assets/main/tab_me_unselected.webp';
   static const String mainTabVisitorSelected = 'assets/main/tab_visitor_selected.webp';
   static const String mainTabVisitorSelected = 'assets/main/tab_visitor_selected.webp';
   static const String mainTabVisitorUnselected = 'assets/main/tab_visitor_unselected.webp';
   static const String mainTabVisitorUnselected = 'assets/main/tab_visitor_unselected.webp';
+  static const String mainVisitorActive = 'assets/main/visitor_active.webp';
+  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 noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';

+ 30 - 6
packages/cs_resources/lib/generated/intl/messages_en.dart

@@ -20,14 +20,17 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
 class MessageLookup extends MessageLookupByLibrary {
 class MessageLookup extends MessageLookupByLibrary {
   String get localeName => 'en';
   String get localeName => 'en';
 
 
-  static String m0(count) => "Followers(${count})";
+  static String m0(count) => "${count} Characters";
 
 
-  static String m1(count) => "Following(${count})";
+  static String m1(count) => "Followers(${count})";
 
 
-  static String m2(name) => "Welcome ${name}";
+  static String m2(count) => "Following(${count})";
+
+  static String m3(name) => "Welcome ${name}";
 
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("Access Date"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
         "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."),
             "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":
         "account_deactivation":
@@ -44,12 +47,15 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
         "cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
         "change_mobile_phone":
         "change_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Change Mobile Phone"),
             MessageLookupByLibrary.simpleMessage("Change Mobile Phone"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("Community"),
         "community": MessageLookupByLibrary.simpleMessage("Community"),
         "confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
         "confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
         "confirm_new_password":
         "confirm_new_password":
             MessageLookupByLibrary.simpleMessage("Confirm New Password"),
             MessageLookupByLibrary.simpleMessage("Confirm New Password"),
         "confirm_password":
         "confirm_password":
             MessageLookupByLibrary.simpleMessage("Confirm Password"),
             MessageLookupByLibrary.simpleMessage("Confirm Password"),
+        "create_new_feedback":
+            MessageLookupByLibrary.simpleMessage("Create New FeedBack"),
         "create_new_yy_home_account":
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("Create New YY Home Account"),
             MessageLookupByLibrary.simpleMessage("Create New YY Home Account"),
         "did_not_receive":
         "did_not_receive":
@@ -64,19 +70,26 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Estate or Building Name?"),
             MessageLookupByLibrary.simpleMessage("Estate or Building Name?"),
         "facility": MessageLookupByLibrary.simpleMessage("Facility"),
         "facility": MessageLookupByLibrary.simpleMessage("Facility"),
         "feedback": MessageLookupByLibrary.simpleMessage("FeedBack"),
         "feedback": MessageLookupByLibrary.simpleMessage("FeedBack"),
+        "feedback_msg_1": MessageLookupByLibrary.simpleMessage(
+            "Help us keep your estate beautiful"),
+        "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
+            "there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!"),
         "first_name": MessageLookupByLibrary.simpleMessage("First Name"),
         "first_name": MessageLookupByLibrary.simpleMessage("First Name"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password":
         "forgot_password":
             MessageLookupByLibrary.simpleMessage("Forgot Password?"),
             MessageLookupByLibrary.simpleMessage("Forgot Password?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage(
         "forgot_text": MessageLookupByLibrary.simpleMessage(
             "Enter your email and mobile phone number"),
             "Enter your email and mobile phone number"),
         "form": MessageLookupByLibrary.simpleMessage("Form"),
         "form": MessageLookupByLibrary.simpleMessage("Form"),
+        "full_name": MessageLookupByLibrary.simpleMessage("Full Name"),
         "get_code": MessageLookupByLibrary.simpleMessage("Get Code"),
         "get_code": MessageLookupByLibrary.simpleMessage("Get Code"),
         "get_started":
         "get_started":
             MessageLookupByLibrary.simpleMessage("let\'s get started"),
             MessageLookupByLibrary.simpleMessage("let\'s get started"),
+        "history": MessageLookupByLibrary.simpleMessage("History"),
         "home": MessageLookupByLibrary.simpleMessage("Home"),
         "home": MessageLookupByLibrary.simpleMessage("Home"),
         "household": MessageLookupByLibrary.simpleMessage("Household"),
         "household": MessageLookupByLibrary.simpleMessage("Household"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("In Progress"),
         "info": MessageLookupByLibrary.simpleMessage("Info"),
         "info": MessageLookupByLibrary.simpleMessage("Info"),
         "internal": MessageLookupByLibrary.simpleMessage("Internal"),
         "internal": MessageLookupByLibrary.simpleMessage("Internal"),
         "introduction_to_info_pack":
         "introduction_to_info_pack":
@@ -85,6 +98,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "latest_news": MessageLookupByLibrary.simpleMessage("Latest News"),
         "latest_news": MessageLookupByLibrary.simpleMessage("Latest News"),
         "latest_transactions":
         "latest_transactions":
             MessageLookupByLibrary.simpleMessage("Latest Transactions"),
             MessageLookupByLibrary.simpleMessage("Latest Transactions"),
+        "license_plate_number":
+            MessageLookupByLibrary.simpleMessage("License Plate Number"),
         "login": MessageLookupByLibrary.simpleMessage("Log In"),
         "login": MessageLookupByLibrary.simpleMessage("Log In"),
         "logout": MessageLookupByLibrary.simpleMessage("Logout"),
         "logout": MessageLookupByLibrary.simpleMessage("Logout"),
         "logout_alert": MessageLookupByLibrary.simpleMessage(
         "logout_alert": MessageLookupByLibrary.simpleMessage(
@@ -97,8 +112,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("New Password"),
         "new_password": MessageLookupByLibrary.simpleMessage("New Password"),
         "next": MessageLookupByLibrary.simpleMessage("Next"),
         "next": MessageLookupByLibrary.simpleMessage("Next"),
         "no": MessageLookupByLibrary.simpleMessage("No"),
         "no": MessageLookupByLibrary.simpleMessage("No"),
+        "notes": MessageLookupByLibrary.simpleMessage("Notes"),
         "notice_board": MessageLookupByLibrary.simpleMessage("Notice Board"),
         "notice_board": MessageLookupByLibrary.simpleMessage("Notice Board"),
         "notification": MessageLookupByLibrary.simpleMessage("Notification"),
         "notification": MessageLookupByLibrary.simpleMessage("Notification"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("NRIC/FIN"),
         "old_mobile_phone":
         "old_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Old Mobile Phone"),
             MessageLookupByLibrary.simpleMessage("Old Mobile Phone"),
         "other": MessageLookupByLibrary.simpleMessage("Other"),
         "other": MessageLookupByLibrary.simpleMessage("Other"),
@@ -132,6 +149,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "reset_password":
         "reset_password":
             MessageLookupByLibrary.simpleMessage("Reset Password"),
             MessageLookupByLibrary.simpleMessage("Reset Password"),
         "rewards": MessageLookupByLibrary.simpleMessage("Rewards"),
         "rewards": MessageLookupByLibrary.simpleMessage("Rewards"),
+        "sent": MessageLookupByLibrary.simpleMessage("Sent"),
         "service": MessageLookupByLibrary.simpleMessage("Service"),
         "service": MessageLookupByLibrary.simpleMessage("Service"),
         "settings": MessageLookupByLibrary.simpleMessage("Settings"),
         "settings": MessageLookupByLibrary.simpleMessage("Settings"),
         "sign_up_success_txt1": MessageLookupByLibrary.simpleMessage(
         "sign_up_success_txt1": MessageLookupByLibrary.simpleMessage(
@@ -174,7 +192,13 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Verification Code"),
             MessageLookupByLibrary.simpleMessage("Verification Code"),
         "version_no": MessageLookupByLibrary.simpleMessage("Version No."),
         "version_no": MessageLookupByLibrary.simpleMessage("Version No."),
         "visitor": MessageLookupByLibrary.simpleMessage("Visitor"),
         "visitor": MessageLookupByLibrary.simpleMessage("Visitor"),
-        "welcome_name": m2,
+        "visitor_active": MessageLookupByLibrary.simpleMessage("Active"),
+        "visitor_msg": MessageLookupByLibrary.simpleMessage(
+            "The community visitor system is an intelligent system designed to enhance community security management and facilitate visitor access."),
+        "visitor_now": MessageLookupByLibrary.simpleMessage("Now"),
+        "visitor_registration":
+            MessageLookupByLibrary.simpleMessage("Visitor Registration"),
+        "welcome_name": m3,
         "who_are_owners":
         "who_are_owners":
             MessageLookupByLibrary.simpleMessage("Who are owners?"),
             MessageLookupByLibrary.simpleMessage("Who are owners?"),
         "who_are_tenants":
         "who_are_tenants":

+ 26 - 6
packages/cs_resources/lib/generated/intl/messages_zh_CN.dart

@@ -20,14 +20,17 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
 class MessageLookup extends MessageLookupByLibrary {
 class MessageLookup extends MessageLookupByLibrary {
   String get localeName => 'zh_CN';
   String get localeName => 'zh_CN';
 
 
-  static String m0(count) => "粉丝(${count})";
+  static String m0(count) => "${count} 字符";
 
 
-  static String m1(count) => "关注(${count})";
+  static String m1(count) => "粉丝(${count})";
 
 
-  static String m2(name) => "欢迎你 ${name}";
+  static String m2(count) => "关注(${count})";
+
+  static String m3(name) => "欢迎你 ${name}";
 
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
@@ -41,10 +44,12 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
+        "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
@@ -57,16 +62,22 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
         "facility": MessageLookupByLibrary.simpleMessage("设施"),
         "facility": MessageLookupByLibrary.simpleMessage("设施"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
+        "feedback_msg_1": MessageLookupByLibrary.simpleMessage("帮助我们保持您的房产美丽"),
+        "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
+            "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表单"),
         "form": MessageLookupByLibrary.simpleMessage("表单"),
+        "full_name": MessageLookupByLibrary.simpleMessage("全名"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
+        "history": MessageLookupByLibrary.simpleMessage("历史记录"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("处理中"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "introduction_to_info_pack":
         "introduction_to_info_pack":
@@ -74,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
+        "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -84,8 +96,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
+        "notes": MessageLookupByLibrary.simpleMessage("备注"),
         "notice_board": MessageLookupByLibrary.simpleMessage("消息板"),
         "notice_board": MessageLookupByLibrary.simpleMessage("消息板"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("身份证/签证"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "owner": MessageLookupByLibrary.simpleMessage("业主"),
         "owner": MessageLookupByLibrary.simpleMessage("业主"),
@@ -109,6 +123,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("奖励"),
         "rewards": MessageLookupByLibrary.simpleMessage("奖励"),
+        "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "sign_up_success_txt1":
         "sign_up_success_txt1":
@@ -143,7 +158,12 @@ class MessageLookup extends MessageLookupByLibrary {
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
-        "welcome_name": m2,
+        "visitor_active": MessageLookupByLibrary.simpleMessage("可用的"),
+        "visitor_msg": MessageLookupByLibrary.simpleMessage(
+            "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
+        "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
+        "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
+        "welcome_name": m3,
         "who_are_owners": MessageLookupByLibrary.simpleMessage("怎样才算业主?"),
         "who_are_owners": MessageLookupByLibrary.simpleMessage("怎样才算业主?"),
         "who_are_tenants": MessageLookupByLibrary.simpleMessage("怎样才算租户?"),
         "who_are_tenants": MessageLookupByLibrary.simpleMessage("怎样才算租户?"),
         "yes": MessageLookupByLibrary.simpleMessage("是"),
         "yes": MessageLookupByLibrary.simpleMessage("是"),

+ 26 - 6
packages/cs_resources/lib/generated/intl/messages_zh_HK.dart

@@ -20,14 +20,17 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
 class MessageLookup extends MessageLookupByLibrary {
 class MessageLookup extends MessageLookupByLibrary {
   String get localeName => 'zh_HK';
   String get localeName => 'zh_HK';
 
 
-  static String m0(count) => "粉丝(${count})";
+  static String m0(count) => "${count} 字符";
 
 
-  static String m1(count) => "关注(${count})";
+  static String m1(count) => "粉丝(${count})";
 
 
-  static String m2(name) => "欢迎你 ${name}";
+  static String m2(count) => "关注(${count})";
+
+  static String m3(name) => "欢迎你 ${name}";
 
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
@@ -41,10 +44,12 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
+        "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
@@ -57,16 +62,22 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
         "facility": MessageLookupByLibrary.simpleMessage("設施"),
         "facility": MessageLookupByLibrary.simpleMessage("設施"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
+        "feedback_msg_1": MessageLookupByLibrary.simpleMessage("帮助我们保持您的房产美丽"),
+        "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
+            "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表單"),
         "form": MessageLookupByLibrary.simpleMessage("表單"),
+        "full_name": MessageLookupByLibrary.simpleMessage("全名"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
+        "history": MessageLookupByLibrary.simpleMessage("历史记录"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("处理中"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "introduction_to_info_pack":
         "introduction_to_info_pack":
@@ -74,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
+        "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -84,8 +96,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
+        "notes": MessageLookupByLibrary.simpleMessage("备注"),
         "notice_board": MessageLookupByLibrary.simpleMessage("通知板"),
         "notice_board": MessageLookupByLibrary.simpleMessage("通知板"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("身份证/签证"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "password": MessageLookupByLibrary.simpleMessage("密码"),
         "password": MessageLookupByLibrary.simpleMessage("密码"),
@@ -101,6 +115,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("獎勵"),
         "rewards": MessageLookupByLibrary.simpleMessage("獎勵"),
+        "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "sign_up_success_txt1":
         "sign_up_success_txt1":
@@ -130,7 +145,12 @@ class MessageLookup extends MessageLookupByLibrary {
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
-        "welcome_name": m2,
+        "visitor_active": MessageLookupByLibrary.simpleMessage("可用的"),
+        "visitor_msg": MessageLookupByLibrary.simpleMessage(
+            "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
+        "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
+        "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
+        "welcome_name": m3,
         "yes": MessageLookupByLibrary.simpleMessage("是"),
         "yes": MessageLookupByLibrary.simpleMessage("是"),
         "you_have": MessageLookupByLibrary.simpleMessage("你还有"),
         "you_have": MessageLookupByLibrary.simpleMessage("你还有"),
         "your_roles_responsibilities":
         "your_roles_responsibilities":

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

@@ -1100,6 +1100,166 @@ class S {
     );
     );
   }
   }
 
 
+  /// `Now`
+  String get visitor_now {
+    return Intl.message(
+      'Now',
+      name: 'visitor_now',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Active`
+  String get visitor_active {
+    return Intl.message(
+      'Active',
+      name: 'visitor_active',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `History`
+  String get history {
+    return Intl.message(
+      'History',
+      name: 'history',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `The community visitor system is an intelligent system designed to enhance community security management and facilitate visitor access.`
+  String get visitor_msg {
+    return Intl.message(
+      'The community visitor system is an intelligent system designed to enhance community security management and facilitate visitor access.',
+      name: 'visitor_msg',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Visitor Registration`
+  String get visitor_registration {
+    return Intl.message(
+      'Visitor Registration',
+      name: 'visitor_registration',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Full Name`
+  String get full_name {
+    return Intl.message(
+      'Full Name',
+      name: 'full_name',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `NRIC/FIN`
+  String get nric_fin {
+    return Intl.message(
+      'NRIC/FIN',
+      name: 'nric_fin',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `License Plate Number`
+  String get license_plate_number {
+    return Intl.message(
+      'License Plate Number',
+      name: 'license_plate_number',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Access Date`
+  String get access_date {
+    return Intl.message(
+      'Access Date',
+      name: 'access_date',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Notes`
+  String get notes {
+    return Intl.message(
+      'Notes',
+      name: 'notes',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `{count} Characters`
+  String characters(Object count) {
+    return Intl.message(
+      '$count Characters',
+      name: 'characters',
+      desc: '',
+      args: [count],
+    );
+  }
+
+  /// `Sent`
+  String get sent {
+    return Intl.message(
+      'Sent',
+      name: 'sent',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `In Progress`
+  String get in_progress {
+    return Intl.message(
+      'In Progress',
+      name: 'in_progress',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Help us keep your estate beautiful`
+  String get feedback_msg_1 {
+    return Intl.message(
+      'Help us keep your estate beautiful',
+      name: 'feedback_msg_1',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!`
+  String get feedback_msg_2 {
+    return Intl.message(
+      'there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!',
+      name: 'feedback_msg_2',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Create New FeedBack`
+  String get create_new_feedback {
+    return Intl.message(
+      'Create New FeedBack',
+      name: 'create_new_feedback',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Other`
   /// `Other`
   String get other {
   String get other {
     return Intl.message(
     return Intl.message(

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

@@ -104,5 +104,21 @@
   "introduction_to_info_pack": "Introduction to info-pack",
   "introduction_to_info_pack": "Introduction to info-pack",
   "your_roles_responsibilities": "Your roles & responsibilities",
   "your_roles_responsibilities": "Your roles & responsibilities",
   "property_guide": "Property Guide",
   "property_guide": "Property Guide",
+  "visitor_now": "Now",
+  "visitor_active": "Active",
+  "history": "History",
+  "visitor_msg": "The community visitor system is an intelligent system designed to enhance community security management and facilitate visitor access.",
+  "visitor_registration": "Visitor Registration",
+  "full_name": "Full Name",
+  "nric_fin": "NRIC/FIN",
+  "license_plate_number": "License Plate Number",
+  "access_date": "Access Date",
+  "notes": "Notes",
+  "characters": "{count} Characters",
+  "sent": "Sent",
+  "in_progress": "In Progress",
+  "feedback_msg_1": "Help us keep your estate beautiful",
+  "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",
   "other": "Other"
   "other": "Other"
 }
 }

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

@@ -104,5 +104,21 @@
   "introduction_to_info_pack": "信息介绍",
   "introduction_to_info_pack": "信息介绍",
   "your_roles_responsibilities": "您的角色和职责",
   "your_roles_responsibilities": "您的角色和职责",
   "property_guide": "物业指南",
   "property_guide": "物业指南",
+  "visitor_now": "当前的",
+  "visitor_active": "可用的",
+  "history": "历史记录",
+  "visitor_msg": "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。",
+  "visitor_registration": "访客登记",
+  "full_name": "全名",
+  "nric_fin": "身份证/签证",
+  "license_plate_number": "车牌号",
+  "access_date": "访问日期",
+  "notes": "备注",
+  "characters": "{count} 字符",
+  "sent": "发送",
+  "in_progress": "处理中",
+  "feedback_msg_1": "帮助我们保持您的房产美丽",
+  "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
+  "create_new_feedback": "创建新的反馈",
   "other": "其他"
   "other": "其他"
 }
 }

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

@@ -90,5 +90,21 @@
   "introduction_to_info_pack": "信息介绍",
   "introduction_to_info_pack": "信息介绍",
   "your_roles_responsibilities": "您的角色和职责",
   "your_roles_responsibilities": "您的角色和职责",
   "property_guide": "物业指南",
   "property_guide": "物业指南",
+  "visitor_now": "当前的",
+  "visitor_active": "可用的",
+  "history": "历史记录",
+  "visitor_msg": "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。",
+  "visitor_registration": "访客登记",
+  "full_name": "全名",
+  "nric_fin": "身份证/签证",
+  "license_plate_number": "车牌号",
+  "access_date": "访问日期",
+  "notes": "备注",
+  "characters": "{count} 字符",
+  "sent": "发送",
+  "in_progress": "处理中",
+  "feedback_msg_1": "帮助我们保持您的房产美丽",
+  "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
+  "create_new_feedback": "创建新的反馈",
   "other": "其他"
   "other": "其他"
 }
 }

+ 17 - 1
packages/cs_resources/lib/theme/app_colors_theme.dart

@@ -27,12 +27,13 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   static const _colorDCDCDC = Color(0xFFDCDCDC);
   static const _colorDCDCDC = Color(0xFFDCDCDC);
   static const _colorEFF3FF = Color(0xFFEFF3FF);
   static const _colorEFF3FF = Color(0xFFEFF3FF);
   static const _colorDFF0FF = Color(0xFFDFF0FF);
   static const _colorDFF0FF = Color(0xFFDFF0FF);
-
+  static const _color1B61CA = Color(0X4D1B61CA);
 
 
   //暗色主题的一些自定义颜色值
   //暗色主题的一些自定义颜色值
   static const _darkBlackBg = Color(0xFF0F0F0F);
   static const _darkBlackBg = Color(0xFF0F0F0F);
   static const _darkBlackItem = Color(0xFF1D1D1E);
   static const _darkBlackItem = Color(0xFF1D1D1E);
   static const _darkBlackItemLight = Color(0xFF3B3933);
   static const _darkBlackItemLight = Color(0xFF3B3933);
+  static const _darkBlackItemLightShadow = Color(0x4D3B3933);
   static const _darkBlackItemLightMost = Color(0xFF5C5850);
   static const _darkBlackItemLightMost = Color(0xFF5C5850);
   static const _darkBlackItemDivider = Color(0xFF3B3B3F);
   static const _darkBlackItemDivider = Color(0xFF3B3B3F);
 
 
@@ -60,6 +61,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   final Color dividerDefault; //分割线默认颜色
   final Color dividerDefault; //分割线默认颜色
   final Color lightPurpleBg; //淡紫色背景
   final Color lightPurpleBg; //淡紫色背景
   final Color lightBlueBg; //淡蓝色背景
   final Color lightBlueBg; //淡蓝色背景
+  final Color tabTextSelectedDefault; //Tab文本,选中主题蓝,黑暗模式为白色
+  final Color tabTextUnSelectedDefault; //Tab文本,未选中 亮色为黑色,黑暗模式为灰色
+  final Color tabLightBlueShadow; //Tab的淡蓝色阴影
 
 
   // 私有的构造函数
   // 私有的构造函数
   const AppColorsTheme._internal({
   const AppColorsTheme._internal({
@@ -86,6 +90,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
     required this.dividerDefault,
     required this.dividerDefault,
     required this.lightPurpleBg,
     required this.lightPurpleBg,
     required this.lightBlueBg,
     required this.lightBlueBg,
+    required this.tabLightBlueShadow,
+    required this.tabTextSelectedDefault,
+    required this.tabTextUnSelectedDefault,
   });
   });
 
 
   // 浅色主题工厂方法
   // 浅色主题工厂方法
@@ -114,6 +121,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       dividerDefault: _colorDCDCDC,
       dividerDefault: _colorDCDCDC,
       lightPurpleBg: _colorEFF3FF,
       lightPurpleBg: _colorEFF3FF,
       lightBlueBg: _colorDFF0FF,
       lightBlueBg: _colorDFF0FF,
+      tabLightBlueShadow: _color1B61CA,
+      tabTextSelectedDefault: _colorPrimary,
+      tabTextUnSelectedDefault: Colors.black,
     );
     );
   }
   }
 
 
@@ -143,6 +153,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       dividerDefault: _darkBlackItemDivider,
       dividerDefault: _darkBlackItemDivider,
       lightPurpleBg: _darkBlackItemLight,
       lightPurpleBg: _darkBlackItemLight,
       lightBlueBg: _darkBlackItem,
       lightBlueBg: _darkBlackItem,
+      tabLightBlueShadow: _darkBlackItemLightShadow,
+      tabTextSelectedDefault: Colors.white,
+      tabTextUnSelectedDefault: _darkBlackItemLightMost,
     );
     );
   }
   }
 
 
@@ -181,6 +194,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       dividerDefault: Color.lerp(dividerDefault, other.dividerDefault, t)!,
       dividerDefault: Color.lerp(dividerDefault, other.dividerDefault, t)!,
       lightPurpleBg: Color.lerp(lightPurpleBg, other.lightPurpleBg, t)!,
       lightPurpleBg: Color.lerp(lightPurpleBg, other.lightPurpleBg, t)!,
       lightBlueBg: Color.lerp(lightBlueBg, other.lightBlueBg, t)!,
       lightBlueBg: Color.lerp(lightBlueBg, other.lightBlueBg, t)!,
+      tabTextSelectedDefault: Color.lerp(tabTextSelectedDefault, other.tabTextSelectedDefault, t)!,
+      tabLightBlueShadow: Color.lerp(tabLightBlueShadow, other.tabLightBlueShadow, t)!,
+      tabTextUnSelectedDefault: Color.lerp(tabTextUnSelectedDefault, other.tabTextUnSelectedDefault, t)!,
     );
     );
   }
   }
 }
 }

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

@@ -8,4 +8,6 @@ abstract class AppService {
 
 
   RootStackRouter getAppRouter();
   RootStackRouter getAppRouter();
 
 
+  bool isDeviceFullScreen();
+
 }
 }

+ 20 - 19
packages/cs_widgets/lib/load_state_layout.dart

@@ -1,4 +1,5 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'my_load_image.dart';
 import 'my_load_image.dart';
@@ -43,34 +44,34 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
       return SizedBox(
       return SizedBox(
         width: double.infinity,
         width: double.infinity,
         height: double.infinity,
         height: double.infinity,
-        child: _buildWidget,
+        child: _buildWidget(context),
       );
       );
     }
     }
   }
   }
 
 
   //Slivers的布局
   //Slivers的布局
   List<Widget> _buildSlivers() {
   List<Widget> _buildSlivers() {
-    return _buildListWidget;
+    return _buildListWidget(context);
   }
   }
 
 
   ///根据不同状态来显示不同的视图 (默认布局)
   ///根据不同状态来显示不同的视图 (默认布局)
-  Widget get _buildWidget {
+  Widget _buildWidget(BuildContext context) {
     switch (widget.state) {
     switch (widget.state) {
       case LoadState.State_Success:
       case LoadState.State_Success:
         return widget.successWidget ?? const SizedBox();
         return widget.successWidget ?? const SizedBox();
       case LoadState.State_Error:
       case LoadState.State_Error:
-        return _errorView;
+        return _errorView(context);
       case LoadState.State_Loading:
       case LoadState.State_Loading:
-        return _loadingView;
+        return _loadingView(context);
       case LoadState.State_Empty:
       case LoadState.State_Empty:
-        return _emptyView;
+        return _emptyView(context);
       default:
       default:
-        return _loadingView;
+        return _loadingView(context);
     }
     }
   }
   }
 
 
   ///根据不同状态来显示不同的视图 (CustomScrollView)
   ///根据不同状态来显示不同的视图 (CustomScrollView)
-  List<Widget> get _buildListWidget {
+  List<Widget> _buildListWidget(BuildContext context) {
     switch (widget.state) {
     switch (widget.state) {
       case LoadState.State_Success:
       case LoadState.State_Success:
         return widget.successSliverWidget != null
         return widget.successSliverWidget != null
@@ -79,13 +80,13 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
                 ? [widget.successWidget!]
                 ? [widget.successWidget!]
                 : [const SizedBox()];
                 : [const SizedBox()];
       case LoadState.State_Error:
       case LoadState.State_Error:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_errorView) : _errorView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_errorView(context)) : _errorView(context)];
       case LoadState.State_Loading:
       case LoadState.State_Loading:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView) : _loadingView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView(context)) : _loadingView(context)];
       case LoadState.State_Empty:
       case LoadState.State_Empty:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_emptyView) : _emptyView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_emptyView(context)) : _emptyView(context)];
       default:
       default:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView) : _loadingView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView(context)) : _loadingView(context)];
     }
     }
   }
   }
 
 
@@ -104,7 +105,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
   // ===================================== 真正的状态布局 ↓ =====================================
   // ===================================== 真正的状态布局 ↓ =====================================
 
 
   ///加载中视图
   ///加载中视图
-  Widget get _loadingView {
+  Widget _loadingView(BuildContext context) {
     return Container(
     return Container(
       width: double.infinity,
       width: double.infinity,
       height: double.infinity,
       height: double.infinity,
@@ -116,13 +117,13 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
         children: [
         children: [
           CircularProgressIndicator(
           CircularProgressIndicator(
             strokeWidth: 3,
             strokeWidth: 3,
-            valueColor: AlwaysStoppedAnimation(widget.themeColor ?? const Color(0XFFD6E9F1)),
+            valueColor: AlwaysStoppedAnimation(widget.themeColor ?? context.appColors.textDarkGray),
           ),
           ),
           MyTextView(
           MyTextView(
             'Loading...',
             'Loading...',
             marginTop: 15,
             marginTop: 15,
             fontSize: 14,
             fontSize: 14,
-            textColor: widget.themeColor ?? const Color(0XFFD6E9F1),
+            textColor: widget.themeColor ?? context.appColors.textDarkGray,
           )
           )
         ],
         ],
       ),
       ),
@@ -130,7 +131,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
   }
   }
 
 
   ///错误视图
   ///错误视图
-  Widget get _errorView {
+  Widget _errorView(BuildContext context) {
     return Container(
     return Container(
         width: double.infinity,
         width: double.infinity,
         height: double.infinity,
         height: double.infinity,
@@ -148,14 +149,14 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
                   widget.errorMessage ?? 'Data loading failed! Please refresh and try again',
                   widget.errorMessage ?? 'Data loading failed! Please refresh and try again',
                   marginTop: 18,
                   marginTop: 18,
                   fontSize: 14,
                   fontSize: 14,
-                  textColor: widget.themeColor ?? const Color(0XFFD6E9F1),
+                  textColor: widget.themeColor ?? context.appColors.textDarkGray,
                 ),
                 ),
               ],
               ],
             )));
             )));
   }
   }
 
 
   ///数据为空的视图
   ///数据为空的视图
-  Widget get _emptyView {
+  Widget _emptyView(BuildContext context) {
     return Container(
     return Container(
       width: double.infinity,
       width: double.infinity,
       height: double.infinity,
       height: double.infinity,
@@ -171,7 +172,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
             'There is currently no content available',
             'There is currently no content available',
             marginTop: 18,
             marginTop: 18,
             fontSize: 14,
             fontSize: 14,
-            textColor: widget.themeColor ?? const Color(0XFFD6E9F1),
+            textColor: widget.themeColor ?? context.appColors.textDarkGray,
           ),
           ),
         ],
         ],
       ),
       ),

+ 4 - 4
packages/cs_widgets/lib/responsive_widget.dart

@@ -1,4 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
+import 'package:router/componentRouter/app_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 
 
 /// 响应式的布局,根据不同的尺寸展示不同的布局
 /// 响应式的布局,根据不同的尺寸展示不同的布局
@@ -32,10 +34,8 @@ class ResponsiveWidget extends StatelessWidget {
         // 小屏幕
         // 小屏幕
         else {
         else {
           // 获取屏幕的高度和宽度
           // 获取屏幕的高度和宽度
-          final double height = constraints.maxHeight;
-          final double width = constraints.maxWidth;
-          final radio = height / width;
-          final isFullScreen = radio > 1.88;
+          final isFullScreen =   ComponentServiceManager().appService.isDeviceFullScreen();
+          Log.d("isFullScreen:$isFullScreen");
           // 判断是否为全面屏
           // 判断是否为全面屏
           if (isFullScreen) {
           if (isFullScreen) {
             return smallFullScreen ?? smallScreen; // 如果是全面屏,使用全面屏布局
             return smallFullScreen ?? smallScreen; // 如果是全面屏,使用全面屏布局