Browse Source

update community module

glglove 1 week ago
parent
commit
ea69975fbe
79 changed files with 3214 additions and 556 deletions
  1. 0 6
      app/lib/main.dart
  2. 6 0
      app/lib/router/component/app_component_service_impl.dart
  3. 10 2
      packages/cpt_community/lib/components/custom_tabs.dart
  4. 16 13
      packages/cpt_community/lib/components/custom_tabs_vm.dart
  5. 1 1
      packages/cpt_community/lib/components/custom_tabs_vm.g.dart
  6. 84 0
      packages/cpt_community/lib/components/newfeed_card_header.dart
  7. 69 0
      packages/cpt_community/lib/components/newsfeed_card_content.dart
  8. 87 0
      packages/cpt_community/lib/components/newsfeed_card_footer.dart
  9. 115 6
      packages/cpt_community/lib/modules/newsfeed/newsfeed_page.dart
  10. 71 0
      packages/cpt_community/lib/modules/newsfeed/newsfeed_repository.dart
  11. 28 0
      packages/cpt_community/lib/modules/newsfeed/newsfeed_repository.g.dart
  12. 44 4
      packages/cpt_community/lib/modules/newsfeed/newsfeed_state.dart
  13. 101 0
      packages/cpt_community/lib/modules/newsfeed/newsfeed_vm.dart
  14. 1 1
      packages/cpt_community/lib/modules/newsfeed/newsfeed_vm.g.dart
  15. 280 0
      packages/cpt_main/lib/modules/demo_page.dart
  16. 130 0
      packages/cpt_main/lib/modules/feedback/feedback_page.dart
  17. 56 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history.dart
  18. 31 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_state.dart
  19. 131 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.dart
  20. 27 0
      packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.g.dart
  21. 75 0
      packages/cpt_main/lib/modules/feedback/item_feedback.dart
  22. 0 77
      packages/cpt_main/lib/modules/feedback/page/feedback_page.dart
  23. 56 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress.dart
  24. 31 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_state.dart
  25. 130 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.dart
  26. 28 0
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.g.dart
  27. 18 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send.dart
  28. 58 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send_large.dart
  29. 55 0
      packages/cpt_main/lib/modules/feedback/send/feedback_send_small.dart
  30. 101 84
      packages/cpt_main/lib/modules/home/home_page.dart
  31. 1 1
      packages/cpt_main/lib/modules/home/home_view_model.g.dart
  32. 1 1
      packages/cpt_main/lib/modules/home/item_home_category.dart
  33. 1 1
      packages/cpt_main/lib/modules/home/item_home_last_news.dart
  34. 1 1
      packages/cpt_main/lib/modules/home/item_home_last_trans.dart
  35. 1 1
      packages/cpt_main/lib/modules/home/item_home_manage_guide.dart
  36. 1 1
      packages/cpt_main/lib/modules/home/item_home_property_news.dart
  37. 1 1
      packages/cpt_main/lib/modules/main/main_state.dart
  38. 56 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active.dart
  39. 31 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_state.dart
  40. 133 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.dart
  41. 27 0
      packages/cpt_main/lib/modules/visitor/active/visitor_active_view_model.g.dart
  42. 55 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history.dart
  43. 31 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_state.dart
  44. 133 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.dart
  45. 27 0
      packages/cpt_main/lib/modules/visitor/history/visitor_history_view_model.g.dart
  46. 97 0
      packages/cpt_main/lib/modules/visitor/item_visitor.dart
  47. 22 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now.dart
  48. 52 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart
  49. 48 0
      packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart
  50. 109 257
      packages/cpt_main/lib/modules/visitor/visitor_page.dart
  51. 36 15
      packages/cpt_main/lib/router/page/main_page_router.dart
  52. 120 0
      packages/cpt_main/lib/router/page/main_page_router.gr.dart
  53. 11 11
      packages/cpt_property/lib/modules/ioan/property_ioan_page.dart
  54. 1 1
      packages/cpt_property/lib/modules/news/page/property_news_state.dart
  55. 5 7
      packages/cpt_property/lib/modules/property/page/property_page.dart
  56. 14 14
      packages/cpt_property/lib/modules/rent/page/property_rent_page.dart
  57. 15 7
      packages/cpt_property/lib/modules/sale/page/property_sale_page.dart
  58. 2 1
      packages/cs_plugin_basic/lib/provider/app_config/app_config_service.dart
  59. BIN
      packages/cs_resources/assets/main/feedback_history.webp
  60. BIN
      packages/cs_resources/assets/main/feedback_in_progress.webp
  61. BIN
      packages/cs_resources/assets/main/feedback_item_icon.webp
  62. BIN
      packages/cs_resources/assets/main/feedback_send.webp
  63. BIN
      packages/cs_resources/assets/main/feedback_send_img.webp
  64. BIN
      packages/cs_resources/assets/main/visitor_active.webp
  65. BIN
      packages/cs_resources/assets/main/visitor_history.webp
  66. BIN
      packages/cs_resources/assets/main/visitor_now.webp
  67. BIN
      packages/cs_resources/assets/main/visitor_now_img.webp
  68. 9 0
      packages/cs_resources/lib/generated/assets.dart
  69. 30 6
      packages/cs_resources/lib/generated/intl/messages_en.dart
  70. 26 6
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  71. 26 6
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  72. 160 0
      packages/cs_resources/lib/generated/l10n.dart
  73. 16 0
      packages/cs_resources/lib/l10n/intl_en.arb
  74. 16 0
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  75. 16 0
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  76. 17 1
      packages/cs_resources/lib/theme/app_colors_theme.dart
  77. 2 0
      packages/cs_router/lib/componentRouter/app_service.dart
  78. 20 19
      packages/cs_widgets/lib/load_state_layout.dart
  79. 4 4
      packages/cs_widgets/lib/responsive_widget.dart

+ 0 - 6
app/lib/main.dart

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

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

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

+ 10 - 2
packages/cpt_community/lib/components/custom_tabs.dart

@@ -1,3 +1,5 @@
+import 'package:cpt_community/components/custom_tabs_state.dart';
+import 'package:cpt_community/components/custom_tabs_state.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
@@ -10,6 +12,7 @@ import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_appbar.dart';
 
 
+import 'custom_tabs_state.dart';
 import 'custom_tabs_vm.dart';
 import 'custom_tabs_vm.dart';
 
 
 
 
