Browse Source

Merge branch 'dev' of http://git.wmzhubo.com/guadoutech/YYHome into dev

glglove 3 months ago
parent
commit
eed3026bfe
100 changed files with 2556 additions and 1996 deletions
  1. 18 19
      packages/cpt_facility/lib/modules/booking/facility_booking_page.dart
  2. 1 1
      packages/cpt_facility/lib/modules/booking/facility_booking_view_model.dart
  3. 1 1
      packages/cpt_facility/lib/modules/booking/facility_booking_view_model.g.dart
  4. 1 1
      packages/cpt_facility/lib/modules/detail/facility_detail_view_model.g.dart
  5. 1 2
      packages/cpt_facility/lib/modules/facility/book/facility_book_screen.dart
  6. 1 1
      packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.g.dart
  7. 1 0
      packages/cpt_facility/lib/router/page/facility_page_router.dart
  8. 6 12
      packages/cpt_facility/lib/router/page/facility_page_router.gr.dart
  9. 183 89
      packages/cpt_main/lib/modules/home/home_page.dart
  10. 75 96
      packages/cpt_main/lib/modules/home/home_state.dart
  11. 43 3
      packages/cpt_main/lib/modules/home/home_view_model.dart
  12. 4 2
      packages/cpt_main/lib/modules/home/item_home_last_news.dart
  13. 16 15
      packages/cpt_main/lib/modules/home/item_home_last_trans.dart
  14. 7 9
      packages/cpt_main/lib/modules/home/item_home_manage_guide.dart
  15. 6 3
      packages/cpt_main/lib/modules/home/item_home_property_news.dart
  16. 18 6
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_screen.dart
  17. 3 2
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_state.dart
  18. 64 70
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.dart
  19. 15 1
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_screen.dart
  20. 3 2
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_state.dart
  21. 64 71
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.dart
  22. 84 0
      packages/cpt_main/lib/modules/home/latest_news/item_latest_news.dart
  23. 15 2
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_screen.dart
  24. 3 2
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_state.dart
  25. 62 69
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.dart
  26. 19 6
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_screen.dart
  27. 3 2
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_state.dart
  28. 64 70
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.dart
  29. 6 7
      packages/cpt_main/lib/modules/home/management_guides/item_management_guide.dart
  30. 4 3
      packages/cpt_main/lib/modules/home/management_guides/management_guides_page.dart
  31. 3 3
      packages/cpt_main/lib/modules/home/management_guides/management_guides_state.dart
  32. 59 81
      packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.dart
  33. 0 4
      packages/cpt_main/lib/modules/home/management_guides/test_guide_bean.dart
  34. 5 2
      packages/cpt_main/lib/modules/home/property_news/home_property_news_page.dart
  35. 3 2
      packages/cpt_main/lib/modules/home/property_news/home_property_news_state.dart
  36. 44 67
      packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.dart
  37. 5 4
      packages/cpt_main/lib/modules/home/property_news/item_list_news.dart
  38. 8 9
      packages/cpt_notice_board/lib/modules/announ/page/announ_page.dart
  39. 0 1
      packages/cpt_notice_board/lib/modules/announ/repository/announ_repository.dart
  40. 2 4
      packages/cpt_notice_board/lib/modules/announ/vm/announ_vm.dart
  41. 107 80
      packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_page.dart
  42. 34 35
      packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_state.dart
  43. 12 14
      packages/cpt_notice_board/lib/modules/announcement_detail/repository/announcement_detail_repository.dart
  44. 46 48
      packages/cpt_notice_board/lib/modules/announcement_detail/vm/announcement_detail_vm.dart
  45. 24 15
      packages/cpt_notice_board/lib/modules/documents/page/documents_page.dart
  46. 24 6
      packages/cpt_notice_board/lib/modules/documents/vm/documents_vm.dart
  47. 65 37
      packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_page.dart
  48. 44 32
      packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_state.dart
  49. 12 17
      packages/cpt_notice_board/lib/modules/documents_list/repository/documents_list_repository.dart
  50. 115 49
      packages/cpt_notice_board/lib/modules/documents_list/vm/documents_list_vm.dart
  51. 6 12
      packages/cpt_notice_board/lib/modules/event/page/event_page.dart
  52. 2 4
      packages/cpt_notice_board/lib/modules/event/vm/event_vm.dart
  53. 88 61
      packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_page.dart
  54. 34 38
      packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_state.dart
  55. 12 15
      packages/cpt_notice_board/lib/modules/event_detail/repository/event_detail_repository.dart
  56. 48 50
      packages/cpt_notice_board/lib/modules/event_detail/vm/event_detail_vm.dart
  57. 1 1
      packages/cpt_notice_board/lib/modules/notice_board/page/notice_board_page.dart
  58. 121 15
      packages/cpt_notice_board/lib/router/page/notice_board_page_router.gr.dart
  59. 6 4
      packages/cpt_notice_board/pubspec.yaml
  60. 9 7
      packages/cpt_property/lib/modules/news_detail/property_news_detail_page.dart
  61. 6 0
      packages/cpt_property/lib/router/component/property_component_service.dart
  62. 114 163
      packages/cpt_rewards/lib/modules/rewards/rewards_page.dart
  63. 1 1
      packages/cpt_rewards/lib/modules/rewards/rewards_repository.g.dart
  64. 2 2
      packages/cpt_rewards/lib/modules/rewards/rewards_state.dart
  65. 3 1
      packages/cpt_rewards/lib/modules/rewards/rewards_vm.dart
  66. 1 1
      packages/cpt_rewards/lib/modules/rewards/rewards_vm.g.dart
  67. 4 2
      packages/cpt_rewards/lib/modules/rewards_address/rewards_address_repository.g.dart
  68. 4 3
      packages/cpt_rewards/lib/modules/rewards_address/rewards_address_vm.g.dart
  69. 9 5
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_page.dart
  70. 2 1
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_repository.g.dart
  71. 4 3
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_vm.g.dart
  72. 9 29
      packages/cpt_rewards/lib/modules/rewards_confirm/dialog/account_deactivation_dialog.dart
  73. 118 95
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_page.dart
  74. 59 15
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.dart
  75. 4 2
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.g.dart
  76. 45 35
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_state.dart
  77. 83 44
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.dart
  78. 5 4
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.g.dart
  79. 113 154
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_page.dart
  80. 3 2
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.dart
  81. 4 2
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.g.dart
  82. 14 7
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_state.dart
  83. 11 10
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.dart
  84. 4 3
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.g.dart
  85. 29 33
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_page.dart
  86. 6 3
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_repository.g.dart
  87. 2 2
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.dart
  88. 9 6
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.g.dart
  89. 24 31
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_page.dart
  90. 6 3
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_repository.g.dart
  91. 2 2
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.dart
  92. 7 5
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.g.dart
  93. 6 5
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_vm.g.dart
  94. 26 16
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_page.dart
  95. 42 0
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.dart
  96. 2 1
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.g.dart
  97. 7 0
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_state.dart
  98. 32 18
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.dart
  99. 4 3
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.g.dart
  100. 0 0
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_page.dart

+ 18 - 19
packages/cpt_facility/lib/modules/booking/facility_booking_page.dart

@@ -5,6 +5,7 @@ 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:domain/entity/facility_book_entity.dart';
+import 'package:domain/entity/facility_index_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
@@ -26,17 +27,16 @@ import 'facility_booking_view_model.dart';
 
 @RoutePage()
 class FacilityBookingPage extends HookConsumerWidget {
-  final String facilityId;
-  final String facilityName;
+  final FacilityIndexEntity facilityEntity;
 
-  const FacilityBookingPage({Key? key, required this.facilityId, required this.facilityName}) : super(key: key);
+  const FacilityBookingPage({Key? key, required this.facilityEntity}) : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context, required String facilityId, required String facilityName}) {
+  static void startInstance({BuildContext? context, required FacilityIndexEntity facilityEntity}) {
     if (context != null) {
-      context.router.push(FacilityBookingPageRoute(facilityId: facilityId, facilityName: facilityName));
+      context.router.push(FacilityBookingPageRoute(facilityEntity: facilityEntity));
     } else {
-      appRouter.push(FacilityBookingPageRoute(facilityId: facilityId, facilityName: facilityName));
+      appRouter.push(FacilityBookingPageRoute(facilityEntity: facilityEntity));
     }
   }
 
@@ -48,7 +48,7 @@ class FacilityBookingPage extends HookConsumerWidget {
     useEffect(() {
       // 组件挂载时执行 - 执行接口请求
       Future.microtask(() {
-        viewModel.setFacilityId(facilityId, facilityName);
+        viewModel.setFacilityId(facilityEntity.id, facilityEntity.name);
         viewModel.fetchListByDate();
       });
       return () {
@@ -59,21 +59,20 @@ class FacilityBookingPage extends HookConsumerWidget {
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        facilityName,
+        facilityEntity.name ?? "",
         backgroundColor: context.appColors.backgroundWhite,
         actions: [
           //去设施小区的定位图片
-          const MyAssetImage(
-            Assets.facilityTitleLocationIcon,
-            width: 44,
-            height: 44,
-          ).marginOnly(right: 3).onTap(() {
-            FacilityLocationPage.startInstance(context: context, imageUrls: [
-              "https://mz.eastday.com/63074197.jpeg",
-              "https://t10.baidu.com/it/u=3562774827,189123978&fm=30&app=106&f=PNG?w=640&h=479&s=DFBA6EC80A72B7CC02FC011F0300D0C2",
-              "https://img1.baidu.com/it/u=4090167392,148087489&fm=253&fmt=auto&app=138&f=JPEG?w=484&h=300"
-            ]);
-          }),
+          Visibility(
+            visible: facilityEntity.mapResources.isNotEmpty,
+            child: const MyAssetImage(
+              Assets.facilityTitleLocationIcon,
+              width: 44,
+              height: 44,
+            ).marginOnly(right: 3).onTap(() {
+              FacilityLocationPage.startInstance(context: context, imageUrls: facilityEntity.mapResources);
+            }),
+          )
         ],
       ),
       backgroundColor: context.appColors.backgroundDark,

+ 1 - 1
packages/cpt_facility/lib/modules/booking/facility_booking_view_model.dart

@@ -32,7 +32,7 @@ class FacilityBookingViewModel extends _$FacilityBookingViewModel with DioCancel
   }
 
   //设置设施的ID
-  void setFacilityId(String facilityId, String facilityName) {
+  void setFacilityId(String? facilityId, String? facilityName) {
     state = state.copyWith(facilityId: facilityId, facilityName: facilityName);
   }
 

+ 1 - 1
packages/cpt_facility/lib/modules/booking/facility_booking_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'facility_booking_view_model.dart';
 // **************************************************************************
 
 String _$facilityBookingViewModelHash() =>
-    r'564f4a008b169156b09e3c2325eb1e1cd02e1a47';
+    r'646deef1f63c76e1c0f03d12695d41e0389122d9';
 
 /// See also [FacilityBookingViewModel].
 @ProviderFor(FacilityBookingViewModel)

+ 1 - 1
packages/cpt_facility/lib/modules/detail/facility_detail_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'facility_detail_view_model.dart';
 // **************************************************************************
 
 String _$facilityDetailViewModelHash() =>
-    r'8a361195ada0787beab9b28c38810c95acc51156';
+    r'd026d982cc65cab780f287c0bf91789bc3884202';
 
 /// See also [FacilityDetailViewModel].
 @ProviderFor(FacilityDetailViewModel)

+ 1 - 2
packages/cpt_facility/lib/modules/facility/book/facility_book_screen.dart

@@ -44,8 +44,7 @@ class FacilityBookScreen extends HookConsumerWidget {
                 return FacilityBookItem(index: index, item: state.datas[index]).onTap(() {
                   FacilityBookingPage.startInstance(
                     context: context,
-                    facilityId: state.datas[index].id ?? "",
-                    facilityName: state.datas[index].name ?? "",
+                    facilityEntity: state.datas[index],
                   );
                 });
               },

+ 1 - 1
packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'facility_book_view_model.dart';
 // **************************************************************************
 
 String _$facilityBookViewModelHash() =>
-    r'a1ae4da61a6245c401083faabca3a6c94b971a4d';
+    r'1424ada4c23a96abadd01134687ecff538650a26';
 
 /// See also [FacilityBookViewModel].
 @ProviderFor(FacilityBookViewModel)

+ 1 - 0
packages/cpt_facility/lib/router/page/facility_page_router.dart

@@ -12,6 +12,7 @@ import '../../modules/detail/facility_detail_page.dart';
 import '../../modules/booking/facility_booking_page.dart';
 import '../../modules/book_confirm/book_confirm_page.dart';
 import '../../modules/location/facility_location_page.dart';
+import 'package:domain/entity/facility_index_entity.dart';
 
 part 'facility_page_router.gr.dart';
 

+ 6 - 12
packages/cpt_facility/lib/router/page/facility_page_router.gr.dart

@@ -39,8 +39,7 @@ abstract class _$FacilityPageRouter extends RootStackRouter {
         routeData: routeData,
         child: FacilityBookingPage(
           key: args.key,
-          facilityId: args.facilityId,
-          facilityName: args.facilityName,
+          facilityEntity: args.facilityEntity,
         ),
       );
     },
@@ -133,15 +132,13 @@ class FacilityBookingPageRoute
     extends PageRouteInfo<FacilityBookingPageRouteArgs> {
   FacilityBookingPageRoute({
     Key? key,
-    required String facilityId,
-    required String facilityName,
+    required FacilityIndexEntity facilityEntity,
     List<PageRouteInfo>? children,
   }) : super(
           FacilityBookingPageRoute.name,
           args: FacilityBookingPageRouteArgs(
             key: key,
-            facilityId: facilityId,
-            facilityName: facilityName,
+            facilityEntity: facilityEntity,
           ),
           initialChildren: children,
         );
@@ -155,19 +152,16 @@ class FacilityBookingPageRoute
 class FacilityBookingPageRouteArgs {
   const FacilityBookingPageRouteArgs({
     this.key,
-    required this.facilityId,
-    required this.facilityName,
+    required this.facilityEntity,
   });
 
   final Key? key;
 
-  final String facilityId;
-
-  final String facilityName;
+  final FacilityIndexEntity facilityEntity;
 
   @override
   String toString() {
-    return 'FacilityBookingPageRouteArgs{key: $key, facilityId: $facilityId, facilityName: $facilityName}';
+    return 'FacilityBookingPageRouteArgs{key: $key, facilityEntity: $facilityEntity}';
   }
 }
 

+ 183 - 89
packages/cpt_main/lib/modules/home/home_page.dart

@@ -2,8 +2,10 @@ import 'package:cpt_main/modules/home/home_state.dart';
 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:domain/entity/home_list_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
@@ -13,6 +15,7 @@ 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/widget_export.dart';
 
 import 'item_home_category.dart';
 import 'home_view_model.dart';
@@ -20,6 +23,10 @@ import 'item_home_last_news.dart';
 import 'item_home_last_trans.dart';
 import 'item_home_manage_guide.dart';
 import 'item_home_property_news.dart';
+import 'latest_news/info/latest_news_info_screen.dart';
+import 'latest_news/internal/latest_news_internal_screen.dart';
+import 'latest_news/property/latest_news_property_screen.dart';
+import 'latest_news/publish/latest_news_publish_screen.dart';
 
 @RoutePage()
 class HomePage extends HookConsumerWidget {
@@ -29,6 +36,15 @@ class HomePage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final viewModel = ref.read(homeViewModelProvider.notifier);
     final state = ref.watch(homeViewModelProvider);
+    final bannerIndex = useState(0);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchHomeIndex());
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
 
     return Scaffold(
       appBar: MyAppBar.appBar(context, "Good Afternoon,Mike",
@@ -69,64 +85,67 @@ class HomePage extends HookConsumerWidget {
           ],
           showBottomDivider: true),
       backgroundColor: context.appColors.backgroundDefault,
-      body: CustomScrollView(
-        scrollDirection: Axis.vertical,
-        physics: const BouncingScrollPhysics(),
-        slivers: [
-          //支付与奖励
-          _buildPaymentAndRewardsWidget(context, ref),
-
-          //间距
-          _buildSliverSpace(20),
-
-          //九宫选项组 (固定)
-          _buildCategoryWidget(context, ref),
-
-          //轮播图片 (动态)
-          _buildBannerImage(),
-
-          //最新的新闻(动态)
-          _buildLastNews(context, ref),
-
-          //最新的交易
-          SliverToBoxAdapter(
-            child: MyTextView(
-              marginTop: 14,
-              marginLeft: 15,
-              marginBottom: 14,
-              S.current.latest_transactions,
-              textColor: context.appColors.textPrimary,
-              fontSize: 16,
-              isFontMedium: true,
+      body: EasyRefresh(
+        controller: viewModel.refreshController,
+        onRefresh: viewModel.onRefresh,
+        child: CustomScrollView(
+          scrollDirection: Axis.vertical,
+          slivers: [
+            //支付与奖励
+            _buildPaymentAndRewardsWidget(context, ref),
+
+            //间距
+            _buildSliverSpace(20),
+
+            //九宫选项组 (固定)
+            _buildCategoryWidget(context, ref),
+
+            //轮播图片 (动态)
+            _buildBannerImage(ref, bannerIndex),
+
+            //最新的新闻(动态)
+            _buildLastNews(context, ref),
+
+            //最新的交易
+            SliverToBoxAdapter(
+              child: MyTextView(
+                marginTop: 14,
+                marginLeft: 15,
+                marginBottom: 14,
+                S.current.latest_transactions,
+                textColor: context.appColors.textPrimary,
+                fontSize: 16,
+                isFontMedium: true,
+              ),
             ),
-          ),
 
-          //最新交易列表 (动态)
-          _buildLastTransaction(context, state),
-
-          //房产新闻
-          SliverToBoxAdapter(
-            child: MyTextView(
-              marginTop: 14,
-              marginLeft: 15,
-              marginBottom: 14,
-              onClick: viewModel.gotoPropertyNewsPage,
-              S.current.property_news,
-              textColor: context.appColors.textPrimary,
-              fontSize: 16,
-              isFontMedium: true,
+            //最新交易列表 (动态)
+            _buildLastTransaction(context, state),
+
+            //房产新闻
+            SliverToBoxAdapter(
+              child: MyTextView(
+                marginTop: 14,
+                marginLeft: 15,
+                marginBottom: 14,
+                onClick: viewModel.gotoPropertyNewsPage,
+                S.current.property_news,
+                textColor: context.appColors.textPrimary,
+                fontSize: 16,
+                isFontMedium: true,
+              ),
             ),
-          ),
 
-          //房产新闻列表 (动态)
-          _buildPropertyNews(context, state),
+            //房产新闻列表 (动态)
+            _buildPropertyNews(context, ref),
 
-          //管理员介绍 (固定)
-          _buildManagementGuides(context, ref),
+            //管理员介绍 (固定)
+            _buildManagementGuides(context, ref),
 
-          //间距
-          _buildSliverSpace(15),
-        ],
+            //间距
+            _buildSliverSpace(15),
+          ],
+        ),
       ),
     );
   }
@@ -221,19 +240,74 @@ class HomePage extends HookConsumerWidget {
   }
 
   //Banner的布局
-  Widget _buildBannerImage() {
+  Widget _buildBannerImage(WidgetRef ref, ValueNotifier<int> bannerIndex) {
+    final viewModel = ref.read(homeViewModelProvider.notifier);
+    final state = ref.watch(homeViewModelProvider);
+
     return SliverToBoxAdapter(
       child: Container(
         width: double.infinity,
         margin: const EdgeInsets.only(top: 21, left: 15, right: 15),
-        child: AspectRatio(
-          aspectRatio: 345/152.5,
-          child: MyLoadImage(
-            "https://t11.baidu.com/it/u=1326770860,192430039&fm=30&app=106&f=JPEG?w=640&h=427&s=33B5BFAA6A165BCA182937620300D077",
-            width: double.infinity,
-            cornerRadius: 5,
-          ),
-        ),
+        child: state.homeIndex != null && state.homeIndex!.banners.isNotEmpty
+            ? Stack(
+                alignment: Alignment.bottomCenter, // 设置 Stack 的对齐方式为底部中心
+                children: [
+                  CarouselSlider(
+                    options: CarouselOptions(
+                      aspectRatio: 345 / 152.5,
+                      viewportFraction: 1,
+                      initialPage: 0,
+                      enableInfiniteScroll: true,
+                      reverse: false,
+                      autoPlay: true,
+                      autoPlayInterval: const Duration(seconds: 5),
+                      autoPlayAnimationDuration: const Duration(milliseconds: 800),
+                      autoPlayCurve: Curves.fastOutSlowIn,
+                      enlargeCenterPage: true,
+                      scrollDirection: Axis.horizontal,
+                      onPageChanged: (index, reason) {
+                        bannerIndex.value = index;
+                      },
+                    ),
+                    items: state.homeIndex!.banners.map<Widget>((item) {
+                      return MyLoadImage(
+                        item.image,
+                        width: double.infinity,
+                        cornerRadius: 5,
+                      );
+                    }).toList(),
+                  ),
+                  Positioned(
+                    bottom: 10, // 距离底部 20 像素
+                    child: Row(
+                      mainAxisAlignment: MainAxisAlignment.center,
+                      children: state.homeIndex!.banners.map((item) {
+                        //难道就没有indexMap,要么就转换为Map的方式进行遍历Map
+                        int index = state.homeIndex!.banners.indexOf(item);
+                        return Container(
+                          width: 6.5,
+                          height: 6.5,
+                          margin: const EdgeInsets.symmetric(horizontal: 3.5),
+                          decoration: BoxDecoration(
+                            shape: BoxShape.circle,
+                            color: bannerIndex.value == index
+                                ? const Color(0x4D000000) // 选中状态颜色
+                                : const Color(0x1A000000), // 未选中状态颜色
+                          ),
+                        );
+                      }).toList(),
+                    ),
+                  ),
+                ],
+              )
+            : AspectRatio(
+                aspectRatio: 345 / 152.5,
+                child: MyLoadImage(
+                  Assets.baseLibImageDefaultPlaceholder,
+                  width: double.infinity,
+                  cornerRadius: 5,
+                ),
+              ),
       ),
     );
   }
@@ -257,18 +331,29 @@ class HomePage extends HookConsumerWidget {
           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(
+        Row(
+          mainAxisAlignment: MainAxisAlignment.spaceAround, // 均匀排布
+          children: List.generate(state.lastNews.length, (index) {
+            return Expanded(
+              // 使用 Expanded 使每个子项占据相同空间
+              child: LastNewsItem(
                 lastNews: state.lastNews[index],
-              );
-            }),
-          ),
-        )
+                onItemTap: () {
+                  //根据不同的索引跳转到不同的PageView指定页面
+                  if (index == 0) {
+                    LatestNewsPropertyScreen.startInstance(context: context);
+                  } else if (index == 1) {
+                    LatestNewsInternalScreen.startInstance(context: context);
+                  } else if (index == 2) {
+                    LatestNewsInfoScreen.startInstance(context: context);
+                  } else if (index == 3) {
+                    LatestNewsPublishScreen.startInstance(context: context);
+                  }
+                },
+              ),
+            );
+          }),
+        ),
       ],
     ).paddingOnly(left: 15, right: 15));
   }
@@ -298,11 +383,11 @@ class HomePage extends HookConsumerWidget {
                 return Padding(
                   padding: const EdgeInsets.symmetric(vertical: 10),
                   child: LastTransItem(
-                    lastTrans: state.lastTrans[index],
+                    lastTrans: state.homeIndex!.latestTransactions[index],
                   ),
                 );
               },
-              childCount: state.lastTrans.length,
+              childCount: state.homeIndex?.latestTransactions.length ?? 0,
             ),
           ),
         ),
