Ver código fonte

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

liukai 1 semana atrás
pai
commit
fdbd505bd9
62 arquivos alterados com 2451 adições e 405 exclusões
  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',
           failedText: 'Failed',
           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,
         );
     EasyRefresh.defaultFooterBuilder = () => const ClassicFooter(
@@ -90,9 +87,6 @@ class MyApp extends HookConsumerWidget {
           showMessage: false,
           triggerOffset: 50,
           iconDimension: 22,
-          textStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
-          messageStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
-          iconTheme: IconThemeData(color: Color(0XFFAECAE5)),
           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: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';
 
 class AppComponentServiceImpl extends AppService {
@@ -10,4 +11,9 @@ class AppComponentServiceImpl extends AppService {
   RootStackRouter getAppRouter() {
     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:hooks_riverpod/hooks_riverpod.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/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
@@ -29,7 +32,15 @@ class HomePage extends HookConsumerWidget {
 
     return Scaffold(
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
+          backIconPath: Assets.mainTabMeSelected,
+          backIconWidth: 18.5,
+          backIconHeight: 20,
+          showBackButton: true,
           backgroundColor: context.appColors.whiteBG,
+          backCallback: (){
+          ToastEngine.show("测试去登录页面");
+          ComponentServiceManager().authService.startLoginPage();
+          },
           actions: [
             Center(
                     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
 // **************************************************************************
 
-String _$homeViewModelHash() => r'9b4974389335a1d56e6b345f83e7c626e3ba0d28';
+String _$homeViewModelHash() => r'6ec7a8712028daa4d43ace46ea0269981b237187';
 
 /// See also [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:flutter/material.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:flutter/material.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:flutter/material.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:flutter/material.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:flutter/material.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/l10n.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/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_appbar.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';
 
 @RoutePage()
@@ -31,253 +19,117 @@ class VisitorPage extends HookConsumerWidget {
 
   @override
   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(
-      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/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/main/main_page.dart';
 import '../../modules/me/me_page.dart';
 import '../../modules/notification/notification_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';
 
@@ -20,17 +25,33 @@ part 'main_page_router.gr.dart';
 class MainPageRouter extends _$MainPageRouter {
   @override
   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
   final Map<String, PageFactory> pagesMap = {
+    FeedbackHistoryPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FeedbackHistoryScreen(),
+      );
+    },
     FeedbackPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         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) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -45,6 +63,24 @@ abstract class _$MainPageRouter extends RootStackRouter {
         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) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -55,6 +91,20 @@ abstract class _$MainPageRouter extends RootStackRouter {
 }
 
 /// 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]
 class FeedbackPageRoute extends PageRouteInfo<void> {
   const FeedbackPageRoute({List<PageRouteInfo>? children})
@@ -69,6 +119,34 @@ class FeedbackPageRoute extends PageRouteInfo<void> {
 }
 
 /// 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]
 class HomePageRoute extends PageRouteInfo<void> {
   const HomePageRoute({List<PageRouteInfo>? children})
@@ -125,6 +203,48 @@ class NotificationPageRoute extends PageRouteInfo<void> {
 }
 
 /// 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]
 class VisitorPageRoute extends PageRouteInfo<void> {
   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,
         height: height,
         whRatio: height / width,
-        isFullScreenDevice: (height / width) > 1.9,
+        isFullScreenDevice: (height / width) > 1.88,
         topPadding: MediaQuery.of(context).padding.top,
         bottomPadding: MediaQuery.of(context).padding.bottom,
         textScaleFactor: MediaQuery.of(context).textScaleFactor,
@@ -122,5 +122,6 @@ class AppConfigService extends _$AppConfigService {
     Log.d('AppConfig---disableAnimations: ${state.disableAnimations}');
     Log.d('AppConfig---boldText: ${state.boldText}');
     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 communityShare = 'assets/community/share.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 mainHomeCommunityIcon = 'assets/main/home_community_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 mainTabVisitorSelected = 'assets/main/tab_visitor_selected.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 noticeBoardDocumentsIcon = 'assets/notice_board/documents_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 {
   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);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("Access Date"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request."),
         "account_deactivation":
@@ -44,12 +47,15 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
         "change_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Change Mobile Phone"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("Community"),
         "confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
         "confirm_new_password":
             MessageLookupByLibrary.simpleMessage("Confirm New Password"),
         "confirm_password":
             MessageLookupByLibrary.simpleMessage("Confirm Password"),
+        "create_new_feedback":
+            MessageLookupByLibrary.simpleMessage("Create New FeedBack"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("Create New YY Home Account"),
         "did_not_receive":
@@ -64,19 +70,26 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Estate or Building Name?"),
         "facility": MessageLookupByLibrary.simpleMessage("Facility"),
         "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"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password":
             MessageLookupByLibrary.simpleMessage("Forgot Password?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage(
             "Enter your email and mobile phone number"),
         "form": MessageLookupByLibrary.simpleMessage("Form"),
+        "full_name": MessageLookupByLibrary.simpleMessage("Full Name"),
         "get_code": MessageLookupByLibrary.simpleMessage("Get Code"),
         "get_started":
             MessageLookupByLibrary.simpleMessage("let\'s get started"),
+        "history": MessageLookupByLibrary.simpleMessage("History"),
         "home": MessageLookupByLibrary.simpleMessage("Home"),
         "household": MessageLookupByLibrary.simpleMessage("Household"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("In Progress"),
         "info": MessageLookupByLibrary.simpleMessage("Info"),
         "internal": MessageLookupByLibrary.simpleMessage("Internal"),
         "introduction_to_info_pack":
@@ -85,6 +98,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "latest_news": MessageLookupByLibrary.simpleMessage("Latest News"),
         "latest_transactions":
             MessageLookupByLibrary.simpleMessage("Latest Transactions"),
+        "license_plate_number":
+            MessageLookupByLibrary.simpleMessage("License Plate Number"),
         "login": MessageLookupByLibrary.simpleMessage("Log In"),
         "logout": MessageLookupByLibrary.simpleMessage("Logout"),
         "logout_alert": MessageLookupByLibrary.simpleMessage(
@@ -97,8 +112,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("New Password"),
         "next": MessageLookupByLibrary.simpleMessage("Next"),
         "no": MessageLookupByLibrary.simpleMessage("No"),
+        "notes": MessageLookupByLibrary.simpleMessage("Notes"),
         "notice_board": MessageLookupByLibrary.simpleMessage("Notice Board"),
         "notification": MessageLookupByLibrary.simpleMessage("Notification"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("NRIC/FIN"),
         "old_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Old Mobile Phone"),
         "other": MessageLookupByLibrary.simpleMessage("Other"),
@@ -132,6 +149,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "reset_password":
             MessageLookupByLibrary.simpleMessage("Reset Password"),
         "rewards": MessageLookupByLibrary.simpleMessage("Rewards"),
+        "sent": MessageLookupByLibrary.simpleMessage("Sent"),
         "service": MessageLookupByLibrary.simpleMessage("Service"),
         "settings": MessageLookupByLibrary.simpleMessage("Settings"),
         "sign_up_success_txt1": MessageLookupByLibrary.simpleMessage(
@@ -174,7 +192,13 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Verification Code"),
         "version_no": MessageLookupByLibrary.simpleMessage("Version No."),
         "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":
             MessageLookupByLibrary.simpleMessage("Who are owners?"),
         "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 {
   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);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
@@ -41,10 +44,12 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
+        "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
@@ -57,16 +62,22 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
         "facility": MessageLookupByLibrary.simpleMessage("设施"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
+        "feedback_msg_1": MessageLookupByLibrary.simpleMessage("帮助我们保持您的房产美丽"),
+        "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
+            "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表单"),
+        "full_name": MessageLookupByLibrary.simpleMessage("全名"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
+        "history": MessageLookupByLibrary.simpleMessage("历史记录"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("处理中"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "introduction_to_info_pack":
@@ -74,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
+        "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -84,8 +96,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
+        "notes": MessageLookupByLibrary.simpleMessage("备注"),
         "notice_board": MessageLookupByLibrary.simpleMessage("消息板"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("身份证/签证"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "owner": MessageLookupByLibrary.simpleMessage("业主"),
@@ -109,6 +123,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("奖励"),
+        "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "sign_up_success_txt1":
@@ -143,7 +158,12 @@ class MessageLookup extends MessageLookupByLibrary {
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": 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_tenants": 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 {
   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);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
@@ -41,10 +44,12 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("123 是街区地址邮编 #08-08 是单元号码"),
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
+        "characters": m0,
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
         "confirm_password": MessageLookupByLibrary.simpleMessage("确认密码"),
+        "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
@@ -57,16 +62,22 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("房产或建筑名称?"),
         "facility": MessageLookupByLibrary.simpleMessage("設施"),
         "feedback": MessageLookupByLibrary.simpleMessage("反馈"),
+        "feedback_msg_1": MessageLookupByLibrary.simpleMessage("帮助我们保持您的房产美丽"),
+        "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
+            "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m0,
-        "following": m1,
+        "followers": m1,
+        "following": m2,
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表單"),
+        "full_name": MessageLookupByLibrary.simpleMessage("全名"),
         "get_code": MessageLookupByLibrary.simpleMessage("获取验证码"),
         "get_started": MessageLookupByLibrary.simpleMessage("让我们开始吧"),
+        "history": MessageLookupByLibrary.simpleMessage("历史记录"),
         "home": MessageLookupByLibrary.simpleMessage("首页"),
         "household": MessageLookupByLibrary.simpleMessage("家庭"),
+        "in_progress": MessageLookupByLibrary.simpleMessage("处理中"),
         "info": MessageLookupByLibrary.simpleMessage("咨询"),
         "internal": MessageLookupByLibrary.simpleMessage("内部"),
         "introduction_to_info_pack":
@@ -74,6 +85,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "last_name": MessageLookupByLibrary.simpleMessage("姓"),
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
+        "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -84,8 +96,10 @@ class MessageLookup extends MessageLookupByLibrary {
         "new_password": MessageLookupByLibrary.simpleMessage("新密码"),
         "next": MessageLookupByLibrary.simpleMessage("下一步"),
         "no": MessageLookupByLibrary.simpleMessage("否"),
+        "notes": MessageLookupByLibrary.simpleMessage("备注"),
         "notice_board": MessageLookupByLibrary.simpleMessage("通知板"),
         "notification": MessageLookupByLibrary.simpleMessage("通知"),
+        "nric_fin": MessageLookupByLibrary.simpleMessage("身份证/签证"),
         "old_mobile_phone": MessageLookupByLibrary.simpleMessage("旧的手机号码"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "password": MessageLookupByLibrary.simpleMessage("密码"),
@@ -101,6 +115,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("獎勵"),
+        "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
         "sign_up_success_txt1":
@@ -130,7 +145,12 @@ class MessageLookup extends MessageLookupByLibrary {
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": 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("是"),
         "you_have": MessageLookupByLibrary.simpleMessage("你还有"),
         "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`
   String get other {
     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",
   "your_roles_responsibilities": "Your roles & responsibilities",
   "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"
 }

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

@@ -104,5 +104,21 @@
   "introduction_to_info_pack": "信息介绍",
   "your_roles_responsibilities": "您的角色和职责",
   "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": "其他"
 }

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

@@ -90,5 +90,21 @@
   "introduction_to_info_pack": "信息介绍",
   "your_roles_responsibilities": "您的角色和职责",
   "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": "其他"
 }

+ 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 _colorEFF3FF = Color(0xFFEFF3FF);
   static const _colorDFF0FF = Color(0xFFDFF0FF);
-
+  static const _color1B61CA = Color(0X4D1B61CA);
 
   //暗色主题的一些自定义颜色值
   static const _darkBlackBg = Color(0xFF0F0F0F);
   static const _darkBlackItem = Color(0xFF1D1D1E);
   static const _darkBlackItemLight = Color(0xFF3B3933);
+  static const _darkBlackItemLightShadow = Color(0x4D3B3933);
   static const _darkBlackItemLightMost = Color(0xFF5C5850);
   static const _darkBlackItemDivider = Color(0xFF3B3B3F);
 
@@ -60,6 +61,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   final Color dividerDefault; //分割线默认颜色
   final Color lightPurpleBg; //淡紫色背景
   final Color lightBlueBg; //淡蓝色背景
+  final Color tabTextSelectedDefault; //Tab文本,选中主题蓝,黑暗模式为白色
+  final Color tabTextUnSelectedDefault; //Tab文本,未选中 亮色为黑色,黑暗模式为灰色
+  final Color tabLightBlueShadow; //Tab的淡蓝色阴影
 
   // 私有的构造函数
   const AppColorsTheme._internal({
@@ -86,6 +90,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
     required this.dividerDefault,
     required this.lightPurpleBg,
     required this.lightBlueBg,
+    required this.tabLightBlueShadow,
+    required this.tabTextSelectedDefault,
+    required this.tabTextUnSelectedDefault,
   });
 
   // 浅色主题工厂方法
@@ -114,6 +121,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       dividerDefault: _colorDCDCDC,
       lightPurpleBg: _colorEFF3FF,
       lightBlueBg: _colorDFF0FF,
+      tabLightBlueShadow: _color1B61CA,
+      tabTextSelectedDefault: _colorPrimary,
+      tabTextUnSelectedDefault: Colors.black,
     );
   }
 
@@ -143,6 +153,9 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       dividerDefault: _darkBlackItemDivider,
       lightPurpleBg: _darkBlackItemLight,
       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)!,
       lightPurpleBg: Color.lerp(lightPurpleBg, other.lightPurpleBg, 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();
 
+  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/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'my_load_image.dart';
@@ -43,34 +44,34 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
       return SizedBox(
         width: double.infinity,
         height: double.infinity,
-        child: _buildWidget,
+        child: _buildWidget(context),
       );
     }
   }
 
   //Slivers的布局
   List<Widget> _buildSlivers() {
-    return _buildListWidget;
+    return _buildListWidget(context);
   }
 
   ///根据不同状态来显示不同的视图 (默认布局)
-  Widget get _buildWidget {
+  Widget _buildWidget(BuildContext context) {
     switch (widget.state) {
       case LoadState.State_Success:
         return widget.successWidget ?? const SizedBox();
       case LoadState.State_Error:
-        return _errorView;
+        return _errorView(context);
       case LoadState.State_Loading:
-        return _loadingView;
+        return _loadingView(context);
       case LoadState.State_Empty:
-        return _emptyView;
+        return _emptyView(context);
       default:
-        return _loadingView;
+        return _loadingView(context);
     }
   }
 
   ///根据不同状态来显示不同的视图 (CustomScrollView)
-  List<Widget> get _buildListWidget {
+  List<Widget> _buildListWidget(BuildContext context) {
     switch (widget.state) {
       case LoadState.State_Success:
         return widget.successSliverWidget != null
@@ -79,13 +80,13 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
                 ? [widget.successWidget!]
                 : [const SizedBox()];
       case LoadState.State_Error:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_errorView) : _errorView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_errorView(context)) : _errorView(context)];
       case LoadState.State_Loading:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView) : _loadingView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView(context)) : _loadingView(context)];
       case LoadState.State_Empty:
-        return [widget.successSliverWidget != null ? _warpStateLayout(_emptyView) : _emptyView];
+        return [widget.successSliverWidget != null ? _warpStateLayout(_emptyView(context)) : _emptyView(context)];
       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(
       width: double.infinity,
       height: double.infinity,
@@ -116,13 +117,13 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
         children: [
           CircularProgressIndicator(
             strokeWidth: 3,
-            valueColor: AlwaysStoppedAnimation(widget.themeColor ?? const Color(0XFFD6E9F1)),
+            valueColor: AlwaysStoppedAnimation(widget.themeColor ?? context.appColors.textDarkGray),
           ),
           MyTextView(
             'Loading...',
             marginTop: 15,
             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(
         width: double.infinity,
         height: double.infinity,
@@ -148,14 +149,14 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
                   widget.errorMessage ?? 'Data loading failed! Please refresh and try again',
                   marginTop: 18,
                   fontSize: 14,
-                  textColor: widget.themeColor ?? const Color(0XFFD6E9F1),
+                  textColor: widget.themeColor ?? context.appColors.textDarkGray,
                 ),
               ],
             )));
   }
 
   ///数据为空的视图
-  Widget get _emptyView {
+  Widget _emptyView(BuildContext context) {
     return Container(
       width: double.infinity,
       height: double.infinity,
@@ -171,7 +172,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
             'There is currently no content available',
             marginTop: 18,
             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:router/componentRouter/app_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:shared/utils/log_utils.dart';
 
 /// 响应式的布局,根据不同的尺寸展示不同的布局
@@ -32,10 +34,8 @@ class ResponsiveWidget extends StatelessWidget {
         // 小屏幕
         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) {
             return smallFullScreen ?? smallScreen; // 如果是全面屏,使用全面屏布局