@@ -18,10 +21,14 @@ class CustomTabs extends HookConsumerWidget {
   int activeIndex = 0;
   int activeIndex = 0;
   Widget? Function(BuildContext)? tabItemBuilder;
   Widget? Function(BuildContext)? tabItemBuilder;
   VoidCallback? onClickAction;
   VoidCallback? onClickAction;
-  CustomTabs({Key? key, required this.tabsList, required this.activeIndex, this.onClickAction, this.tabItemBuilder}) : super(key: key);
+  CustomTabs({Key? key, required this.tabsList, required this.activeIndex, this.onClickAction, this.tabItemBuilder}) :
+        super(key: key);
 
 
   Widget _buildTabItem(BuildContext context, WidgetRef ref, vm, item, index) {
   Widget _buildTabItem(BuildContext context, WidgetRef ref, vm, item, index) {
-    int? activeIndex = ref.watch(customTabsVmProvider).activeIndex;
+
+    // 监听 activeIndex 的变化
+    final activeIndex = ref.watch(customTabsVmProvider.select((state) => state.activeIndex));
+
     return Container(
     return Container(
         width: MediaQuery.of(context).size.width / vm.state.tabsList.length - 30,
         width: MediaQuery.of(context).size.width / vm.state.tabsList.length - 30,
         height: 43,
         height: 43,
@@ -61,6 +68,7 @@ class CustomTabs extends HookConsumerWidget {
 
 
   List<Widget> _buildTabs(BuildContext context, WidgetRef ref, vm){
   List<Widget> _buildTabs(BuildContext context, WidgetRef ref, vm){
     tabsList = vm.state.tabsList;
     tabsList = vm.state.tabsList;
+
     int tabsLength = tabsList.length;
     int tabsLength = tabsList.length;
     return List.generate(tabsLength, (index) {
     return List.generate(tabsLength, (index) {
       return _buildTabItem(context, ref, vm, tabsList[index], index);
       return _buildTabItem(context, ref, vm, tabsList[index], index);

+ 16 - 13
packages/cpt_community/lib/components/custom_tabs_vm.dart

@@ -2,6 +2,7 @@
 import 'package:cpt_community/components/custom_tabs_state.dart';
 import 'package:cpt_community/components/custom_tabs_state.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -10,11 +11,12 @@ part 'custom_tabs_vm.g.dart';
 
 
 @riverpod
 @riverpod
 class CustomTabsVm extends _$CustomTabsVm {
 class CustomTabsVm extends _$CustomTabsVm {
-  CustomTabsState initState(tabsList, activeIndex,tabItemBuilder, onClickAction) {
+
+  CustomTabsState initState(List tabsList, int activeIndex, tabItemBuilder, onClickAction) {
     CustomTabsState state = CustomTabsState(
     CustomTabsState state = CustomTabsState(
-        tabsList: tabsList,
-        activeIndex:activeIndex,
-        tabItemBuilder: tabItemBuilder,
+        tabsList: tabsList ?? [],
+        activeIndex: activeIndex ?? 0,
+        tabItemBuilder:tabItemBuilder,
         onClickAction: onClickAction
         onClickAction: onClickAction
     );
     );
 
 
@@ -23,17 +25,17 @@ class CustomTabsVm extends _$CustomTabsVm {
 
 
   @override
   @override
   CustomTabsState build(){
   CustomTabsState build(){
-    CustomTabsState state = initState([],0,null,null);
+    CustomTabsState state = initState([], 0, null, null);
     return state;
     return state;
   }
   }
 
 
 
 
   Future<void> initPropData(tabsList, activeIndex,tabItemBuilder, onClickAction) async {
   Future<void> initPropData(tabsList, activeIndex,tabItemBuilder, onClickAction) async {
     CustomTabsState newState = state.copyWith(
     CustomTabsState newState = state.copyWith(
-      tabsList: tabsList,
-      activeIndex: activeIndex,
-      tabItemBuilder: tabItemBuilder,
-      onClickAction: onClickAction
+        tabsList: tabsList,
+        activeIndex: activeIndex,
+        tabItemBuilder: tabItemBuilder,
+        onClickAction: onClickAction
     );
     );
     state = newState;
     state = newState;
   }
   }
@@ -41,12 +43,13 @@ class CustomTabsVm extends _$CustomTabsVm {
   // 点击tab
   // 点击tab
   void handlerClickTab(int index, item){
   void handlerClickTab(int index, item){
     CustomTabsState newState = state.copyWith(
     CustomTabsState newState = state.copyWith(
-      activeIndex: index
+        activeIndex: index
     );
     );
     state = newState;
     state = newState;
-    
+
     print("切换后新的 sate, ${state.activeIndex}");
     print("切换后新的 sate, ${state.activeIndex}");
-  }
 
 
-}
+    // ref.invalidate(customTabsVmProvider);
+  }
 
 
+}

+ 1 - 1
packages/cpt_community/lib/components/custom_tabs_vm.g.dart

@@ -6,7 +6,7 @@ part of 'custom_tabs_vm.dart';
 // RiverpodGenerator
 // RiverpodGenerator
 // **************************************************************************
 // **************************************************************************
 
 
-String _$customTabsVmHash() => r'34989e04bef32871e5ada4fb3a4bfdd44f7fb17f';
+String _$customTabsVmHash() => r'b70151a4b38ff797bae21d730f0aa7c38272f766';
 
 
 /// See also [CustomTabsVm].
 /// See also [CustomTabsVm].
 @ProviderFor(CustomTabsVm)
 @ProviderFor(CustomTabsVm)

+ 84 - 0
packages/cpt_community/lib/components/newfeed_card_header.dart

@@ -0,0 +1,84 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+// 'id':1,
+// 'avator': Assets.communityCamera,
+// 'title': 'William Jefferson',
+// 'isFollow': false,
+// 'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+// 'imageUrls': ['https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg'],
+// 'time': 'June 17,2016 at 7:23 p.m.',
+// 'likeno': 12
+
+class NewsFeedCardHeader extends StatelessWidget {
+  final String title;
+  final String avator;
+  final String time;
+  final VoidCallback? onTap;
+
+  const NewsFeedCardHeader({
+    Key? key,
+    required this.title,
+    required this.avator,
+    required this.time,
+    this.onTap,
+  }) : super(key: key);
+
+
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: const EdgeInsets.symmetric(horizontal: 16),
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyLoadImage(
+            avator,
+            width: 45,
+            height: 45,
+            isCircle: true,
+            fit: BoxFit.cover,
+          ).onTap(() {
+            // 点击头像
+            onTap?.call();
+          }),
+          Expanded(
+            child: Container(
+              padding: const EdgeInsets.only(left:15, right: 40),
+              // color: Colors.red,
+              child: Column(
+                mainAxisAlignment: MainAxisAlignment.start,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    title,
+                    isFontMedium: true,
+                    fontSize: 18,
+                    textColor: ColorUtils.string2Color('#000000'),
+                    maxLines: 1,
+                    isTextEllipsis: true,
+                  ),
+                  MyTextView(
+                    time,
+                    isFontRegular: true,
+                    fontSize: 13,
+                    marginTop: 8,
+                    textColor: ColorUtils.string2Color('#767676'),
+                    maxLines: 1,
+                    isTextEllipsis: true,
+                  ),
+                ],
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 69 - 0
packages/cpt_community/lib/components/newsfeed_card_content.dart

@@ -0,0 +1,69 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:widgets/my_text_view.dart';
+
+// 'id':1,
+// 'avator': Assets.communityCamera,
+// 'title': 'William Jefferson',
+// 'isFollow': false,
+// 'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+// 'imageUrls': ['https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg'],
+// 'time': 'June 17,2016 at 7:23 p.m.',
+// 'likeno': 12
+
+class NewsFeedCardContent extends StatelessWidget {
+  const NewsFeedCardContent({
+    Key? key,
+    required this.content,
+    this.imageUrls,
+  }) : super(key: key);
+
+  final String content;
+  final List? imageUrls;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: const EdgeInsets.symmetric(horizontal: 16),
+      child: Column(
+        children: [
+          Expanded(
+            child: Container(
+              // color: Colors.red,
+              child: MyTextView(
+                content,
+                textColor: ColorUtils.string2Color('#000000'),
+                fontSize: 15,
+                maxLines: 3,
+                isTextEllipsis: true,
+              ),
+            ),
+          ),
+          const SizedBox(height: 12),
+          // 图片
+          if (imageUrls != null && imageUrls!.isNotEmpty)
+             Container(
+               width: double.infinity,
+               height: 87,
+               child: Row(
+                 mainAxisAlignment: MainAxisAlignment.center,
+                 children: [
+                   for (var item in imageUrls!)
+                     Expanded(
+                       child: Container(
+                         // width: 87,
+                         // height: 87,
+                         // margin: const EdgeInsets.only(right: 30),
+                         margin: const EdgeInsets.only(left: 15,right: 18),
+                         color: ColorUtils.string2Color("#F2F3F6"),
+                       ),
+                     )
+                 ],
+               ),
+             )
+        ]
+      ),
+    );
+  }
+}

+ 87 - 0
packages/cpt_community/lib/components/newsfeed_card_footer.dart

@@ -0,0 +1,87 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+// 'id':1,
+// 'avator': Assets.communityCamera,
+// 'title': 'William Jefferson',
+// 'isFollow': false,
+// 'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+// 'imageUrls': ['https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg'],
+// 'time': 'June 17,2016 at 7:23 p.m.',
+// 'likeno': 12
+
+class NewsFeedCardFooter extends StatelessWidget {
+  final bool isLike;
+  final VoidCallback? onLike;
+  final VoidCallback? onComment;
+  final VoidCallback? onShare;
+
+  const NewsFeedCardFooter({
+    Key? key,
+    required this.isLike,
+    this.onLike,
+    this.onComment,
+    this.onShare
+  })
+  : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      height: 40,
+      width: double.infinity,
+      padding: const EdgeInsets.symmetric(horizontal: 16),
+      // color: Colors.red,
+      child: Expanded(
+        child:  Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            Row(
+              children: [
+                const MyAssetImage(Assets.communityLike, width: 16,height: 16,),
+                MyTextView(
+                  'Like',
+                  textColor: ColorUtils.string2Color('#767676'),
+                  fontSize: 14,
+                  isFontRegular: true,
+                  textAlign: TextAlign.left,
+                  marginLeft: 8,
+                ),
+              ],
+            ),
+            Row(
+              children: [
+                const MyAssetImage(Assets.communityComments, width: 16,height: 16,),
+                MyTextView(
+                  'Comments',
+                  textColor: ColorUtils.string2Color('#767676'),
+                  fontSize: 14,
+                  isFontRegular: true,
+                  textAlign: TextAlign.left,
+                  marginLeft: 8,
+                ),
+              ],
+            ),
+            Row(
+              children: [
+                const MyAssetImage(Assets.communityShare, width: 16,height: 16,),
+                MyTextView(
+                  'Share',
+                  textColor: ColorUtils.string2Color('#767676'),
+                  fontSize: 14,
+                  isFontRegular: true,
+                  textAlign: TextAlign.left,
+                  marginLeft: 8,
+                ),
+              ],
+            ),
+          ]
+        ),
+      )
+    );
+  }
+}

+ 115 - 6
packages/cpt_community/lib/modules/newsfeed/newsfeed_page.dart

@@ -1,10 +1,20 @@
 
 
 import 'package:cpt_community/components/custom_tabs.dart';
 import 'package:cpt_community/components/custom_tabs.dart';
+import 'package:cpt_community/components/newsfeed_card_content.dart';
+import 'package:cpt_community/components/newsfeed_card_footer.dart';
+import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 
 
+import '../../components/newfeed_card_header.dart';
 import '../../router/page/community_page_router.dart';
 import '../../router/page/community_page_router.dart';
 import 'newsfeed_vm.dart';
 import 'newsfeed_vm.dart';
 
 
@@ -31,24 +41,111 @@ class NewsfeedPage extends HookConsumerWidget {
 
 
   Widget _buildPostSection(BuildContext context, WidgetRef ref, vm){
   Widget _buildPostSection(BuildContext context, WidgetRef ref, vm){
     return Container(
     return Container(
-      height: 100,
-      color: Colors.red,
+      height: 65.5,
+      width: double.infinity,
+      padding: const EdgeInsets.only(left: 20, right: 20),
+      color: Colors.white,
+      child: Row(
+        children: [
+          const MyAssetImage(Assets.communityNesFeed, width: 45,height: 45,),
+          Expanded(
+            child: Container(
+              // height: 65.5,
+              // color: Colors.blue,
+              child: MyTextView(
+                "What’s on your mind?",
+                textColor: ColorUtils.string2Color('#000000'),
+                fontSize: 15,
+                marginLeft: 15,
+                alignment: Alignment.centerLeft,
+                textAlign: TextAlign.left,
+                backgroundColor: ColorUtils.string2Color('#ffffff'),
+                maxLines: 1,
+                isFontMedium: true,
+              ),
+            ),
+          ),
+          const MyAssetImage(
+            Assets.communityCamera,
+            width: 21,
+            height: 16.5,
+          ).onTap(() {
+            // 点击 发布的按钮
+            vm.handlerGotoPost();
+          }),
+        ],
+      ),
     );
     );
   }
   }
 
 
-  Widget _buildNesFeedList(BuildContext context, WidgetRef ref, vm){
+  Widget _buildNewsItem(BuildContext context, WidgetRef ref, item, vm){
+    print("1111111${item}");
     return Container(
     return Container(
-      height: 100,
-      color: Colors.blue,
+      width: double.infinity,
+      // padding: const EdgeInsets.only(left: 15, right: 15,top: 14,bottom: 14),
+        color: Colors.yellow,
+      child: Container(
+        margin: const EdgeInsets.only(left: 15, right: 15,top: 14,bottom: 14),
+        color: Colors.white,
+        padding: const EdgeInsets.only(left: 15, right: 15,top: 17,bottom: 17),
+        height: 280,
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            // 卡片头部(头像 标题 时间)
+            NewsFeedCardHeader(
+              title: item['title'],
+              avator: item['avator'],
+              time: item['time'],
+            ),
+            const SizedBox(height: 15),
+            // 卡片中间 (文字和图片)
+            Expanded(
+              child: NewsFeedCardContent(
+                content: item['content'],
+                imageUrls: item['imageUrls'],
+              ),
+            ),
+            const SizedBox(height: 26),
+            // // 卡片底部 (点赞 评论 分享)
+            NewsFeedCardFooter(
+              isLike: item['isLike'],
+            ),
+          ]
+        ),
+      )
     );
     );
   }
   }
 
 
+  Widget _buildNesFeedList(BuildContext context, WidgetRef ref, vm){
+    // return Container(
+    //   height: 100,
+    //   color: Colors.blue,
+    // );
+    // List items = List.generate(20, (index) => "Item $index");
+    // List items = _vm.state.list.fromMap();
+    final itemList = vm.state.list?? [];
+    if(itemList.isEmpty){
+      return const Center(child: Text('No Data'));
+    }else {
+      List itemsList = vm.state.list.toList();
+      return ListView.builder(
+        itemCount: itemsList.length,
+        itemBuilder: (context, index) {
+          return _buildNewsItem(context, ref, itemsList[index], vm);
+        },
+      );
+    }
+  }
+
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
     final vm = ref.read(newsfeedVmProvider.notifier);
     final vm = ref.read(newsfeedVmProvider.notifier);
 
 
     return Scaffold(
     return Scaffold(
+      backgroundColor: ColorUtils.string2Color("#F2F3F6"),
       body: Column(
       body: Column(
           children: [
           children: [
             _buildTabsSection(context, ref, vm),
             _buildTabsSection(context, ref, vm),
@@ -56,7 +153,19 @@ class NewsfeedPage extends HookConsumerWidget {
             _buildPostSection(context, ref, vm),
             _buildPostSection(context, ref, vm),
 
 
             Expanded(
             Expanded(
-              child: _buildNesFeedList(context, ref, vm),
+              child: EasyRefresh(
+                // 上拉加载
+                onLoad: () async{
+                  Log.d("----onLoad");
+                  vm.onLoadData();
+                },
+                // 下拉刷新
+                onRefresh: () async{
+                  Log.d("----onRefresh");
+                  vm.refreshListData();
+                },
+                child: _buildNesFeedList(context, ref, vm),
+              ),
             )
             )
           ],
           ],
       ),
       ),

+ 71 - 0
packages/cpt_community/lib/modules/newsfeed/newsfeed_repository.dart

@@ -0,0 +1,71 @@
+import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/server_time.dart';
+import 'package:plugin_platform/platform_export.dart';
+import 'package:plugin_platform/http/dio_engine.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/util.dart';
+
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:plugin_basic/provider/http_provider/http_provider.dart';
+
+import 'newsfeed_state.dart';
+
+part 'newsfeed_repository.g.dart';
+
+@Riverpod(keepAlive: true)
+NewsfeedRepository newsfeedRepository(Ref ref) {
+  final dioEngine = ref.watch(dioEngineProvider);
+  return NewsfeedRepository(dioEngine: dioEngine);
+}
+
+/*
+ * 数据仓库
+ */
+class NewsfeedRepository {
+  DioEngine dioEngine;
+
+  NewsfeedRepository({required this.dioEngine});
+
+  Future<HttpResult<Object>> fetchNewsfeedList(
+      Map<String, dynamic>? data, {
+        CancelToken? cancelToken,
+      }) async {
+    Map<String, dynamic> params = {};
+
+    // if (!Utils.isEmpty(type)) {
+    //   params["type"] = type!;
+    // }
+
+    params = data!;
+
+
+    Map<String, String> headers = {};
+
+    headers["Content-Type"] = "application/x-www-form-urlencoded";
+    headers["Accept"] = "application/x.yyjobs-api.v1+json";
+
+    final result = await dioEngine.requestNetResult(
+      // ApiConstants.apiServerTime, // api 地址
+      '/index.php/api/employee/extra/time', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = NewsfeedState.fromMap(json!);
+      //重新赋值data或list
+      return result.convert<NewsfeedState>(data: data);
+    }
+    return result.convert();
+  }
+
+
+}

+ 28 - 0
packages/cpt_community/lib/modules/newsfeed/newsfeed_repository.g.dart

@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'newsfeed_repository.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$newsfeedRepositoryHash() =>
+    r'79d5132feb0bc631d47ec659702f854189feec5b';
+
+/// See also [newsfeedRepository].
+@ProviderFor(newsfeedRepository)
+final newsfeedRepositoryProvider = Provider<NewsfeedRepository>.internal(
+  newsfeedRepository,
+  name: r'newsfeedRepositoryProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$newsfeedRepositoryHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
+typedef NewsfeedRepositoryRef = ProviderRef<NewsfeedRepository>;
+// 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

+ 44 - 4
packages/cpt_community/lib/modules/newsfeed/newsfeed_state.dart

@@ -3,21 +3,61 @@ import 'package:flutter/material.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 
 
 class NewsfeedState {
 class NewsfeedState {
+  int? curPage;
+  int? pageSize;
+  int? filterCount;
   int? activeIndex = 0;
   int? activeIndex = 0;
   List tabsList = [];
   List tabsList = [];
+  List? list = [];
+
 
 
-  NewsfeedState({
-    this.activeIndex,
-    required this.tabsList,
-  });
 
 
   NewsfeedState copyWith({
   NewsfeedState copyWith({
+    int? curPage,
+    int? pageSize,
+    int? filterCount,
     int? activeIndex,
     int? activeIndex,
     List? tabsList,
     List? tabsList,
+    List? list,
   }) {
   }) {
     return NewsfeedState(
     return NewsfeedState(
+      curPage: curPage ?? this.curPage,
+      pageSize: pageSize ?? this.pageSize,
+      filterCount: filterCount ?? this.filterCount,
       activeIndex: activeIndex ?? this.activeIndex,
       activeIndex: activeIndex ?? this.activeIndex,
       tabsList: tabsList ?? this.tabsList,
       tabsList: tabsList ?? this.tabsList,
+      list: list ?? this.list,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'curPage': this.curPage,
+      'pageSize': this.pageSize,
+      'filterCount': this.filterCount,
+      'activeIndex': this.activeIndex,
+      'tabsList': this.tabsList,
+      'list': this.list,
+    };
+  }
+
+  factory NewsfeedState.fromMap(Map<String, dynamic> map) {
+    return NewsfeedState(
+      curPage: map['curPage'] as int,
+      pageSize: map['pageSize'] as int,
+      filterCount: map['filterCount'] as int,
+      activeIndex: map['activeIndex'] as int,
+      tabsList: map['tabsList'] as List,
+      list: map['list'] as List,
     );
     );
   }
   }
+
+  NewsfeedState({
+    this.curPage,
+    this.pageSize,
+    this.filterCount,
+    this.activeIndex,
+    required this.tabsList,
+    this.list,
+  });
 }
 }

+ 101 - 0
packages/cpt_community/lib/modules/newsfeed/newsfeed_vm.dart

@@ -1,14 +1,19 @@
 
 
+import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
 
 
 import 'newsfeed_state.dart';
 import 'newsfeed_state.dart';
+import 'newsfeed_repository.dart';
 
 
 part 'newsfeed_vm.g.dart';
 part 'newsfeed_vm.g.dart';
 
 
 @riverpod
 @riverpod
 class NewsfeedVm extends _$NewsfeedVm {
 class NewsfeedVm extends _$NewsfeedVm {
+  late NewsfeedRepository newsfeedRepository;
   NewsfeedState initState() {
   NewsfeedState initState() {
     return NewsfeedState(
     return NewsfeedState(
       activeIndex: 0,
       activeIndex: 0,
@@ -34,14 +39,110 @@ class NewsfeedVm extends _$NewsfeedVm {
           'activeTitleFontSize': 16,
           'activeTitleFontSize': 16,
           'activeTitleBackgroundColor': ColorUtils.string2Color("#4161D0"),
           'activeTitleBackgroundColor': ColorUtils.string2Color("#4161D0"),
         }
         }
+      ],
+      list: [
+          {
+          'id':1,
+          'avator': Assets.communityCamera,
+          'title': 'William Jefferson',
+          'isFollow': false,
+          'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+          'imageUrls': ['https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg','https://img.alicdn.com/tfs/TB1h.o9O4MPMeJjy1XaXXcSsFXa-640-360.jpg'],
+          'time': 'June 17,2016 at 7:23 p.m.',
+            'isLike': true,
+          'likeno': 12
+          },
+          {
+            'id':2,
+            'avator': Assets.communityCamera,
+            'title': 'William fdsaf的飞洒发生的',
+            'isFollow': true,
+            'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+            'imageUrls': [],
+            'time': 'June 17,2016 at 7:23 p.m.',
+            'isLike': true,
+            'likeno': 12
+          },
+          {
+            'id':3,
+            'avator': Assets.communityCamera,
+            'title': 'Fsjfkds  dfsk',
+            'isFollow': false,
+            'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
+            'imageUrls': [],
+            'time': 'June 17,2016 at 7:23 p.m.',
+            'isLike': false,
+            'likeno': 12
+          },
       ]
       ]
     );
     );
   }
   }
   @override
   @override
   NewsfeedState build(){
   NewsfeedState build(){
+    // 引入数据仓库
+    newsfeedRepository = ref.read(newsfeedRepositoryProvider);
+    // 初始化状态
     NewsfeedState state = initState();
     NewsfeedState state = initState();
     return state;
     return state;
   }
   }
 
 
+  // 上拉加载
+  Future onLoadData() async {
+    Log.d("----property_news_vm-----initListData");
+    // await Future.delayed(const Duration(seconds: 2));
+    // if(state.list.length >= state.filterCount){
+    //   return;
+    // }else {
+    //   int curPage = state.curPage + 1;
+    //   state = state.copyWith(curPage: curPage,);
+    //   getListData();
+    // }
+    // getListData();
+  }
+
+  // 获取list 列表数据
+  void getListData<T>() async {
+    Log.d("加载listData数据---------------start-----");
+    try {
+      //请求网络
+      Map<String, dynamic>  params = {
+        "curPage": state.curPage,
+        "pageSize": state.pageSize,
+      };
+      Log.d("请求参数------$params");
+      final result = await newsfeedRepository.fetchNewsfeedList(params);
+      Log.d("请求完成结果------${result.data}");
+      //校验成功失败
+      if (result.isSuccess) {
+        // state = state.copyWith(serverTime: result.data);
+        state = state;
+        ToastEngine.show("获取数据成功");
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
+  }
+
+
+  // 下拉刷新
+  Future refreshListData() async {
+    Log.d("----property_news_vm-----refreshListData ");
+
+    // await Future.delayed(const Duration(seconds: 2));
+
+    state = state.copyWith(curPage: 1, pageSize: 10);
+    // ref.invalidateSelf();
+    // ref.invalidate(newsfeedVmProvider);
+    getListData();
 
 
+  }
+
+
+
+  // 点击发布的按钮 跳转到发布的页面
+  void handlerGotoPost(){
+
+  }
 }
 }

+ 1 - 1
packages/cpt_community/lib/modules/newsfeed/newsfeed_vm.g.dart

@@ -6,7 +6,7 @@ part of 'newsfeed_vm.dart';
 // RiverpodGenerator
 // RiverpodGenerator
 // **************************************************************************
 // **************************************************************************
 
 
-String _$newsfeedVmHash() => r'85ded646400393df6fe1d8fb9f9065845f36ede7';
+String _$newsfeedVmHash() => r'0d147c845251f1b8031020ef5dc25250e56192ab';
 
 
 /// See also [NewsfeedVm].
 /// See also [NewsfeedVm].
 @ProviderFor(NewsfeedVm)
 @ProviderFor(NewsfeedVm)

+ 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),
+        ]),
+      ),
+    );
+    ;
+  }
+}

+ 101 - 84
packages/cpt_main/lib/modules/home/home_page.dart

@@ -6,6 +6,9 @@ import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/componentRouter/community_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
@@ -29,38 +32,46 @@ class HomePage extends HookConsumerWidget {
 
 
     return Scaffold(
     return Scaffold(
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
+          backIconPath: Assets.mainTabMeSelected,
+          backIconWidth: 18.5,
+          backIconHeight: 20,
+          showBackButton: true,
           backgroundColor: context.appColors.whiteBG,
           backgroundColor: context.appColors.whiteBG,
+          backCallback: (){
+          ToastEngine.show("测试去登录页面");
+          ComponentServiceManager().authService.startLoginPage();
+          },
           actions: [
           actions: [
             Center(
             Center(
-                child: Stack(
-                  clipBehavior: Clip.none, // 不裁剪超出边界的内容
-                  alignment: Alignment.topLeft,
-                  children: <Widget>[
-                    // 通知图标
-                    const MyAssetImage(Assets.mainHomeNotificationIcon, width: 19, height: 20),
+                    child: Stack(
+              clipBehavior: Clip.none, // 不裁剪超出边界的内容
+              alignment: Alignment.topLeft,
+              children: <Widget>[
+                // 通知图标
+                const MyAssetImage(Assets.mainHomeNotificationIcon, width: 19, height: 20),
 
 
-                    //未读消息
-                    Positioned(
-                      left: 0,
-                      top: 0,
-                      child: Transform.translate(
-                        offset: const Offset(-10, -5),
-                        child: MyTextView(
-                          "99",
-                          boxWidth: 20.0,
-                          textColor: Colors.white,
-                          fontSize: 10,
-                          isFontLight: true,
-                          backgroundColor: context.appColors.redDefault,
-                          cornerRadius: 8,
-                          paddingTop: 2,
-                          paddingBottom: 2,
-                          textAlign: TextAlign.center,
-                        ),
-                      ),
+                //未读消息
+                Positioned(
+                  left: 0,
+                  top: 0,
+                  child: Transform.translate(
+                    offset: const Offset(-10, -5),
+                    child: MyTextView(
+                      "99",
+                      boxWidth: 20.0,
+                      textColor: Colors.white,
+                      fontSize: 10,
+                      isFontLight: true,
+                      backgroundColor: context.appColors.redDefault,
+                      cornerRadius: 8,
+                      paddingTop: 2,
+                      paddingBottom: 2,
+                      textAlign: TextAlign.center,
                     ),
                     ),
-                  ],
-                ).onTap(viewModel.gotoNotificationPage))
+                  ),
+                ),
+              ],
+            ).onTap(viewModel.gotoNotificationPage))
                 .marginOnly(right: 15),
                 .marginOnly(right: 15),
           ],
           ],
           showBottomDivider: true),
           showBottomDivider: true),
@@ -165,7 +176,13 @@ class HomePage extends HookConsumerWidget {
                       textColor: context.appColors.textBlack,
                       textColor: context.appColors.textBlack,
                       fontSize: 15,
                       fontSize: 15,
                       isFontMedium: true,
                       isFontMedium: true,
-                    ).paddingOnly(left: 13, right: 13).expanded(),
+                    ).paddingOnly(left: 13, right: 4).expanded(),
+                    MyTextView(
+                      "9568",
+                      textColor: context.appColors.textBlack,
+                      fontSize: 15,
+                      isFontBold: true,
+                    ).paddingOnly(left: 1, right: 4),
                     const MyAssetImage(Assets.mainHomeMoreIcon, width: 6, height: 8.5).marginOnly(right: 15),
                     const MyAssetImage(Assets.mainHomeMoreIcon, width: 6, height: 8.5).marginOnly(right: 15),
                   ],
                   ],
                 ).onTap(viewModel.gotoRewardsPage).expanded(),
                 ).onTap(viewModel.gotoRewardsPage).expanded(),
@@ -193,12 +210,12 @@ class HomePage extends HookConsumerWidget {
     return SliverGrid(
     return SliverGrid(
       gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
       gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
         crossAxisCount: 3, // 三列
         crossAxisCount: 3, // 三列
-        mainAxisSpacing: 14.0, // 主轴(上下)的间距
+        mainAxisSpacing: 10.0, // 主轴(上下)的间距
         crossAxisSpacing: 0.0, // 交叉轴(左右)的间距
         crossAxisSpacing: 0.0, // 交叉轴(左右)的间距
-        childAspectRatio: 9 / 7, // 子组件的宽高比
+        childAspectRatio: 9 / 8, // 子组件的宽高比
       ),
       ),
       delegate: SliverChildBuilderDelegate(
       delegate: SliverChildBuilderDelegate(
-            (BuildContext context, int index) {
+        (BuildContext context, int index) {
           return HomeCategoryItem(
           return HomeCategoryItem(
             category: state.homeCategory[index],
             category: state.homeCategory[index],
           ).onTap(() {
           ).onTap(() {
@@ -231,32 +248,32 @@ class HomePage extends HookConsumerWidget {
 
 
     return SliverToBoxAdapter(
     return SliverToBoxAdapter(
         child: Column(
         child: Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          mainAxisAlignment: MainAxisAlignment.start,
-          children: [
-            MyTextView(
-              S.current.latest_news,
-              fontSize: 16,
-              marginTop: 14,
-              marginBottom: 14,
-              isFontMedium: true,
-              onClick: viewModel.gotoLastNewsPage,
-              textColor: context.appColors.textPrimary,
-            ),
-            SingleChildScrollView(
-              scrollDirection: Axis.horizontal,
-              physics: const BouncingScrollPhysics(),
-              clipBehavior: Clip.none,
-              child: Row(
-                children: List.generate(state.lastNews.length, (index) {
-                  return LastNewsItem(
-                    lastNews: state.lastNews[index],
-                  );
-                }),
-              ),
-            )
-          ],
-        ).paddingOnly(left: 15, right: 15));
+      crossAxisAlignment: CrossAxisAlignment.start,
+      mainAxisAlignment: MainAxisAlignment.start,
+      children: [
+        MyTextView(
+          S.current.latest_news,
+          fontSize: 16,
+          marginTop: 14,
+          marginBottom: 14,
+          isFontMedium: true,
+          onClick: viewModel.gotoLastNewsPage,
+          textColor: context.appColors.textPrimary,
+        ),
+        SingleChildScrollView(
+          scrollDirection: Axis.horizontal,
+          physics: const BouncingScrollPhysics(),
+          clipBehavior: Clip.none,
+          child: Row(
+            children: List.generate(state.lastNews.length, (index) {
+              return LastNewsItem(
+                lastNews: state.lastNews[index],
+              );
+            }),
+          ),
+        )
+      ],
+    ).paddingOnly(left: 15, right: 15));
   }
   }
 
 
   //最新的交易列表
   //最新的交易列表
@@ -280,7 +297,7 @@ class HomePage extends HookConsumerWidget {
           padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 20),
           padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 20),
           sliver: SliverList(
           sliver: SliverList(
             delegate: SliverChildBuilderDelegate(
             delegate: SliverChildBuilderDelegate(
-                  (BuildContext context, int index) {
+              (BuildContext context, int index) {
                 return Padding(
                 return Padding(
                   padding: const EdgeInsets.symmetric(vertical: 10),
                   padding: const EdgeInsets.symmetric(vertical: 10),
                   child: LastTransItem(
                   child: LastTransItem(
@@ -335,31 +352,31 @@ class HomePage extends HookConsumerWidget {
 
 
     return SliverToBoxAdapter(
     return SliverToBoxAdapter(
         child: Column(
         child: Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          mainAxisAlignment: MainAxisAlignment.start,
-          children: [
-            MyTextView(
-              S.current.strata_management_guides,
-              fontSize: 16,
-              marginTop: 14,
-              marginBottom: 14,
-              onClick: viewModel.gotoManageGuidePage,
-              isFontMedium: true,
-              textColor: context.appColors.textPrimary,
-            ),
-            SingleChildScrollView(
-              scrollDirection: Axis.horizontal,
-              physics: const BouncingScrollPhysics(),
-              clipBehavior: Clip.none,
-              child: Row(
-                children: List.generate(state.manage_guide.length, (index) {
-                  return ManageGuideItem(
-                    manageGuide: state.manage_guide[index],
-                  );
-                }),
-              ),
-            )
-          ],
-        ).paddingOnly(left: 15, right: 15));
+      crossAxisAlignment: CrossAxisAlignment.start,
+      mainAxisAlignment: MainAxisAlignment.start,
+      children: [
+        MyTextView(
+          S.current.strata_management_guides,
+          fontSize: 16,
+          marginTop: 14,
+          marginBottom: 14,
+          onClick: viewModel.gotoManageGuidePage,
+          isFontMedium: true,
+          textColor: context.appColors.textPrimary,
+        ),
+        SingleChildScrollView(
+          scrollDirection: Axis.horizontal,
+          physics: const BouncingScrollPhysics(),
+          clipBehavior: Clip.none,
+          child: Row(
+            children: List.generate(state.manage_guide.length, (index) {
+              return ManageGuideItem(
+                manageGuide: state.manage_guide[index],
+              );
+            }),
+          ),
+        )
+      ],
+    ).paddingOnly(left: 15, right: 15));
   }
   }
 }
 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 11 - 11
packages/cpt_property/lib/modules/ioan/property_ioan_page.dart

@@ -33,14 +33,14 @@ class PropertyIoanPage extends HookConsumerWidget {
           "YY Home",
           "YY Home",
           textColor: ColorUtils.string2Color('#000000'),
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 27,
           fontSize: 27,
-          fontWeight: FontWeight.w500,
+          isFontMedium: true,
           textAlign: TextAlign.center,
           textAlign: TextAlign.center,
         ),
         ),
         MyTextView(
         MyTextView(
           "Find the best home loan for you",
           "Find the best home loan for you",
           textColor: ColorUtils.string2Color('#000000'),
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 16,
           fontSize: 16,
-          fontWeight: FontWeight.w400,
+          isFontRegular: true,
           marginBottom: 14,
           marginBottom: 14,
           textAlign: TextAlign.center,
           textAlign: TextAlign.center,
         ),
         ),
@@ -185,7 +185,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                               marginLeft: 15,
                             ),
                             ),
                             MyTextView(
                             MyTextView(
@@ -193,7 +193,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 50.5,
                               marginLeft: 50.5,
                             ),
                             ),
                           ],
                           ],
@@ -206,7 +206,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                               marginLeft: 15,
                             ),
                             ),
                             MyTextView(
                             MyTextView(
@@ -214,7 +214,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 50.5,
                               marginLeft: 50.5,
                             ),
                             ),
                           ],
                           ],
@@ -227,7 +227,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                               marginLeft: 15,
                             ),
                             ),
                             MyTextView(
                             MyTextView(
@@ -235,7 +235,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               fontSize: 16,
                               textAlign: TextAlign.center,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 47.5,
                               marginLeft: 47.5,
                             ),
                             ),
                           ],
                           ],
@@ -261,7 +261,7 @@ class PropertyIoanPage extends HookConsumerWidget {
             "The right advice to help you choose the best package in the market!",
             "The right advice to help you choose the best package in the market!",
             textColor: ColorUtils.string2Color('#000000'),
             textColor: ColorUtils.string2Color('#000000'),
             fontSize: 18,
             fontSize: 18,
-            fontWeight: FontWeight.w500,
+            isFontMedium: true,
             marginTop: 20,
             marginTop: 20,
             marginBottom: 20,
             marginBottom: 20,
             textAlign: TextAlign.center,
             textAlign: TextAlign.center,
@@ -287,7 +287,7 @@ class PropertyIoanPage extends HookConsumerWidget {
            "What do we offer?",
            "What do we offer?",
             textColor: ColorUtils.string2Color('#000000'),
             textColor: ColorUtils.string2Color('#000000'),
             fontSize: 18,
             fontSize: 18,
-            fontWeight: FontWeight.w500,
+            isFontMedium: true,
             marginTop: 16.5,
             marginTop: 16.5,
             marginBottom: 16.5,
             marginBottom: 16.5,
           ),
           ),
@@ -334,7 +334,7 @@ class PropertyIoanPage extends HookConsumerWidget {
           "Our Partners",
           "Our Partners",
           textColor: ColorUtils.string2Color('#000000'),
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 18,
           fontSize: 18,
-          fontWeight: FontWeight.w500,
+          isFontMedium: true,
           marginBottom: 16.5,
           marginBottom: 16.5,
         ),
         ),
         MyLoadImage(Assets.propertyOurPartners,),
         MyLoadImage(Assets.propertyOurPartners,),

+ 1 - 1
packages/cpt_property/lib/modules/news/page/property_news_state.dart

@@ -16,8 +16,8 @@ class PropertyNewsState {
 
 
     int curPage;
     int curPage;
     int pageSize;
     int pageSize;
-    List<Map<String, dynamic>> list;
     int filterCount;
     int filterCount;
+    List<Map<String, dynamic>> list;
 
 
     factory PropertyNewsState.fromJson(Map<dynamic, dynamic> json) => PropertyNewsState(
     factory PropertyNewsState.fromJson(Map<dynamic, dynamic> json) => PropertyNewsState(
         curPage: json["curPage"],
         curPage: json["curPage"],

+ 5 - 7
packages/cpt_property/lib/modules/property/page/property_page.dart

@@ -54,15 +54,13 @@ class PropertyPage extends HookConsumerWidget {
                     type: ClickType.throttle,
                     type: ClickType.throttle,
                   ),
                   ),
                   SizedBox.fromSize(size: const Size(0, 9)),
                   SizedBox.fromSize(size: const Size(0, 9)),
-                  Text(
+                  MyTextView(
                     item['title'],
                     item['title'],
                     maxLines: 1, // 设置最大行数为2
                     maxLines: 1, // 设置最大行数为2
-                    overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                    style: TextStyle(
-                        fontSize: 13.0,
-                        color: curIdx == index ? ColorUtils.string2Color('#4161D0'):Colors.black,
-                        fontWeight: FontWeight.w500
-                    ), // 设置字体大小
+                    isTextEllipsis: true, // 超出部分用省略号表示
+                    fontSize: 13,
+                    textColor: curIdx == index ? ColorUtils.string2Color('#4161D0'):Colors.black,
+                    isFontMedium: true,
                   ),
                   ),
                 ],
                 ],
               ),
               ),