@@ -311,33 +396,40 @@ class HomePage extends HookConsumerWidget {
   }
 
   //房产新闻的双列表
-  Widget _buildPropertyNews(BuildContext context, HomeState state) {
+  Widget _buildPropertyNews(BuildContext context, WidgetRef ref) {
+    final state = ref.watch(homeViewModelProvider);
+    final propertyNewsList = state.homeIndex?.propertyNews ?? [];
+
+    // 计算行数和每行的元素
+    int totalItems = propertyNewsList.length;
+    int firstRowCount = (totalItems + 1) ~/ 2; // 第1行的数量 (奇数时多一个)
+    int secondRowCount = totalItems ~/ 2; // 第2行的数量
+
     return SliverList(
       delegate: SliverChildListDelegate(
         [
-          // PropertyNews(),
-
           // 第一个水平滑动列表
-          _buildPropertyNewsHorizontalList(),
+          _buildPropertyNewsHorizontalList(propertyNewsList.sublist(0, firstRowCount)),
 
           const SizedBox(height: 10),
 
-          // // 第二个水平滑动列表
-          _buildPropertyNewsHorizontalList(),
+          // 第二个水平滑动列表
+          if (secondRowCount > 0) // 只有在有第二行内容时才显示
+            _buildPropertyNewsHorizontalList(propertyNewsList.sublist(firstRowCount, firstRowCount + secondRowCount)),
         ],
       ),
     );
   }
 
-  Widget _buildPropertyNewsHorizontalList() {
+  Widget _buildPropertyNewsHorizontalList(List<HomeListPropertyNews> propertyNews) {
     return SingleChildScrollView(
       scrollDirection: Axis.horizontal,
       physics: const BouncingScrollPhysics(),
       clipBehavior: Clip.none,
       child: Row(
-        children: List.generate(5, (index) {
-          return PropertyNews();
-        }),
+        children: propertyNews.map((news) {
+          return PropertyNews(news: news); // 假设 PropertyNews 需要传入一个 news 参数
+        }).toList(),
       ).marginOnly(left: 15, right: 15),
     );
   }
@@ -366,11 +458,13 @@ class HomePage extends HookConsumerWidget {
           physics: const BouncingScrollPhysics(),
           clipBehavior: Clip.none,
           child: Row(
-            children: List.generate(state.manage_guide.length, (index) {
-              return ManageGuideItem(
-                manageGuide: state.manage_guide[index],
-              );
-            }),
+            children: state.homeIndex?.strataManagementGuides == null
+                ? [const SizedBox.shrink()]
+                : List.generate(state.homeIndex!.strataManagementGuides.length, (index) {
+                    return ManageGuideItem(
+                      manageGuide: state.homeIndex!.strataManagementGuides[index],
+                    );
+                  }),
           ),
         )
       ],

+ 75 - 96
packages/cpt_main/lib/modules/home/home_state.dart

@@ -1,103 +1,82 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/home_list_entity.dart';
 
 class HomeState {
-  final homeCategory = [
-    {
-      'category_name': S.current.facility,
-      'category_icon': Assets.mainHomeFacilityIcon,
-    },
-    {
-      'category_name': S.current.form,
-      'category_icon': Assets.mainHomeFormsIcon,
-    },
-    {
-      'category_name': S.current.notice_board,
-      'category_icon': Assets.mainHomeBoticeBoardIcon,
-    },
-    {
-      'category_name': S.current.property,
-      'category_icon': Assets.mainHomePropertyIcon,
-    },
-    {
-      'category_name': S.current.service,
-      'category_icon': Assets.mainHomeServiceIcon,
-    },
-    {
-      'category_name': S.current.community,
-      'category_icon': Assets.mainHomeCommunityIcon,
-    }
-  ];
+  final List<Map<String, dynamic>> homeCategory;
+  final List<Map<String, dynamic>> lastNews;
+  HomeListEntity? homeIndex;
 
-  final lastNews = [
-    {
-      'category_name': S.current.property,
-      'category_icon': Assets.mainHomePropertyNews,
-      'icon_width': 38.5,
-      'icon_height': 39.5,
-      'margin_right': 13.0,
-    },
-    {
-      'category_name': S.current.internal,
-      'category_icon': Assets.mainHomeInternalNews,
-      'icon_width': 33.5,
-      'icon_height': 41.0,
-      'margin_right': 11.0,
-    },
-    {
-      'category_name': S.current.info,
-      'category_icon': Assets.mainHomeInfoNews,
-      'icon_width': 44.0,
-      'icon_height': 42.0,
-      'margin_right': 6.0,
-    },
-    {
-      'category_name': S.current.notice,
-      'category_icon': Assets.mainHomePublishNews,
-      'icon_width': 40.5,
-      'icon_height': 42.5,
-      'margin_right': 11.0,
-    }
-  ];
+  HomeState({
+    List<Map<String, dynamic>>? homeCategory,
+    List<Map<String, dynamic>>? lastNews,
+    this.homeIndex,
+  })  : homeCategory = homeCategory ??
+            [
+              {
+                'category_name': S.current.facility,
+                'category_icon': Assets.mainHomeFacilityIcon,
+              },
+              {
+                'category_name': S.current.form,
+                'category_icon': Assets.mainHomeFormsIcon,
+              },
+              {
+                'category_name': S.current.notice_board,
+                'category_icon': Assets.mainHomeBoticeBoardIcon,
+              },
+              {
+                'category_name': S.current.property,
+                'category_icon': Assets.mainHomePropertyIcon,
+              },
+              {
+                'category_name': S.current.service,
+                'category_icon': Assets.mainHomeServiceIcon,
+              },
+              {
+                'category_name': S.current.community,
+                'category_icon': Assets.mainHomeCommunityIcon,
+              }
+            ],
+        lastNews = lastNews ??
+            [
+              {
+                'category_name': S.current.property,
+                'category_icon': Assets.mainHomePropertyNews,
+                'icon_width': 38.5,
+                'icon_height': 39.5,
+                'margin_right': 13.0,
+              },
+              {
+                'category_name': S.current.internal,
+                'category_icon': Assets.mainHomeInternalNews,
+                'icon_width': 33.5,
+                'icon_height': 41.0,
+                'margin_right': 11.0,
+              },
+              {
+                'category_name': S.current.info,
+                'category_icon': Assets.mainHomeInfoNews,
+                'icon_width': 44.0,
+                'icon_height': 42.0,
+                'margin_right': 6.0,
+              },
+              {
+                'category_name': S.current.notice,
+                'category_icon': Assets.mainHomePublishNews,
+                'icon_width': 40.5,
+                'icon_height': 42.5,
+                'margin_right': 11.0,
+              }
+            ];
 
-
-  final manage_guide = [
-    {
-      'category_name': S.current.introduction_to_info_pack,
-      'category_icon': Assets.mainIntroductionGuide,
-      'icon_width': 118.5,
-      'icon_height': 73.5,
-      'margin_top': 12.0,
-    },
-    {
-      'category_name': S.current.your_roles_responsibilities,
-      'category_icon': Assets.mainRolesGuide,
-      'icon_width': 116,
-      'icon_height': 78,
-      'margin_top': 8.5,
-    },
-    {
-      'category_name': S.current.property_guide,
-      'category_icon': Assets.mainPropertyGuide,
-      'icon_width': 117.0,
-      'icon_height': 76.5,
-      'margin_top': 10.0,
-    },
-  ];
-
-  //模拟数据
-  final lastTrans = [
-    {
-      'title': '18 Sep 2024 Blk 39 #09-XX',
-      'price': '1,001 - 1,337 sqft',
-      'total': '1.338 M',
-      'unit': '',
-    },
-    {
-      'title': 'Jul 2024  Blk XX #XX to XX',
-      'price': '1,100 - 1,200 sqft',
-      'total': '4,000 M',
-      'unit': 'per month',
-    },
-  ];
+  HomeState copyWith({
+    HomeListEntity? homeIndex,
+  }) {
+    return HomeState(
+      homeIndex: homeIndex ?? this.homeIndex,
+      homeCategory: homeCategory,
+      lastNews: lastNews,
+    );
+  }
 }

+ 43 - 3
packages/cpt_main/lib/modules/home/home_view_model.dart

@@ -1,9 +1,11 @@
 import 'package:cpt_main/modules/home/property_news/home_property_news_page.dart';
 import 'package:cpt_main/modules/notification/notification_page.dart';
+import 'package:domain/repository/main_repository.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
-import 'package:router/componentRouter/community_service.dart';
 import 'package:router/componentRouter/component_service_manager.dart';
+import 'package:widgets/widget_export.dart';
 
 import 'home_state.dart';
 import 'latest_news/latest_news_page.dart';
@@ -12,10 +14,47 @@ import 'management_guides/management_guides_page.dart';
 part 'home_view_model.g.dart';
 
 @riverpod
-class HomeViewModel extends _$HomeViewModel {
+class HomeViewModel extends _$HomeViewModel with DioCancelableMixin {
+  late final MainRepository _mainRepository;
+  var _needShowLoading = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: false, //允许加载
+  );
+
   @override
   HomeState build() {
-    return HomeState();
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = HomeState();
+    registerCancellation();
+    return state;
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    fetchHomeIndex();
+  }
+
+  /// 获取首页数据
+  Future fetchHomeIndex() async {
+    // 获取列表
+    var result = await _mainRepository.fetchHomeIndex(
+      needLoading: _needShowLoading,
+      cancelToken: cancelToken,
+    );
+
+    // 处理数据
+    if (result.isSuccess) {
+      state = state.copyWith(homeIndex: result.data);
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+
+    // 最后赋值
+    _needShowLoading = false;
+    refreshController.finishRefresh();
   }
 
   /// 根据索引触发点击的事件
@@ -72,4 +111,5 @@ class HomeViewModel extends _$HomeViewModel {
   void gotoManageGuidePage() {
     ManagementGuidesPage.startInstance();
   }
+
 }

+ 4 - 2
packages/cpt_main/lib/modules/home/item_home_last_news.dart

@@ -7,8 +7,9 @@ import 'package:widgets/my_text_view.dart';
 
 class LastNewsItem extends StatelessWidget {
   final Map<String, dynamic> lastNews;
+  void Function() onItemTap;
 
-  LastNewsItem({required this.lastNews});
+  LastNewsItem({required this.lastNews, required this.onItemTap});
 
   @override
   Widget build(BuildContext context) {
@@ -55,6 +56,7 @@ class LastNewsItem extends StatelessWidget {
           ],
         )
         .marginOnly(right: 5)
-        .constrained(width: 86.5, height: 78.5);
+        .constrained(width: 86.5, height: 78.5)
+        .onTap(onItemTap);
   }
 }

+ 16 - 15
packages/cpt_main/lib/modules/home/item_home_last_trans.dart

@@ -1,5 +1,6 @@
 import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/home_list_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
@@ -7,7 +8,7 @@ import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
 class LastTransItem extends StatelessWidget {
-  final Map<String, dynamic> lastTrans;
+  HomeListLatestTransactions lastTrans;
 
   LastTransItem({required this.lastTrans});
 
@@ -22,13 +23,13 @@ class LastTransItem extends StatelessWidget {
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
             MyTextView(
-              lastTrans['title'],
+              lastTrans.title ?? "",
               fontSize: 15,
               textColor: context.appColors.textBlack,
               isFontMedium: true,
             ),
             MyTextView(
-              lastTrans['price'],
+              lastTrans.price ?? "",
               fontSize: 15,
               marginTop: 5,
               textColor: context.appColors.textBlack,
@@ -36,10 +37,9 @@ class LastTransItem extends StatelessWidget {
             ),
           ],
         ).expanded(),
-
         Container(
-          width: 91.5,
           margin: const EdgeInsets.only(left: 10),
+          padding: const EdgeInsets.symmetric(horizontal: 5),
           height: 45,
           decoration: BoxDecoration(
             color: context.appColors.lightPurpleBg,
@@ -50,22 +50,23 @@ class LastTransItem extends StatelessWidget {
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               MyTextView(
-               "\$${lastTrans['total']}",
+                "\$${lastTrans.price ?? "-"}",
                 fontSize: 17,
                 textColor: context.appColors.textBlack,
                 isFontMedium: true,
               ),
-              Visibility(
-                  visible: Utils.isNotEmpty(lastTrans['unit']),
-                  child: MyTextView(
-                    lastTrans['unit'],
-                    fontSize: 12,
-                    textColor: context.appColors.textBlack,
-                    isFontRegular: true,
-                  ))
+              //单元,每个月或者没有单元
+              // Visibility(
+              //     visible: Utils.isNotEmpty(lastTrans['unit']),
+              //     child: MyTextView(
+              //       lastTrans['unit'],
+              //       fontSize: 12,
+              //       textColor: context.appColors.textBlack,
+              //       isFontRegular: true,
+              //     ))
             ],
           ),
-        ),
+        ).constrained(minWidth: 92),
       ],
     );
   }

+ 7 - 9
packages/cpt_main/lib/modules/home/item_home_manage_guide.dart

