Преглед на файлове

update community module

glglove преди 2 седмици
родител
ревизия
ea69975fbe
променени са 79 файла, в които са добавени 3214 реда и са изтрити 556 реда
  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',
           failedText: 'Failed',
           messageText: 'Last updated at %T',
-          textStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
-          messageStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
-          iconTheme: IconThemeData(color: Color(0XFFAECAE5)),
           backgroundColor: Colors.transparent,
         );
     EasyRefresh.defaultFooterBuilder = () => const ClassicFooter(
@@ -90,9 +87,6 @@ class MyApp extends HookConsumerWidget {
           showMessage: false,
           triggerOffset: 50,
           iconDimension: 22,
-          textStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
-          messageStyle: TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
-          iconTheme: IconThemeData(color: Color(0XFFAECAE5)),
           backgroundColor: Colors.transparent,
         );
 

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

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

+ 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:flutter/material.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_appbar.dart';
 
+import 'custom_tabs_state.dart';
 import 'custom_tabs_vm.dart';
 
 
@@ -18,10 +21,14 @@ class CustomTabs extends HookConsumerWidget {
   int activeIndex = 0;
   Widget? Function(BuildContext)? tabItemBuilder;
   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) {
-    int? activeIndex = ref.watch(customTabsVmProvider).activeIndex;
+
+    // 监听 activeIndex 的变化
+    final activeIndex = ref.watch(customTabsVmProvider.select((state) => state.activeIndex));
+
     return Container(
         width: MediaQuery.of(context).size.width / vm.state.tabsList.length - 30,
         height: 43,
@@ -61,6 +68,7 @@ class CustomTabs extends HookConsumerWidget {
 
   List<Widget> _buildTabs(BuildContext context, WidgetRef ref, vm){
     tabsList = vm.state.tabsList;
+
     int tabsLength = tabsList.length;
     return List.generate(tabsLength, (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:cs_resources/generated/assets.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -10,11 +11,12 @@ part 'custom_tabs_vm.g.dart';
 
 @riverpod
 class CustomTabsVm extends _$CustomTabsVm {
-  CustomTabsState initState(tabsList, activeIndex,tabItemBuilder, onClickAction) {
+
+  CustomTabsState initState(List tabsList, int activeIndex, tabItemBuilder, onClickAction) {
     CustomTabsState state = CustomTabsState(
-        tabsList: tabsList,
-        activeIndex:activeIndex,
-        tabItemBuilder: tabItemBuilder,
+        tabsList: tabsList ?? [],
+        activeIndex: activeIndex ?? 0,
+        tabItemBuilder:tabItemBuilder,
         onClickAction: onClickAction
     );
 
@@ -23,17 +25,17 @@ class CustomTabsVm extends _$CustomTabsVm {
 
   @override
   CustomTabsState build(){
-    CustomTabsState state = initState([],0,null,null);
+    CustomTabsState state = initState([], 0, null, null);
     return state;
   }
 
 
   Future<void> initPropData(tabsList, activeIndex,tabItemBuilder, onClickAction) async {
     CustomTabsState newState = state.copyWith(
-      tabsList: tabsList,
-      activeIndex: activeIndex,
-      tabItemBuilder: tabItemBuilder,
-      onClickAction: onClickAction
+        tabsList: tabsList,
+        activeIndex: activeIndex,
+        tabItemBuilder: tabItemBuilder,
+        onClickAction: onClickAction
     );
     state = newState;
   }
@@ -41,12 +43,13 @@ class CustomTabsVm extends _$CustomTabsVm {
   // 点击tab
   void handlerClickTab(int index, item){
     CustomTabsState newState = state.copyWith(
-      activeIndex: index
+        activeIndex: index
     );
     state = newState;
-    
+
     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
 // **************************************************************************
 
-String _$customTabsVmHash() => r'34989e04bef32871e5ada4fb3a4bfdd44f7fb17f';
+String _$customTabsVmHash() => r'b70151a4b38ff797bae21d730f0aa7c38272f766';
 
 /// See also [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/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:auto_route/auto_route.dart';
 import 'package:hooks_riverpod/hooks_riverpod.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 'newsfeed_vm.dart';
 
@@ -31,24 +41,111 @@ class NewsfeedPage extends HookConsumerWidget {
 
   Widget _buildPostSection(BuildContext context, WidgetRef ref, vm){
     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(
-      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
   Widget build(BuildContext context, WidgetRef ref) {
     final vm = ref.read(newsfeedVmProvider.notifier);
 
     return Scaffold(
+      backgroundColor: ColorUtils.string2Color("#F2F3F6"),
       body: Column(
           children: [
             _buildTabsSection(context, ref, vm),
@@ -56,7 +153,19 @@ class NewsfeedPage extends HookConsumerWidget {
             _buildPostSection(context, ref, vm),
 
             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';
 
 class NewsfeedState {
+  int? curPage;
+  int? pageSize;
+  int? filterCount;
   int? activeIndex = 0;
   List tabsList = [];
+  List? list = [];
+
 
-  NewsfeedState({
-    this.activeIndex,
-    required this.tabsList,
-  });
 
   NewsfeedState copyWith({
+    int? curPage,
+    int? pageSize,
+    int? filterCount,
     int? activeIndex,
     List? tabsList,
+    List? list,
   }) {
     return NewsfeedState(
+      curPage: curPage ?? this.curPage,
+      pageSize: pageSize ?? this.pageSize,
+      filterCount: filterCount ?? this.filterCount,
       activeIndex: activeIndex ?? this.activeIndex,
       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:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
 
 import 'newsfeed_state.dart';
+import 'newsfeed_repository.dart';
 
 part 'newsfeed_vm.g.dart';
 
 @riverpod
 class NewsfeedVm extends _$NewsfeedVm {
+  late NewsfeedRepository newsfeedRepository;
   NewsfeedState initState() {
     return NewsfeedState(
       activeIndex: 0,
@@ -34,14 +39,110 @@ class NewsfeedVm extends _$NewsfeedVm {
           'activeTitleFontSize': 16,
           '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
   NewsfeedState build(){
+    // 引入数据仓库
+    newsfeedRepository = ref.read(newsfeedRepositoryProvider);
+    // 初始化状态
     NewsfeedState state = initState();
     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
 // **************************************************************************
 
-String _$newsfeedVmHash() => r'85ded646400393df6fe1d8fb9f9065845f36ede7';
+String _$newsfeedVmHash() => r'0d147c845251f1b8031020ef5dc25250e56192ab';
 
 /// See also [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:hooks_riverpod/hooks_riverpod.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/componentRouter/community_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
@@ -29,38 +32,46 @@ class HomePage extends HookConsumerWidget {
 
     return Scaffold(
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
+          backIconPath: Assets.mainTabMeSelected,
+          backIconWidth: 18.5,
+          backIconHeight: 20,
+          showBackButton: true,
           backgroundColor: context.appColors.whiteBG,
+          backCallback: (){
+          ToastEngine.show("测试去登录页面");
+          ComponentServiceManager().authService.startLoginPage();
+          },
           actions: [
             Center(
-                child: Stack(
-                  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),
           ],
           showBottomDivider: true),
@@ -165,7 +176,13 @@ class HomePage extends HookConsumerWidget {
                       textColor: context.appColors.textBlack,
                       fontSize: 15,
                       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),
                   ],
                 ).onTap(viewModel.gotoRewardsPage).expanded(),
@@ -193,12 +210,12 @@ class HomePage extends HookConsumerWidget {
     return SliverGrid(
       gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
         crossAxisCount: 3, // 三列
-        mainAxisSpacing: 14.0, // 主轴(上下)的间距
+        mainAxisSpacing: 10.0, // 主轴(上下)的间距
         crossAxisSpacing: 0.0, // 交叉轴(左右)的间距
-        childAspectRatio: 9 / 7, // 子组件的宽高比
+        childAspectRatio: 9 / 8, // 子组件的宽高比
       ),
       delegate: SliverChildBuilderDelegate(
-            (BuildContext context, int index) {
+        (BuildContext context, int index) {
           return HomeCategoryItem(
             category: state.homeCategory[index],
           ).onTap(() {
@@ -231,32 +248,32 @@ class HomePage extends HookConsumerWidget {
 
     return SliverToBoxAdapter(
         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),
           sliver: SliverList(
             delegate: SliverChildBuilderDelegate(
-                  (BuildContext context, int index) {
+              (BuildContext context, int index) {
                 return Padding(
                   padding: const EdgeInsets.symmetric(vertical: 10),
                   child: LastTransItem(
@@ -335,31 +352,31 @@ class HomePage extends HookConsumerWidget {
 
     return SliverToBoxAdapter(
         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
 // **************************************************************************
 
-String _$homeViewModelHash() => r'9b4974389335a1d56e6b345f83e7c626e3ba0d28';
+String _$homeViewModelHash() => r'6ec7a8712028daa4d43ace46ea0269981b237187';
 
 /// See also [HomeViewModel].
 @ProviderFor(HomeViewModel)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -33,14 +33,14 @@ class PropertyIoanPage extends HookConsumerWidget {
           "YY Home",
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 27,
-          fontWeight: FontWeight.w500,
+          isFontMedium: true,
           textAlign: TextAlign.center,
         ),
         MyTextView(
           "Find the best home loan for you",
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 16,
-          fontWeight: FontWeight.w400,
+          isFontRegular: true,
           marginBottom: 14,
           textAlign: TextAlign.center,
         ),
@@ -185,7 +185,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                             ),
                             MyTextView(
@@ -193,7 +193,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 50.5,
                             ),
                           ],
@@ -206,7 +206,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                             ),
                             MyTextView(
@@ -214,7 +214,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 50.5,
                             ),
                           ],
@@ -227,7 +227,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 15,
                             ),
                             MyTextView(
@@ -235,7 +235,7 @@ class PropertyIoanPage extends HookConsumerWidget {
                               textColor: ColorUtils.string2Color('#000000'),
                               fontSize: 16,
                               textAlign: TextAlign.center,
-                              fontWeight: FontWeight.w500,
+                              isFontMedium: true,
                               marginLeft: 47.5,
                             ),
                           ],
@@ -261,7 +261,7 @@ class PropertyIoanPage extends HookConsumerWidget {
             "The right advice to help you choose the best package in the market!",
             textColor: ColorUtils.string2Color('#000000'),
             fontSize: 18,
-            fontWeight: FontWeight.w500,
+            isFontMedium: true,
             marginTop: 20,
             marginBottom: 20,
             textAlign: TextAlign.center,
@@ -287,7 +287,7 @@ class PropertyIoanPage extends HookConsumerWidget {
            "What do we offer?",
             textColor: ColorUtils.string2Color('#000000'),
             fontSize: 18,
-            fontWeight: FontWeight.w500,
+            isFontMedium: true,
             marginTop: 16.5,
             marginBottom: 16.5,
           ),
@@ -334,7 +334,7 @@ class PropertyIoanPage extends HookConsumerWidget {
           "Our Partners",
           textColor: ColorUtils.string2Color('#000000'),
           fontSize: 18,
-          fontWeight: FontWeight.w500,
+          isFontMedium: true,
           marginBottom: 16.5,
         ),
         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 pageSize;
-    List<Map<String, dynamic>> list;
     int filterCount;
+    List<Map<String, dynamic>> list;
 
     factory PropertyNewsState.fromJson(Map<dynamic, dynamic> json) => PropertyNewsState(
         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,
                   ),
                   SizedBox.fromSize(size: const Size(0, 9)),
-                  Text(
+                  MyTextView(
                     item['title'],
                     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: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 'package:cs_resources/generated/assets.dart';
 
@@ -29,10 +30,14 @@ class PropertyRentPage extends HookConsumerWidget {
   Widget _buildItemLeftSection(BuildContext context,WidgetRef ref, item, _vm) {
     return Container(
       // 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);
   }
 
@@ -60,19 +65,14 @@ class PropertyRentPage extends HookConsumerWidget {
           child: Column(
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
-              Text(
+              MyTextView(
                 item['price'],
-                style: const TextStyle(
-                  fontSize: 17, // 字体大小
-                  fontWeight: FontWeight.bold, // 字体粗细
-                ),
+                fontSize: 17,
+                isFontMedium: true,
               ),
-              Text(
+              MyTextView(
                 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: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 'package:cs_resources/generated/assets.dart';
 
@@ -30,9 +31,12 @@ class PropertySalePage extends HookConsumerWidget {
     return Container(
       // color: Colors.blue,
         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);
   }
 
@@ -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,
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
-                Container(
-                  width: 100,
+                SizedBox(
+                  width: 120,
                   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,
         height: height,
         whRatio: height / width,
-        isFullScreenDevice: (height / width) > 1.9,
+        isFullScreenDevice: (height / width) > 1.88,
         topPadding: MediaQuery.of(context).padding.top,
         bottomPadding: MediaQuery.of(context).padding.bottom,
         textScaleFactor: MediaQuery.of(context).textScaleFactor,
@@ -122,5 +122,6 @@ class AppConfigService extends _$AppConfigService {
     Log.d('AppConfig---disableAnimations: ${state.disableAnimations}');
     Log.d('AppConfig---boldText: ${state.boldText}');
     Log.d('AppConfig---orientation:${state.orientation}');
+    Log.d('AppConfig---宽高比:${(state.mSize!.height / state.mSize!.width)} isFullScreenDevice:${state.isFullScreenDevice}');
   }
 }

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


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


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


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


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


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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