+ 14 - 14
packages/cpt_property/lib/modules/rent/page/property_rent_page.dart

@@ -7,6 +7,7 @@ import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 
 
@@ -29,10 +30,14 @@ class PropertyRentPage extends HookConsumerWidget {
   Widget _buildItemLeftSection(BuildContext context,WidgetRef ref, item, _vm) {
   Widget _buildItemLeftSection(BuildContext context,WidgetRef ref, item, _vm) {
     return Container(
     return Container(
       // color: Colors.blue,
       // color: Colors.blue,
-      child:
-      Text(item['title'],
-        style: const TextStyle(fontSize: 16.0, color: Colors.black, fontWeight: FontWeight.w400), // 设置字体大小
-      ),
+      child:MyTextView(
+        item['title'],
+        maxLines: 1, // 设置最大行数为2
+        isTextEllipsis: true, // 超出部分用省略号表示
+        fontSize: 16,
+        textColor: Colors.black,
+        isFontRegular: true,
+      )
     ).marginOnly(right: 17.5);
     ).marginOnly(right: 17.5);
   }
   }
 
 
@@ -60,19 +65,14 @@ class PropertyRentPage extends HookConsumerWidget {
           child: Column(
           child: Column(
             mainAxisAlignment: MainAxisAlignment.center,
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
             children: [
-              Text(
+              MyTextView(
                 item['price'],
                 item['price'],
-                style: const TextStyle(
-                  fontSize: 17, // 字体大小
-                  fontWeight: FontWeight.bold, // 字体粗细
-                ),
+                fontSize: 17,
+                isFontMedium: true,
               ),
               ),
-              Text(
+              MyTextView(
                 item['unit'],
                 item['unit'],
-                style: const TextStyle(
-                  fontSize: 12, // 字体大小
-                  fontWeight: FontWeight.normal, // 字体粗细
-                ),
+                fontSize: 12,
               ),
               ),
             ],
             ],
           ),
           ),

+ 15 - 7
packages/cpt_property/lib/modules/sale/page/property_sale_page.dart

@@ -7,6 +7,7 @@ import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 
 
@@ -30,9 +31,12 @@ class PropertySalePage extends HookConsumerWidget {
     return Container(
     return Container(
       // color: Colors.blue,
       // color: Colors.blue,
         child:
         child:
-          Text(item['title'],
-          style: const TextStyle(fontSize: 16.0, color: Colors.black, fontWeight: FontWeight.w400), // 设置字体大小
-        ),
+          MyTextView(
+            item['title'],
+            fontSize: 16,
+            textColor: Colors.black,
+            isFontMedium: true,
+          ),
     ).marginOnly(right: 17.5);
     ).marginOnly(right: 17.5);
   }
   }
 
 
