Pārlūkot izejas kodu

首页的其他新闻的展示与跳转·

liukai 2 mēneši atpakaļ
vecāks
revīzija
7aa450955a
24 mainītis faili ar 550 papildinājumiem un 391 dzēšanām
  1. 16 0
      packages/cpt_main/lib/modules/home/home_page.dart
  2. 4 2
      packages/cpt_main/lib/modules/home/item_home_last_news.dart
  3. 18 6
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_screen.dart
  4. 3 2
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_state.dart
  5. 64 70
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.dart
  6. 15 1
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_screen.dart
  7. 3 2
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_state.dart
  8. 64 71
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.dart
  9. 84 0
      packages/cpt_main/lib/modules/home/latest_news/item_latest_news.dart
  10. 15 2
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_screen.dart
  11. 3 2
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_state.dart
  12. 62 69
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.dart
  13. 19 6
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_screen.dart
  14. 3 2
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_state.dart
  15. 64 70
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.dart
  16. 5 2
      packages/cpt_main/lib/modules/home/property_news/home_property_news_page.dart
  17. 3 2
      packages/cpt_main/lib/modules/home/property_news/home_property_news_state.dart
  18. 44 67
      packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.dart
  19. 5 4
      packages/cpt_main/lib/modules/home/property_news/item_list_news.dart
  20. 9 7
      packages/cpt_property/lib/modules/news_detail/property_news_detail_page.dart
  21. 6 0
      packages/cpt_property/lib/router/component/property_component_service.dart
  22. 25 0
      packages/cs_domain/lib/repository/main_repository.dart
  23. 14 4
      packages/cs_plugin_basic/lib/widget/webview_page.dart
  24. 2 0
      packages/cs_router/lib/componentRouter/property_service.dart

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

@@ -23,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 {
@@ -334,6 +338,18 @@ class HomePage extends HookConsumerWidget {
               // 使用 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);
+                  }
+                },
               ),
             );
           }),

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

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

+ 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,

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

@@ -135,13 +135,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);
+  }
 }

+ 25 - 0
packages/cs_domain/lib/repository/main_repository.dart

@@ -16,6 +16,7 @@ import 'package:plugin_basic/provider/http_provider/http_provider.dart';
 
 import '../entity/feedback_list_entity.dart';
 import '../entity/id_name_entity.dart';
+import '../entity/property_news_entity.dart';
 
 part 'main_repository.g.dart';
 
@@ -288,4 +289,28 @@ class MainRepository {
     }
     return result.convert();
   }
+
+  // 获取 房产 news 列表
+  Future<HttpResult<PropertyNewsEntity>> fetchPropertyNewsList({
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+    params['page'] = curPage.toString();
+    params['limit'] = "10";
+
+    final result = await dioEngine.requestNetResult(
+      '/api/v1/user/property/news/list', // api 地址
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = PropertyNewsEntity.fromJson(json!);
+      return result.convert<PropertyNewsEntity>(data: data);
+    }
+    return result.convert();
+  }
 }

+ 14 - 4
packages/cs_plugin_basic/lib/widget/webview_page.dart

@@ -1,3 +1,5 @@
+import 'dart:convert';
+
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/engine/image/image_nine_grid.dart';
@@ -30,7 +32,7 @@ class WebViewPage extends StatefulWidget {
 class _WebViewPageState extends State<WebViewPage> {
   WebViewController? webViewController;
   final _key = UniqueKey();
-  String title = '';
+  String? title;
   bool _showAppbar = true;
   int _stackToView = 1;
   String? _initialUrl;
@@ -41,6 +43,7 @@ class _WebViewPageState extends State<WebViewPage> {
     super.initState();
     title = widget.arguments != null ? widget.arguments!['title'] : null;
     _showAppbar = widget.showAppbar ?? true;
+    Log.d("传入的initialUrl:${widget.initialUrl}");
     _initialUrl = widget.initialUrl ?? widget.arguments!['initialUrl'];
     if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
   }
@@ -160,7 +163,7 @@ class _WebViewPageState extends State<WebViewPage> {
   Widget build(BuildContext context) {
     return Scaffold(
         backgroundColor: Colors.white,
-        appBar: _showAppbar ? MyAppBar.appBar(context, title, backgroundColor: Colors.white, actions: widget.actions, backCallback: _onWillPop) : null,
+        appBar: _showAppbar ? MyAppBar.appBar(context, title ?? "", backgroundColor: Colors.white, actions: widget.actions, backCallback: _onWillPop) : null,
         body: SafeArea(
           bottom: true,
           top: false,
@@ -176,7 +179,14 @@ class _WebViewPageState extends State<WebViewPage> {
                           onWillPop: _onWillPop,
                           child: WebView(
                             key: _key,
-                            initialUrl: _initialUrl,
+                            initialUrl: _initialUrl!.startsWith("http")
+                                ? _initialUrl
+                                : Uri.dataFromString(
+                                    _initialUrl!,
+                                    mimeType: 'text/html',
+                                    encoding: Encoding.getByName('utf-8'),
+                                  ).toString(),
+
                             userAgent: '',
                             //JS执行模式 是否允许JS执行
                             javascriptMode: JavascriptMode.unrestricted,
@@ -242,7 +252,7 @@ class _WebViewPageState extends State<WebViewPage> {
               if (widget.bottomBtnTxt != null)
                 MyButton(
                   onPressed: widget.bottomBtnAction,
-                  text: widget.bottomBtnTxt??"",
+                  text: widget.bottomBtnTxt ?? "",
                   textColor: Colors.white,
                   backgroundColor: context.appColors.btnBgDefault,
                   fontWeight: FontWeight.w500,

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

@@ -5,4 +5,6 @@ abstract class PropertyService {
 
   void startPropertyPage();
 
+  void startPropertyNewsDetailPage(int id);
+
 }