@@ -1,12 +1,13 @@
 import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/home_list_entity.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 ManageGuideItem extends StatelessWidget {
-  final Map<String, dynamic> manageGuide;
+  HomeListPropertyNews manageGuide;
 
   ManageGuideItem({required this.manageGuide});
 
@@ -16,15 +17,12 @@ class ManageGuideItem extends StatelessWidget {
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisAlignment: MainAxisAlignment.start,
       children: [
-        MyAssetImage(
-          manageGuide['category_icon'],
-          width: (manageGuide['icon_width'] as num).toDouble(),
-          height: (manageGuide['icon_height'] as num).toDouble(),
-          fit: BoxFit.cover, // 调整 fit 参数
-        ).marginOnly(top: manageGuide['margin_top']),
-
+        MyLoadImage(
+          manageGuide.coverImage,
+          fit: BoxFit.contain,
+        ).marginOnly(top: 10),
         MyTextView(
-          manageGuide['category_name'],
+          manageGuide.title ?? "",
           marginLeft: 9,
           marginTop: 10,
           maxLines: 2,

+ 6 - 3
packages/cpt_main/lib/modules/home/item_home_property_news.dart

@@ -1,5 +1,6 @@
 import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/home_list_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
@@ -7,7 +8,9 @@ import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
 class PropertyNews extends StatelessWidget {
-  PropertyNews();
+  final HomeListPropertyNews? news;
+
+  PropertyNews({required this.news});
 
   @override
   Widget build(BuildContext context) {
@@ -16,12 +19,12 @@ class PropertyNews extends StatelessWidget {
       mainAxisAlignment: MainAxisAlignment.start,
       children: [
         MyLoadImage(
-          "https://t11.baidu.com/it/u=4142771387,220552469&fm=30&app=106&f=JPEG?w=564&h=604&s=FA2FB04406270B0D68AE05910300509B",
+          news?.coverImage,
           width: 80,
           height: 80,
         ),
         MyTextView(
-          "Key Appeals and Performance of Nonlan-ded Properties in District 19",
+          news?.title ?? "",
           fontSize: 15,
           marginLeft: 12.5,
           marginRight: 12.5,

+ 18 - 6
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_screen.dart

@@ -1,18 +1,28 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:cpt_main/modules/home/property_news/item_list_news.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.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_latest_news.dart';
 import 'latest_news_info_view_model.dart';
 
-
 @RoutePage()
 class LatestNewsInfoScreen extends HookConsumerWidget {
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LatestNewsInfoPageRoute());
+    } else {
+      appRouter.push(const LatestNewsInfoPageRoute());
+    }
+  }
+
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final viewModel = ref.read(latestNewsInfoViewModelProvider.notifier);
@@ -42,11 +52,13 @@ class LatestNewsInfoScreen extends HookConsumerWidget {
           successSliverWidget: [
             SliverList(
                 delegate: SliverChildBuilderDelegate(
-                      (context, index) {
-                    return ListNewsItem(index: index, item: state.datas[index]);
-                  },
-                  childCount: state.datas.length,
-                ))
+              (context, index) {
+                return LatestNewsItem(index: index, item: state.datas[index]).onTap((){
+                  viewModel.gotoLatestNewsDetail(context,state.datas[index]);
+                });
+              },
+              childCount: state.datas.length,
+            ))
           ],
         ),
       ).marginOnly(top: 5, bottom: 5),

+ 3 - 2
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class LatestNewsInfoState {
@@ -6,7 +7,7 @@ class LatestNewsInfoState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<LatestNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class LatestNewsInfoState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<LatestNewsList>? datas,
   }) {
     return LatestNewsInfoState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 64 - 70
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.dart

@@ -1,3 +1,10 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,19 +15,23 @@ import 'latest_news_info_state.dart';
 part 'latest_news_info_view_model.g.dart';
 
 @riverpod
-class LatestNewsInfoViewModel extends _$LatestNewsInfoViewModel {
+class LatestNewsInfoViewModel extends _$LatestNewsInfoViewModel with DioCancelableMixin{
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
   );
 
   @override
   LatestNewsInfoState build() {
-    return LatestNewsInfoState(datas: []);
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = LatestNewsInfoState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -53,44 +64,18 @@ class LatestNewsInfoViewModel extends _$LatestNewsInfoViewModel {
       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();
+    // 获取列表
+    var listResult = await _mainRepository.fetchLatestNewsList(
+      type: "3",
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-      state = state.copyWith(datas: allList);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
+    } else {
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -98,33 +83,42 @@ class LatestNewsInfoViewModel extends _$LatestNewsInfoViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<LatestNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<LatestNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  /// 去详情页面
+  void gotoLatestNewsDetail(BuildContext context, LatestNewsList data) async {
+    final result = await _mainRepository.fetchLatestNewsDetail(id: data.id ?? "");
+    if (result.isSuccess) {
+      GlobalWebPage.startInstance(context: context, title: S.current.latest_news, url: result.data?.content ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+  }
+
 }

+ 15 - 1
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_screen.dart

@@ -1,17 +1,29 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:cpt_main/modules/home/property_news/item_list_news.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../item_latest_news.dart';
 import 'latest_news_internal_view_model.dart';
 
 
 @RoutePage()
 class LatestNewsInternalScreen extends HookConsumerWidget {
+
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LatestNewsInternalPageRoute());
+    } else {
+      appRouter.push(const LatestNewsInternalPageRoute());
+    }
+  }
+
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final viewModel = ref.read(latestNewsInternalViewModelProvider.notifier);
@@ -42,7 +54,9 @@ class LatestNewsInternalScreen extends HookConsumerWidget {
             SliverList(
                 delegate: SliverChildBuilderDelegate(
                       (context, index) {
-                    return ListNewsItem(index: index, item: state.datas[index]);
+                        return LatestNewsItem(index: index, item: state.datas[index]).onTap((){
+                          viewModel.gotoLatestNewsDetail(context,state.datas[index]);
+                        });
                   },
                   childCount: state.datas.length,
                 ))

+ 3 - 2
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class LatestNewsInternalState {
@@ -6,7 +7,7 @@ class LatestNewsInternalState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<LatestNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class LatestNewsInternalState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<LatestNewsList>? datas,
   }) {
     return LatestNewsInternalState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 64 - 71
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.dart

@@ -1,5 +1,11 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 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';
 
@@ -8,19 +14,23 @@ import 'latest_news_internal_state.dart';
 part 'latest_news_internal_view_model.g.dart';
 
 @riverpod
-class LatestNewsInternalViewModel extends _$LatestNewsInternalViewModel {
+class LatestNewsInternalViewModel extends _$LatestNewsInternalViewModel with DioCancelableMixin {
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
   );
 
   @override
   LatestNewsInternalState build() {
-    return LatestNewsInternalState(datas: []);
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = LatestNewsInternalState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -53,44 +63,18 @@ class LatestNewsInternalViewModel extends _$LatestNewsInternalViewModel {
       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();
+    // 获取列表
+    var listResult = await _mainRepository.fetchLatestNewsList(
+      type: "2",
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-      state = state.copyWith(datas: allList);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
+    } else {
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -98,33 +82,42 @@ class LatestNewsInternalViewModel extends _$LatestNewsInternalViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<LatestNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<LatestNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  /// 去详情页面
+  void gotoLatestNewsDetail(BuildContext context, LatestNewsList data) async {
+    final result = await _mainRepository.fetchLatestNewsDetail(id: data.id ?? "");
+    if (result.isSuccess) {
+      GlobalWebPage.startInstance(context: context, title: S.current.latest_news, url: result.data?.content ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+  }
+
 }

+ 84 - 0
packages/cpt_main/lib/modules/home/latest_news/item_latest_news.dart

@@ -0,0 +1,84 @@
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/latest_news_page_entity.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';
+
+///  首页最新新闻News 的Item
+class LatestNewsItem extends StatelessWidget {
+  final int index;
+  final LatestNewsList item;
+
+  const LatestNewsItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      height: 117.5,
+      margin: const EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 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: Row(
+        mainAxisSize: MainAxisSize.max,
+        children: [
+          MyLoadImage(
+            item.coverImage,
+            width: 100,
+            height: 117.5,
+          ).marginOnly(right: 18),
+          Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              //标题
+              MyTextView(
+                item.title??"",
+                marginTop: 12,
+                fontSize: 16,
+                maxLines: 2,
+                textColor: context.appColors.textBlack,
+                isFontMedium: true,
+              ),
+
+              //内容
+              MyTextView(
+                item.content??"",
+                marginTop: 5,
+                fontSize: 12,
+                maxLines: 2,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+
+              const Spacer(),
+
+              //时间
+              MyTextView(
+                item.createdAt??"",
+                fontSize: 12,
+                marginBottom: 12,
+                marginTop: 12,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+            ],
+          ).expanded(),
+        ],
+      ),
+    );
+  }
+}

+ 15 - 2
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_screen.dart

@@ -1,17 +1,28 @@
 import 'package:auto_route/auto_route.dart';
-import 'package:cpt_main/modules/home/property_news/item_list_news.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../item_latest_news.dart';
 import 'latest_news_property_view_model.dart';
 
 
 @RoutePage()
 class LatestNewsPropertyScreen extends HookConsumerWidget {
+
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LatestNewsPropertyPageRoute());
+    } else {
+      appRouter.push(const LatestNewsPropertyPageRoute());
+    }
+  }
+
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final viewModel = ref.read(latestNewsPropertyViewModelProvider.notifier);
@@ -42,7 +53,9 @@ class LatestNewsPropertyScreen extends HookConsumerWidget {
             SliverList(
                 delegate: SliverChildBuilderDelegate(
                       (context, index) {
-                    return ListNewsItem(index: index, item: state.datas[index]);
+                        return LatestNewsItem(index: index, item: state.datas[index]).onTap((){
+                          viewModel.gotoLatestNewsDetail(context,state.datas[index]);
+                        });
                   },
                   childCount: state.datas.length,
                 ))

+ 3 - 2
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class LatestNewsPropertyState {
@@ -6,7 +7,7 @@ class LatestNewsPropertyState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<LatestNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class LatestNewsPropertyState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<LatestNewsList>? datas,
   }) {
     return LatestNewsPropertyState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 62 - 69
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.dart

@@ -1,3 +1,10 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,19 +15,22 @@ import 'latest_news_property_state.dart';
 part 'latest_news_property_view_model.g.dart';
 
 @riverpod
-class LatestNewsPropertyViewModel extends _$LatestNewsPropertyViewModel {
+class LatestNewsPropertyViewModel extends _$LatestNewsPropertyViewModel with DioCancelableMixin {
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
   );
 
   @override
   LatestNewsPropertyState build() {
+    _mainRepository = ref.read(mainRepositoryProvider);
     final state = LatestNewsPropertyState(datas: []);
+    registerCancellation();
     return state;
   }
 
@@ -54,44 +64,18 @@ class LatestNewsPropertyViewModel extends _$LatestNewsPropertyViewModel {
       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();
+    // 获取列表
+    var listResult = await _mainRepository.fetchLatestNewsList(
+      type: "1",
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-      state = state.copyWith(datas: allList);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
+    } else {
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -99,33 +83,42 @@ class LatestNewsPropertyViewModel extends _$LatestNewsPropertyViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<LatestNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<LatestNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  /// 去详情页面
+  void gotoLatestNewsDetail(BuildContext context, LatestNewsList data) async {
+    final result = await _mainRepository.fetchLatestNewsDetail(id: data.id ?? "");
+    if (result.isSuccess) {
+      GlobalWebPage.startInstance(context: context, title: S.current.latest_news, url: result.data?.content ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+  }
+
 }

+ 19 - 6
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_screen.dart

@@ -1,17 +1,28 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:cpt_main/modules/home/property_news/item_list_news.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../item_latest_news.dart';
 import 'latest_news_publish_view_model.dart';
 
-
 @RoutePage()
 class LatestNewsPublishScreen extends HookConsumerWidget {
+
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LatestNewsPublishPageRoute());
+    } else {
+      appRouter.push(const LatestNewsPublishPageRoute());
+    }
+  }
+
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final viewModel = ref.read(latestNewsPublishViewModelProvider.notifier);
@@ -41,11 +52,13 @@ class LatestNewsPublishScreen extends HookConsumerWidget {
           successSliverWidget: [
             SliverList(
                 delegate: SliverChildBuilderDelegate(
-                      (context, index) {
-                    return ListNewsItem(index: index, item: state.datas[index]);
-                  },
-                  childCount: state.datas.length,
-                ))
+              (context, index) {
+                return LatestNewsItem(index: index, item: state.datas[index]).onTap((){
+                  viewModel.gotoLatestNewsDetail(context,state.datas[index]);
+                });
+              },
+              childCount: state.datas.length,
+            ))
           ],
         ),
       ).marginOnly(top: 5, bottom: 5),

+ 3 - 2
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class LatestNewsPublishState {
@@ -6,7 +7,7 @@ class LatestNewsPublishState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<LatestNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class LatestNewsPublishState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<LatestNewsList>? datas,
   }) {
     return LatestNewsPublishState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 64 - 70
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.dart

@@ -1,3 +1,10 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,19 +15,23 @@ import 'latest_news_publish_state.dart';
 part 'latest_news_publish_view_model.g.dart';
 
 @riverpod
-class LatestNewsPublishViewModel extends _$LatestNewsPublishViewModel {
+class LatestNewsPublishViewModel extends _$LatestNewsPublishViewModel with DioCancelableMixin{
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
   );
 
   @override
   LatestNewsPublishState build() {
-    return LatestNewsPublishState(datas: []);
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = LatestNewsPublishState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -53,44 +64,18 @@ class LatestNewsPublishViewModel extends _$LatestNewsPublishViewModel {
       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();
+    // 获取列表
+    var listResult = await _mainRepository.fetchLatestNewsList(
+      type: "4",
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-      state = state.copyWith(datas: allList);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
+    } else {
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -98,33 +83,42 @@ class LatestNewsPublishViewModel extends _$LatestNewsPublishViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<LatestNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<LatestNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  /// 去详情页面
+  void gotoLatestNewsDetail(BuildContext context, LatestNewsList data) async {
+    final result = await _mainRepository.fetchLatestNewsDetail(id: data.id ?? "");
+    if (result.isSuccess) {
+      GlobalWebPage.startInstance(context: context, title: S.current.latest_news, url: result.data?.content ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+  }
+
 }

+ 6 - 7
packages/cpt_main/lib/modules/home/management_guides/item_management_guide.dart

@@ -1,16 +1,15 @@
 import 'package:cpt_main/modules/feedback/feedback_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
 class ManagementGuideItem extends StatelessWidget {
-  final String? iconImage;
-  final String? title;
+  final LatestNewsList? item;
 
   ManagementGuideItem({
-    this.iconImage,
-    this.title,
+    this.item,
   });
 
   @override
@@ -34,14 +33,14 @@ class ManagementGuideItem extends StatelessWidget {
         children: [
           AspectRatio(
             aspectRatio: 165 / 108, // 设置宽高比例为 165:108
-            child: MyAssetImage(
-              iconImage ?? "-",
+            child: MyLoadImage(
+              item?.coverImage,
               width: double.infinity,
               height: double.infinity,
             ),
           ),
           MyTextView(
-            title ?? "-",
+            item?.title ?? "-",
             marginLeft: 9,
             marginTop: 15,
             maxLines: 2,

+ 4 - 3
packages/cpt_main/lib/modules/home/management_guides/management_guides_page.dart

@@ -67,9 +67,10 @@ class ManagementGuidesPage extends HookConsumerWidget {
                   delegate: SliverChildBuilderDelegate(
                         (BuildContext context, int index) {
                       return ManagementGuideItem(
-                        iconImage: state.datas[index].iconImage,
-                        title: state.datas[index].title,
-                      ); // 生成每个网格项
+                       item: state.datas[index],
+                      ).onTap((){
+                        viewModel.gotoLatestNewsDetail(context, state.datas[index]);
+                      }); // 生成每个网格项
                     },
                     childCount: state.datas.length, // 总共的网格项数
                   ),

+ 3 - 3
packages/cpt_main/lib/modules/home/management_guides/management_guides_state.dart

@@ -1,4 +1,4 @@
-import 'package:cpt_main/modules/home/management_guides/test_guide_bean.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class ManagementGuidesState {
@@ -7,7 +7,7 @@ class ManagementGuidesState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<TestGuideBean> datas; //页面列表数据
+  List<LatestNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -21,7 +21,7 @@ class ManagementGuidesState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<TestGuideBean>? datas,
+    List<LatestNewsList>? datas,
   }) {
     return ManagementGuidesState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 59 - 81
packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.dart

@@ -1,17 +1,22 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/latest_news_page_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 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 'management_guides_state.dart';
-import 'test_guide_bean.dart';
 
 part 'management_guides_view_model.g.dart';
 
 @riverpod
-class ManagementGuidesViewModel extends _$ManagementGuidesViewModel {
+class ManagementGuidesViewModel extends _$ManagementGuidesViewModel with DioCancelableMixin {
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
@@ -23,7 +28,10 @@ class ManagementGuidesViewModel extends _$ManagementGuidesViewModel {
 
   @override
   ManagementGuidesState build() {
-    return ManagementGuidesState(datas: []);
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = ManagementGuidesState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -56,55 +64,17 @@ class ManagementGuidesViewModel extends _$ManagementGuidesViewModel {
       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<TestGuideBean> list = [
-      TestGuideBean()
-        ..iconImage = Assets.mainIntroductionGuide
-        ..title = S.current.introduction_to_info_pack,
-
-      TestGuideBean()
-        ..iconImage = Assets.mainRolesGuide
-        ..title = S.current.your_roles_responsibilities,
-
-      TestGuideBean()
-        ..iconImage = Assets.mainPropertyGuide
-        ..title = S.current.property_guide,
-    ];
-
-    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();
+    // 获取列表
+    var listResult = await _mainRepository.fetchManageGuideList(
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-      state = state.copyWith(datas: allList);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
+    } else {
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -112,33 +82,41 @@ class ManagementGuidesViewModel extends _$ManagementGuidesViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<LatestNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<LatestNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  /// 去详情页面
+  void gotoLatestNewsDetail(BuildContext context, LatestNewsList data) async {
+    final result = await _mainRepository.fetchManageGuideDetail(id: data.id ?? "");
+    if (result.isSuccess) {
+      GlobalWebPage.startInstance(context: context, title: S.current.latest_news, url: result.data?.content ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    }
+  }
 }

+ 0 - 4
packages/cpt_main/lib/modules/home/management_guides/test_guide_bean.dart

@@ -1,4 +0,0 @@
-class TestGuideBean{
-  String? iconImage;
-  String? title;
-}

+ 5 - 2
packages/cpt_main/lib/modules/home/property_news/home_property_news_page.dart

@@ -5,6 +5,7 @@ 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:router/componentRouter/component_service_manager.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
@@ -17,7 +18,6 @@ import 'home_property_news_view_model.dart';
 
 @RoutePage()
 class HomePropertyNewsPage extends HookConsumerWidget {
-
   static void startInstance({BuildContext? context}) {
     if (context != null) {
       context.router.push(const HomePropertyNewsPageRoute());
@@ -59,7 +59,10 @@ class HomePropertyNewsPage extends HookConsumerWidget {
               SliverList(
                   delegate: SliverChildBuilderDelegate(
                 (context, index) {
-                  return ListNewsItem(index: index, item: state.datas[index]);
+                  return ListNewsItem(index: index, item: state.datas[index]).onTap(() {
+                    //路由跳转到Property模块的新闻详情页面
+                    ComponentServiceManager().propertyService.startPropertyNewsDetailPage(state.datas[index].id ?? 0);
+                  });
                 },
                 childCount: state.datas.length,
               ))

+ 3 - 2
packages/cpt_main/lib/modules/home/property_news/home_property_news_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/property_news_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class HomePropertyNewsState {
@@ -6,7 +7,7 @@ class HomePropertyNewsState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<PropertyNewsList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class HomePropertyNewsState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<PropertyNewsList>? datas,
   }) {
     return HomePropertyNewsState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 44 - 67
packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.dart

@@ -1,3 +1,6 @@
+import 'package:domain/entity/property_news_entity.dart';
+import 'package:domain/repository/main_repository.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,7 +11,8 @@ import 'home_property_news_state.dart';
 part 'home_property_news_view_model.g.dart';
 
 @riverpod
-class HomePropertyNewsViewModel extends _$HomePropertyNewsViewModel {
+class HomePropertyNewsViewModel extends _$HomePropertyNewsViewModel with DioCancelableMixin{
+  late final MainRepository _mainRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
@@ -20,7 +24,9 @@ class HomePropertyNewsViewModel extends _$HomePropertyNewsViewModel {
 
   @override
   HomePropertyNewsState build() {
-    return HomePropertyNewsState(datas: []);
+    _mainRepository = ref.read(mainRepositoryProvider);
+    final state = HomePropertyNewsState(datas: []);
+    return state;
   }
 
   //刷新页面状态
@@ -53,44 +59,17 @@ class HomePropertyNewsViewModel extends _$HomePropertyNewsViewModel {
       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);
-    // }
+    // 获取列表
+    var listResult = await _mainRepository.fetchPropertyNewsList(
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-
-    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);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
     } else {
-      //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
@@ -98,33 +77,31 @@ class HomePropertyNewsViewModel extends _$HomePropertyNewsViewModel {
   }
 
 // 处理数据与展示的逻辑
-// 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);
-//     }
-//   }
-// }
+  void handleList(List<PropertyNewsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<PropertyNewsList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
 }

+ 5 - 4
packages/cpt_main/lib/modules/home/property_news/item_list_news.dart

@@ -1,4 +1,5 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/property_news_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
@@ -7,7 +8,7 @@ import 'package:widgets/my_text_view.dart';
 ///  首页新闻News 的Item
 class ListNewsItem extends StatelessWidget {
   final int index;
-  final String item;
+  final PropertyNewsList item;
 
   const ListNewsItem({
     required this.index,
@@ -36,7 +37,7 @@ class ListNewsItem extends StatelessWidget {
         mainAxisSize: MainAxisSize.max,
         children: [
           MyLoadImage(
-            "https://pic.rmb.bdstatic.com/bjh/news/e991d703e32e11c2414ca1298410cc3a8789.jpeg",
+            item.coverImage ?? "",
             width: 100,
             height: 117.5,
           ).marginOnly(right: 18),
@@ -44,7 +45,7 @@ class ListNewsItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.start,
             children: [
               MyTextView(
-                "On Monday, the real estate market stopped falling and stabilized, and a devices",
+                item.title ?? "",
                 marginTop: 12,
                 fontSize: 16,
                 maxLines: 3,
@@ -52,7 +53,7 @@ class ListNewsItem extends StatelessWidget {
                 isFontMedium: true,
               ).expanded(),
               MyTextView(
-                "Monday 14 0ct 2024",
+                item.createdAt ?? "",
                 fontSize: 12,
                 marginBottom: 12,
                 marginTop: 12,

+ 8 - 9
packages/cpt_notice_board/lib/modules/announ/page/announ_page.dart

@@ -30,7 +30,7 @@ class AnnounPage extends HookConsumerWidget {
     }
   }
 
-  Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, vm) { 
+  Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, vm) {
     return Container(
       // color: Colors.blue,
       child: Text(
@@ -89,20 +89,19 @@ class AnnounPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        AnnouncementDetailPage.startInstance(context: context);
+        // AnnouncementDetailPage.startInstance(context: context);
+        AnnouncementDetailPage.startInstance(id: item['id']);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, vm) {
-    List itemsList = vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], vm);
-      },
-    );
+    final state = ref.watch(announVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 0 - 1
packages/cpt_notice_board/lib/modules/announ/repository/announ_repository.dart

@@ -63,5 +63,4 @@ class AnnounRepository {
     }
     return result.convert();
   }
-
 }

+ 2 - 4
packages/cpt_notice_board/lib/modules/announ/vm/announ_vm.dart

@@ -100,9 +100,7 @@ class AnnounVm extends _$AnnounVm {
       final result = await announRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardAnnounEntity)
-            .list
-            .cast<NoticeBoardAnnounEntity>());
+        handlerResultList((result.data as NoticeBoardAnnounEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -113,7 +111,7 @@ class AnnounVm extends _$AnnounVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardAnnounEntity>? list) {
+  void handlerResultList(List<NoticeBoardAnnounList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 107 - 80
packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_page.dart

@@ -1,70 +1,78 @@
 import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:cs_resources/generated/assets.dart';
-
+import 'package:flutter_html/flutter_html.dart';
 import '../../../router/page/notice_board_page_router.dart';
 import '../vm/announcement_detail_vm.dart';
 
 @RoutePage()
 class AnnouncementDetailPage extends HookConsumerWidget {
-  const AnnouncementDetailPage({Key? key}) : super(key: key);
+  final int? id;
+  const AnnouncementDetailPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const AnnouncementDetailPageRoute());
+      context.router.push(AnnouncementDetailPageRoute(id: id));
     } else {
-      appRouter.push(const AnnouncementDetailPageRoute());
+      appRouter.push(AnnouncementDetailPageRoute(id: id));
     }
   }
 
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm, item) {
+    List? resources = item!.resources ?? [];
     return Column(
       children: [
         Column(children: [
-          const Text(
-            'STANDARD OPERATING PROCEDURE FOR REPLACEMENT VEHICLES AND OVERNICHT PARKING VEHICLES(REMINDER)',
-            style: TextStyle(
+          Text(
+            item.title,
+            style: const TextStyle(
                 fontSize: 18.0,
                 color: Colors.black,
                 fontWeight: FontWeight.w700), // 设置字体大小
           ),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.start,
-            crossAxisAlignment: CrossAxisAlignment.center,
-            children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailOur,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'Our ref: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                '2024/CORR/CIR/112.V5',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w400), // 设置字体大小
-              ),
-            ],
-          ).marginOnly(top: 15),
+          // Row(
+          //   mainAxisAlignment: MainAxisAlignment.start,
+          //   crossAxisAlignment: CrossAxisAlignment.center,
+          //   children: [
+          //     const MyAssetImage(
+          //       Assets.noticeBoardAnnouncementDetailOur,
+          //       width: 15,
+          //       height: 15,
+          //     ).marginOnly(right: 8),
+          //     const Text(
+          //       'Our ref: ',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w700), // 设置字体大小
+          //     ),
+          //     const Text(
+          //       '2024/CORR/CIR/112.V5',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w400), // 设置字体大小
+          //     ),
+          //   ],
+          // ).marginOnly(top: 15),
           Row(
             mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.center,
@@ -81,40 +89,40 @@ class AnnouncementDetailPage extends HookConsumerWidget {
                     color: Colors.black,
                     fontWeight: FontWeight.w700), // 设置字体大小
               ),
-              const Text(
-                '31 July 2024',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w400), // 设置字体大小
-              ),
-            ],
-          ).marginOnly(top: 15),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.start,
-            crossAxisAlignment: CrossAxisAlignment.center,
-            children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailTo,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'To: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                'All Residents',
-                style: TextStyle(
+              Text(
+                item.createdAt,
+                style: const TextStyle(
                     fontSize: 15.0,
                     color: Colors.black,
                     fontWeight: FontWeight.w400), // 设置字体大小
               ),
             ],
           ).marginOnly(top: 15),
+          // Row(
+          //   mainAxisAlignment: MainAxisAlignment.start,
+          //   crossAxisAlignment: CrossAxisAlignment.center,
+          //   children: [
+          //     const MyAssetImage(
+          //       Assets.noticeBoardAnnouncementDetailTo,
+          //       width: 15,
+          //       height: 15,
+          //     ).marginOnly(right: 8),
+          //     const Text(
+          //       'To: ',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w700), // 设置字体大小
+          //     ),
+          //     const Text(
+          //       'All Residents',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w400), // 设置字体大小
+          //     ),
+          //   ],
+          // ).marginOnly(top: 15),
         ])
             .paddingOnly(bottom: 25)
             .border(bottom: 1, color: ColorUtils.string2Color('#F2F3F6')),
@@ -133,12 +141,15 @@ class AnnouncementDetailPage extends HookConsumerWidget {
                 )
               ],
             ).marginOnly(bottom: 25),
-            const Text(
-              'Dear Residents,STANDARD OPERATING PROCEDURE FORREPLACEMENT VEHICLES ANDOVERNICHT PARKING VEHICLES',
-              style: TextStyle(
-                  fontSize: 15.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w400), // 设置字体大小
+            resources!.length > 0
+                ? MyLoadImage(
+                    resources[0] ?? '',
+                    width: MediaQuery.of(context).size.width,
+                    height: 150,
+                  ).marginOnly(bottom: 15)
+                : Container(),
+            Html(
+              data: item.content,
             ),
           ],
         ).paddingOnly(top: 25, bottom: 50),
@@ -149,23 +160,39 @@ class AnnouncementDetailPage extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(announcementDetailVmProvider.notifier);
-
+    final state = ref.watch(announcementDetailVmProvider);
+    NoticeBoardAnnounDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
         "Lift Padding",
         backgroundColor: context.appColors.backgroundWhite,
       ),
-      body: Container(
-          child: EasyRefresh(
-        child: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child: Padding(
-                padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
-                child: _buildDetailTop(context, ref, _vm))),
-      )),
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Container(
+              child: EasyRefresh(
+            child: SingleChildScrollView(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Padding(
+                    padding:
+                        const EdgeInsets.only(left: 15, right: 15, top: 15),
+                    child: _buildDetailTop(context, ref, _vm, detailInfo))),
+          ))),
     );
   }
 }

+ 34 - 35
packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_state.dart

@@ -2,48 +2,47 @@
 
 import 'dart:convert';
 
-AnnouncementDetailState announcementDetailStateFromJson(String str) => AnnouncementDetailState.fromJson(json.decode(str));
 
-String announcementDetailStateToJson(AnnouncementDetailState data) => json.encode(data.toJson());
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class AnnouncementDetailState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  NoticeBoardAnnounDetailEntity? detailInfo;
+
   AnnouncementDetailState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory AnnouncementDetailState.fromJson(Map<dynamic, dynamic> json) => AnnouncementDetailState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    NoticeBoardAnnounDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? NoticeBoardAnnounDetailEntity();
 
   AnnouncementDetailState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    NoticeBoardAnnounDetailEntity? detailInfo,
   }) {
     return AnnouncementDetailState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory AnnouncementDetailState.fromMap(Map<String, dynamic> map) {
+    return AnnouncementDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as NoticeBoardAnnounDetailEntity,
     );
   }
-}
+}

+ 12 - 14
packages/cpt_notice_board/lib/modules/announcement_detail/repository/announcement_detail_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_announ_detail_entity.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -27,18 +29,13 @@ class AnnouncementDetailRepository {
   AnnouncementDetailRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    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";
@@ -46,25 +43,26 @@ class AnnouncementDetailRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/announcement/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = AnnouncementDetailState.fromJson(json!);
+      var data = NoticeBoardAnnounDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<AnnouncementDetailState>(data: data);
+      return result.convert<NoticeBoardAnnounDetailEntity>(data: data);
     }
     return result.convert();
   }
 
-
 }

+ 46 - 48
packages/cpt_notice_board/lib/modules/announcement_detail/vm/announcement_detail_vm.dart

@@ -1,7 +1,10 @@
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/announcement_detail_state.dart';
 import '../repository/announcement_detail_repository.dart';
 part 'announcement_detail_vm.g.dart';
@@ -9,31 +12,22 @@ part 'announcement_detail_vm.g.dart';
 @riverpod
 class AnnouncementDetailVm extends _$AnnouncementDetailVm {
   late AnnouncementDetailRepository announcementDetailRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   AnnouncementDetailState initState() {
-    return AnnouncementDetailState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return AnnouncementDetailState();
   }
 
   @override
   AnnouncementDetailState build() {
     // 引入数据仓库
-    announcementDetailRepository = ref.read(announcementDetailRepositoryProvider);
+    announcementDetailRepository =
+        ref.read(announcementDetailRepositoryProvider);
     // 初始化状态
     AnnouncementDetailState state = initState();
     // 初始化列表数据
@@ -41,22 +35,14 @@ class AnnouncementDetailVm extends _$AnnouncementDetailVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData(id: id);
   }
 
   // 上拉加载
   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();
   }
 
@@ -66,40 +52,52 @@ class AnnouncementDetailVm extends _$AnnouncementDetailVm {
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData(id: id);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
-  void getListData<T>() async {
+  void getListData<T>({int? id}) async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await announcementDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await announcementDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as NoticeBoardAnnounDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
       ToastEngine.show("Error: $e");
     }
   }
+  // // 下拉刷新
+  // Future refreshListData() async {
+  //   Log.d("----property_news_vm-----refreshListData ");
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
+  //   // await Future.delayed(const Duration(seconds: 2));
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
+  //   state = state.copyWith(curPage: 1, pageSize: 10);
+  //   // ref.invalidateSelf();
+  //   // ref.invalidate(propertyNewsVmProvider);
+  //   getListData();
+  // }
 }

+ 24 - 15
packages/cpt_notice_board/lib/modules/documents/page/documents_page.dart

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
@@ -49,7 +50,10 @@ class DocumentsPage extends HookConsumerWidget {
     return Container(
       color: Colors.white,
       child: TextButton(
-        onPressed: () {},
+        onPressed: () {
+          DocumentsListPage.startInstance(id: item['id']);
+          // DocumentsListPage.startInstance(context: context);
+        },
         style: TextButton.styleFrom(
           foregroundColor: Colors.black,
           backgroundColor: ColorUtils.string2Color('#4161D0'), // 背景颜色
@@ -76,6 +80,7 @@ class DocumentsPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String url = item['url'];
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -97,11 +102,13 @@ class DocumentsPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
-                Container(
-                  width: 120,
-                  child: _buildItemRightSection(context, ref, item, _vm),
-                  // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
-                ),
+                url == ''
+                    ? Container(
+                        width: 120,
+                        child: _buildItemRightSection(context, ref, item, _vm),
+                        // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
+                      )
+                    : Container(),
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
@@ -110,21 +117,23 @@ class DocumentsPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        // _vm.goNewsDetail(item);
-        DocumentsListPage.startInstance(context: context);
+        if (url != '') {
+          // _vm.launchURL(url);
+          GlobalWebPage.startInstance(
+              context: context, title: item['name'], url: url);
+        }
+        // DocumentsListPage.startInstance(context: context);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(documentsVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 24 - 6
packages/cpt_notice_board/lib/modules/documents/vm/documents_vm.dart

@@ -1,8 +1,8 @@
 import 'package:domain/entity/notice_board_documents_entity.dart';
-import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:url_launcher/url_launcher.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 import '../page/documents_state.dart';
@@ -96,15 +96,13 @@ class DocumentsVm extends _$DocumentsVm {
       Map<String, dynamic> params = {
         "page": page,
         "limit": limit,
-        "parent_id":0
+        "parent_id": 0
       };
       Log.d("请求参数------$params");
       final result = await documentsRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardDocumentsEntity)
-            .list
-            .cast<NoticeBoardDocumentsEntity>());
+        handlerResultList((result.data as NoticeBoardDocumentsEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -115,7 +113,7 @@ class DocumentsVm extends _$DocumentsVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardDocumentsEntity>? list) {
+  void handlerResultList(List<NoticeBoardDocumentsList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {
@@ -150,4 +148,24 @@ class DocumentsVm extends _$DocumentsVm {
       }
     }
   }
+
+  // 重试请求
+  void launchURL(url) async {
+    // const url = 'https://flutterchina.club/';
+    if (await canLaunch(url)) {
+      await launch(
+        url,
+        // Add optional `forceWebView` flag for Android to use a WebView
+        forceWebView: true,
+        // Add optional `enableBarColors` flag for iOS to change the color of the bars
+        enableJavaScript: true,
+        // Add optional `chromeCustomTabs` parameter for Android to customize Chrome Custom Tabs
+        enableDomStorage: true,
+        universalLinksOnly: true,
+        forceSafariVC: true,
+      );
+    } else {
+      throw 'Could not launch $url';
+    }
+  }
 }

+ 65 - 37
packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_page.dart

@@ -2,11 +2,14 @@ import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dar
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
@@ -17,14 +20,19 @@ import '../vm/documents_list_vm.dart';
 
 @RoutePage()
 class DocumentsListPage extends HookConsumerWidget {
-  const DocumentsListPage({Key? key}) : super(key: key);
+  final int? id;
+  const DocumentsListPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const DocumentsListPageRoute());
+      context.router.push(DocumentsListPageRoute(id: id));
     } else {
-      appRouter.push(const DocumentsListPageRoute());
+      appRouter.push(DocumentsListPageRoute(id: id));
     }
   }
 
@@ -32,7 +40,7 @@ class DocumentsListPage extends HookConsumerWidget {
     return Container(
       // color: Colors.blue,
       child: Text(
-        item['title'],
+        item['name'],
         maxLines: 2, // 设置最大行数为2
         overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
         style: const TextStyle(
@@ -63,8 +71,11 @@ class DocumentsListPage extends HookConsumerWidget {
             ), // 边框
           ),
         ),
-        child: const Text('Open Folder',
-          style: const TextStyle(color: Colors.white,),
+        child: const Text(
+          'Open Folder',
+          style: const TextStyle(
+            color: Colors.white,
+          ),
         ),
       ),
     );
@@ -72,6 +83,7 @@ class DocumentsListPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String url = item['url'];
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -94,38 +106,46 @@ class DocumentsListPage extends HookConsumerWidget {
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
                 Container(
-                  // width: 120,
-                  // child: _buildItemRightSection(context, ref, item, _vm),
-                  // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
-                ),
+                    // width: 120,
+                    // child: _buildItemRightSection(context, ref, item, _vm),
+                    // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
+                    ),
               ],
-            ).paddingOnly(left: 20,right: 20),
+            ).paddingOnly(left: 20, right: 20),
           ).constrained(
             minHeight: 70,
           ),
         ],
       ).onTap(() {
         // 去详情
-        _vm.goNewsDetail(item);
+        // _vm.launchURL(url);
+        GlobalWebPage.startInstance(
+            context: context, title: item['name'], url: url);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(documentsListVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
-    final _vm = ref.read(documentsListVmProvider.notifier);
-
+    final vm = ref.read(documentsListVmProvider.notifier);
+    final state = ref.watch(documentsListVmProvider);
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
@@ -134,21 +154,29 @@ class DocumentsListPage extends HookConsumerWidget {
       ),
       body: Container(
           child: EasyRefresh(
-        // 上拉加载
-        onLoad: () async {
-          Log.d("----onLoad");
-          _vm.onLoadData();
-        },
-        // 下拉刷新
-        onRefresh: () async {
-          Log.d("----onRefresh");
-          _vm.refreshListData();
-        },
-        child: Container(
-            color: ColorUtils.string2Color('#F2F3F6'),
-            padding: const EdgeInsets.only(top: 15),
-            child: _buildSaleList(context, ref, _vm)),
-      )),
+              controller: vm.refreshController,
+              // 上拉加载
+              onLoad: () async {
+                Log.d("----onLoad");
+                vm.loadMore();
+              },
+              // 下拉刷新
+              onRefresh: () async {
+                Log.d("----onRefresh");
+                vm.onRefresh();
+              },
+              child: Container(
+                color: ColorUtils.string2Color('#F2F3F6'),
+                padding: const EdgeInsets.only(top: 15),
+                child: LoadStateLayout(
+                  state: state.loadingState,
+                  errorMessage: state.errorMessage,
+                  errorRetry: () {
+                    vm.retryRequest();
+                  },
+                  successSliverWidget: [_buildSaleList(context, ref, vm)],
+                ),
+              ))),
     );
   }
 }

+ 44 - 32
packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_state.dart

@@ -2,48 +2,60 @@
 
 import 'dart:convert';
 
-DocumentsListState documentsListStateFromJson(String str) => DocumentsListState.fromJson(json.decode(str));
-
-String documentsListStateToJson(DocumentsListState data) => json.encode(data.toJson());
+import 'package:widgets/load_state_layout.dart';
 
 class DocumentsListState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  int? page;
+  int? limit = 10;
+  int? count = 1;
+  List<Map<String, dynamic>>? list;
+
   DocumentsListState({
-    required this.curPage,
-    required this.pageSize,
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    this.page = 1,
+    this.limit = 10,
+    this.count = 1,
     required this.list,
-    required this.filterCount,
   });
 
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory DocumentsListState.fromJson(Map<dynamic, dynamic> json) => DocumentsListState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
-
   DocumentsListState copyWith({
-    int? curPage,
-    int? pageSize,
+    LoadState? loadingState,
+    String? errorMessage,
+    int? page,
+    int? limit,
+    int? count,
     List<Map<String, dynamic>>? list,
-    int? filterCount,
   }) {
     return DocumentsListState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      page: page ?? this.page,
+      limit: limit ?? this.limit,
+      count: count ?? this.count,
       list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
     );
   }
-}
+
+  Map<String, dynamic> toMap() {
+    return {
+      'page': this.page,
+      'limit': this.limit,
+      'count': this.count,
+      'list': this.list,
+    };
+  }
+
+  factory DocumentsListState.fromMap(Map<String, dynamic> map) {
+    return DocumentsListState(
+      page: map['page'] as int,
+      limit: map['limit'] as int,
+      count: map['count'] as int,
+      list: map['list'] as List<Map<String, dynamic>>,
+    );
+  }
+}

+ 12 - 17
packages/cpt_notice_board/lib/modules/documents_list/repository/documents_list_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_documents_entity.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -25,20 +27,14 @@ class DocumentsListRepository {
   DioEngine dioEngine;
 
   DocumentsListRepository({required this.dioEngine});
-
-  Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+Future<HttpResult<Object>> fetchList(
+    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";
@@ -46,25 +42,24 @@ class DocumentsListRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/document/index', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = DocumentsListState.fromJson(json!);
+      var data = NoticeBoardDocumentsEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<DocumentsListState>(data: data);
+      return result.convert<NoticeBoardDocumentsEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 115 - 49
packages/cpt_notice_board/lib/modules/documents_list/vm/documents_list_vm.dart

@@ -1,7 +1,11 @@
+import 'package:domain/entity/notice_board_documents_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:url_launcher/url_launcher.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/documents_list_state.dart';
 import '../repository/documents_list_repository.dart';
 part 'documents_list_vm.g.dart';
@@ -9,23 +13,19 @@ part 'documents_list_vm.g.dart';
 @riverpod
 class DocumentsListVm extends _$DocumentsListVm {
   late DocumentsListRepository documentsListRepository;
+  var page = 1;
+  var limit = 10;
+  int listId = 0;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   DocumentsListState initState() {
     return DocumentsListState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title": "18 Sep 2024 BIK 39#09-XX 1337 psd 1001 sqft 39#09-XX 1337 psd 1001",
-          "price": "\$1.338 M",
-        },  
-        {
-          "id": 2,
-          "title": "18 Sep 2024 BIK 39#09-XX 1337 psd 1001 sqft",
-          "price": "\$1.338 M",
-        },
-      ],
-      filterCount: 2,
+      list: [],
     );
   }
 
@@ -39,48 +39,73 @@ class DocumentsListVm extends _$DocumentsListVm {
     return state;
   }
 
-  // 初始化页面数据
-  initPageData() {
+//刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // 初始化页面数据&0
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    listId = id!;
+    onRefresh();
   }
 
-  // 上拉加载
-  Future onLoadData() async {
-    Log.d("----property_news_vm-----initListData");
+  // 上拉加载 更多
+  Future loadMore() async {
+    Log.d("----property_news_vm-----loadMore");
     // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
+    // if(state.list.length >= state.count){
     //   return;
     // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
+    //   int page = page + 1;
+    //   state = state.copyWith(page: page,);
     //   getListData();
     // }
+    // 检查 page 是否为 null,并初始化为 1
+    page++;
+
+    getListData();
+  }
+
+  // 下拉刷新
+  Future onRefresh() async {
+    Log.d("----property_news_vm-----onRefresh ");
+
+    // await Future.delayed(const Duration(seconds: 2));
+    page = 1;
     getListData();
   }
-// 去新闻详情页
-  void goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
+
+  // 重试请求
+  Future retryRequest() async {
+    page = 1;
+    _needShowPlaceholder = true;
+    getListData();
   }
+
   // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
+  Future getListData<T>() async {
+    // if (_needShowPlaceholder) {
+    //   changeLoadingState(LoadState.State_Loading, null);
+    // }
+
+    Log.d("加载listData数据---------------start--${page}---");
     try {
       //请求网络
-      Map<String, dynamic>  params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
+      Map<String, dynamic> params = {
+        "page": page,
+        "limit": limit,
+        "parent_id": listId
       };
       Log.d("请求参数------$params");
-      final result = await documentsListRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
+      final result = await documentsListRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        handlerResultList((result.data as NoticeBoardDocumentsEntity).list);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
@@ -88,18 +113,59 @@ class DocumentsListVm extends _$DocumentsListVm {
     }
   }
 
+  void handlerResultList(List<NoticeBoardDocumentsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (page == 1) {
+        //刷新的方式
+        state.list!.clear();
+        state.list!.addAll(list.map((item) => item.toJson()).toList());
+        refreshController.finishRefresh();
 
-  // 下拉刷新
-  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(propertyNewsVmProvider);
-    getListData();
-
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        final allList = state.list;
+        state = state.copyWith(list: allList);
+        refreshController.finishLoad();
+        // update();
+      }
+    } else {
+      if (page == 1) {
+        //展示无数据的布局
+        state.list!.clear();
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        if (state.list!.length == 0) {
+          changeLoadingState(LoadState.State_Empty, null);
+        } else {
+          changeLoadingState(LoadState.State_Success, null);
+        }
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
   }
 
+  // 重试请求
+  void launchURL(url) async {
+    // const url = url;
+    if (await canLaunch(url)) {
+      await launch(
+        url,
+        // Add optional `forceWebView` flag for Android to use a WebView
+        forceWebView: true,
+        // Add optional `enableBarColors` flag for iOS to change the color of the bars
+        enableJavaScript: true,
+        // Add optional `chromeCustomTabs` parameter for Android to customize Chrome Custom Tabs
+        enableDomStorage: true,
+        universalLinksOnly: true,
+        forceSafariVC: true,
+      );
+    } else {
+      throw 'Could not launch $url';
+    }
+  }
 }

+ 6 - 12
packages/cpt_notice_board/lib/modules/event/page/event_page.dart

@@ -86,24 +86,18 @@ class EventPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        // _vm.goNewsDetail(item['title']);
-        Navigator.push(
-          context,
-          MaterialPageRoute(builder: (context) => const EventDetailPage()),
-        );
+        EventDetailPage.startInstance(id: item['id']);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(eventVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 2 - 4
packages/cpt_notice_board/lib/modules/event/vm/event_vm.dart

@@ -101,9 +101,7 @@ class EventVm extends _$EventVm {
       final result = await eventRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardEventEntity)
-            .list
-            .cast<NoticeBoardEventEntity>());
+        handlerResultList((result.data as NoticeBoardEventEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -114,7 +112,7 @@ class EventVm extends _$EventVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardEventEntity>? list) {
+  void handlerResultList(List<NoticeBoardEventList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 88 - 61
packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_page.dart

@@ -1,12 +1,15 @@
 import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
@@ -17,25 +20,30 @@ import '../vm/event_detail_vm.dart';
 
 @RoutePage()
 class EventDetailPage extends HookConsumerWidget {
-  const EventDetailPage({Key? key}) : super(key: key);
+  final int? id;
+  const EventDetailPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const EventDetailPageRoute());
+      context.router.push(EventDetailPageRoute(id: id));
     } else {
-      appRouter.push(const EventDetailPageRoute());
+      appRouter.push(EventDetailPageRoute(id: id));
     }
   }
 
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();3
+  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm, item) {
+    List? resources = item!.resources ?? [];
     return Column(
       children: [
         Column(children: [
-          const Text(
-            'STANDARD OPERATING PROCEDURE FOR REPLACEMENT VEHICLES AND OVERNICHT PARKING VEHICLES(REMINDER)',
-            style: TextStyle(
+          Text(
+            item.title,
+            style: const TextStyle(
                 fontSize: 18.0,
                 color: Colors.black,
                 fontWeight: FontWeight.w700), // 设置字体大小
@@ -44,57 +52,60 @@ class EventDetailPage extends HookConsumerWidget {
             mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailOur,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'Our ref: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                '2024/CORR/CIR/112.V5',
-                style: TextStyle(
+              // const MyAssetImage(
+              //   Assets.noticeBoardAnnouncementDetailOur,
+              //   width: 15,
+              //   height: 15,
+              // ).marginOnly(right: 8),
+              // const Text(
+              //   'Our ref: ',
+              //   style: TextStyle(
+              //       fontSize: 15.0,
+              //       color: Colors.black,
+              //       fontWeight: FontWeight.w700), // 设置字体大小
+              // ),
+              Text(
+                item.datetime,
+                style: const TextStyle(
                     fontSize: 15.0,
                     color: Colors.black,
                     fontWeight: FontWeight.w400), // 设置字体大小
               ),
             ],
           ).marginOnly(top: 15),
-          const MyAssetImage(
-            Assets.propertyHomeLoanBg,
-            // width: 15,
-            // height: 15,
-          ).marginOnly(top: 25),
-        ]).paddingOnly(bottom: 25),
+          // const MyAssetImage(
+          //   Assets.propertyHomeLoanBg,
+          //   // width: 15,
+          //   // height: 15,
+          // ).marginOnly(top: 25),
+        ]).paddingOnly(bottom: 20),
         Column(
           children: [
-            const Column(
-              mainAxisAlignment: MainAxisAlignment.center,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              children: [
-                Text(
-                  'IMPORTANT',
-                  style: TextStyle(
-                      fontSize: 18.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                )
-              ],
-            ).marginOnly(bottom: 25),
-            const Text(
-              'Dear Residents,STANDARD OPERATING PROCEDURE FORREPLACEMENT VEHICLES ANDOVERNICHT PARKING VEHICLES',
-              style: TextStyle(
-                  fontSize: 15.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w400), // 设置字体大小
+            // const Column(
+            //   mainAxisAlignment: MainAxisAlignment.center,
+            //   crossAxisAlignment: CrossAxisAlignment.center,
+            //   children: [
+            // Text(
+            //   'IMPORTANT',
+            //   style: TextStyle(
+            //       fontSize: 18.0,
+            //       color: Colors.black,
+            //       fontWeight: FontWeight.w700), // 设置字体大小
+            // )
+            // ],
+            // ).marginOnly(bottom: 25),
+            resources!.length > 0
+                ? MyLoadImage(
+                    resources[0] ?? '',
+                    width: MediaQuery.of(context).size.width,
+                    height: 150,
+                  ).marginOnly(bottom: 15)
+                : Container(),
+            Html(
+              data: item.content,
             ),
           ],
-        ).paddingOnly(top: 25, bottom: 50),
+        ).paddingOnly(top: 0, bottom: 50),
       ],
     );
   }
@@ -102,23 +113,39 @@ class EventDetailPage extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(eventDetailVmProvider.notifier);
-
+    final state = ref.watch(eventDetailVmProvider);
+    NoticeBoardEventDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
         "Lift Padding",
         backgroundColor: context.appColors.backgroundWhite,
       ),
-      body: Container(
-          child: EasyRefresh(
-        child: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child: Padding(
-                padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
-                child: _buildDetailTop(context, ref, _vm))),
-      )),
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Container(
+              child: EasyRefresh(
+            child: SingleChildScrollView(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Padding(
+                    padding:
+                        const EdgeInsets.only(left: 15, right: 15, top: 15),
+                    child: _buildDetailTop(context, ref, _vm, detailInfo))),
+          ))),
     );
   }
 }

+ 34 - 38
packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_state.dart

@@ -1,49 +1,45 @@
 /// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
 
 import 'dart:convert';
-
-EventDetailState eventDetailStateFromJson(String str) => EventDetailState.fromJson(json.decode(str));
-
-String eventDetailStateToJson(EventDetailState data) => json.encode(data.toJson());
-
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 class EventDetailState {
-  EventDetailState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  NoticeBoardEventDetailEntity? detailInfo;
 
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory EventDetailState.fromJson(Map<dynamic, dynamic> json) => EventDetailState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+  EventDetailState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    NoticeBoardEventDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? NoticeBoardEventDetailEntity();
 
   EventDetailState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    NoticeBoardEventDetailEntity? detailInfo,
   }) {
     return EventDetailState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory EventDetailState.fromMap(Map<String, dynamic> map) {
+    return EventDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as NoticeBoardEventDetailEntity,
     );
   }
-}
+}

+ 12 - 15
packages/cpt_notice_board/lib/modules/event_detail/repository/event_detail_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_event_detail_entity.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -27,18 +29,13 @@ class EventDetailRepository {
   EventDetailRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    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";
@@ -46,25 +43,25 @@ class EventDetailRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/event/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = EventDetailState.fromJson(json!);
+      var data = NoticeBoardEventDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<EventDetailState>(data: data);
+      return result.convert<NoticeBoardEventDetailEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 48 - 50
packages/cpt_notice_board/lib/modules/event_detail/vm/event_detail_vm.dart

@@ -1,7 +1,10 @@
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/event_detail_state.dart';
 import '../repository/event_detail_repository.dart';
 part 'event_detail_vm.g.dart';
@@ -9,31 +12,22 @@ part 'event_detail_vm.g.dart';
 @riverpod
 class EventDetailVm extends _$EventDetailVm {
   late EventDetailRepository eventDetailRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   EventDetailState initState() {
-    return EventDetailState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return EventDetailState();
   }
 
   @override
   EventDetailState build() {
     // 引入数据仓库
-    eventDetailRepository = ref.read(eventDetailRepositoryProvider);
+    eventDetailRepository =
+        ref.read(eventDetailRepositoryProvider);
     // 初始化状态
     EventDetailState state = initState();
     // 初始化列表数据
@@ -41,22 +35,14 @@ class EventDetailVm extends _$EventDetailVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData(id: id);
   }
 
   // 上拉加载
   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();
   }
 
@@ -66,40 +52,52 @@ class EventDetailVm extends _$EventDetailVm {
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData(id: id);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
-  void getListData<T>() async {
+  void getListData<T>({int? id}) async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await eventDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await eventDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
-      //校验成功失败
+     //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as NoticeBoardEventDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
       ToastEngine.show("Error: $e");
     }
   }
+  // // 下拉刷新
+  // Future refreshListData() async {
+  //   Log.d("----property_news_vm-----refreshListData ");
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
+  //   // await Future.delayed(const Duration(seconds: 2));
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-}
+  //   state = state.copyWith(curPage: 1, pageSize: 10);
+  //   // ref.invalidateSelf();
+  //   // ref.invalidate(propertyNewsVmProvider);
+  //   getListData();
+  // }
+}

+ 1 - 1
packages/cpt_notice_board/lib/modules/notice_board/page/notice_board_page.dart

@@ -103,7 +103,7 @@ class NoticeBoardPage extends HookConsumerWidget {
     return Scaffold(
         appBar: MyAppBar.appBar(
           context,
-          "Property",
+          "Notice Board",
           backgroundColor: context.appColors.backgroundWhite,
         ),
         body: AutoTabsRouter.pageView(

+ 121 - 15
packages/cpt_notice_board/lib/router/page/notice_board_page_router.gr.dart

@@ -22,9 +22,17 @@ abstract class _$NoticeBoardPageRouter extends RootStackRouter {
       );
     },
     AnnouncementDetailPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<AnnouncementDetailPageRouteArgs>(
+          orElse: () => AnnouncementDetailPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const AnnouncementDetailPage(),
+        child: AnnouncementDetailPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     DocumentsPageRoute.name: (routeData) {
@@ -34,15 +42,31 @@ abstract class _$NoticeBoardPageRouter extends RootStackRouter {
       );
     },
     EventDetailPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<EventDetailPageRouteArgs>(
+          orElse: () => EventDetailPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const EventDetailPage(),
+        child: EventDetailPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     DocumentsListPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<DocumentsListPageRouteArgs>(
+          orElse: () => DocumentsListPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const DocumentsListPage(),
+        child: DocumentsListPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     EventPageRoute.name: (routeData) {
@@ -76,16 +100,44 @@ class AnnounPageRoute extends PageRouteInfo<void> {
 
 /// generated route for
 /// [AnnouncementDetailPage]
-class AnnouncementDetailPageRoute extends PageRouteInfo<void> {
-  const AnnouncementDetailPageRoute({List<PageRouteInfo>? children})
-      : super(
+class AnnouncementDetailPageRoute
+    extends PageRouteInfo<AnnouncementDetailPageRouteArgs> {
+  AnnouncementDetailPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           AnnouncementDetailPageRoute.name,
+          args: AnnouncementDetailPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'AnnouncementDetailPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<AnnouncementDetailPageRouteArgs> page =
+      PageInfo<AnnouncementDetailPageRouteArgs>(name);
+}
+
+class AnnouncementDetailPageRouteArgs {
+  const AnnouncementDetailPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'AnnouncementDetailPageRouteArgs{key: $key, id: $id}';
+  }
 }
 
 /// generated route for
@@ -104,32 +156,86 @@ class DocumentsPageRoute extends PageRouteInfo<void> {
 
 /// generated route for
 /// [EventDetailPage]
-class EventDetailPageRoute extends PageRouteInfo<void> {
-  const EventDetailPageRoute({List<PageRouteInfo>? children})
-      : super(
+class EventDetailPageRoute extends PageRouteInfo<EventDetailPageRouteArgs> {
+  EventDetailPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           EventDetailPageRoute.name,
+          args: EventDetailPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'EventDetailPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<EventDetailPageRouteArgs> page =
+      PageInfo<EventDetailPageRouteArgs>(name);
+}
+
+class EventDetailPageRouteArgs {
+  const EventDetailPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'EventDetailPageRouteArgs{key: $key, id: $id}';
+  }
 }
 
 /// generated route for
 /// [DocumentsListPage]
-class DocumentsListPageRoute extends PageRouteInfo<void> {
-  const DocumentsListPageRoute({List<PageRouteInfo>? children})
-      : super(
+
+class DocumentsListPageRoute extends PageRouteInfo<DocumentsListPageRouteArgs> {
+  DocumentsListPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           DocumentsListPageRoute.name,
+          args: DocumentsListPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'DocumentsListPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<DocumentsListPageRouteArgs> page =
+      PageInfo<DocumentsListPageRouteArgs>(name);
 }
 
+class DocumentsListPageRouteArgs {
+  const DocumentsListPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'DocumentsListPageRouteArgs{key: $key, id: $id}';
+  }
+}
 /// generated route for
 /// [EventPage]
 class EventPageRoute extends PageRouteInfo<void> {

+ 6 - 4
packages/cpt_notice_board/pubspec.yaml

@@ -4,10 +4,9 @@ description: 物业系统的公告板模块,用于展示物业发布的各类
 version: 1.0.0
 
 environment:
-  sdk: '>=3.0.2 <4.0.0'
+  sdk: ">=3.0.2 <4.0.0"
 
 dependencies:
-
   flutter_localizations:
     sdk: flutter
 
@@ -48,6 +47,10 @@ dependencies:
   # Hooks 简化 Riverpod 获取
   hooks_riverpod: ^2.5.1
 
+  flutter_html: ^2.1.0
+  cached_network_image: ^3.1.0
+  url_launcher: ^6.1.0
+
 dev_dependencies:
   flutter_test:
     sdk: flutter
@@ -66,6 +69,5 @@ dev_dependencies:
   # AutoRouter 生成代码
   auto_route_generator: ^8.0.0
 
-
 flutter:
-  uses-material-design: true
+  uses-material-design: true

+ 9 - 7
packages/cpt_property/lib/modules/news_detail/property_news_detail_page.dart

@@ -134,13 +134,15 @@ class PropertyNewsDetailPage extends HookConsumerWidget {
               fit: BoxFit.cover,
             ) : SizedBox.shrink(),
           // 内容
-          MyTextView(
-            content,
-            isFontRegular: true,
-            fontSize: 15,
-            textColor: context.appColors.textBlack,
-            marginTop: 24.5,
-          ),
+          // MyTextView(
+          //   content,
+          //   isFontRegular: true,
+          //   fontSize: 15,
+          //   textColor: context.appColors.textBlack,
+          //   marginTop: 24.5,
+          // ),
+
+          Html(data: content),
         ]
       ),
     );

+ 6 - 0
packages/cpt_property/lib/router/component/property_component_service.dart

@@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 
+import '../../modules/news_detail/property_news_detail_page.dart';
 import '../../modules/property/page/property_page.dart';
 
 part 'property_component_service.g.dart';
@@ -22,4 +23,9 @@ class PropertyComponentService extends PropertyService {
   void startPropertyPage() {
     PropertyPage.startInstance();
   }
+
+  @override
+  void startPropertyNewsDetailPage(int id) {
+    PropertyNewsDetailPage.startInstance(id: id);
+  }
 }

+ 114 - 163
packages/cpt_rewards/lib/modules/rewards/rewards_page.dart

@@ -1,3 +1,5 @@
+import 'dart:ffi';
+
 import 'package:cpt_rewards/modules/rewards_address/rewards_address_page.dart';
 import 'package:cpt_rewards/modules/rewards_code/rewards_code_page.dart';
 import 'package:cpt_rewards/modules/rewards_history/rewards_history_page.dart';
@@ -16,9 +18,12 @@ import 'package:shared/utils/color_utils.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/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
 
+import 'package:intl/intl.dart';
+
 import '../../../router/page/rewards_page_router.dart';
 import './rewards_vm.dart';
 
@@ -35,8 +40,8 @@ class RewardsPage extends HookConsumerWidget {
     }
   }
 
-  Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+  Widget _buildTop(BuildContext context, WidgetRef ref, _vm, list) {
+    int points = list.points ?? 0;
     return Container(
         decoration: BoxDecoration(
           border: Border(
@@ -110,9 +115,9 @@ class RewardsPage extends HookConsumerWidget {
                         width: 23,
                         height: 23,
                       ).marginOnly(right: 5),
-                      const Text(
-                        '1022',
-                        style: TextStyle(
+                      Text(
+                        '$points',
+                        style: const TextStyle(
                             fontSize: 15.0,
                             color: Colors.white,
                             fontWeight: FontWeight.w400), // 设置字体大小
@@ -130,6 +135,23 @@ class RewardsPage extends HookConsumerWidget {
   }
 
   Widget _buildSearch(BuildContext context, WidgetRef ref, _vm, list) {
+    final dateFormat = DateFormat('yyyy-MM-dd');
+    final now = DateFormat('yyyy-MM-dd').format(DateTime.now());
+    // final date = list.continuous.currentWeekCheckin[0] ?? now;
+    final date = now;
+    final date0 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).subtract(const Duration(days: 1)));
+    final date1 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 1)));
+    final date2 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 2)));
+    final date3 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 3)));
+    final date4 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 4)));
+    final date5 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 5)));
+    // final nextDate = date.add(Duration(days: 1));
     return Container(
       width: MediaQuery.of(context).size.width - 30,
       decoration: BoxDecoration(
@@ -168,7 +190,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        '11/01',
+                        '$date0',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#4161D0'),
@@ -244,7 +266,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date1',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -282,7 +304,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date2',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -324,7 +346,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date3',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -362,7 +384,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date4',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -404,7 +426,7 @@ class RewardsPage extends HookConsumerWidget {
                         // mainAxisAlignment: MainAxisAlignment.center,
                         children: [
                           Text(
-                            'Today',
+                            '$date5',
                             style: TextStyle(
                                 fontSize: 13.0,
                                 color: ColorUtils.string2Color('#000000'),
@@ -435,7 +457,8 @@ class RewardsPage extends HookConsumerWidget {
     );
   }
 
-  Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm, list) {
+    int points = list.points ?? 0;
     return Container(
       // color: Colors.white,
       height: 55,
@@ -471,7 +494,7 @@ class RewardsPage extends HookConsumerWidget {
                   color: ColorUtils.string2Color('#ffffff'),
                   fontWeight: FontWeight.w400), // 设置字体大小
             ).onTap(() {
-              RewardsHomePage.startInstance();
+              RewardsHomePage.startInstance(points: points);
             }),
           ),
         ],
@@ -479,7 +502,9 @@ class RewardsPage extends HookConsumerWidget {
     ).marginOnly(top: 12, bottom: 12);
   }
 
-  Widget _buildList(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildList(BuildContext context, WidgetRef ref, _vm, list) {
+    bool newsFeed = list.tasks.newsFeedPost;
+    int giveLikes = list.tasks.give10Likes;
     return Container(
       decoration: BoxDecoration(
         color: Colors.white,
@@ -544,7 +569,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -606,7 +631,7 @@ class RewardsPage extends HookConsumerWidget {
                       mainAxisAlignment: MainAxisAlignment.center,
                       children: [
                         Text(
-                          'Daily Login',
+                          'News Feed Post',
                           style: TextStyle(
                               fontSize: 15.0,
                               color: ColorUtils.string2Color('#000000'),
@@ -625,7 +650,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -643,7 +668,7 @@ class RewardsPage extends HookConsumerWidget {
                   ),
                   child: Center(
                     child: Text(
-                      'Check In',
+                      newsFeed == true ? 'Completed' : 'incomplete',
                       style: TextStyle(
                           fontSize: 14.0,
                           color: ColorUtils.string2Color('#4161D0'),
@@ -687,7 +712,7 @@ class RewardsPage extends HookConsumerWidget {
                       mainAxisAlignment: MainAxisAlignment.center,
                       children: [
                         Text(
-                          'Daily Login',
+                          'Give 10 Likes',
                           style: TextStyle(
                               fontSize: 15.0,
                               color: ColorUtils.string2Color('#000000'),
@@ -706,7 +731,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -724,7 +749,7 @@ class RewardsPage extends HookConsumerWidget {
                   ),
                   child: Center(
                     child: Text(
-                      'Check In',
+                      giveLikes == 10 ? 'Completed' : '$giveLikes/10',
                       style: TextStyle(
                           fontSize: 14.0,
                           color: ColorUtils.string2Color('#4161D0'),
@@ -740,7 +765,8 @@ class RewardsPage extends HookConsumerWidget {
     ).marginOnly(bottom: 12);
   }
 
-  Widget _buildHistory(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildHistory(BuildContext context, WidgetRef ref, _vm, list) {
+    List latest = list.latest;
     return Container(
       decoration: BoxDecoration(
         color: Colors.white,
@@ -774,135 +800,55 @@ class RewardsPage extends HookConsumerWidget {
                   RewardsHistoryPage.startInstance();
                 })
               ]).paddingOnly(left: 15, right: 15, top: 15, bottom: 5),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
+          Column(
               crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: List.generate(latest.length, (index) {
+                int point = latest[index]['point'];
+                return Container(
+                  padding: const EdgeInsets.only(
+                      top: 15, bottom: 15, left: 15, right: 15),
+                  decoration: BoxDecoration(
+                      border: Border(
+                          bottom: BorderSide(
+                    width: 1.0, // 底边边框的宽度
+                    color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                  ))),
+                  child: Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      Column(
+                        crossAxisAlignment: CrossAxisAlignment.start,
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        children: [
+                          Text(
+                            latest[index]['short_description'],
+                            style: TextStyle(
+                                fontSize: 15.0,
+                                color: ColorUtils.string2Color('#000000'),
+                                fontWeight: FontWeight.w500), // 设置字体大小
+                          ).marginOnly(bottom: 6),
+                          Text(
+                            latest[index]['created_at'],
+                            style: TextStyle(
+                                fontSize: 13.0,
+                                color: ColorUtils.string2Color('#808DAF'),
+                                fontWeight: FontWeight.w400), // 设置字体大小
+                          ),
+                        ],
+                      ),
+                      Text(
+                        "$point",
+                        style: TextStyle(
+                            fontSize: 20.0,
+                            color: ColorUtils.string2Color('#FDB429'),
+                            fontWeight: FontWeight.w500), // 设置字体大小
+                      ),
+                    ],
+                  ),
+                );
+              }))
         ],
       ),
     ).marginOnly(bottom: 12);
@@ -922,37 +868,42 @@ class RewardsPage extends HookConsumerWidget {
       };
     }, []);
     return Scaffold(
-      // appBar: AppBar(title: Text("奖励")),
+      // appBar: MyAppBar.appBar(
+      //   context,
+      //   "Daily Login",
+      //   backgroundColor: ColorUtils.string2Color('#4161D0'),
+      // ),
       body: Column(children: [
         Expanded(
-          child: 
-          LoadStateLayout(
+          child: LoadStateLayout(
             state: state.loadingState,
             errorMessage: state.errorMessage,
             errorRetry: () {
               _vm.retryRequest();
             },
             successWidget: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child:  Column(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Column(
                   children: [
-                    _buildTop(context, ref, _vm),
+                    _buildTop(context, ref, _vm, list)
+                        .paddingOnly(top: MediaQuery.of(context).padding.top),
                     Container(
                       transform: Matrix4.translationValues(0.0, -45.0, 0.0),
                       child: Column(
                         children: [
                           _buildSearch(context, ref, _vm, list),
-                          _buildSwiper(context, ref, _vm),
-                          _buildList(context, ref, _vm),
-                          _buildHistory(context, ref, _vm),
+                          _buildSwiper(context, ref, _vm, list),
+                          list?.points != 0
+                              ? _buildList(context, ref, _vm, list)
+                              : const SizedBox.shrink(),
+                          _buildHistory(context, ref, _vm, list),
                         ],
                       ), // 使用负数margin
                     ).paddingOnly(left: 15, right: 15),
                   ],
-                )
-                ),
+                )),
           ),
         ),
       ]).backgroundColor(ColorUtils.string2Color('#F2F3F6')),

+ 1 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_repository.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsRepositoryHash() => r'4137a1449ba3b67667c7ad0e28a4cd7d5998867b';
 
 /// See also [rewardsRepository].
 @ProviderFor(rewardsRepository)

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards/rewards_state.dart

@@ -14,8 +14,8 @@ class RewardsState {
   RewardsState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
-    required this.list,
-  });
+    RewardsIndexEntity? list
+  }) : list = list ?? RewardsIndexEntity();
 
   RewardsState copyWith({
     LoadState? loadingState,

+ 3 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_vm.dart

@@ -22,7 +22,9 @@ class RewardsVm extends _$RewardsVm {
     controlFinishLoad: true, //允许加载
   );
   RewardsState initState() {
-    return RewardsState(list: null);
+    return RewardsState(
+      list: RewardsIndexEntity()
+    );
   }
 
   @override

+ 1 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsVmHash() => r'd6bf1aaec9173a614dd6b87e137b02bb2ff07013';
 
 /// See also [RewardsVm].
 @ProviderFor(RewardsVm)

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_address/rewards_address_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_address_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsAddressRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsAddressRepositoryHash() =>
+    r'ff71a0993e288969034b7d5900f1adc5483378c6';
 
 /// See also [rewardsAddressRepository].
 @ProviderFor(rewardsAddressRepository)
-final rewardsAddressRepositoryProvider = Provider<RewardsAddressRepository>.internal(
+final rewardsAddressRepositoryProvider =
+    Provider<RewardsAddressRepository>.internal(
   rewardsAddressRepository,
   name: r'rewardsAddressRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_address/rewards_address_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_address_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsAddressVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsAddressVmHash() => r'f9ad7b3cb57967ca39bdf30bed5e8c28c19d8249';
 
 /// See also [RewardsAddressVm].
 @ProviderFor(RewardsAddressVm)
@@ -14,8 +14,9 @@ final rewardsAddressVmProvider =
     AutoDisposeNotifierProvider<RewardsAddressVm, RewardsAddressState>.internal(
   RewardsAddressVm.new,
   name: r'rewardsAddressVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsAddressVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsAddressVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 9 - 5
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_page.dart

@@ -18,18 +18,22 @@ import './rewards_code_vm.dart';
 
 @RoutePage()
 class RewardsCodePage extends HookConsumerWidget {
-  const RewardsCodePage({Key? key}) : super(key: key);
+  final int? code;
+  const RewardsCodePage({Key? key, @PathParam('code') required this.code}) : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({BuildContext? context,
+    int? code,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsCodePageRoute());
+      context.router.push(RewardsCodePageRoute(code: code));
     } else {
-      appRouter.push(const RewardsCodePageRoute());
+      appRouter.push(RewardsCodePageRoute(code: code));
     }
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int? codes = code ?? 0;
     return Column(
       children: [
         Column(
@@ -54,7 +58,7 @@ class RewardsCodePage extends HookConsumerWidget {
                   fontWeight: FontWeight.w500),
             ).marginOnly(top: 35, bottom: 20),
             Text(
-              '778890',
+              '$codes',
               style: TextStyle(
                   fontSize: 36.0,
                   color: ColorUtils.string2Color('#4161D0'),

+ 2 - 1
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_repository.g.dart

@@ -6,7 +6,8 @@ part of 'rewards_code_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsCodeRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsCodeRepositoryHash() =>
+    r'0349a3b039d854a21f52694bd1ab72207bf18736';
 
 /// See also [rewardsCodeRepository].
 @ProviderFor(rewardsCodeRepository)

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_code_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsCodeVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsCodeVmHash() => r'66d75ea9d41db0c16581beb6efa01a4809e92993';
 
 /// See also [RewardsCodeVm].
 @ProviderFor(RewardsCodeVm)
@@ -14,8 +14,9 @@ final rewardsCodeVmProvider =
     AutoDisposeNotifierProvider<RewardsCodeVm, RewardsCodeState>.internal(
   RewardsCodeVm.new,
   name: r'rewardsCodeVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsCodeVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsCodeVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 9 - 29
packages/cpt_rewards/lib/modules/rewards_confirm/dialog/account_deactivation_dialog.dart

@@ -17,35 +17,17 @@ class AccountDeactivationDialog extends HookConsumerWidget {
     required this.confirmAction,
   });
 
-  Widget CheckboxList(BuildContext context) {
-    // final List<String> items = ['苹果', '香蕉', '橙子'];
-    // final List<bool> selections = [false, false, false];
-    // return Expanded(child:ListView.builder(
-    //   itemCount: items.length,
-    //   itemBuilder: (context, index) {
-    //     return Container(
-    //       padding: EdgeInsets.symmetric(vertical: 5.0),
-    //       child: CheckboxListTile(
-    //         value: selections[index],
-    //         onChanged: (bool? val) {
-    //           print('Option 1 is now ${val ?? false}');
-    //           selections[index] = val!;
-    //         },
-    //         title: Text(items[index]),
-    //       ),
-    //     );
-    //   },
-    // )
-    // );
-    var _rangeValues = RangeValues(20.0, 80.0);
+  Widget CheckboxList(BuildContext context, ref) {
+    final state = ref.watch(rewardsConfirmVmProvider);
+    int amount = state.amount ?? 0;
     return Column(
       mainAxisAlignment: MainAxisAlignment.center,
       crossAxisAlignment: CrossAxisAlignment.center,
       children: [
-        const Text(
+        Text(
           textAlign: TextAlign.center,
-          'Are you sure to spend 600 points to redeem goods?',
-          style: TextStyle(
+          'Are you sure to spend $amount points to redeem goods?',
+          style: const TextStyle(
               fontSize: 19.0, color: Colors.black, fontWeight: FontWeight.w500),
         ).paddingOnly(left: 40, right: 40)
       ],
@@ -55,8 +37,6 @@ class AccountDeactivationDialog extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsConfirmVmProvider.notifier);
-    final state = ref.watch(rewardsConfirmVmProvider);
-    List itemsList = _vm.state.list.toList();
     return Column(
       crossAxisAlignment: CrossAxisAlignment.center,
       mainAxisAlignment: MainAxisAlignment.center,
@@ -103,7 +83,7 @@ class AccountDeactivationDialog extends HookConsumerWidget {
           ),
           child: Column(
             children: [
-              Container(height: 150, child: CheckboxList(context)),
+              Container(height: 150, child: CheckboxList(context, ref)),
               Row(
                 children: [
                   const SizedBox(width: 18),
@@ -112,8 +92,8 @@ class AccountDeactivationDialog extends HookConsumerWidget {
                       child: InkWell(
                         onTap: () async {
                           onCancel();
-                          RewardsSuccessfulPage.startInstance();
-                          // confirmAction();
+                          // RewardsSuccessfulPage.startInstance();
+                          _vm.rewardBuy();
                         },
                         child: MyTextView(
                           'Pay Now',

+ 118 - 95
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_page.dart

@@ -1,12 +1,15 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
@@ -19,19 +22,26 @@ import './rewards_confirm_vm.dart';
 
 @RoutePage()
 class RewardsConfirmPage extends HookConsumerWidget {
-  const RewardsConfirmPage({Key? key}) : super(key: key);
+  final int? id;
+  const RewardsConfirmPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsConfirmPageRoute());
+      context.router.push(RewardsConfirmPageRoute(id: id));
     } else {
-      appRouter.push(const RewardsConfirmPageRoute());
+      appRouter.push(RewardsConfirmPageRoute(id: id));
     }
   }
 
   // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String title = detailInfo!.title ?? "";
+    List? resources = detailInfo!.resources ?? [];
     return Column(
       children: [
         Container(
@@ -50,20 +60,22 @@ class RewardsConfirmPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIndex1,
-                  // width: 110,
-                  height: 150,
-                ),
-                const Column(
+                resources!.length > 0
+                    ? MyLoadImage(
+                        resources[0] ?? '',
+                        width: MediaQuery.of(context).size.width,
+                        height: 150,
+                      )
+                    : Container(),
+                Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
                     Text(
                       maxLines: 1, // 设置最大行数为2
                       overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                      'Cute children multifunctional umbrella',
-                      style: TextStyle(
+                      title,
+                      style: const TextStyle(
                           fontSize: 17.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
@@ -111,36 +123,20 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   )
                 ],
               ),
-              Row(
+              Column(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 crossAxisAlignment: CrossAxisAlignment.center,
                 children: [
                   Text(
-                    'Also redeemable in 1 more location',
+                    '60 paya lebar rd, #09-13/17 paya lebar square, singapore 409051',
+                    maxLines: 2, // 设置最大行数为2
+                    overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
                         fontWeight: FontWeight.w400),
                   ),
                 ],
-              ).marginOnly(top: 10, bottom: 15),
-              Container(
-                height: 40,
-                decoration: BoxDecoration(
-                  color: Colors.white,
-                  borderRadius: const BorderRadius.all(Radius.circular(6.0)),
-                  border: Border.all(
-                      color: ColorUtils.string2Color('#4161D0'), width: 1.0),
-                ),
-                child: Center(
-                  child: Text(
-                    'See More Locations',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#4161D0'),
-                        fontWeight: FontWeight.w500),
-                  ),
-                ),
               ),
             ],
           ).paddingOnly(left: 15, right: 15, top: 12, bottom: 20),
@@ -149,7 +145,10 @@ class RewardsConfirmPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String redeemedStart = detailInfo.redeemedStart ?? "";
+    String redeemedEnd = detailInfo.redeemedEnd ?? "";
+    String redeemedDate = '$redeemedStart-$redeemedEnd';
     return Column(
       children: [
         Container(
@@ -188,7 +187,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
-                    '17 Mar 2020 until 15 Jul 2020',
+                    redeemedDate,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
@@ -203,7 +202,12 @@ class RewardsConfirmPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildNotice(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildNotice(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    final state = ref.watch(rewardsConfirmVmProvider);
+    int number = state.number ?? 0;
+    int amount = state.amount ?? 0;
+    int point = detailInfo.point ?? 0;
+    int originalPoint = detailInfo.originalPoint ?? 0;
     return Column(
       children: [
         Container(
@@ -236,9 +240,11 @@ class RewardsConfirmPage extends HookConsumerWidget {
                         Assets.rewardsRewardsJian,
                         width: 21,
                         height: 21,
-                      ),
+                      ).onTap(() {
+                        _vm.numberDec();
+                      }),
                       Text(
-                        '2',
+                        '$number',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#333333'),
@@ -248,7 +254,9 @@ class RewardsConfirmPage extends HookConsumerWidget {
                         Assets.rewardsRewardsJia,
                         width: 21,
                         height: 21,
-                      ),
+                      ).onTap(() {
+                        _vm.numberAdd();
+                      }),
                     ],
                   ),
                 ],
@@ -267,7 +275,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '350',
+                        '$originalPoint',
                         style: TextStyle(
                             decoration: TextDecoration.lineThrough,
                             decorationColor: ColorUtils.string2Color('#54638C'),
@@ -277,7 +285,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                             fontWeight: FontWeight.w400),
                       ),
                       Text(
-                        '300',
+                        '$point',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#333333'),
@@ -301,7 +309,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '600',
+                        '$amount',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#4161D0'),
@@ -322,67 +330,82 @@ class RewardsConfirmPage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsConfirmVmProvider.notifier);
     final state = ref.watch(rewardsConfirmVmProvider);
+    RewardsDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        "Verification Confirm",
+        "Confirm Details",
         backgroundColor: context.appColors.whiteBG,
       ),
-      body: Column(
-        children: [
-          Expanded(
-              child: SingleChildScrollView(
-                  scrollDirection: Axis.vertical,
-                  physics: const BouncingScrollPhysics(),
-                  clipBehavior: Clip.none,
-                  child: Column(
-                    children: [
-                      Container(
-                          color: ColorUtils.string2Color('#F2F3F6'),
-                          padding: const EdgeInsets.only(top: 15),
-                          child: Column(
-                            children: [
-                              _buildSaleItem(context, ref, _vm),
-                              _buildDeal(context, ref, _vm),
-                              _buildPackage(context, ref, _vm),
-                              _buildNotice(context, ref, _vm),
-                            ],
-                          )),
-                    ],
-                  ))),
-          Container(
-            height: 50,
-            color: ColorUtils.string2Color('#4161D0'),
-            child: Flex(
-              direction: Axis.horizontal,
-              children: [
-                Expanded(
-                  flex: 1,
-                  child: Container(
-                    color: ColorUtils.string2Color('#4161D0'),
-                    height: 100,
-                    child: Row(
-                      mainAxisAlignment: MainAxisAlignment.center,
-                      crossAxisAlignment: CrossAxisAlignment.center,
-                      children: [
-                        MyTextView(
-                          "Redeem",
-                          fontSize: 16,
-                          textColor: Colors.white,
-                          isFontMedium: true,
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Column(
+            children: [
+              Expanded(
+                  child: SingleChildScrollView(
+                      scrollDirection: Axis.vertical,
+                      physics: const BouncingScrollPhysics(),
+                      clipBehavior: Clip.none,
+                      child: Column(
+                        children: [
+                          Container(
+                              color: ColorUtils.string2Color('#F2F3F6'),
+                              padding: const EdgeInsets.only(top: 15),
+                              child: Column(
+                                children: [
+                                  _buildSaleItem(context, ref, _vm, detailInfo),
+                                  _buildDeal(context, ref, _vm),
+                                  _buildPackage(context, ref, _vm, detailInfo),
+                                  _buildNotice(context, ref, _vm, detailInfo),
+                                ],
+                              )),
+                        ],
+                      ))),
+              Container(
+                height: 50,
+                color: ColorUtils.string2Color('#4161D0'),
+                child: Flex(
+                  direction: Axis.horizontal,
+                  children: [
+                    Expanded(
+                      flex: 1,
+                      child: Container(
+                        color: ColorUtils.string2Color('#4161D0'),
+                        height: 100,
+                        child: Row(
+                          mainAxisAlignment: MainAxisAlignment.center,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            MyTextView(
+                              "Redeem",
+                              fontSize: 16,
+                              textColor: Colors.white,
+                              isFontMedium: true,
+                            ),
+                          ],
                         ),
-                      ],
+                      ).onTap(() {
+                        // 去详情
+                        _vm.doDeleteAccount();
+                      }),
                     ),
-                  ).onTap(() {
-                    // 去详情
-                    _vm.doDeleteAccount();
-                  }),
+                  ],
                 ),
-              ],
-            ),
-          )
-        ],
-      ),
+              )
+            ],
+          )),
     );
   }
 }

+ 59 - 15
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.dart

@@ -1,9 +1,12 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_buy_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -24,47 +27,88 @@ RewardsConfirmRepository rewardsConfirmRepository(Ref ref) {
 class RewardsConfirmRepository {
   DioEngine dioEngine;
 
-RewardsConfirmRepository({required this.dioEngine});
+  RewardsConfirmRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    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(
+    final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/reward/reward/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsConfirmState.fromJson(json!);
+      var data = RewardsDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<RewardsConfirmState>(data: data);
+      return result.convert<RewardsDetailEntity>(data: data);
     }
     return result.convert();
   }
 
+  Future<HttpResult<Object>> rewardBuy(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+
+    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 地址
+      '/api/v1/user/reward/sale/buy', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.POST,
+      isShowLoadingDialog: true, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
 
+    Log.d("------请求返回的result--$result--------");
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      // final json = result.getDataJson();
+      // var data = RewardsBuyEntity.fromJson(json!);
+      // // Log.d("------data--$data--------");
+      // //重新赋值data或list
+      // return result.convert<RewardsBuyEntity>(data: data);
+      //重新赋值data或list
+      final json = result.getListJson();
+      Log.d("------json--$json--------");
+      List<RewardsBuyEntity> data =
+          json?.map((item) => RewardsBuyEntity.fromJson(item)).toList() ?? [];
+      // var data = RewardsHomeTesEntity.fromJson(json);
+      Log.d("------data--$data--------");
+      //重新赋值data或list
+      return result.convert(list: data);
+    }
+    return result.convert();
+  }
 }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_confirm_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsConfirmRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsConfirmRepositoryHash() =>
+    r'cb6b785b321394bd5e94c6b6ad5b6fd13478992f';
 
 /// See also [rewardsConfirmRepository].
 @ProviderFor(rewardsConfirmRepository)
-final rewardsConfirmRepositoryProvider = Provider<RewardsConfirmRepository>.internal(
+final rewardsConfirmRepositoryProvider =
+    Provider<RewardsConfirmRepository>.internal(
   rewardsConfirmRepository,
   name: r'rewardsConfirmRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 45 - 35
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_state.dart

@@ -2,48 +2,58 @@
 
 import 'dart:convert';
 
-RewardsConfirmState rewardsConfirmStateFromJson(String str) => RewardsConfirmState.fromJson(json.decode(str));
-
-String rewardsConfirmStateToJson(RewardsConfirmState data) => json.encode(data.toJson());
+import 'package:domain/entity/rewards_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class RewardsConfirmState {
-  RewardsConfirmState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  RewardsDetailEntity? detailInfo;
+  int? number=1;
+  int? amount=0;
 
-  factory RewardsConfirmState.fromJson(Map<dynamic, dynamic> json) => RewardsConfirmState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+  RewardsConfirmState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    this.number = 1,
+    this.amount = 0,
+    RewardsDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? RewardsDetailEntity();
 
   RewardsConfirmState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    int? number,
+    int? amount,
+    RewardsDetailEntity? detailInfo,
   }) {
     return RewardsConfirmState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      number: number ?? this.number,
+      amount: amount ?? this.amount,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'number': this.number,
+      'amount': this.amount,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory RewardsConfirmState.fromMap(Map<String, dynamic> map) {
+    return RewardsConfirmState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      number: map['number'] as int,
+      amount: map['amount'] as int,
+      detailInfo: map['detailInfo'] as RewardsDetailEntity,
     );
   }
 }

+ 83 - 44
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.dart

@@ -1,11 +1,16 @@
 import 'package:cpt_rewards/modules/rewards_confirm/dialog/account_deactivation_dialog.dart';
+import 'package:cpt_rewards/modules/rewards_successful/rewards_successful_page.dart';
+import 'package:domain/entity/rewards_buy_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
 import './rewards_confirm_state.dart';
 import './rewards_confirm_repository.dart';
 part 'rewards_confirm_vm.g.dart';
@@ -13,25 +18,15 @@ part 'rewards_confirm_vm.g.dart';
 @riverpod
 class RewardsConfirmVm extends _$RewardsConfirmVm {
   late RewardsConfirmRepository rewardsConfirmRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  late int detailId;
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   RewardsConfirmState initState() {
-    return RewardsConfirmState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return RewardsConfirmState();
   }
 
   @override
@@ -45,50 +40,58 @@ class RewardsConfirmVm extends _$RewardsConfirmVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    detailId = id!;
+    getListData();
   }
 
   // 上拉加载
   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();
   }
 
 // 去新闻详情页
-  void goNewsConfirm(String item) {
+  void goNewsDetail(String item) {
     Log.d(item);
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
   void getListData<T>() async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": detailId};
       Log.d("请求参数------$params");
       final result =
           await rewardsConfirmRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as RewardsDetailEntity,
+        );
+        state = state.copyWith(
+          amount: state.detailInfo?.point,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
@@ -96,16 +99,52 @@ class RewardsConfirmVm extends _$RewardsConfirmVm {
     }
   }
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
+  void numberAdd() {
+    int numNew = state.number! + 1;
+    int amountNew = numNew * state.detailInfo!.point;
+    state = state.copyWith(amount: amountNew, number: numNew);
+  }
 
-    // await Future.delayed(const Duration(seconds: 2));
+  void numberDec() {
+    if (state.number! > 1) {
+      int numNew = state.number! - 1;
+      int amountNew = numNew * state.detailInfo!.point;
+      state = state.copyWith(amount: amountNew, number: numNew);
+    }
+  }
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
+  void rewardBuy<T>() async {
+    Log.d("加载listData数据---------------start-----");
+    try {
+      //请求网络
+      Map<String, dynamic> params = {"id": detailId, "number": state.number};
+      Log.d("请求参数------$params");
+      final result = await rewardsConfirmRepository.rewardBuy(params);
+      Log.d("请求完成结果------${result.data}");
+      //校验成功失败
+      if (result.isSuccess) {
+        Log.d("123------${result.list}");
+        final data = result.list as List<RewardsBuyEntity>;
+        Log.d("123------$data");
+        // RewardsSuccessfulPage.startInstance(data: data);
+        String title = data[0].reward.title;
+        String resources = data[0].reward.resources[0];
+        String redeemedStart = data[0].reward.redeemedStart;
+        String redeemedEnd = data[0].reward.redeemedEnd;
+        String redeemedDate = '$redeemedStart until $redeemedEnd';
+        String createdAt = data[0].createdAt;
+        RewardsSuccessfulPage.startInstance(
+            amount: state.amount,
+            title: title,
+            resources: resources,
+            redeemedDate: redeemedDate,
+            createdAt: createdAt);
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
   }
 
   void doDeleteAccount() {

+ 5 - 4
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_confirm_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsConfirmVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsConfirmVmHash() => r'1d7a4a6df997b7fe9df48171f87d5a951dd0e5d3';
 
 /// See also [RewardsConfirmVm].
 @ProviderFor(RewardsConfirmVm)
@@ -14,12 +14,13 @@ final rewardsConfirmVmProvider =
     AutoDisposeNotifierProvider<RewardsConfirmVm, RewardsConfirmState>.internal(
   RewardsConfirmVm.new,
   name: r'rewardsConfirmVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsConfirmVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsConfirmVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
 typedef _$RewardsConfirmVm = AutoDisposeNotifier<RewardsConfirmState>;
 // 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
+// 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

File diff suppressed because it is too large
+ 113 - 154
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_page.dart


+ 3 - 2
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.dart

@@ -1,4 +1,5 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -56,10 +57,10 @@ class RewardsDetailRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      // var data = RewardsIndexEntity.fromJson(json!);
+      var data = RewardsDetailEntity.fromJson(json!);
       // Log.d("------data--$data--------");
       //重新赋值data或list
-      // return result.convert<RewardsIndexEntity>(data: data);
+      return result.convert<RewardsDetailEntity>(data: data);
     }
     return result.convert();
   }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_detail_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsDetailRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsDetailRepositoryHash() =>
+    r'0fe06d8758e7ae97d436d7b6bcbdd2a677c6d2de';
 
 /// See also [rewardsDetailRepository].
 @ProviderFor(rewardsDetailRepository)
-final rewardsDetailRepositoryProvider = Provider<RewardsDetailRepository>.internal(
+final rewardsDetailRepositoryProvider =
+    Provider<RewardsDetailRepository>.internal(
   rewardsDetailRepository,
   name: r'rewardsDetailRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 14 - 7
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_state.dart

@@ -2,39 +2,46 @@
 
 import 'dart:convert';
 
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class RewardsDetailState {
   //页面 LoadView 状态的展示
   LoadState loadingState;
   String? errorMessage;
-  List<Map<String, dynamic>>? list;
+  RewardsDetailEntity? detailInfo;
 
   RewardsDetailState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
-    required this.list,
-  });
+    RewardsDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? RewardsDetailEntity();
 
   RewardsDetailState copyWith({
     LoadState? loadingState,
     String? errorMessage,
-    List<Map<String, dynamic>>? list,
+    RewardsDetailEntity? detailInfo,
   }) {
     return RewardsDetailState(
       loadingState: loadingState ?? this.loadingState,
       errorMessage: errorMessage ?? this.errorMessage,
-      list: list ?? this.list,
+      detailInfo: detailInfo ?? this.detailInfo,
     );
   }
 
   Map<String, dynamic> toMap() {
     return {
-      'list': this.list,
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
     };
   }
 
   factory RewardsDetailState.fromMap(Map<String, dynamic> map) {
-    return RewardsDetailState(list: map['list'] as List<Map<String, dynamic>>);
+    return RewardsDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as RewardsDetailEntity,
+    );
   }
 }

+ 11 - 10
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -21,7 +22,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     controlFinishLoad: true, //允许加载
   );
   RewardsDetailState initState() {
-    return RewardsDetailState(list: [],);
+    return RewardsDetailState();
   }
 
   @override
@@ -31,6 +32,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     // 初始化状态
     RewardsDetailState state = initState();
     // 初始化列表数据
+    Log.d("state.list------${state.detailInfo}");
     return state;
   }
 
@@ -55,7 +57,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
 // 重试请求
   Future retryRequest({int? id}) async {
     _needShowPlaceholder = true;
-    getListData(id:id);
+    getListData(id: id);
   }
 
   //刷新页面状态
@@ -68,18 +70,17 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "id": id
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await rewardsDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await rewardsDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(
-        //   list: result.data as RewardsIndexEntity,
-        // );
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as RewardsDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
         changeLoadingState(LoadState.State_Success, null);
       } else {
         String errorMessage = result.errorMsg!;

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_detail_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsDetailVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsDetailVmHash() => r'796f0fb5cee8d1f89e2e3ca380e6496878361ab2';
 
 /// See also [RewardsDetailVm].
 @ProviderFor(RewardsDetailVm)
@@ -14,8 +14,9 @@ final rewardsDetailVmProvider =
     AutoDisposeNotifierProvider<RewardsDetailVm, RewardsDetailState>.internal(
   RewardsDetailVm.new,
   name: r'rewardsDetailVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsDetailVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsDetailVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 29 - 33
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_page.dart

@@ -31,6 +31,9 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String shortDescription = item['short_description'] ?? '';
+    String createdAt = item['created_at'] ?? '';
+    int point = item['point'] ?? 0;
     return Container(
       padding: const EdgeInsets.only(top: 15, bottom: 15, left: 18, right: 18),
       decoration: BoxDecoration(
@@ -48,14 +51,14 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               Text(
-                'Daily Login',
+                shortDescription,
                 style: TextStyle(
                     fontSize: 15.0,
                     color: ColorUtils.string2Color('#000000'),
                     fontWeight: FontWeight.w500), // 设置字体大小
               ).marginOnly(bottom: 6),
               Text(
-                '14 Oct 2024  10:00PM',
+                createdAt,
                 style: TextStyle(
                     fontSize: 13.0,
                     color: ColorUtils.string2Color('#808DAF'),
@@ -64,7 +67,7 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
             ],
           ),
           Text(
-            '+2',
+            '$point',
             style: TextStyle(
                 fontSize: 20.0,
                 color: ColorUtils.string2Color('#FDB429'),
@@ -77,28 +80,11 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return Container(
-        decoration: BoxDecoration(
-          color: Colors.white,
-          borderRadius: BorderRadius.circular(10),
-          boxShadow: const [
-            BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-          ],
-        ),
-        child:
-            // Column(
-            //     crossAxisAlignment: CrossAxisAlignment.center,
-            //     mainAxisAlignment: MainAxisAlignment.center,
-            //     children: [
-            ListView.builder(
-          itemCount: itemsList.length,
-          itemBuilder: (context, index) {
-            return _buildSaleItem(context, ref, itemsList[index], _vm);
-          },
-        )
-        // ])
-        );
+    final state = ref.watch(rewardsHistoryEarnedVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
@@ -133,14 +119,24 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
               child: Container(
                 color: ColorUtils.string2Color('#F2F3F6'),
                 padding: const EdgeInsets.only(top: 15),
-                child: LoadStateLayout(
-                  state: state.loadingState,
-                  errorMessage: state.errorMessage,
-                  errorRetry: () {
-                    vm.retryRequest();
-                  },
-                  successSliverWidget: [_buildSaleList(context, ref, vm)],
-                ),
+                child: Container(
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(10),
+                      boxShadow: const [
+                        BoxShadow(
+                            color: Color.fromRGBO(184, 191, 217, 0.3),
+                            blurRadius: 6)
+                      ],
+                    ),
+                    child: LoadStateLayout(
+                      state: state.loadingState,
+                      errorMessage: state.errorMessage,
+                      errorRetry: () {
+                        vm.retryRequest();
+                      },
+                      successSliverWidget: [_buildSaleList(context, ref, vm)],
+                    )),
               ))),
     );
   }

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_history_earned_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryEarnedRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHistoryEarnedRepositoryHash() =>
+    r'ba04d36d7a0dd5e0b0e430c5704219c0a9fc46d3';
 
 /// See also [rewardsHistoryEarnedRepository].
 @ProviderFor(rewardsHistoryEarnedRepository)
-final rewardsHistoryEarnedRepositoryProvider = Provider<RewardsHistoryEarnedRepository>.internal(
+final rewardsHistoryEarnedRepositoryProvider =
+    Provider<RewardsHistoryEarnedRepository>.internal(
   rewardsHistoryEarnedRepository,
   name: r'rewardsHistoryEarnedRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsHistoryEarnedRepositoryProvider = Provider<RewardsHistoryEarnedRepo
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsHistoryEarnedRepositoryRef = ProviderRef<RewardsHistoryEarnedRepository>;
+typedef RewardsHistoryEarnedRepositoryRef
+    = ProviderRef<RewardsHistoryEarnedRepository>;
 // ignore_for_file: type=lint
 // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.dart

@@ -105,7 +105,7 @@ class RewardsHistoryEarnedVm extends _$RewardsHistoryEarnedVm {
       if (result.isSuccess) {
         handlerResultList((result.data as RewardsHistoryEarnedEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsHistoryEarnedList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -116,7 +116,7 @@ class RewardsHistoryEarnedVm extends _$RewardsHistoryEarnedVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsHistoryEarnedList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 9 - 6
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.g.dart

@@ -6,20 +6,23 @@ part of 'rewards_history_earned_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryEarnedVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHistoryEarnedVmHash() =>
+    r'e9700821c483af4713a6bc2d6902fdca2327602e';
 
 /// See also [RewardsHistoryEarnedVm].
 @ProviderFor(RewardsHistoryEarnedVm)
-final rewardsHistoryEarnedVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistoryEarnedVm, RewardsHistoryEarnedState>.internal(
+final rewardsHistoryEarnedVmProvider = AutoDisposeNotifierProvider<
+    RewardsHistoryEarnedVm, RewardsHistoryEarnedState>.internal(
   RewardsHistoryEarnedVm.new,
   name: r'rewardsHistoryEarnedVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistoryEarnedVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistoryEarnedVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
-typedef _$RewardsHistoryEarnedVm = AutoDisposeNotifier<RewardsHistoryEarnedState>;
+typedef _$RewardsHistoryEarnedVm
+    = AutoDisposeNotifier<RewardsHistoryEarnedState>;
 // 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

+ 24 - 31
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_page.dart

@@ -76,32 +76,15 @@ class RewardsHistorySpentPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return Container(
-        decoration: BoxDecoration(
-          color: Colors.white,
-          borderRadius: BorderRadius.circular(10),
-          boxShadow: const [
-            BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-          ],
-        ),
-        child:
-            // Column(
-            //     crossAxisAlignment: CrossAxisAlignment.center,
-            //     mainAxisAlignment: MainAxisAlignment.center,
-            //     children: [
-            ListView.builder(
-          itemCount: itemsList.length,
-          itemBuilder: (context, index) {
-            return _buildSaleItem(context, ref, itemsList[index], _vm);
-          },
-        )
-        // ])
-        );
+    final state = ref.watch(rewardsHistorySpentVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
-   Widget build(BuildContext context, WidgetRef ref) {
+  Widget build(BuildContext context, WidgetRef ref) {
     final vm = ref.read(rewardsHistorySpentVmProvider.notifier);
     final state = ref.watch(rewardsHistorySpentVmProvider);
     useEffect(() {
@@ -132,14 +115,24 @@ class RewardsHistorySpentPage extends HookConsumerWidget {
               child: Container(
                 color: ColorUtils.string2Color('#F2F3F6'),
                 padding: const EdgeInsets.only(top: 15),
-                child: LoadStateLayout(
-                  state: state.loadingState,
-                  errorMessage: state.errorMessage,
-                  errorRetry: () {
-                    vm.retryRequest();
-                  },
-                  successSliverWidget: [_buildSaleList(context, ref, vm)],
-                ),
+                child: Container(
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(10),
+                      boxShadow: const [
+                        BoxShadow(
+                            color: Color.fromRGBO(184, 191, 217, 0.3),
+                            blurRadius: 6)
+                      ],
+                    ),
+                    child: LoadStateLayout(
+                      state: state.loadingState,
+                      errorMessage: state.errorMessage,
+                      errorRetry: () {
+                        vm.retryRequest();
+                      },
+                      successSliverWidget: [_buildSaleList(context, ref, vm)],
+                    )),
               ))),
     );
   }

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_history_spent_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistorySpentRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHistorySpentRepositoryHash() =>
+    r'79fa9a68c9f3630929226b702b8c3676c1711a6c';
 
 /// See also [rewardsHistorySpentRepository].
 @ProviderFor(rewardsHistorySpentRepository)
-final rewardsHistorySpentRepositoryProvider = Provider<RewardsHistorySpentRepository>.internal(
+final rewardsHistorySpentRepositoryProvider =
+    Provider<RewardsHistorySpentRepository>.internal(
   rewardsHistorySpentRepository,
   name: r'rewardsHistorySpentRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsHistorySpentRepositoryProvider = Provider<RewardsHistorySpentReposi
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsHistorySpentRepositoryRef = ProviderRef<RewardsHistorySpentRepository>;
+typedef RewardsHistorySpentRepositoryRef
+    = ProviderRef<RewardsHistorySpentRepository>;
 // ignore_for_file: type=lint
 // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.dart

@@ -105,7 +105,7 @@ class RewardsHistorySpentVm extends _$RewardsHistorySpentVm {
       if (result.isSuccess) {
         handlerResultList((result.data as RewardsHistoryEarnedEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsHistoryEarnedList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -116,7 +116,7 @@ class RewardsHistorySpentVm extends _$RewardsHistorySpentVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsHistoryEarnedList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 7 - 5
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.g.dart

@@ -6,16 +6,18 @@ part of 'rewards_history_spent_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistorySpentVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHistorySpentVmHash() =>
+    r'7e0e58a3be1ccd92b61275c86223a3beadde72b2';
 
 /// See also [RewardsHistorySpentVm].
 @ProviderFor(RewardsHistorySpentVm)
-final rewardsHistorySpentVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistorySpentVm, RewardsHistorySpentState>.internal(
+final rewardsHistorySpentVmProvider = AutoDisposeNotifierProvider<
+    RewardsHistorySpentVm, RewardsHistorySpentState>.internal(
   RewardsHistorySpentVm.new,
   name: r'rewardsHistorySpentVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistorySpentVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistorySpentVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 6 - 5
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_vm.g.dart

@@ -6,16 +6,17 @@ part of 'rewards_history_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryVmHash() => r'9b08b5e83d2b45f67b653daf60bb66bacb9c47ed';
+String _$rewardsHistoryVmHash() => r'79d4a3d09ec45ac0c123ce56d962b03ff13d742c';
 
 /// See also [RewardsHistoryVm].
 @ProviderFor(RewardsHistoryVm)
-final rewardsHistoryVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistoryVm, RewardsHistoryVmState>.internal(
+final rewardsHistoryVmProvider = AutoDisposeNotifierProvider<RewardsHistoryVm,
+    RewardsHistoryVmState>.internal(
   RewardsHistoryVm.new,
   name: r'rewardsHistoryVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistoryVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistoryVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 26 - 16
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_page.dart

@@ -5,6 +5,7 @@ import 'package:cpt_rewards/modules/rewards_list/rewards_list_page.dart';
 import 'package:cpt_rewards/modules/rewards_my/rewards_my_page.dart';
 import 'package:cpt_rewards/modules/rewards_search/rewards_search_page.dart';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
@@ -23,19 +24,25 @@ import './rewards_home_vm.dart';
 
 @RoutePage()
 class RewardsHomePage extends HookConsumerWidget {
-  const RewardsHomePage({Key? key}) : super(key: key);
+  final int? points;
+  const RewardsHomePage({Key? key, @PathParam('points') required this.points})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? points,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsHomePageRoute());
+      context.router.push(RewardsHomePageRoute(points: points));
     } else {
-      appRouter.push(const RewardsHomePageRoute()); 
+      appRouter.push(RewardsHomePageRoute(points: points));
     }
   }
 
   Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+    int? point = points ?? 0;
+    // String available = '$point'
     return Container(
         decoration: BoxDecoration(
           border: Border(
@@ -65,9 +72,9 @@ class RewardsHomePage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                const Text(
-                  '1526 Available Points',
-                  style: TextStyle(
+                Text(
+                  '$point Available Points',
+                  style: const TextStyle(
                       fontSize: 18.0,
                       color: Colors.white,
                       fontWeight: FontWeight.w500), // 设置字体大小
@@ -162,7 +169,9 @@ class RewardsHomePage extends HookConsumerWidget {
   }
 
   Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.lists.toList();
+    // List itemsList = _vm.state.lists.toList();
+    final state = ref.watch(rewardsHomeVmProvider);
+    List<Map<String, dynamic>>? itemsList = state.categoryList;
     return Container(
       transform: Matrix4.translationValues(0.0, -10.0, 0.0),
       // color: Colors.white,
@@ -187,19 +196,19 @@ class RewardsHomePage extends HookConsumerWidget {
         child: Row(
           crossAxisAlignment: CrossAxisAlignment.center,
           mainAxisAlignment: MainAxisAlignment.center,
-          children: List.generate(itemsList.length, (index) {
+          children: List.generate(itemsList!.length, (index) {
             final item = itemsList[index];
             return Column(
               crossAxisAlignment: CrossAxisAlignment.center,
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                MyAssetImage(
-                  item['icon'],
+                MyLoadImage(
+                  item['icon'] ?? '',
                   width: 70,
                   height: 70,
                 ),
                 Text(
-                  item['title']!,
+                  item['name']!,
                   style: TextStyle(
                       fontSize: 14.0,
                       color: ColorUtils.string2Color('#000001'),
@@ -409,7 +418,7 @@ class RewardsHomePage extends HookConsumerWidget {
                 Row(
                     crossAxisAlignment: CrossAxisAlignment.center,
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: List.generate(2, (index) {
+                    children: List.generate(list['rewards'].length, (index) {
                       double hg = 70;
                       return Container(
                           width: MediaQuery.of(context).size.width / 2 - 25,
@@ -461,7 +470,7 @@ class RewardsHomePage extends HookConsumerWidget {
                 Column(
                     crossAxisAlignment: CrossAxisAlignment.center,
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: List.generate(2, (index) {
+                    children: List.generate(list['rewards'].length, (index) {
                       double hg = 140;
                       return Container(
                               // width: MediaQuery.of(context).size.width / 2 - 25,
@@ -515,7 +524,8 @@ class RewardsHomePage extends HookConsumerWidget {
               child: state.list.length > 0
                   ? Column(
                       children: [
-                        _buildTop(context, ref, _vm),
+                        _buildTop(context, ref, _vm).paddingOnly(
+                            top: MediaQuery.of(context).padding.top),
                         Container(
                           transform: Matrix4.translationValues(0.0, -25.0, 0.0),
                           child: _buildSearch(context, ref, _vm), // 使用负数margin

+ 42 - 0
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.dart

@@ -1,4 +1,5 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:domain/entity/rewards_home_tes_entity.dart';
 import 'package:domain/entity/rewards_home_test_entity.dart';
@@ -73,4 +74,45 @@ class RewardsHomeRepository {
     }
     return result.convert();
   }
+
+  Future<HttpResult<Object>> fetchCategory(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+
+    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 地址
+      '/api/v1/user/reward/category/index', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    Log.d("------请求返回的result--$result--------");
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getListJson();
+      Log.d("------json--$json--------");
+      List<RewardsCategoryEntity> data =
+          json?.map((item) => RewardsCategoryEntity.fromJson(item)).toList() ??
+              [];
+      // var data = RewardsHomeTesEntity.fromJson(json);
+      Log.d("------data--$data--------");
+      //重新赋值data或list
+      return result.convert(list: data);
+    }
+    return result.convert();
+  }
 }

+ 2 - 1
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.g.dart

@@ -6,7 +6,8 @@ part of 'rewards_home_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHomeRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHomeRepositoryHash() =>
+    r'514daf688c4c2a26677843f4650633094b2cc16c';
 
 /// See also [rewardsHomeRepository].
 @ProviderFor(rewardsHomeRepository)

+ 7 - 0
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_state.dart

@@ -17,16 +17,19 @@ class RewardsHomeState {
   String? errorMessage;
   List<Map<String, dynamic>> list;
   List<Map<String, dynamic>> lists;
+  List<Map<String, dynamic>>? categoryList;
   RewardsHomeState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
     required this.list,
     required this.lists,
+    required this.categoryList,
   });
 
   RewardsHomeState copyWith(
       {LoadState? loadingState,
       String? errorMessage,
+      List<Map<String, dynamic>>? categoryList,
       List<Map<String, dynamic>>? list,
       List<Map<String, dynamic>>? lists}) {
     return RewardsHomeState(
@@ -34,6 +37,7 @@ class RewardsHomeState {
       errorMessage: errorMessage ?? this.errorMessage,
       list: list ?? this.list,
       lists: lists ?? this.lists,
+      categoryList: list ?? this.categoryList,
     );
   }
 
@@ -41,6 +45,7 @@ class RewardsHomeState {
     return {
       'list': List<dynamic>.from(lists.map((x) => x)),
       "lists": List<dynamic>.from(lists.map((x) => x)),
+      'categoryList': this.categoryList,
     };
   }
 
@@ -51,11 +56,13 @@ class RewardsHomeState {
       RewardsHomeState(
         lists: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
         list: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
+        categoryList: map['categoryList'] as List<Map<String, dynamic>>,
       );
   factory RewardsHomeState.fromMap(Map<String, dynamic> map, dynamic json) {
     return RewardsHomeState(
       list: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
       lists: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
+      categoryList: map['categoryList'] as List<Map<String, dynamic>>,
     );
   }
 }

+ 32 - 18
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.dart

@@ -1,7 +1,7 @@
 import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:domain/entity/rewards_home_tx_entity.dart';
-import 'package:domain/entity/rewards_list_entity.dart';
 import 'package:domain/entity/text_kon_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
@@ -28,6 +28,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
   RewardsHomeState initState() {
     return RewardsHomeState(
       list: [],
+      categoryList: [],
       lists: [
         {'title': 'YY', 'icon': Assets.rewardsRewardsIndex1},
         {'title': 'F&B', 'icon': Assets.rewardsRewardsIndex2},
@@ -53,8 +54,9 @@ class RewardsHomeVm extends _$RewardsHomeVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData() async {
     Log.d("----property_news_vm-----initPageData");
+    await getCategoryData();
     getListData();
   }
 
@@ -96,12 +98,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
       Log.d("请求完成结果------${result.list}");
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.list as List<RewardsListEntity>));
-        // state.list.addAll(result.list?.toList());
-        // final lis = result.getListJson();
-        // state =
-        // state.copyWith(list: result.list);
-        ToastEngine.show("获取数据成功");
+        handlerResultList((result.list as List<RewardsHomeTxEntity>));
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -112,7 +109,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
     }
   }
 
-  void handlerResultList(List<RewardsListEntity>? list) {
+  void handlerResultList(List<RewardsHomeTxEntity>? list) {
     if (list != null) {
       //有数据,判断是刷新还是加载更多的数据
       //刷新的方式
@@ -122,15 +119,32 @@ class RewardsHomeVm extends _$RewardsHomeVm {
       changeLoadingState(LoadState.State_Success, null);
     }
   }
-  // // 下拉刷新
-  // Future refreshListData() async {
-  //   Log.d("----property_news_vm-----refreshListData ");
 
-  //   // await Future.delayed(const Duration(seconds: 2));
+  // 获取Category数据
+  Future getCategoryData<T>() async {
+    try {
+      //请求网络
+      Map<String, dynamic> params = {};
+      Log.d("请求参数------$params");
+      final result = await rewardsHomeRepository.fetchCategory(params);
+      //校验成功失败
+      if (result.isSuccess) {
+        handlerCategory((result.list as List<RewardsCategoryEntity>));
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
+  }
 
-  //   state = state.copyWith(curPage: 1, pageSize: 10);
-  //   // ref.invalidateSelf();
-  //   // ref.invalidate(propertyNewsVmProvider);
-  //   getListData();
-  // }
+  void handlerCategory(List<RewardsCategoryEntity>? list) {
+    if (list != null) {
+      //有数据,判断是刷新还是加载更多的数据
+      //刷新的方式
+      state.categoryList?.clear();
+      state.categoryList?.addAll(list.map((item) => item.toJson()).toList());
+      Log.d("请categoryList------${state.categoryList}");
+    }
+  }
 }

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_home_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHomeVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHomeVmHash() => r'2efaf800d3b6eb5195282364ad59fce1e008c686';
 
 /// See also [RewardsHomeVm].
 @ProviderFor(RewardsHomeVm)
@@ -14,8 +14,9 @@ final rewardsHomeVmProvider =
     AutoDisposeNotifierProvider<RewardsHomeVm, RewardsHomeState>.internal(
   RewardsHomeVm.new,
   name: r'rewardsHomeVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHomeVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHomeVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 0 - 0
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_page.dart


Some files were not shown because too many files changed in this diff