@@ -55,7 +59,12 @@ class PropertySalePage extends HookConsumerWidget {
             ), // 边框
             ), // 边框
           ),
           ),
         ),
         ),
-        child: Text(item['price']),
+        child:MyTextView(
+          item['price'],
+          fontSize: 17,
+          textColor: Colors.black,
+          isFontMedium: true,
+        ),
       ),
       ),
     );
     );
   }
   }
@@ -78,10 +87,9 @@ class PropertySalePage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
-                Container(
-                  width: 100,
+                SizedBox(
+                  width: 120,
                   child: _buildItemRightSection(context, ref, item, _vm),
                   child: _buildItemRightSection(context, ref, item, _vm),
-                  // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
                 ),
                 ),
               ],
               ],
             ),
             ),

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

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

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


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


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


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


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


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


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


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


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


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

@@ -48,6 +48,11 @@ class Assets {
   static const String communityNesFeed = 'assets/community/nes_feed.webp';
   static const String communityNesFeed = 'assets/community/nes_feed.webp';
   static const String communityShare = 'assets/community/share.webp';
   static const String communityShare = 'assets/community/share.webp';
   static const String mainAccountDeactivationImg = 'assets/main/account_deactivation_img.webp';
   static const String mainAccountDeactivationImg = 'assets/main/account_deactivation_img.webp';
+  static const String mainFeedbackHistory = 'assets/main/feedback_history.webp';
+  static const String mainFeedbackInProgress = 'assets/main/feedback_in_progress.webp';
+  static const String mainFeedbackItemIcon = 'assets/main/feedback_item_icon.webp';
+  static const String mainFeedbackSend = 'assets/main/feedback_send.webp';
+  static const String mainFeedbackSendImg = 'assets/main/feedback_send_img.webp';
   static const String mainHomeBoticeBoardIcon = 'assets/main/home_botice_board_icon.webp';
   static const String mainHomeBoticeBoardIcon = 'assets/main/home_botice_board_icon.webp';
   static const String mainHomeCommunityIcon = 'assets/main/home_community_icon.webp';
   static const String mainHomeCommunityIcon = 'assets/main/home_community_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
@@ -73,6 +78,10 @@ class Assets {
   static const String mainTabMeUnselected = 'assets/main/tab_me_unselected.webp';
   static const String mainTabMeUnselected = 'assets/main/tab_me_unselected.webp';
   static const String mainTabVisitorSelected = 'assets/main/tab_visitor_selected.webp';
   static const String mainTabVisitorSelected = 'assets/main/tab_visitor_selected.webp';
   static const String mainTabVisitorUnselected = 'assets/main/tab_visitor_unselected.webp';
   static const String mainTabVisitorUnselected = 'assets/main/tab_visitor_unselected.webp';
+  static const String mainVisitorActive = 'assets/main/visitor_active.webp';
+  static const String mainVisitorHistory = 'assets/main/visitor_history.webp';
+  static const String mainVisitorNow = 'assets/main/visitor_now.webp';
+  static const String mainVisitorNowImg = 'assets/main/visitor_now_img.webp';
   static const String noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';

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

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

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

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

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

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

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

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

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

@@ -104,5 +104,21 @@
   "introduction_to_info_pack": "Introduction to info-pack",
   "introduction_to_info_pack": "Introduction to info-pack",
   "your_roles_responsibilities": "Your roles & responsibilities",
   "your_roles_responsibilities": "Your roles & responsibilities",
   "property_guide": "Property Guide",
   "property_guide": "Property Guide",
+  "visitor_now": "Now",
+  "visitor_active": "Active",
+  "history": "History",
+  "visitor_msg": "The community visitor system is an intelligent system designed to enhance community security management and facilitate visitor access.",
+  "visitor_registration": "Visitor Registration",
+  "full_name": "Full Name",
+  "nric_fin": "NRIC/FIN",
+  "license_plate_number": "License Plate Number",
+  "access_date": "Access Date",
+  "notes": "Notes",
+  "characters": "{count} Characters",
+  "sent": "Sent",
+  "in_progress": "In Progress",
+  "feedback_msg_1": "Help us keep your estate beautiful",
+  "feedback_msg_2": "there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!",
+  "create_new_feedback": "Create New FeedBack",
   "other": "Other"
   "other": "Other"
 }
 }

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

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

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

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

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

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

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

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

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

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

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

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