glglove 2 months ago
parent
commit
980ebeb289
59 changed files with 2347 additions and 2098 deletions
  1. 1 1
      melos.yaml
  2. 0 8
      packages/cpt_community/lib/modules/community/community_pageview_idx_data.dart
  3. 3 0
      packages/cpt_community/lib/modules/community/following/following_vm.dart
  4. 3 0
      packages/cpt_community/lib/modules/community/foryou/foryou_vm.dart
  5. 3 1
      packages/cpt_community/lib/modules/community/news/news_vm.dart
  6. 4 0
      packages/cpt_community/lib/modules/community/newsfeed_detail/newsfeed_detail_vm.dart
  7. 8 2
      packages/cpt_community/lib/modules/community/newsfeed_post/newsfeed_post_vm.dart
  8. 4 0
      packages/cpt_community/lib/modules/garage/garagesale_post/garagesale_post_vm.dart
  9. 5 5
      packages/cpt_property/lib/modules/news/page/property_news_page.dart
  10. 9 2
      packages/cpt_property/lib/modules/news/vm/property_news_vm.dart
  11. 1 1
      packages/cpt_property/lib/modules/news/vm/property_news_vm.g.dart
  12. 113 13
      packages/cpt_property/lib/modules/news_detail/property_news_detail_page.dart
  13. 16 4
      packages/cpt_property/lib/modules/news_detail/property_news_detail_state.dart
  14. 268 9
      packages/cpt_property/lib/modules/news_detail/property_news_detail_vm.dart
  15. 1 1
      packages/cpt_property/lib/modules/news_detail/property_news_detail_vm.g.dart
  16. 1 1
      packages/cpt_property/lib/modules/property/vm/property_vm.g.dart
  17. 1 1
      packages/cpt_property/lib/modules/rent/vm/property_rent_vm.g.dart
  18. 1 1
      packages/cpt_property/lib/modules/sale/vm/property_sale_vm.g.dart
  19. 42 0
      packages/cpt_property/lib/respository/property_resposity.dart
  20. 9 9
      packages/cpt_property/lib/router/page/property_page_router.gr.dart
  21. 19 0
      packages/cpt_services/lib/constants_services.dart
  22. 0 123
      packages/cpt_services/lib/modules/services/dialog/account_deactivation_dialog.dart
  23. 148 0
      packages/cpt_services/lib/modules/services/homeService/home_service_page.dart
  24. 44 0
      packages/cpt_services/lib/modules/services/homeService/home_service_state.dart
  25. 337 0
      packages/cpt_services/lib/modules/services/homeService/home_service_vm.dart
  26. 10 10
      packages/cpt_services/lib/modules/services_detail/services_detail_vm.g.dart
  27. 231 0
      packages/cpt_services/lib/modules/services/homeService/service_card_item.dart
  28. 320 214
      packages/cpt_services/lib/modules/services/services_page.dart
  29. 13 0
      packages/cpt_services/lib/modules/services/services_pageview_idx_data.dart
  30. 0 70
      packages/cpt_services/lib/modules/services/services_repository.dart
  31. 43 50
      packages/cpt_services/lib/modules/services/services_state.dart
  32. 0 175
      packages/cpt_services/lib/modules/services/services_view_model.dart
  33. 251 0
      packages/cpt_services/lib/modules/services/services_vm.dart
  34. 4 4
      packages/cpt_services/lib/modules/services/services_view_model.g.dart
  35. 0 180
      packages/cpt_services/lib/modules/services_contact/services_contact_page.dart
  36. 0 70
      packages/cpt_services/lib/modules/services_contact/services_contact_repository.dart
  37. 0 28
      packages/cpt_services/lib/modules/services_contact/services_contact_repository.g.dart
  38. 0 49
      packages/cpt_services/lib/modules/services_contact/services_contact_state.dart
  39. 0 106
      packages/cpt_services/lib/modules/services_contact/services_contact_vm.dart
  40. 0 26
      packages/cpt_services/lib/modules/services_contact/services_contact_vm.g.dart
  41. 0 167
      packages/cpt_services/lib/modules/services_detail/services_detail_page.dart
  42. 0 70
      packages/cpt_services/lib/modules/services_detail/services_detail_repository.dart
  43. 0 28
      packages/cpt_services/lib/modules/services_detail/services_detail_repository.g.dart
  44. 0 49
      packages/cpt_services/lib/modules/services_detail/services_detail_state.dart
  45. 0 105
      packages/cpt_services/lib/modules/services_detail/services_detail_vm.dart
  46. 0 167
      packages/cpt_services/lib/modules/services_list/services_list_page.dart
  47. 0 70
      packages/cpt_services/lib/modules/services_list/services_list_repository.dart
  48. 0 27
      packages/cpt_services/lib/modules/services_list/services_list_repository.g.dart
  49. 0 49
      packages/cpt_services/lib/modules/services_list/services_list_state.dart
  50. 0 107
      packages/cpt_services/lib/modules/services_list/services_list_vm.dart
  51. 0 25
      packages/cpt_services/lib/modules/services_list/services_list_vm.g.dart
  52. 272 0
      packages/cpt_services/lib/respository/services_respository.dart
  53. 10 10
      packages/cpt_services/lib/modules/services/services_repository.g.dart
  54. 13 19
      packages/cpt_services/lib/router/page/services_page_router.dart
  55. 33 38
      packages/cpt_services/lib/router/page/services_page_router.gr.dart
  56. 29 0
      packages/cs_domain/lib/entity/property_news_detail_entity.dart
  57. 6 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  58. 70 0
      packages/cs_domain/lib/generated/json/property_news_detail_entity.g.dart
  59. 1 3
      packages/cs_router/lib/path/router_path.dart

+ 1 - 1
melos.yaml

@@ -88,7 +88,7 @@ scripts:
     description: Run `dart run build_runner build` in rewards module
 
   build_runner_services:
-    run: cd "$MELOS_ROOT_PATH/packages/cpt_services" && dart run build_runner build --delete-conflicting-outputs
+    run: cd "$MELOS_ROOT_PATH/packages/cpt_services" && flutter pub run build_runner build --delete-conflicting-outputs --verbose
     description: Run `dart run build_runner build` in services module
 
   clean_all:

+ 0 - 8
packages/cpt_community/lib/modules/community/community_pageview_idx_data.dart

@@ -1,11 +1,3 @@
-import 'package:riverpod_annotation/riverpod_annotation.dart';
-
-import '../garage/for_rent/for_rent_vm.dart';
-import '../garage/for_sale/for_sale_vm.dart';
-import 'following/following_vm.dart';
-import 'foryou/foryou_vm.dart';
-import 'news/news_state.dart';
-import 'news/news_vm.dart';
 
 class CommunityPageViewIdxData {
   static const int news = 0;

+ 3 - 0
packages/cpt_community/lib/modules/community/following/following_vm.dart

@@ -1,6 +1,7 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/newsfeed_following_entity.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:router/ext/auto_router_extensions.dart';
@@ -271,6 +272,8 @@ class FollowingVm extends _$FollowingVm {
           });
           state = state.copyWith(list: listCopyDta);
         }
+        // 同步用户信息
+        UserConfigService.getInstance().refreshUserInfo();
         return true;
       }else {
         return false;

+ 3 - 0
packages/cpt_community/lib/modules/community/foryou/foryou_vm.dart

@@ -1,6 +1,7 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/newsfeed_foryou_entity.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:router/ext/auto_router_extensions.dart';
@@ -274,6 +275,8 @@ class ForyouVm extends _$ForyouVm {
           });
           state = state.copyWith(list: listCopyDta);
         }
+        // 同步用户信息
+        UserConfigService.getInstance().refreshUserInfo();
         return true;
       }else {
         return false;

+ 3 - 1
packages/cpt_community/lib/modules/community/news/news_vm.dart

@@ -2,6 +2,7 @@ import 'package:cpt_community/respository/common_newsfeed.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/newsfeed_news_entity.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:router/ext/auto_router_extensions.dart';
@@ -103,7 +104,6 @@ class NewsVm extends _$NewsVm {
       _page = 1;
       _needShowPlaceholder = true;
       getListData();
-      Log.d("99999999");
       // refreshController.callRefresh();
   }
 
@@ -281,6 +281,8 @@ class NewsVm extends _$NewsVm {
           });
           state = state.copyWith(list: listCopyDta);
         }
+        // 同步用户信息
+        UserConfigService.getInstance().refreshUserInfo();
         return true;
       }else {
         return false;

+ 4 - 0
packages/cpt_community/lib/modules/community/newsfeed_detail/newsfeed_detail_vm.dart

@@ -8,6 +8,7 @@ import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:domain/entity/newsfeed_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -255,6 +256,9 @@ class NewsfeedDetailVm extends _$NewsfeedDetailVm {
         card_account.followed = !(card_account!.followed?? false);
         state = state.copyWith(detailInfo: detailInfoDta);
       }
+
+      // 同步用户信息
+      UserConfigService.getInstance().refreshUserInfo();
     }
     return result;
   }

+ 8 - 2
packages/cpt_community/lib/modules/community/newsfeed_post/newsfeed_post_vm.dart

@@ -2,11 +2,14 @@
 import 'package:cpt_community/respository/common_newsfeed.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/material.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/path/router_path.dart';
 import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/event_bus.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:shared/utils/util.dart';
@@ -133,9 +136,9 @@ class NewsfeedPostVm extends _$NewsfeedPostVm {
       return false;
     }
 
-    bool resResult = await handlerSubmitPostNewsfeed(mindValue, state.imgList,  sCallback: sCallback, fCallback: fCallback);
+    final resResult = await handlerSubmitPostNewsfeed(mindValue, state.imgList,  sCallback: sCallback, fCallback: fCallback);
 
-    if(resResult){
+    if(resResult!=null && resResult){
       final communitVm = ref.read(communityVmProvider.notifier);
       communitVm.getCurrentPageViewVm(null).initPageData();
       // Navigator.pop(context);
@@ -143,6 +146,7 @@ class NewsfeedPostVm extends _$NewsfeedPostVm {
     }
   }
 
+  // 发布
   Future<bool> handlerSubmitPostNewsfeed(String mindValue,List<String> imgList,{VoidCallback? sCallback, VoidCallback? fCallback}) async{
     try {
       final result = await repositoryInstance.fetchNewsfeedPublish({
@@ -151,6 +155,8 @@ class NewsfeedPostVm extends _$NewsfeedPostVm {
       });
       if (result.isSuccess) {
         sCallback?.call();
+        // 更新用户信息
+        UserConfigService.getInstance().refreshUserInfo();
         return true;
       }else {
         fCallback?.call();

+ 4 - 0
packages/cpt_community/lib/modules/garage/garagesale_post/garagesale_post_vm.dart

@@ -5,6 +5,7 @@ import 'package:cpt_community/modules/community/community_vm.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/http_result.dart';
@@ -347,6 +348,9 @@ class GaragesalePostVm extends _$GaragesalePostVm {
     );
 
     if(resResult.isSuccess){
+      // 更新用户信息
+      UserConfigService.getInstance().refreshUserInfo();
+
       final communitVm = ref.read(communityVmProvider.notifier);
       communitVm.getCurrentPageViewVm(null).initPageData();
       // Navigator.pop(context);

+ 5 - 5
packages/cpt_property/lib/modules/news/page/property_news_page.dart

@@ -181,10 +181,7 @@ class PropertyNewsPage extends HookConsumerWidget {
           minHeight: 117.5,
         ),
       ],
-    ).onTap((){
-      // 去详情
-      // vm.goNewsDetail(item);
-    });
+    );
   }
 
 
@@ -230,7 +227,10 @@ class PropertyNewsPage extends HookConsumerWidget {
                 SliverList(
                   delegate: SliverChildBuilderDelegate(
                         (context, index){
-                          return _buildNewsItem(context, ref, state.list![index], vm);
+                          return _buildNewsItem(context, ref, state.list![index], vm).onTap((){
+                            Log.d("点击了item");
+                            vm.goNewsDetailPage(context, state.list![index]['id']);
+                          });
                         },
                     childCount: state.list!.length
                   )

+ 9 - 2
packages/cpt_property/lib/modules/news/vm/property_news_vm.dart

@@ -1,11 +1,18 @@
+import 'package:auto_route/src/route/page_route_info.dart';
+import 'package:cpt_property/modules/ioan/property_ioan_page.dart';
 import 'package:cpt_property/respository/property_resposity.dart';
+import 'package:cpt_property/router/page/property_page_router.dart';
 import 'package:domain/entity/property_news_entity.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/ext/auto_router_extensions.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 '../../news_detail/property_news_detail_page.dart';
+import '../../property/page/property_page.dart';
 import '../page/property_news_state.dart';
 
 part 'property_news_vm.g.dart';
@@ -208,9 +215,9 @@ class PropertyNewsVm extends _$PropertyNewsVm {
 
 
   // 去新闻详情页
-  void goNewsDetail(String item) {
+  void goNewsDetailPage(BuildContext? context, int id) {
     Log.d("goNewsDetail");
-    // PropertyPage.startInstance(context: context, item: item);
+    PropertyNewsDetailPage.startInstance(context: context, id: id,);
   }
 
   // 收藏/取消收藏

+ 1 - 1
packages/cpt_property/lib/modules/news/vm/property_news_vm.g.dart

@@ -6,7 +6,7 @@ part of 'property_news_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$propertyNewsVmHash() => r'928d4b39cb2b66e861543f2dae06d10f4e755b15';
+String _$propertyNewsVmHash() => r'b1bb0fdae0d2fa1f2080a4adeb1f2d0be04f6281';
 
 /// See also [PropertyNewsVm].
 @ProviderFor(PropertyNewsVm)

+ 113 - 13
packages/cpt_property/lib/modules/news_detail/property_news_detail_page.dart

@@ -1,28 +1,40 @@
 
+import 'package:cpt_property/components/bottomDialog.dart';
 import 'package:cpt_property/modules/news_detail/property_news_detail_vm.dart';
+import 'package:cpt_property/modules/rent/page/property_rent_page.dart';
 import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:plugin_basic/widget/webview_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/ext_dart.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/size_config.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';
+import 'package:widgets/widget_export.dart';
 
 import '../../router/page/property_page_router.dart';
 
-//协议页面,也是详情页面的第一个页面入口,内部可以请求详情数据和选项数据
 @RoutePage()
 class PropertyNewsDetailPage extends HookConsumerWidget {
-  final String type;
+  final int id;
 
-  const PropertyNewsDetailPage({Key? key, @PathParam() required this.type}) : super(key: key);
+  const PropertyNewsDetailPage({Key? key, @PathParam() required this.id}) : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context, required String formType}) {
+  static void startInstance({BuildContext? context, required int id}) {
     if (context != null) {
-      context.router.push(const PropertyNewsPageRoute());
+      context.router.push(PropertyNewsDetailPageRoute(id: id));
     } else {
-      appRouter.push(const PropertyNewsPageRoute());
+      appRouter.push(PropertyNewsDetailPageRoute(id: id));
     }
   }
 
@@ -33,17 +45,105 @@ class PropertyNewsDetailPage extends HookConsumerWidget {
     useEffect(() {
       // 组件挂载时执行 - 执行接口请求
       // 组件挂载时执行 - 执行接口请求
-      Future.microtask(() => vm.initPageData());
+      Future.microtask(() => vm.initPageData(id));
       return () {
         // 组件卸载时执行
       };
     }, []);
 
-    return state.detailData != null
-        ? WebViewPage(
-      showAppbar: true,
-      initialUrl: state.detailData?['detail_url'],
-      arguments: {'title': state.detailData?['title']},
-    ): const SizedBox.shrink();
+    // return state.detailData != null
+    //     ? WebViewPage(
+    //   showAppbar: true,
+    //   initialUrl: state.detailData?['detail_url'],
+    //   arguments: {'title': state.detailData?['title']},
+    // ): const SizedBox.shrink();
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(
+        context,
+        "News Detail",
+        backgroundColor: context.appColors.backgroundWhite,
+      ),
+      backgroundColor: context.appColors.whiteBG,
+      body: SizedBox(
+          width: double.infinity,
+          height: double.infinity,
+          child: EasyRefresh(
+            controller: vm.refreshController,
+            // 上拉加载
+            onLoad: null,
+            // 下拉刷新
+            onRefresh: null,
+            child: LoadStateLayout(
+              state: state.loadingState,
+              errorMessage: state.errorMessage,
+              errorRetry: () {
+                vm.retryRequest();
+              },
+              successSliverWidget: [
+                SliverList(
+                  delegate: SliverChildBuilderDelegate(
+                          (context, index){
+                        return state.dataRes !=null? _buildContentBox(context, ref, state.dataRes!): Container();
+                      },
+                      childCount: 1
+                  ),
+                )
+              ],
+            ),
+          ).marginOnly(top: 5, bottom: 5)
+      ),
+    );
+  }
+
+
+  Widget _buildContentBox(BuildContext context, WidgetRef ref, Map<String, dynamic> detailInfo) {
+    final title = detailInfo.getValue('title',  '');
+    final coverImage = detailInfo.getValue('cover_image',  '');
+    final content = detailInfo.getValue('content',  '');
+    final createdAt = detailInfo.getValue('created_at',  '');
+    final likesCount = detailInfo.getValue('likes_count',  '');
+    final liked = detailInfo.getValue('liked',  '');
+    return Padding(
+      padding: const EdgeInsets.only(left: 16, right: 16,bottom: 20),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          // 标题
+          MyTextView(
+            title,
+            isFontMedium: true,
+            fontSize: 24,
+            textColor: context.appColors.textBlack,
+            marginTop: 18.5,
+          ),
+          // 时间
+          MyTextView(
+            createdAt,
+            isFontRegular: true,
+            fontSize: 15,
+            textColor: context.appColors.textBlack,
+            marginTop: 11,
+            marginBottom: 17.5,
+          ),
+          // 图片
+          coverImage.isNotEmpty?
+            MyLoadImage(
+              coverImage,
+              width: SizeConfig().screenWidth,
+              height: 190,
+              fit: BoxFit.cover,
+            ) : SizedBox.shrink(),
+          // 内容
+          MyTextView(
+            content,
+            isFontRegular: true,
+            fontSize: 15,
+            textColor: context.appColors.textBlack,
+            marginTop: 24.5,
+          ),
+        ]
+      ),
+    );
   }
 }

+ 16 - 4
packages/cpt_property/lib/modules/news_detail/property_news_detail_state.dart

@@ -1,19 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
 class PropertyNewsDetailState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
   final String? title;
-  Map<String, dynamic>? detailData;
+  Map<String, dynamic>? dataRes;
 
   PropertyNewsDetailState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
     this.title,
-    this.detailData,
+    this.dataRes,
   });
 
   PropertyNewsDetailState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
     String? title,
-    Map<String, dynamic>? detailData,
+    Map<String, dynamic>? dataRes,
   }) {
     return PropertyNewsDetailState(
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
       title: title ?? this.title,
-      detailData: detailData ?? this.detailData,
+      dataRes: dataRes ?? this.dataRes,
     );
   }
 }

+ 268 - 9
packages/cpt_property/lib/modules/news_detail/property_news_detail_vm.dart

@@ -1,26 +1,41 @@
 
 import 'package:cpt_property/modules/news_detail/property_news_detail_state.dart';
+import 'package:domain/entity/property_news_detail_entity.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.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 '../../respository/property_resposity.dart';
 
 part 'property_news_detail_vm.g.dart';
 
 @riverpod
 class PropertyNewsDetailVm extends _$PropertyNewsDetailVm {
+  late PropertyRespository propertyRespositoryInstance;
+
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  int _page = 1;  // 当前页
+  int _limit = 10; // 每页数量
+  int _count = 0; // 总条数
+
+  late int _detailId; // 详情id
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
 
   PropertyNewsDetailState initState() {
-    return PropertyNewsDetailState(
-        detailData: {
-          "detail_url": "https://www.baidu.com",
-          "title": "详情"
-        }
-    );
+    return PropertyNewsDetailState();
   }
 
   @override
   PropertyNewsDetailState build(){
     // 引入数据仓库
-    // NewsRepositoryInstance = ref.read(newsRepositoryProvider);
+    propertyRespositoryInstance = ref.read(propertyRespositoryProvider);
     final state = initState();
     Log.d("--------------------------build---------------------");
 
@@ -28,12 +43,256 @@ class PropertyNewsDetailVm extends _$PropertyNewsDetailVm {
   }
 
 
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(
+        loadingState: loadState,
+        errorMessage: errorMsg
+    );
+  }
+
   // 初始化页面数据
-  initPageData() {
+  initPageData(int id) {
+    _detailId = id;
+    onRefresh();
+  }
+
+  // 上拉加载 更多
+  Future loadMore() async {
+    // await Future.delayed(const Duration(seconds: 2));
+    // if(state.list.length >= _count){
+    //   return;
+    // }else {
+    //   int page = _page + 1;
+    //   state = state.copyWith(page: page,);
+    //   getListData();
+    // }
+    // 检查 page 是否为 null,并初始化为 1
+    _page++;
+    getDetailData();
+  }
+
+
+  // 下拉刷新
+  Future onRefresh() async {
+    // await Future.delayed(const Duration(seconds: 2));
+    _page = 1;
+    getDetailData();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _page = 1;
+    _needShowPlaceholder = true;
+    getDetailData();
   }
 
-  getDetailData(String id) async {
+  getDetailData() async {
     Log.d("getDetailData");
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
 
+    // Map<String, dynamic> detailData = {};
+    // handlerResultData(false, data: detailData);
+
+    try {
+        Map<String, dynamic> params = {
+          "id": _detailId,
+        };
+        final result = await propertyRespositoryInstance.fetchNewsDetail(params);
+        if (result.isSuccess) {
+          handlerResultData(false, data: result.data as PropertyNewsDetailEntity);
+        } else {
+          String errorMessage = result.errorMsg!;
+          changeLoadingState(LoadState.State_Error, errorMessage);
+          ToastEngine.show(result.errorMsg ?? "Network Load Error");
+        }
+    }catch(e){
+      Log.d("获取详情数据失败  $e");
+    }
   }
+
+
+  // 获取list 列表数据
+  Future getListData<T>() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    Log.d("加载listData数据---------------start--${_page}---");
+    //   try {
+    //     //请求网络
+    //     Map<String, dynamic>  params = {
+    //       "page": _page,
+    //       "limit": _limit,
+    //     };
+    //     Log.d("请求参数------$params");
+    //     final result = await propertyNewsRepository.fetchPropertyNewsList(params);
+    //     Log.d("请求完成结果------${result.data}");
+    //     //校验成功失败
+    //     if (result.isSuccess) {
+    //       // state = state.copyWith(serverTime: result.data);
+    //       state = state;
+    //   handleList(listResult.data?.rows);
+    //       ToastEngine.show("获取数据成功");
+    //     } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    //       ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    //     }
+    //   } catch (e) {
+    //     ToastEngine.show("Error: $e");
+    //   }
+
+    // await Future.delayed(const Duration(milliseconds: 1500));
+    // final List<Map<String, dynamic>> listData = [
+    //   {
+    //     "id": 1,
+    //     "title": "Jul 2024  Blk XX #XX to XX 1,100 - 1,200 sqft",
+    //     "price": "\$4000",
+    //     "unit": "per month",
+    //   },
+    //   {
+    //     "id": 2,
+    //     "title": "Jul 2024  Blk XX #XX to XX 1,100 - 1,200 sqft",
+    //     "price": "\$4000",
+    //     "unit": "per month",
+    //   },
+    // ];
+    //
+    // if (_page == 1) {
+    //   //刷新的方式
+    //   state = state.copyWith(list: listData);
+    //   refreshController.finishRefresh();
+    //   //更新展示的状态
+    //   changeLoadingState(LoadState.State_Success, null);
+    // } else {
+    //   //加载更多
+    //   final allList = state.list;
+    //   if(allList.length >= _count! * _limit!){
+    //     //更新展示的状态
+    //     changeLoadingState(LoadState.State_Success, null);
+    //     refreshController.finishLoad(IndicatorResult.noMore, true);
+    //   }else {
+    //     allList.addAll(listData);
+    //     state = state.copyWith(list: allList);
+    //     refreshController.finishLoad();
+    //   }
+    // }
+    //
+
+    // try {
+    //   //请求网络
+    //   Map<String, dynamic>  params = {
+    //     "type": 2, // 1 sale 2 rent
+    //     "page": _page,
+    //     "limit": _limit,
+    //   };
+    //   Log.d("请求参数------$params");
+    //   final result = await propertyRespositoryInstance.fetchTransactionList(params);
+    //   //校验成功失败
+    //   if (result.isSuccess) {
+    //     // state = state.copyWith(count: (result.data as PropertySaleRentEntity).count);
+    //     handlerResultList((result.data  as PropertySaleRentEntity).list);
+    //   } else {
+    //     String errorMessage = result.errorMsg!;
+    //     changeLoadingState(LoadState.State_Error, errorMessage);
+    //     ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    //   }
+    // } catch (e) {
+    //   ToastEngine.show("Error: $e");
+    // }
+
+    // // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // void handlerResultList(List<PropertySaleRentList>? list) {
+  //   if (list != null && list.isNotEmpty) {
+  //     //有数据,判断是刷新还是加载更多的数据
+  //     if (_page == 1) {
+  //       //刷新的方式
+  //       state.list!.clear();
+  //       state.list!.addAll(list.map((item)=> item.toJson()).toList());
+  //       refreshController.finishRefresh();
+  //
+  //       //更新展示的状态
+  //       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);
+  //         refreshController.finishLoad();
+  //       }else {
+  //         if(_needShowPlaceholder){
+  //           changeLoadingState(LoadState.State_Success, null);
+  //         }
+  //       }
+  //       //更新展示的状态
+  //       refreshController.finishLoad(IndicatorResult.noMore);
+  //     }
+  //   }
+  // }
+
+  handlerResultData(bool isList, {List<Map<String, dynamic>>? list, PropertyNewsDetailEntity? data}){
+    Future.delayed(const Duration(seconds: 1)).then((value) {
+      if(isList){
+        // list 数据模式
+        if(list != null && list.isNotEmpty){
+          if(_page == 1){
+            // state.list.clear();
+            // state.list!.addAll(list);
+            refreshController.finishRefresh();
+            changeLoadingState(LoadState.State_Success, null);
+          }else {
+            // final allList = state.list;
+            // allList!.addAll(list);
+            // state = state.copyWith(list: allList);
+            refreshController.finishLoad();
+          }
+        }else {
+          if(_page == 1){
+            // state.list.clear();
+            changeLoadingState(LoadState.State_Empty, null);
+            refreshController.finishRefresh();
+          }else {
+            refreshController.finishLoad(IndicatorResult.noMore);
+          }
+        }
+      }else {
+        // 单个数据模式
+        if(data!=null){
+          state = state.copyWith(dataRes: data.toJson());
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Success, null);
+        }else {
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Empty, null);
+        }
+      }
+    });
+  }
+
 }

+ 1 - 1
packages/cpt_property/lib/modules/news_detail/property_news_detail_vm.g.dart

@@ -7,7 +7,7 @@ part of 'property_news_detail_vm.dart';
 // **************************************************************************
 
 String _$propertyNewsDetailVmHash() =>
-    r'5e8df693146169ab97ebc3952f33cc2118b0f35e';
+    r'3ec3fcf64c80e1e3ca1af977bc595b54b2d72266';
 
 /// See also [PropertyNewsDetailVm].
 @ProviderFor(PropertyNewsDetailVm)

+ 1 - 1
packages/cpt_property/lib/modules/property/vm/property_vm.g.dart

@@ -6,7 +6,7 @@ part of 'property_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$propertyVmHash() => r'e9f36995f10e7a4a0897046c50ff9ddd047b58d6';
+String _$propertyVmHash() => r'524ee98015f97fe35fc028fb588fa39b64189784';
 
 /// See also [PropertyVm].
 @ProviderFor(PropertyVm)

+ 1 - 1
packages/cpt_property/lib/modules/rent/vm/property_rent_vm.g.dart

@@ -6,7 +6,7 @@ part of 'property_rent_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$propertyRentVmHash() => r'8af3e7aea46b297f066b9e699713ebea5c06c47a';
+String _$propertyRentVmHash() => r'9d6599ade48d330fcbb81cd7695b939bfb557fa6';
 
 /// See also [PropertyRentVm].
 @ProviderFor(PropertyRentVm)

+ 1 - 1
packages/cpt_property/lib/modules/sale/vm/property_sale_vm.g.dart

@@ -6,7 +6,7 @@ part of 'property_sale_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$propertySaleVmHash() => r'f7493a35f2d0c93caef3b9a4d7678c94fc42cdfa';
+String _$propertySaleVmHash() => r'63a60ed5fe3a3bdc3d8555fe6afc8a61dce5a675';
 
 /// See also [PropertySaleVm].
 @ProviderFor(PropertySaleVm)

+ 42 - 0
packages/cpt_property/lib/respository/property_resposity.dart

@@ -1,4 +1,5 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/property_news_detail_entity.dart';
 import 'package:domain/entity/property_news_entity.dart';
 import 'package:domain/entity/property_sale_rent_entity.dart';
 import 'package:domain/entity/server_time.dart';
@@ -71,6 +72,47 @@ class PropertyRespository {
     return result.convert();
   }
 
+  // 获取 news 详情
+  Future<HttpResult<Object>> fetchNewsDetail(
+      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/property/news/detail', // 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.getDataJson();
+      var data = PropertyNewsDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<PropertyNewsDetailEntity>(data: data);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
 
   // 点赞/取消点赞
   Future<HttpResult<Object>> fetchPropertyNewsLikeClick(

+ 9 - 9
packages/cpt_property/lib/router/page/property_page_router.gr.dart

@@ -24,13 +24,13 @@ abstract class _$PropertyPageRouter extends RootStackRouter {
     PropertyNewsDetailPageRoute.name: (routeData) {
       final pathParams = routeData.inheritedPathParams;
       final args = routeData.argsAs<PropertyNewsDetailPageRouteArgs>(
-          orElse: () => PropertyNewsDetailPageRouteArgs(
-              type: pathParams.getString('type')));
+          orElse: () =>
+              PropertyNewsDetailPageRouteArgs(id: pathParams.getInt('id')));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         child: PropertyNewsDetailPage(
           key: args.key,
-          type: args.type,
+          id: args.id,
         ),
       );
     },
@@ -81,15 +81,15 @@ class PropertyNewsDetailPageRoute
     extends PageRouteInfo<PropertyNewsDetailPageRouteArgs> {
   PropertyNewsDetailPageRoute({
     Key? key,
-    required String type,
+    required int id,
     List<PageRouteInfo>? children,
   }) : super(
           PropertyNewsDetailPageRoute.name,
           args: PropertyNewsDetailPageRouteArgs(
             key: key,
-            type: type,
+            id: id,
           ),
-          rawPathParams: {'type': type},
+          rawPathParams: {'id': id},
           initialChildren: children,
         );
 
@@ -102,16 +102,16 @@ class PropertyNewsDetailPageRoute
 class PropertyNewsDetailPageRouteArgs {
   const PropertyNewsDetailPageRouteArgs({
     this.key,
-    required this.type,
+    required this.id,
   });
 
   final Key? key;
 
-  final String type;
+  final int id;
 
   @override
   String toString() {
-    return 'PropertyNewsDetailPageRouteArgs{key: $key, type: $type}';
+    return 'PropertyNewsDetailPageRouteArgs{key: $key, id: $id}';
   }
 }
 

+ 19 - 0
packages/cpt_services/lib/constants_services.dart

@@ -0,0 +1,19 @@
+class servicesConstants {
+   static Map<String, Map<String, dynamic>> servicesType = {
+     "houseCleaning": {
+       "name": "房屋保洁",
+       "type": "houseCleaning",
+       'code': 0,
+     },
+     "airConditioner": {
+       "name": "空调保洁",
+       "type": "airConditioner",
+       'code': 1,
+     },
+     "repaire": {
+       "name": "维修",
+       "type": "repaire",
+       'code': 2,
+     }
+  };
+}

+ 0 - 123
packages/cpt_services/lib/modules/services/dialog/account_deactivation_dialog.dart

@@ -1,123 +0,0 @@
-import 'package:cs_resources/generated/assets.dart';
-import 'package:cs_resources/generated/l10n.dart';
-import 'package:cs_resources/theme/app_colors_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/my_text_view.dart';
-import 'package:widgets/widget_export.dart';
-
-class AccountDeactivationDialog extends StatelessWidget {
-  VoidCallback confirmAction;
-
-  AccountDeactivationDialog({
-    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]),
-          ),
-        );
-      },
-    )
-    );
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return Column(
-      crossAxisAlignment: CrossAxisAlignment.center,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        Container(
-          width: double.infinity,
-          height: 55,
-          decoration: BoxDecoration(
-            color: context.appColors.btnBgDefault,
-            borderRadius: const BorderRadius.only(
-              topRight: Radius.circular(15),
-              topLeft: Radius.circular(15),
-            ),
-          ),
-          child: Row(
-            children: [
-              const SizedBox(width: 45),
-              MyTextView(
-                'Choose a Category',
-                fontSize: 18,
-                textAlign: TextAlign.center,
-                isFontMedium: true,
-                textColor: Colors.white,
-              ).expanded(),
-              const MyAssetImage(
-                Assets.baseServiceDialogDeleteIcon,
-                width: 25,
-                height: 25.5,
-              ).onTap(() {
-                onCancel();
-              }, padding: 10)
-            ],
-          ),
-        ),
-        Container(
-          width: double.infinity,
-          padding: const EdgeInsets.only(top: 22),
-          decoration: BoxDecoration(
-            color: context.appColors.whiteSecondBG,
-            borderRadius: const BorderRadius.only(
-              bottomLeft: Radius.circular(15),
-              bottomRight: Radius.circular(15),
-            ),
-          ),
-          child: Column(
-            children: [
-              Container(height:200, child:CheckboxList(context)),
-              Row(
-                children: [
-                  const SizedBox(width: 18),
-                  Expanded(
-                      flex: 1,
-                      child: InkWell(
-                        onTap: () async {
-                          onCancel();
-                          confirmAction();
-                        },
-                        child: MyTextView(
-                          'Ok',
-                          fontSize: 16,
-                          paddingTop: 13,
-                          paddingBottom: 13,
-                          isFontMedium: true,
-                          textAlign: TextAlign.center,
-                          textColor: Colors.white,
-                          backgroundColor: context.appColors.btnBgDefault,
-                          cornerRadius: 7,
-                        ),
-                      )),
-                  const SizedBox(width: 18),
-                ],
-              ).marginOnly(bottom: 30, top: 28),
-            ],
-          ),
-        ),
-      ],
-    ).constrained(width: 340);
-  }
-
-//取消弹框
-  void onCancel() async {
-    SmartDialog.dismiss();
-  }
-}

+ 148 - 0
packages/cpt_services/lib/modules/services/homeService/home_service_page.dart

@@ -0,0 +1,148 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/garage_sale_rent_entity.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/provider/app_config/app_config_service.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/ext_dart.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../../router/page/services_page_router.dart';
+import 'home_service_vm.dart';
+
+@RoutePage()
+class HomeServicePage extends HookConsumerWidget {
+  const HomeServicePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const HomeServicePageRoute());
+    } else {
+      appRouter.push(const HomeServicePageRoute());
+    }
+  }
+
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final vm = ref.read(homeServiceVmProvider.notifier);
+    final state = ref.watch(homeServiceVmProvider);
+    // final appConfigState = ref.watch(appConfigServiceProvider)
+
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => vm.initPageData());
+      return () {
+        // 组件卸载时执行
+        Log.d("garage_homeService_page 组件卸载时执行");
+      };
+    }, []);
+
+    return Scaffold(
+      // appBar: MyAppBar.appBar(
+      //   context,
+      //   "HomeService",
+      //   backgroundColor: context.appColors.whiteBG,
+      // ),
+      backgroundColor: ColorUtils.string2Color("#F2F3F6"),
+      body: SizedBox(
+          width: double.infinity,
+          height: double.infinity,
+          child: EasyRefresh(
+            key: ValueKey('homeService'),
+            controller: vm.refreshController,
+            // 上拉加载
+            onLoad: () async{
+              Log.d("----onLoad");
+              vm.loadMore();
+            },
+            // 下拉刷新
+            onRefresh: () async{
+              Log.d("----onRefresh");
+              vm.onRefresh();
+            },
+            child: LoadStateLayout(
+              state: state.loadingState,
+              errorMessage: state.errorMessage,
+              errorRetry: () {
+                vm.retryRequest();
+              },
+              successSliverWidget:[
+                SliverGrid(
+                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                    crossAxisCount: 2, // 每行显示两个项目
+                    mainAxisSpacing: 15,
+                    crossAxisSpacing: 15,
+                    // childAspectRatio: 166.5/214, // 宽高比
+                    // childAspectRatio:  166.5/214 * ScreenUtil.getAdapterSizeCtx(context, 166.5/214), // 宽高比
+                    childAspectRatio:  166.5/214 * ((166.5/214).ap), // 宽高比
+                  ),
+                  delegate: SliverChildBuilderDelegate(
+                        (context, index) {
+                      return  _buildHomeServiceItem(context, ref, state.list[index], vm).onTap((){
+                        vm.handlerGotoDetail(context: context, id: state.list[index]['id'], type: 'forSale');
+                      });
+                    },
+                    childCount: state.list.length,
+                  ),
+                ),
+              ],
+            ),
+          ).marginOnly(left: 15,right: 15,top: 15,bottom: 15)
+      ),
+    );
+  }
+
+  Widget _buildHomeServiceItem(BuildContext context, WidgetRef ref, Map<String, dynamic> item, vm){
+    return SizedBox(
+      width: double.infinity,
+      child: Container(
+        decoration: BoxDecoration(
+          color: context.appColors.whiteBG,
+          borderRadius: BorderRadius.circular(8),
+          boxShadow: [
+            BoxShadow(
+              color: ColorUtils.string2Color('#E5E5E5'),
+              offset: const Offset(0, 2),
+              blurRadius: 8,
+            ),
+          ],
+        ),
+        child: Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              // 卡片头部(头像 标题 时间)
+              // Expanded(
+              //   child: GarageCard(
+              //       key: UniqueKey(),
+              //       itemObj: item.cast<String, dynamic>(),
+              //       onClickColleciotn: (dynamic collectionValue) async {
+              //         Log.d("点击了喜欢按钮  --id:${item['id']}- $collectionValue");
+              //         int id = item['id'];
+              //         return await vm.handlerClickCollection(id, collectionValue);
+              //       }
+              //   ),
+              // ),
+            ]
+        ),
+      ),
+    );
+  }
+}

+ 44 - 0
packages/cpt_services/lib/modules/services/homeService/home_service_state.dart

@@ -0,0 +1,44 @@
+import 'package:widgets/load_state_layout.dart';
+
+class HomeServiceState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  String? keyword;
+  bool? isLiked;
+  Map<String, dynamic> activeSortMap;
+  List<Map<String, dynamic>> activeCateGoryList;
+  List<Map<String, dynamic>> list;
+
+
+  HomeServiceState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    this.keyword,
+    this.isLiked,
+    this.activeSortMap = const {},
+    this.activeCateGoryList = const [],
+    required this.list,
+  });
+
+  HomeServiceState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    String? keyword,
+    bool? isLiked,
+    Map<String, dynamic>? activeSortMap,
+    List<Map<String, dynamic>>? activeCateGoryList,
+    List<Map<String, dynamic>>? list,
+  }) {
+    return HomeServiceState(
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      keyword: keyword ?? this.keyword,
+      isLiked: isLiked ?? this.isLiked,
+      activeSortMap: activeSortMap ?? this.activeSortMap,
+      activeCateGoryList: activeCateGoryList ?? this.activeCateGoryList,
+      list: list ?? this.list,
+    );
+  }
+}

+ 337 - 0
packages/cpt_services/lib/modules/services/homeService/home_service_vm.dart

@@ -0,0 +1,337 @@
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/garage_sale_rent_entity.dart';
+import 'package:domain/entity/newsfeed_detail_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../../respository/services_respository.dart';
+import '../../../router/page/services_page_router.dart';
+import 'home_service_state.dart';
+
+part 'home_service_vm.g.dart';
+
+@riverpod
+class HomeServiceVm extends _$HomeServiceVm {
+  late ServicesRespository servicesRespositoryInstance;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  int _page = 1;  // 当前页
+  int _limit = 10; // 每页数量
+  int _count = 0; // 总条数
+
+  Map<String, dynamic> _queryParams = {
+    'category_id': null,
+    'keyword': null,
+    'is_liked': null,
+  };
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  HomeServiceState initState() {
+    return HomeServiceState(
+        list: []
+    );
+  }
+
+  @override
+  HomeServiceState build(){
+    // 引入数据仓库
+    // servicesRespositoryInstance = ref.read(commonGarageRespositoryProvider);
+    final state = initState();
+    Log.d("--------------------------build---------------------");
+
+    return state;
+  }
+
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(
+        loadingState: loadState,
+        errorMessage: errorMsg
+    );
+  }
+
+  // 初始化页面数据
+  initPageData() {
+    Log.d("----home_service_vm-----initPageData   ${state.loadingState}");
+    onRefresh();
+  }
+
+  // 上拉加载 更多
+  Future loadMore() async {
+    Log.d("----home_service_vm-----loadMore");
+    _page++;
+    getListData();
+  }
+
+
+  // 下拉刷新
+  Future onRefresh() async {
+    // 当前pageView 页面正处于显示状态
+    Log.d("----forsale_vm-----onRefresh ");
+    // await Future.delayed(const Duration(seconds: 2));
+    _page = 1;
+    getListData();
+  }
+
+
+  // 手动进行刷新
+  Future triggerRefresh() async {
+    Log.d("trggerRefresh");
+    refreshController.callRefresh();
+  }
+
+  // 手动进行刷新
+  Future directRefresh() async {
+    state = state.copyWith(list:[]);
+    // 注意:由于 nestedscrollview 嵌套easyfresh 组件  refreshController.callRefresh() 自动刷新只能滚动顶部但是不会触发下拉刷新,这里调用是 用到了将其滚动到顶部的作用,进而刷新操作主动掉接口
+    // https://github.com/xuelongqy/flutter_easy_refresh/issues/692
+    refreshController.callRefresh();
+    refreshController.resetFooter();
+    _page = 1;
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+
+  // 重试请求
+  Future retryRequest() async {
+    _page = 1;
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+
+  // 获取list 列表数据
+  Future getListData<T>({bool? isLoadMore}) async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    List<Map<String, dynamic>> list = [
+      {
+        'id':1,
+        'service_type': 0,  // 0 房屋保洁 1 空调保洁  2 维修
+        'goods_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
+        'title': 'House Cleaning Services',
+        'price': '\$66',
+        'isCollection': true,
+        'collection_num': '12',
+        'publisher': 'William Jefferson',
+        'publish_time': 'June 17,2016 at 7:23 p.m.',
+        'publisher_avator': Assets.communityCamera
+      },
+      {
+        'id':1,
+        'service_type': 1,  // 0 房屋保洁 1 空调保洁  2 维修
+        'goods_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'title': 'Electronic keyboard',
+        'price': '\$66',
+        'isCollection': true,
+        'collection_num': '12',
+        'publisher': 'William Jefferson',
+        'publish_time': 'June 17,2016 at 7:23 p.m.',
+        'publisher_avator': Assets.communityCamera
+      },
+      {
+        'id':1,
+        'service_type': 2,  // 0 房屋保洁 1 空调保洁  2 维修
+        'goods_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'title': 'Electronic keyboard',
+        'price': '\$66',
+        'isCollection': true,
+        'collection_num': '12',
+        'publisher': 'William Jefferson',
+        'publish_time': 'June 17,2016 at 7:23 p.m.',
+        'publisher_avator': Assets.communityCamera
+      },
+    ];
+    handlerResultData(true, list:list);
+
+    // try {
+    //   //请求网络
+    //   Map<String, dynamic>  params = {
+    //     "type": 1,  // 类型(1=Sale,2=Rent)
+    //     "category_id": _queryParams['category_id'],
+    //     "keyword": _queryParams['keyword'],
+    //     "page": _page,
+    //     "limit": _limit,
+    //   };
+    //   Log.d("请求参数------$params");
+    //   final result = await servicesRespositoryInstance.fetchGarageDataList(params);
+    //   //校验成功失败
+    //   if (result.isSuccess) {
+    //     // handlerResultList((result.data as GarageSaleRentEntity).list as List<GarageSaleRentList>, isLoadMore ?? false);
+    //   } else {
+    //     String errorMessage = result.errorMsg!;
+    //     changeLoadingState(LoadState.State_Error, errorMessage);
+    //     ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    //   }
+    // } catch (e) {
+    //   ToastEngine.show("Error: $e");
+    // }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+
+  }
+
+  handlerResultData(bool isList, {List<Map<String, dynamic>>? list, dynamic? data}){
+    Future.delayed(const Duration(seconds: 1)).then((value) {
+      if(isList){
+        // list 数据模式
+        if(list != null && list.isNotEmpty){
+          if(_page == 1){
+            state.list.clear();
+            state.list!.addAll(list);
+            refreshController.finishRefresh();
+            changeLoadingState(LoadState.State_Success, null);
+          }else {
+            final allList = state.list;
+            allList!.addAll(list);
+            state = state.copyWith(list: allList);
+            refreshController.finishLoad();
+          }
+        }else {
+          if(_page == 1){
+            state.list.clear();
+            changeLoadingState(LoadState.State_Empty, null);
+            refreshController.finishRefresh();
+          }else {
+            refreshController.finishLoad(IndicatorResult.noMore);
+          }
+        }
+      }else {
+        // 单个数据模式
+        if(data!=null){
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Success, null);
+        }else {
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Empty, null);
+        }
+      }
+    });
+  }
+
+  void handlerResultList(List<GarageSaleRentList>? list, bool isLoadMore) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_page == 1) {
+        //刷新的方式
+        state.list!.clear();
+        state.list!.addAll(list.map((item) => item.toJson()).toList());
+        refreshController.finishRefresh();
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        final allList = state.list;
+        allList!.addAll(list.map((item) => item.toJson()).toList());
+        state = state.copyWith(list: allList);
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_page == 1) {
+        //展示无数据的布局
+        state.list!.clear();
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } 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);
+            refreshController.finishLoad();
+          }else {
+            if(_needShowPlaceholder){
+              changeLoadingState(LoadState.State_Success, null);
+            }
+          }
+          //更新展示的状态
+          refreshController.finishLoad(IndicatorResult.noMore);
+        }
+      }
+    }
+  }
+
+
+  // 点击 收藏/取消收藏
+  Future<bool?> handlerClickCollection(int id, bool? isCollection) async{
+    try {
+      //请求网络
+      Map<String, dynamic>  params = {
+        "id": id,
+      };
+      Log.d("请求参数------$params");
+      final result = await servicesRespositoryInstance.fetchGarageColleciton(params);
+      //校验成功失败
+      if (result.isSuccess) {
+        // 修改 该id 的 liked 和 likes_count 字段
+        state.list!.forEach((Map<String, dynamic> element) {
+          GarageSaleRentList elementEntity = GarageSaleRentList.fromJson(element);
+
+          if(elementEntity.id == id){
+            elementEntity.liked = !elementEntity.liked!;
+            elementEntity.likesCount = elementEntity.liked! ? (elementEntity.likesCount! + 1) : (elementEntity.likesCount! - 1);
+          }
+
+          element = elementEntity.toJson();
+
+        });
+        return true;
+      } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      Log.e("Error: $e");
+      ToastEngine.show("Error: $e");
+    }
+  }
+
+  // 设置当前的 _queryParams
+  setCurrentQueryParams(Map<String, dynamic> params){
+    _queryParams.addAll(params);
+  }
+
+  // 获取当前的 _queryParams
+  Map<String, dynamic> getCurrentQueryParams(String? key){
+    if(key!=null && key!.isNotEmpty){
+      return _queryParams[key];
+    }
+    return _queryParams;
+  }
+
+  // 去详情页面
+  void handlerGotoDetail({BuildContext? context, required int id, String type='forSale'}){
+    Log.d("去详情页面");
+    // appRouter.push(GaragesaleDetailPageRoute(id: id, type: 'forSale'));
+  }
+}

+ 10 - 10
packages/cpt_services/lib/modules/services_detail/services_detail_vm.g.dart

@@ -1,26 +1,26 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of 'services_detail_vm.dart';
+part of 'home_service_vm.dart';
 
 // **************************************************************************
 // RiverpodGenerator
 // **************************************************************************
 
-String _$servicesDetailVmHash() => r'7fe0ebbd7df15c661751f2b01a9d2efe53f975c7';
+String _$homeServiceVmHash() => r'b0e883932798f7e0dfd413dd1cdadf758cd13173';
 
-/// See also [ServicesDetailVm].
-@ProviderFor(ServicesDetailVm)
-final servicesDetailVmProvider =
-    AutoDisposeNotifierProvider<ServicesDetailVm, ServicesDetailState>.internal(
-  ServicesDetailVm.new,
-  name: r'servicesDetailVmProvider',
+/// See also [HomeServiceVm].
+@ProviderFor(HomeServiceVm)
+final homeServiceVmProvider =
+    AutoDisposeNotifierProvider<HomeServiceVm, HomeServiceState>.internal(
+  HomeServiceVm.new,
+  name: r'homeServiceVmProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
       ? null
-      : _$servicesDetailVmHash,
+      : _$homeServiceVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
-typedef _$ServicesDetailVm = AutoDisposeNotifier<ServicesDetailState>;
+typedef _$HomeServiceVm = AutoDisposeNotifier<HomeServiceState>;
 // 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

+ 231 - 0
packages/cpt_services/lib/modules/services/homeService/service_card_item.dart

@@ -0,0 +1,231 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/ext_dart.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+import '../../../constants_services.dart';
+
+
+// 'id':1,
+// 'goods_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+// 'title': 'Electronic keyboard',
+// 'price': '\$66',
+// 'isCollection': true,
+// 'collection_num': '12',
+// 'publisher': 'William Jefferson',
+// 'publish_time': 'June 17,2016 at 7:23 p.m.',
+// 'publisher_avator': Assets.communityCamera,'
+
+
+class HomeServiceCard extends StatelessWidget {
+  Map<String, dynamic>? serviceType = servicesConstants.servicesType['houseCleaning'];
+  Map<String, dynamic> itemObj;
+  double? cardHeight;
+  final Function()? onTap;
+  final Function(dynamic)? onClickColleciotn;
+
+  HomeServiceCard({
+    Key? key,
+    this.serviceType,
+    required this.itemObj,
+    this.onTap,
+    this.onClickColleciotn,
+    double? cardHeight,
+  }) : super(key: key) {
+    this.cardHeight ??= 214;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    List? card_resources = itemObj.getValue<List>("resources", [])?? [];
+    String card_img = card_resources.length>0? card_resources[0]:"";
+    String card_title = itemObj.getValue("title", "");
+    int card_price = itemObj.getValue("price", "");
+    String card_created_at = itemObj.getValue("created_at", "");
+    Map<String, dynamic>? card_account = itemObj.getValue<Map<String,dynamic>>("account", null);
+    String card_avatar = card_account?['avatar']?? "";
+    String card_publish_name = card_account?['name']?? "";
+    bool card_liked = itemObj.getValue("liked", false);
+    int card_likes_count = itemObj.getValue("likes_count", 0);
+    return Column(
+      children: [
+        // 图片
+        Row(
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            Expanded(
+              child: ClipRRect(
+                borderRadius: const BorderRadius.only(topLeft: Radius.circular(8), topRight: Radius.circular(8),),
+                child: MyLoadImage(
+                  card_img,
+                  width: 166.5,
+                  height: 102.5.ap,
+                  isCircle: false,
+                  fit: BoxFit.cover,
+                ),
+              ),
+            ),
+          ],
+        ),
+        // 标题
+        Padding(
+          padding: const EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Expanded(
+                child: MyTextView(
+                  card_title,
+                  maxLines: 1,
+                  isTextEllipsis: true,
+                  textAlign: TextAlign.left,
+                  textColor: context.appColors.textBlack,
+                  fontSize: 16,
+                  isFontRegular: true,
+                ),
+              ),
+            ],
+          ),
+        ),
+        // 价格 及 收藏
+        Padding(
+          padding: const EdgeInsets.only(left: 10, right: 10,top: 0, bottom: 0),
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.spaceAround,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              Expanded(
+                child: MyTextView(
+                  '$card_price',
+                  maxLines: 1,
+                  isTextEllipsis: true,
+                  textAlign: TextAlign.start,
+                  textColor: ColorUtils.string2Color('#4161D0'),
+                  fontSize: 18,
+                  isFontMedium: true,
+                ),
+              ),
+              // 动态的 收藏数
+              CollectionWidget(
+                collectionNum: card_likes_count,
+                isCollection: card_liked,
+                onClickColleciotn: onClickColleciotn,
+              ),
+            ],
+          ),
+        ),
+        // 发布人信息
+        Expanded(
+          child: Padding(
+              padding: EdgeInsets.only(left: 10, right: 10, bottom: 17.5),
+              child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceAround,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  children: [
+                    Expanded(
+                        child: Column(
+                            mainAxisAlignment: MainAxisAlignment.center,
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            mainAxisSize: MainAxisSize.max,
+                            children: [
+                              MyTextView(
+                                card_publish_name,
+                                maxLines: 1,
+                                isTextEllipsis: true,
+                                textAlign: TextAlign.start,
+                                marginLeft: 13,
+                                fontSize: 12,
+                                textColor: ColorUtils.string2Color('#2956B7'),
+                                isFontRegular: true,
+                              ),
+                              MyTextView(
+                                card_created_at,
+                                maxLines: 1,
+                                isTextEllipsis: true,
+                                textAlign: TextAlign.start,
+                                marginLeft: 13,
+                                marginTop: 5,
+                                fontSize: 10,
+                                textColor: context.appColors.textBlack,
+                                isFontRegular: true,
+                              ),
+                            ]
+                        )
+                    ),
+                  ]
+              )
+          ),
+        )
+      ],
+    );
+  }
+}
+
+
+
+class CollectionWidget extends HookConsumerWidget {
+  int collectionNum = 0;
+  bool isCollection = false;
+  final Function(dynamic)? onClickColleciotn;
+  CollectionWidget({
+    Key? key,
+    required this.collectionNum,
+    required this.isCollection,
+    this.onClickColleciotn,
+  }) : super(key: key);
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final collectionNumState = useState(collectionNum);
+    final isCollectionState = useState(isCollection);
+    return Container(
+        width: 60,
+        height: 30,
+        alignment: Alignment.center,
+        // decoration: BoxDecoration(
+        //   color: ColorUtils.string2Color('#E5E5E5'),
+        //   borderRadius: BorderRadius.circular(15),
+        // ),
+        child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              MyTextView(
+                '${collectionNumState.value}',
+                textColor: context.appColors.textBlack,
+                fontSize: 14,
+                isFontRegular: true,
+                marginRight: 7,
+              ),
+              MyLoadImage(
+                isCollectionState.value? Assets.communityLikeActive: Assets.communityLike,
+                width: 14.1,
+                height: 14,
+              )
+            ]
+          // 点击 收餐/取消收藏
+        ).onTap(() async{
+          // Log.d("点击了收藏按钮  ${isCollectionState.value}");
+          // ToastEngine.show("点击了收藏按钮 ${isCollectionState.value}");
+          final result = await onClickColleciotn?.call(isCollectionState.value);
+          if(result !=null && result){
+            isCollectionState.value = !isCollectionState.value;
+            collectionNumState.value = (collectionNumState.value + (isCollectionState.value? 1: -1))<0? 0: (collectionNumState.value + (isCollectionState.value? 1: -1));
+            if(isCollectionState.value){
+              // ToastEngine.show("Collect Success");
+            }else {
+              // ToastEngine.show("Cancel Collect Success");
+            }
+          }
+        })
+    );
+  }
+}

+ 320 - 214
packages/cpt_services/lib/modules/services/services_page.dart

@@ -1,214 +1,320 @@
-import 'package:cpt_services/modules/services_list/services_list_page.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:cs_resources/generated/assets.dart';
-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:router/ext/auto_router_extensions.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 '../../../router/page/services_page_router.dart';
-import 'services_view_model.dart';
-
-@RoutePage()
-class ServicesPage extends HookConsumerWidget {
-  const ServicesPage({Key? key}) : super(key: key);
-
-  //启动当前页面
-  static void startInstance({BuildContext? context}) {
-    if (context != null) {
-      context.router.push(const ServicesPageRoute());
-    } else {
-      appRouter.push(const ServicesPageRoute());
-    }
-  }
-
-  Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
-    return Container(
-        color: ColorUtils.string2Color('#FFFFFF'),
-        child: Column(children: [
-          Container(
-            width: double.infinity,
-            height: 160,
-            decoration: const BoxDecoration(
-              image: DecorationImage(
-                image: AssetImage(
-                    'packages/cs_resources/${Assets.propertyHomeLoanBg}'),
-                fit: BoxFit.fill, // 设置图片平铺
-              ),
-            ),
-          ).marginOnly(bottom: 15),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.spaceBetween,
-            crossAxisAlignment: CrossAxisAlignment.center,
-            children: [
-              const Text(
-                'Home Services!',
-                style: TextStyle(
-                    fontSize: 16.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w400), // 设置字体大小
-              ),
-              TextButton(
-                onPressed: () {
-                  _vm.doDeleteAccount();
-                },
-                style: TextButton.styleFrom(
-                  foregroundColor: Colors.black,
-                  backgroundColor: ColorUtils.string2Color('#4161D0'), // 背景颜色
-                  minimumSize: const Size(70, 30), // 最小宽度和高度
-                  padding: const EdgeInsets.symmetric(
-                      horizontal: 11.0, vertical: 9), // 内边距
-                  shape: RoundedRectangleBorder(
-                    borderRadius: BorderRadius.circular(5), // 圆角
-                    side: BorderSide(
-                      color: ColorUtils.string2Color('#4161D0'),
-                      width: 1.0,
-                    ), // 边框
-                  ),
-                ),
-                child: const Text(
-                  'Filter',
-                  style: const TextStyle(
-                    color: Colors.white,
-                  ),
-                ),
-              ),
-            ],
-          ),
-        ])).paddingOnly(top: 10, left: 15, right: 15);
-  }
-
-  Widget _buildItem(BuildContext context, WidgetRef ref, _vm, item) {
-    return Container(
-            width: MediaQuery.of(context).size.width / 2 - 25,
-            height: 146,
-            decoration: const BoxDecoration(
-              color: Colors.white,
-              borderRadius: BorderRadius.all(Radius.circular(6.0)),
-              boxShadow: [
-                BoxShadow(
-                    color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-              ],
-            ),
-            child: Column(
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Row(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  children: [
-                    Expanded(
-                      child: Text(
-                        maxLines: 2, // 设置最大行数为2
-                        overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                        item['title'],
-                        style: const TextStyle(
-                            fontSize: 16.0,
-                            color: Colors.black,
-                            fontWeight: FontWeight.w700),
-                      ),
-                    )
-                  ],
-                ),
-                Row(
-                  mainAxisAlignment: MainAxisAlignment.end,
-                  children: [
-                    MyAssetImage(
-                      item['price'],
-                      width: 110,
-                      height: 80,
-                    )
-                  ],
-                ),
-              ],
-            ).paddingOnly(top: 15, left: 15).onTap(() {
-          // 去详情
-          // _vm.goNewsDetail(item['title']);
-          Navigator.push(
-            context,
-            MaterialPageRoute(builder: (context) => const ServicesListPage()),
-          );
-        }))
-        .marginOnly(bottom: 15);
-  }
-
-// list
-  Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        bool noLast = !(index == itemsList.length - 1);
-        bool isLast = index == itemsList.length - 1;
-        if (index % 2 == 0 && noLast) {
-          return Row(
-            mainAxisAlignment: MainAxisAlignment.spaceBetween,
-            children: [
-              _buildItem(context, ref, _vm, itemsList[index]),
-              _buildItem(context, ref, _vm, itemsList[index + 1]),
-            ],
-          );
-        } else if (index % 2 != 0 && noLast) {
-          return Row();
-        } else if (index % 2 != 0 && isLast) {
-          return Row();
-        } else {
-          return Row(
-            mainAxisAlignment: MainAxisAlignment.spaceBetween,
-            children: [
-              _buildItem(context, ref, _vm, itemsList[index]),
-            ],
-          );
-        }
-        // _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
-  }
-
-  @override
-  Widget build(BuildContext context, WidgetRef ref) {
-    final state = ref.watch(servicesVmProvider);
-    final _vm = ref.read(servicesVmProvider.notifier);
-    return Scaffold(
-      appBar: MyAppBar.appBar(
-        context,
-        "Service",
-        backgroundColor: context.appColors.backgroundWhite,
-      ),
-      body: Container(
-        child: Column(
-          children: [
-            _buildTop(context, ref, _vm),
-            Expanded(
-              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(
-                        bottom: 15, left: 15, right: 15, top: 15),
-                    child: _buildSaleList(context, ref, _vm)),
-              ),
-            )
-          ],
-        ),
-      ),
-    );
-  }
-}
+
+import 'package:cpt_services/modules/services/services_pageview_idx_data.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../router/page/services_page_router.dart';
+import 'services_vm.dart';
+
+final tabsRouterKey = GlobalKey<AutoTabsRouterState>();
+final GlobalKey<ExtendedNestedScrollViewState> extendedNestedScrollViewKey =
+GlobalKey<ExtendedNestedScrollViewState>();
+@RoutePage()
+class ServicesPage extends HookConsumerWidget with WidgetsBindingObserver {
+  ServicesPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push( ServicesPageRoute());
+    } else {
+      appRouter.push( ServicesPageRoute());
+    }
+  }
+
+  bool _isKeyboardVisible = false;
+
+  void handlerNestedScrollViewScroll({double? outerOffset, double? innerOffset, bool? isOuterScrollAnimated=false, bool? isInnerScrollAnimated=false}){
+
+    if(outerOffset !=null){
+      if(isOuterScrollAnimated!){
+        extendedNestedScrollViewKey.currentState?.outerController.animateTo(
+          outerOffset,
+          duration: const Duration(seconds: 1),
+          curve: Curves.easeIn,
+        );
+      }else {
+        extendedNestedScrollViewKey.currentState?.outerController.jumpTo(
+          outerOffset,
+        );
+      }
+    }
+
+    if(innerOffset !=null){
+      extendedNestedScrollViewKey.currentState?.innerPositions.forEach((position) {
+        if(isInnerScrollAnimated!){
+          position.animateTo(innerOffset,
+              duration: Duration(seconds: 1), curve: Curves.easeIn);
+        }else {
+          position.jumpTo(innerOffset);
+        }
+      });
+    }
+  }
+
+  @override
+  void didChangeMetrics() {
+    final bottomInset = WidgetsBinding.instance.window.viewInsets.bottom;
+    final newValue = bottomInset > 0.0;
+    if (_isKeyboardVisible != newValue) {
+      _isKeyboardVisible = newValue;
+      if (_isKeyboardVisible) {
+        handlerNestedScrollViewScroll(innerOffset: 0.0,);
+        print("键盘已显示");
+      } else {
+        WidgetsBinding.instance.removeObserver(this);
+        print("键盘已隐藏");
+      }
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final vm = ref.read(servicesVmProvider.notifier);
+    final state = ref.watch(servicesVmProvider);
+
+    useEffect(() {
+      // 监听窗口
+      WidgetsBinding.instance.addObserver(this);
+    }, []);
+
+
+
+    useEffect((){
+      Log.d("ServicesPage initState");
+      // 延迟监听
+      WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+        if(tabsRouterKey.currentState?.controller != null){
+          tabsRouterKey.currentState?.controller?.addListener((){
+            vm.tabsRouterChange();
+          });
+        }
+      });
+
+      return (){
+        Log.d("ServicesPage dispose");
+        WidgetsBinding.instance.removeObserver(this);
+        tabsRouterKey.currentState?.controller?.removeListener(vm.tabsRouterChange);
+      };
+    },[]);
+
+    return Scaffold(
+        appBar: MyAppBar.searchAppBar(
+            context,
+            value: vm.getCurrentQueryParams('keyword'),
+            actions: [
+              const MyAssetImage(
+                Assets.serviceServiceIcon1,
+                width: 21.5,
+                height: 21.5,
+              ).onTap((){
+                vm.handlerClickNavbarLikeBtn(context);
+              }),
+              const SizedBox(width: 15),
+            ],
+            backgroundColor: context.appColors.backgroundWhite,
+            onSearch: (value) {
+              vm.handlerSearch(value);
+            }
+        ),
+        backgroundColor: context.appColors.backgroundDefault,
+        body:  ExtendedNestedScrollView(
+            key: extendedNestedScrollViewKey,
+            onlyOneScrollInBody: true,
+            headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
+              return [
+                // SliverPersistentHeader(
+                //   delegate: CustomSliverPersistentHeaderDelegate(
+                //     maxHeight: 180,
+                //     minHeight: 180,
+                //     child: _buildTopSection(context, ref, vm, state),
+                //   ),
+                //   pinned: false,
+                // ),
+                // top 组件,转换为 Sliver 组件
+                SliverToBoxAdapter(
+                  child: _buildTopSection(context, ref, vm, state),
+                ),
+              ];
+            },
+            body: Column(
+                mainAxisSize: MainAxisSize.max,
+                children: [
+                  Expanded(
+                      child: AutoTabsRouter.pageView(
+                        key: tabsRouterKey,
+                        routes: const [
+                          HomeServicePageRoute(),
+                        ],
+                        builder: (context, child, pageController) {
+                          final tabsRouter = AutoTabsRouter.of(context);
+                          return Column(
+                            children: [
+                              Expanded(
+                                  child: child
+                              ),
+                            ],
+                          );
+                        },
+                      )
+                  )
+                ]
+            )
+        )
+    );
+  }
+
+
+  Widget _buildTopSection(BuildContext context, WidgetRef ref, vm, state) {
+    final topSectionsData = vm.topSectionsData;
+    final currentPageIdx = tabsRouterKey.currentState?.controller?.activeIndex ?? 0;
+    return Container(
+      color: context.appColors.whiteBG,
+      padding: const EdgeInsets.only(top: 23, bottom: 30),
+      child: Center(
+        child: Row(
+          mainAxisSize: MainAxisSize.max,
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: List.generate(topSectionsData.length, (index) {
+            final item = topSectionsData[index];
+            return Column(
+              children: [
+                Container(
+                  width: MediaQuery.of(context).size.width / topSectionsData.length - 36,
+                  height: 70,
+                  decoration: BoxDecoration(
+                    shape: BoxShape.circle, // 设置为圆形
+                    color: ColorUtils.string2Color("#F0F8FF"),
+                    boxShadow: index == currentPageIdx ? [
+                      BoxShadow(
+                        color: context.appColors.tabLightBlueShadow, // 设置阴影颜色
+                        blurRadius: 5, // 设置模糊半径
+                        spreadRadius: 0.05, // 控制阴影扩散
+                        offset: const Offset(0, 4), // 设置阴影偏移量
+                      ),] : [],// 未选中时无阴影,
+                  ),
+                  child: MyAssetImage(
+                    item['icon'],
+                    width: MediaQuery.of(context).size.width / topSectionsData.length - 36,
+                    // width: 70,
+                    height: 70,
+                  ).onTap(() {
+                  },
+                    type: ClickType.throttle,
+                  ),
+                ),
+                SizedBox.fromSize(size: const Size(0, 9)),
+                MyTextView(
+                  item['title'],
+                  fontSize: 15,
+                  textColor: index == currentPageIdx ? ColorUtils.string2Color('#4161D0'): context.appColors.textBlack,
+                  textAlign: TextAlign.center,
+                  isFontMedium: true,
+                ),
+              ],
+            ).marginOnly(left: 18, right: 18, top: 10, bottom: 10);
+          }),
+        ),
+      ),
+    );
+  }
+
+  Widget _buildNewsFeedPost(BuildContext context, WidgetRef ref, vm, state){
+    final userConfig = UserConfigService.getState(ref: ref);
+    return Container(
+      height: 65.5,
+      width: double.infinity,
+      padding: const EdgeInsets.only(left: 20, right: 20),
+      color: Colors.white,
+      child: Row(
+        children: [
+          // const MyAssetImage(Assets.servicesNewsFeed, width: 45,height: 45,),
+          MyLoadImage(
+            userConfig.user?.avatar,
+            width: 45,
+            height: 45,
+            isCircle: true,
+            fit: BoxFit.fill,
+          ),
+          Expanded(
+            child: MyTextView(
+              "What’s on your mind?",
+              textColor: context.appColors.textBlack,
+              fontSize: 15,
+              marginLeft: 15,
+              alignment: Alignment.centerLeft,
+              textAlign: TextAlign.left,
+              backgroundColor: ColorUtils.string2Color('#ffffff'),
+              maxLines: 1,
+              isFontMedium: true,
+            ),
+          ),
+          const MyAssetImage(
+            Assets.serviceServiceIcon1,
+            width: 21,
+            height: 16.5,
+          ),
+        ],
+      ).onTap((){
+        vm.handlerGotoNewsfeedPost(context);
+      }),
+    );
+  }
+
+  Widget _buildGarageSalePost(BuildContext context, WidgetRef ref, vm, state){
+    final userConfig = UserConfigService.getState(ref: ref);
+    return Container(
+      height: 65.5,
+      width: double.infinity,
+      padding: const EdgeInsets.only(left: 20, right: 20),
+      color: Colors.white,
+      child: Row(
+        children: [
+          MyLoadImage(
+            userConfig.user?.avatar,
+            width: 45,
+            height: 45,
+            isCircle: true,
+            fit: BoxFit.fill,
+          ),
+          Expanded(
+            child: MyTextView(
+              "Sell Item",
+              textColor: context.appColors.textBlack,
+              fontSize: 15,
+              marginLeft: 15,
+              alignment: Alignment.centerLeft,
+              textAlign: TextAlign.left,
+              backgroundColor: ColorUtils.string2Color('#ffffff'),
+              maxLines: 1,
+              isFontMedium: true,
+            ),
+          ),
+          const MyAssetImage(
+            Assets.serviceServiceIcon1,
+            width: 21,
+            height: 16.5,
+          ),
+        ],
+      ).onTap((){
+        vm.handlerGotoGaragePost(context);
+      }),
+    );
+  }
+}
+

+ 13 - 0
packages/cpt_services/lib/modules/services/services_pageview_idx_data.dart

@@ -0,0 +1,13 @@
+
+class ServicesPageviewIdxData {
+  static const int homeService = 0;
+  static const int inProgress = 1;
+  static const int history = 2;
+
+
+  static Map<int, String> get values => {
+    0: "homeService",
+    1: "inProgress",
+    2: "history",
+  };
+}

+ 0 - 70
packages/cpt_services/lib/modules/services/services_repository.dart

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

+ 43 - 50
packages/cpt_services/lib/modules/services/services_state.dart

@@ -1,50 +1,43 @@
-/// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
-
-import 'dart:convert';
-
-ServicesState servicesStateFromJson(String str) =>
-    ServicesState.fromJson(json.decode(str));
-
-String servicesStateToJson(ServicesState data) => json.encode(data.toJson());
-
-class ServicesState {
-  ServicesState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory ServicesState.fromJson(Map<dynamic, dynamic> json) => ServicesState(
-        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,
-      };
-
-  ServicesState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
-  }) {
-    return ServicesState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
-    );
-  }
-}
+import 'package:cs_resources/generated/assets.dart';
+
+
+class ServicesVmState {
+  List<Map<String, dynamic>>? topSectionsData;
+  int currentPageViewIdx = 0;
+  dynamic? tabsRouter;
+
+
+  ServicesVmState({
+    List<Map<String, dynamic>>? topSectionsData,
+    required this.currentPageViewIdx,
+    this.tabsRouter,
+  }) : topSectionsData = topSectionsData?? [
+    {
+      "title": "Service",
+      "code": "service",
+      "icon": Assets.communityNews,
+    },
+    {
+      "title": "In Progress",
+      "code": "inProgress",
+      "icon": Assets.communityGarageSale,
+    },
+    {
+      "title": "History",
+      "code": "history",
+      "icon": Assets.communityGarageSale,
+    },
+  ];
+
+  ServicesVmState copyWith({
+    List<Map<String, dynamic>>? topSectionsData,
+    int? currentPageViewIdx,
+    dynamic? tabsRouter,
+  }) {
+    return ServicesVmState(
+      topSectionsData: topSectionsData ?? this.topSectionsData,
+      currentPageViewIdx: currentPageViewIdx ?? this.currentPageViewIdx,
+      tabsRouter: tabsRouter ?? this.tabsRouter,
+    );
+  }
+}

+ 0 - 175
packages/cpt_services/lib/modules/services/services_view_model.dart

@@ -1,175 +0,0 @@
-import 'package:cpt_services/modules/services/dialog/account_deactivation_dialog.dart';
-import 'package:cs_resources/generated/assets.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 'services_state.dart';
-import 'services_repository.dart';
-part 'services_view_model.g.dart';
-
-@riverpod
-class ServicesVm extends _$ServicesVm {
-  late ServicesRepository servicesRepository;
-  ServicesState initState() {
-    return ServicesState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title": "Part-TimeCleaning",
-          "price": Assets.serviceServiceIcon1,
-        },
-        {
-          "id": 2,
-          "title": "Move in/outcleaning",
-          "price": Assets.serviceServiceIcon2,
-        },
-        {
-          "id": 3,
-          "title": "Laundry AnddryCleaning",
-          "price": Assets.serviceServiceIcon3,
-        },
-        {
-          "id": 4,
-          "title": "SofaCleaning",
-          "price": Assets.serviceServiceIcon4,
-        },
-        {
-          "id": 5,
-          "title": "MattressCleaning",
-          "price": Assets.serviceServiceIcon5,
-        },
-         {
-          "id": 5,
-          "title": "MarbleCleaning",
-          "price": Assets.serviceServiceIcon6,
-        },
-        {
-          "id": 6,
-          "title": "ParquetCleaning",
-          "price": Assets.serviceServiceIcon7,
-        },
-        {
-          "id": 6,
-          "title": "Removalist",
-          "price": Assets.serviceServiceIcon8,
-        },
-         {
-          "id": 7,
-          "title": "CarpetCleaning",
-          "price": Assets.serviceServiceIcon9,
-        },
-        {
-          "id": 7,
-          "title": "InteriorDesign",
-          "price": Assets.serviceServiceIcon10,
-        },
-        {
-          "id": 7,
-          "title": "DomesticHelper agency",
-          "price": Assets.serviceServiceIcon11,
-        },
-        {
-          "id": 7,
-          "title": "Recycling AndDisposal Service",
-          "price": Assets.serviceServiceIcon12,
-        },
-        {
-          "id": 7,
-          "title": "Sell YourPre-Loved Items",
-          "price": Assets.serviceServiceIcon13,
-        },
-        {
-          "id": 7,
-          "title": "UpholsteryCleaning",
-          "price": Assets.serviceServiceIcon14,
-        },
-      ],
-      filterCount: 6,
-    );
-  }
-
-  @override
-  ServicesState build() {
-    // 引入数据仓库
-    servicesRepository = ref.read(servicesRepositoryProvider);
-    // 初始化状态
-    ServicesState state = initState();
-    // 初始化列表数据
-    return state;
-  }
-
-  // 初始化页面数据
-  initPageData() {
-    Log.d("----property_news_vm-----initPageData");
-    refreshListData();
-  }
-
-  // 上拉加载
-  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 goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
-  }
-
-  // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
-    try {
-      //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
-      Log.d("请求参数------$params");
-      final result = await servicesRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
-      //校验成功失败
-      if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
-      } else {
-        ToastEngine.show(result.errorMsg ?? "Network Load Error");
-      }
-    } catch (e) {
-      ToastEngine.show("Error: $e");
-    }
-  }
-
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-
-  void doDeleteAccount() {
-    DialogEngine.show(widget: AccountDeactivationDialog(
-      confirmAction: () {
-        ToastEngine.show("点击了确定");
-      },
-    ));
-  }
-}

+ 251 - 0
packages/cpt_services/lib/modules/services/services_vm.dart

@@ -0,0 +1,251 @@
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/sp/sp_util.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:widgets/dialog/app_custom_dialog.dart';
+import 'package:widgets/my_checkbox_group.dart';
+
+import '../../respository/services_respository.dart';
+import 'services_page.dart';
+import 'services_pageview_idx_data.dart';
+import 'services_state.dart';
+
+part 'services_vm.g.dart';
+
+@riverpod
+class ServicesVm extends _$ServicesVm {
+  get topSectionsData => state.topSectionsData;
+  late ServicesRespository servicesRespositoryInstance;
+  late Map<int, dynamic> providerMap = {};
+
+  bool _isSingleSelect = true;
+  List<Map<String, dynamic>> _currentSelectedGarageCategory = [];
+
+  Map<int, Map<String, dynamic>> _queryParams = {};
+
+  // 获取当前的查询参数
+  getCurrentQueryParams(String key) {
+    return _queryParams[state.currentPageViewIdx]?[key];
+  }
+
+  // 根据索引获取 Provider
+  ProviderBase getProvider(int index) {
+    return providerMap[index]!;
+  }
+
+  // 初始化 _queryParams
+  queryParamsInit(){
+    List<MapEntry<int, String>> servicesEntriesList = ServicesPageviewIdxData.values.entries.toList();
+    servicesEntriesList.asMap().forEach((index, value) {
+      _queryParams[index] = {
+        'keyword': null,
+        'is_liked': null,
+        'page_view_idx': index,
+        'page_view_name': value,
+      };
+    });
+  }
+
+  ServicesVmState initState() {
+    return ServicesVmState(
+      currentPageViewIdx: 0,
+    );
+  }
+
+  @override
+  ServicesVmState build(){
+    // 引入数据仓库
+    servicesRespositoryInstance = ref.read(servicesRespositoryProvider);
+    final state = initState();
+    queryParamsInit();
+    setCurrentPageViewIconStatus();
+    getPageViewVm();
+
+    Log.d("-------------services vm-------------build---------------------");
+    ref.onDispose((){
+      providerMap = {};
+      Log.d("-------------services vm-------------dispose---------------------");
+    });
+    return state;
+  }
+
+  // 搜集pageView 对应的vm
+  void getPageViewVm(){
+    // 每次切换后需要重新获取 一组 pageView的 vm
+    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+      // 存入 一组 pageView的 vm
+      ServicesPageviewIdxData.values.forEach((key, value) {
+        switch(key){
+          case 0:
+          case 1:
+          case 2:
+          // providerMap[key] = ref.read(forrentVmProvider.notifier);
+        }
+      });
+    });
+  }
+
+  // 设置当前导航栏的 图标 等状态
+  void setCurrentPageViewIconStatus(){
+    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+      Log.d("获取当前的导航栏 相关状态resMap444 ${providerMap[state.currentPageViewIdx]} ");
+      Map<String, dynamic> resMap = providerMap[state.currentPageViewIdx]?.getCurrentQueryParams(null)??{};
+      Log.d("获取当前的导航栏 相关状态resMap $resMap ");
+      _queryParams[state.currentPageViewIdx] = resMap;
+    });
+  }
+
+  tabsRouterChange(){
+    // 设置当前导航栏的 图标 等状态
+    Log.d("----tabsRouterChange---${tabsRouterKey.currentState?.controller?.activeIndex}-");
+    state = state.copyWith(currentPageViewIdx: tabsRouterKey.currentState?.controller?.activeIndex ?? 0);
+
+    setCurrentPageViewIconStatus();
+    getPageViewVm();
+  }
+
+
+  // 获取当前pageView 的vm
+  getCurrentPageViewVm(int? pageViewIdx){
+    if(pageViewIdx !=null){
+      return providerMap[pageViewIdx];
+    }else {
+      return getCurrentPageViewVm(state.currentPageViewIdx);
+    }
+  }
+
+  // 返回当前 pageView 页面的 vm
+
+  // 判断当前pageview 页面正处于显示状态
+  Future isCurrentPageViewShowing(int pageViewIdx) async{
+    // 延迟获取结果
+    bool isShowing = await Future.delayed(const Duration(milliseconds: 500), (){
+      return state.currentPageViewIdx == pageViewIdx;
+    });
+    return isShowing;
+  }
+
+  Future<void> handlerShowChooseGarageCategoryDialog(BuildContext context, List<Map<String, dynamic>> garageCategoryList) async{
+    await DialogEngine.show(
+        tag: "chooseGarageSaleCategory",
+        position: DialogPosition.center,
+        widget: AppCustomDialog(
+          message: '',
+          dialogWidth: MediaQuery.of(context).size.width * 0.8,
+          // contentBoxMaxHeight: 350,
+          // contentBoxMinHeight: 300,
+          isShowConfirmBtn: garageCategoryList!.length > 0 ? true: false,
+          confirmTxt: "Ok",
+          messageBuilder: (BuildContext context){
+            return Container(
+              color: context.appColors.textWhite,
+              child: Column(
+                mainAxisAlignment: MainAxisAlignment.start,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: garageCategoryList!.length > 0 ? [
+                  MyCheckboxGroup(
+                      isSingleSelect: _isSingleSelect,
+                      labelStyle: const TextStyle(
+                        fontSize: 16,
+                        fontWeight: FontWeight.w500,
+                      ),
+                      items: garageCategoryList!,
+                      defaultSelectedItems: [],
+                      onChanged: (List<Map<String, dynamic>> selectedItems){
+                        Log.d("----MyCheckboxGroup onChanged  $selectedItems");
+                        _currentSelectedGarageCategory = selectedItems;
+                      }
+                  )
+                ]: [
+                  Container(
+                    child: CircularProgressIndicator(
+                      strokeWidth: 3,
+                      valueColor: AlwaysStoppedAnimation(context.appColors.textDarkGray),
+                    ),
+                  )
+                ],
+              ),
+            );
+          },
+          isShowCancelBtn:false,
+          confirmAction: (){
+            // 点击了确定
+            Log.d("----点击了确定按钮");
+            int? categoryId;
+            if(_isSingleSelect){
+              if(_currentSelectedGarageCategory.length > 0){
+                categoryId = _currentSelectedGarageCategory[0]['id'];
+              }
+            }
+
+            providerMap[state.currentPageViewIdx]
+              ..setCurrentQueryParams({
+                "category_id": _queryParams?[state.currentPageViewIdx]?['categoryId'],
+              })
+              ..directRefresh();
+          },
+        )
+    );
+  }
+
+  // 搜索
+  handlerSearch(String value){
+    Log.d("services_vm 中 搜索 value: $value");
+    _queryParams?[state.currentPageViewIdx]?['keyword'] = value;
+    providerMap[state.currentPageViewIdx]
+      ..setCurrentQueryParams({
+        "keyword": _queryParams?[state.currentPageViewIdx]?['keyword'],
+      })
+      ..directRefresh();
+  }
+
+  // 点击了导航栏的 like btn
+  handlerClickNavbarLikeBtn(BuildContext? context){
+    _queryParams[state.currentPageViewIdx]?['is_liked'] = !(_queryParams?[state.currentPageViewIdx]?['is_liked']??false);
+    // 控制外层滚动和内层滚动
+    handlerNestedScrollViewScroll();
+
+    // providerMap[state.currentPageViewIdx]
+    //   ..setCurrentQueryParams({
+    //     "is_liked": _queryParams?[state.currentPageViewIdx]?['is_liked'],
+    //   })
+    //   ..directRefresh();
+  }
+
+  handlerNestedScrollViewScroll({double? outerOffset, double? innerOffset=0.0, bool? isOuterScrollAnimated=false, bool? isInnerScrollAnimated=false}){
+    if(outerOffset !=null){
+      if(isOuterScrollAnimated!){
+        extendedNestedScrollViewKey.currentState?.outerController.animateTo(
+          outerOffset,
+          duration: const Duration(seconds: 1),
+          curve: Curves.easeIn,
+        );
+      }else {
+        extendedNestedScrollViewKey.currentState?.outerController.jumpTo(
+          outerOffset,
+        );
+      }
+    }
+
+    if(innerOffset !=null){
+      extendedNestedScrollViewKey.currentState?.innerPositions.forEach((position) {
+        if(isInnerScrollAnimated!){
+          position.animateTo(innerOffset,
+              duration: Duration(seconds: 1), curve: Curves.easeIn);
+        }else {
+          position.jumpTo(innerOffset);
+        }
+      });
+    }
+  }
+}
+

+ 4 - 4
packages/cpt_services/lib/modules/services/services_view_model.g.dart

@@ -1,17 +1,17 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of 'services_view_model.dart';
+part of 'services_vm.dart';
 
 // **************************************************************************
 // RiverpodGenerator
 // **************************************************************************
 
-String _$servicesVmHash() => r'066315b56e78a801d048576f75f1e30b4816dbf5';
+String _$servicesVmHash() => r'1b1580e19b32511d053f424edbd3ca934e86cad7';
 
 /// See also [ServicesVm].
 @ProviderFor(ServicesVm)
 final servicesVmProvider =
-    AutoDisposeNotifierProvider<ServicesVm, ServicesState>.internal(
+    AutoDisposeNotifierProvider<ServicesVm, ServicesVmState>.internal(
   ServicesVm.new,
   name: r'servicesVmProvider',
   debugGetCreateSourceHash:
@@ -20,6 +20,6 @@ final servicesVmProvider =
   allTransitiveDependencies: null,
 );
 
-typedef _$ServicesVm = AutoDisposeNotifier<ServicesState>;
+typedef _$ServicesVm = AutoDisposeNotifier<ServicesVmState>;
 // 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

+ 0 - 180
packages/cpt_services/lib/modules/services_contact/services_contact_page.dart

@@ -1,180 +0,0 @@
-import 'package:cs_resources/theme/app_colors_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:auto_route/auto_route.dart';
-import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:router/ext/auto_router_extensions.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:shared/utils/color_utils.dart';
-import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_appbar.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/my_text_view.dart';
-import 'package:widgets/widget_export.dart';
-import 'package:cs_resources/generated/assets.dart';
-
-import '../../../router/page/services_page_router.dart';
-import './services_contact_vm.dart';
-
-@RoutePage()
-class ServicesContactPage extends HookConsumerWidget {
-  const ServicesContactPage({Key? key}) : super(key: key);
-
-  //启动当前页面
-  static void startInstance({BuildContext? context}) {
-    if (context != null) {
-      context.router.push(const ServicesContactPageRoute());
-    } else {
-      appRouter.push(const ServicesContactPageRoute());
-    }
-  }
-
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
-    return Column(
-      children: [
-        const Column(children: [
-          MyAssetImage(
-            Assets.propertyHomeLoanBg,
-            // width: 15,
-            // height: 15,
-          ),
-        ]),
-        Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          mainAxisAlignment: MainAxisAlignment.start,
-          children: [
-            const Text(
-              'IMPORTANT',
-              style: TextStyle(
-                  fontSize: 18.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w700), // 设置字体大小
-            ).marginOnly(bottom: 15),
-            const Text(
-              'Dear Residents,STANDARD OPERATING PROCEDURE FORREPLACEMENT VEHICLES ANDOVERNICHT PARKING VEHICLES',
-              style: TextStyle(
-                  fontSize: 15.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w400), // 设置字体大小
-            ).marginOnly(bottom: 28),
-            Row(
-              children: [
-                Container(
-                  child: const Text(
-                    'CONTACT US',
-                    style: TextStyle(
-                        fontSize: 18.0,
-                        color: Colors.black,
-                        fontWeight: FontWeight.w700), // 设置字体大小
-                  ),
-                ).paddingOnly(top: 23),
-              ],
-            ).border(top: 1, color: ColorUtils.string2Color('#F2F3F6')),
-            const Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              mainAxisAlignment: MainAxisAlignment.start,
-              children: [
-                Text(
-                  'Whatsapp',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                ),
-                Text(
-                  '+65 67175555',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w400), // 设置字体大小
-                ),
-              ],
-            ).marginOnly(top: 25),
-            const Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              mainAxisAlignment: MainAxisAlignment.start,
-              children: [
-                Text(
-                  'Whatsapp',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                ),
-                Text(
-                  '+65 67175555',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w400), // 设置字体大小
-                ),
-              ],
-            ).marginOnly(top: 25),
-            const Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              mainAxisAlignment: MainAxisAlignment.start,
-              children: [
-                Text(
-                  'Whatsapp',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                ),
-                Text(
-                  '+65 67175555',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w400), // 设置字体大小
-                ),
-              ],
-            ).marginOnly(top: 25),
-            const Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              mainAxisAlignment: MainAxisAlignment.start,
-              children: [
-                Text(
-                  'Whatsapp',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                ),
-                Text(
-                  '+65 67175555',
-                  style: TextStyle(
-                      fontSize: 17.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w400), // 设置字体大小
-                ),
-              ],
-            ).marginOnly(top: 25),
-          ],
-        ).paddingOnly(top: 15, bottom: 50, left: 15, right: 15),
-      ],
-    );
-  }
-
-  @override
-  Widget build(BuildContext context, WidgetRef ref) {
-    final _vm = ref.read(servicesContactVmProvider.notifier);
-
-    return Scaffold(
-      appBar: MyAppBar.appBar(
-        context,
-        "Lift Padding",
-        backgroundColor: context.appColors.whiteBG,
-      ),
-      body: Column(children: [
-        Expanded(
-          child: SingleChildScrollView(
-              scrollDirection: Axis.vertical,
-              physics: const BouncingScrollPhysics(),
-              clipBehavior: Clip.none,
-              child: _buildDetailTop(context, ref, _vm)),
-        ),
-      ]),
-    );
-  }
-}

+ 0 - 70
packages/cpt_services/lib/modules/services_contact/services_contact_repository.dart

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

+ 0 - 28
packages/cpt_services/lib/modules/services_contact/services_contact_repository.g.dart

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

+ 0 - 49
packages/cpt_services/lib/modules/services_contact/services_contact_state.dart

@@ -1,49 +0,0 @@
-/// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
-
-import 'dart:convert';
-
-ServicesContactState servicesContactStateFromJson(String str) => ServicesContactState.fromJson(json.decode(str));
-
-String servicesContactStateToJson(ServicesContactState data) => json.encode(data.toJson());
-
-class ServicesContactState {
-  ServicesContactState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory ServicesContactState.fromJson(Map<dynamic, dynamic> json) => ServicesContactState(
-    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,
-  };
-
-  ServicesContactState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
-  }) {
-    return ServicesContactState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
-    );
-  }
-}

+ 0 - 106
packages/cpt_services/lib/modules/services_contact/services_contact_vm.dart

@@ -1,106 +0,0 @@
-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 './services_contact_state.dart';
-import './services_contact_repository.dart';
-part 'services_contact_vm.g.dart';
-
-@riverpod
-class ServicesContactVm extends _$ServicesContactVm {
-  late ServicesContactRepository servicesContactRepository;
-  ServicesContactState initState() {
-    return ServicesContactState(
-      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,
-    );
-  }
-
-  @override
-  ServicesContactState build() {
-    // 引入数据仓库
-    servicesContactRepository = ref.read(servicesContactRepositoryProvider);
-    // 初始化状态
-    ServicesContactState state = initState();
-    // 初始化列表数据
-    return state;
-  }
-
-  // 初始化页面数据
-  initPageData() {
-    Log.d("----property_news_vm-----initPageData");
-    refreshListData();
-  }
-
-  // 上拉加载
-  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 goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
-  }
-
-  // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
-    try {
-      //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
-      Log.d("请求参数------$params");
-      final result =
-          await servicesContactRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
-      //校验成功失败
-      if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
-      } else {
-        ToastEngine.show(result.errorMsg ?? "Network Load Error");
-      }
-    } catch (e) {
-      ToastEngine.show("Error: $e");
-    }
-  }
-
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-}

+ 0 - 26
packages/cpt_services/lib/modules/services_contact/services_contact_vm.g.dart

@@ -1,26 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'services_contact_vm.dart';
-
-// **************************************************************************
-// RiverpodGenerator
-// **************************************************************************
-
-String _$servicesContactVmHash() => r'7fe0ebbd7df15c661751f2b01a9d2efe53f975c7';
-
-/// See also [ServicesContactVm].
-@ProviderFor(ServicesContactVm)
-final servicesContactVmProvider =
-    AutoDisposeNotifierProvider<ServicesContactVm, ServicesContactState>.internal(
-  ServicesContactVm.new,
-  name: r'servicesContactVmProvider',
-  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
-      ? null
-      : _$servicesContactVmHash,
-  dependencies: null,
-  allTransitiveDependencies: null,
-);
-
-typedef _$ServicesContactVm = AutoDisposeNotifier<ServicesContactState>;
-// 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

+ 0 - 167
packages/cpt_services/lib/modules/services_detail/services_detail_page.dart

@@ -1,167 +0,0 @@
-import 'package:cpt_services/modules/services_contact/services_contact_page.dart';
-import 'package:cs_resources/theme/app_colors_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:auto_route/auto_route.dart';
-import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:router/ext/auto_router_extensions.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:shared/utils/color_utils.dart';
-import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_appbar.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/my_text_view.dart';
-import 'package:widgets/widget_export.dart';
-import 'package:cs_resources/generated/assets.dart';
-
-import '../../../router/page/services_page_router.dart';
-import './services_detail_vm.dart';
-
-@RoutePage()
-class ServicesDetailPage extends HookConsumerWidget {
-  const ServicesDetailPage({Key? key}) : super(key: key);
-
-  //启动当前页面
-  static void startInstance({BuildContext? context}) {
-    if (context != null) {
-      context.router.push(const ServicesDetailPageRoute());
-    } else {
-      appRouter.push(const ServicesDetailPageRoute());
-    }
-  }
-
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
-    return Column(
-      children: [
-        const Column(children: [
-          MyAssetImage(
-            Assets.propertyHomeLoanBg,
-            // width: 15,
-            // height: 15,
-          ),
-        ]),
-        Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          mainAxisAlignment: MainAxisAlignment.start,
-          children: [
-            const Text(
-              'IMPORTANT',
-              style: TextStyle(
-                  fontSize: 18.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w700), // 设置字体大小
-            ).marginOnly(bottom: 15),
-            Row(children: [
-              SizedBox(
-                width: 100,
-                height: 16,
-                child: ListView.builder(
-                    scrollDirection: Axis.horizontal,
-                    itemCount: 5,
-                    itemBuilder: (context, index) {
-                      return MyAssetImage(
-                        4.1 >= index + 1
-                            ? Assets.serviceServiceScoreYes
-                            : Assets.serviceServiceScoreNo,
-                        width: 16.5,
-                        height: 15.5,
-                      ).marginOnly(right: 4);
-                    }),
-              ),
-              const Text(
-                "4.1",
-                style: TextStyle(
-                    fontSize: 16.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w500), // 设置字体大小
-              ).marginOnly(left: 5),
-            ]).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), // 设置字体大小
-            ),
-          ],
-        ).paddingOnly(top: 15, bottom: 50, left: 15, right: 15),
-      ],
-    );
-  }
-
-  @override
-  Widget build(BuildContext context, WidgetRef ref) {
-    final _vm = ref.read(servicesDetailVmProvider.notifier);
-
-    return Scaffold(
-      appBar: MyAppBar.appBar(
-        context,
-        "Lift Padding",
-        backgroundColor: context.appColors.whiteBG,
-      ),
-      body: Column(children: [
-        Expanded(
-          child: SingleChildScrollView(
-              scrollDirection: Axis.vertical,
-              physics: const BouncingScrollPhysics(),
-              clipBehavior: Clip.none,
-              child: _buildDetailTop(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(
-                        "About",
-                        fontSize: 16,
-                        textColor: Colors.white,
-                        isFontMedium: true,
-                      ),
-                    ],
-                  ),
-                ).onTap(() {
-                  // 去详情
-                  Navigator.push(
-                    context,
-                    MaterialPageRoute(
-                        builder: (context) => const ServicesContactPage()),
-                  );
-                }),
-              ),
-              Expanded(
-                flex: 1,
-                child: Container(
-                  color: ColorUtils.string2Color('#FE6C00'),
-                  height: 100,
-                  child: Row(
-                    mainAxisAlignment: MainAxisAlignment.center,
-                    crossAxisAlignment: CrossAxisAlignment.center,
-                    children: [
-                      MyTextView(
-                        "Content",
-                        fontSize: 16,
-                        textColor: Colors.white,
-                        isFontMedium: true,
-                      ),
-                    ],
-                  ),
-                ),
-              ),
-            ],
-          ),
-        )
-      ]),
-    );
-  }
-}

+ 0 - 70
packages/cpt_services/lib/modules/services_detail/services_detail_repository.dart

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

+ 0 - 28
packages/cpt_services/lib/modules/services_detail/services_detail_repository.g.dart

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

+ 0 - 49
packages/cpt_services/lib/modules/services_detail/services_detail_state.dart

@@ -1,49 +0,0 @@
-/// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
-
-import 'dart:convert';
-
-ServicesDetailState servicesDetailStateFromJson(String str) => ServicesDetailState.fromJson(json.decode(str));
-
-String servicesDetailStateToJson(ServicesDetailState data) => json.encode(data.toJson());
-
-class ServicesDetailState {
-  ServicesDetailState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory ServicesDetailState.fromJson(Map<dynamic, dynamic> json) => ServicesDetailState(
-    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,
-  };
-
-  ServicesDetailState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
-  }) {
-    return ServicesDetailState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
-    );
-  }
-}

+ 0 - 105
packages/cpt_services/lib/modules/services_detail/services_detail_vm.dart

@@ -1,105 +0,0 @@
-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 './services_detail_state.dart';
-import './services_detail_repository.dart';
-part 'services_detail_vm.g.dart';
-
-@riverpod
-class ServicesDetailVm extends _$ServicesDetailVm {
-  late ServicesDetailRepository servicesDetailRepository;
-  ServicesDetailState initState() {
-    return ServicesDetailState(
-      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,
-    );
-  }
-
-  @override
-  ServicesDetailState build() {
-    // 引入数据仓库
-    servicesDetailRepository = ref.read(servicesDetailRepositoryProvider);
-    // 初始化状态
-    ServicesDetailState state = initState();
-    // 初始化列表数据
-    return state;
-  }
-
-  // 初始化页面数据
-  initPageData() {
-    Log.d("----property_news_vm-----initPageData");
-    refreshListData();
-  }
-
-  // 上拉加载
-  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 goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
-  }
-
-  // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
-    try {
-      //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
-      Log.d("请求参数------$params");
-      final result = await servicesDetailRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
-      //校验成功失败
-      if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
-      } else {
-        ToastEngine.show(result.errorMsg ?? "Network Load Error");
-      }
-    } catch (e) {
-      ToastEngine.show("Error: $e");
-    }
-  }
-
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-}

+ 0 - 167
packages/cpt_services/lib/modules/services_list/services_list_page.dart

@@ -1,167 +0,0 @@
-import 'package:cpt_services/modules/services_detail/services_detail_page.dart';
-import 'package:cs_resources/theme/app_colors_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:auto_route/auto_route.dart';
-import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:router/ext/auto_router_extensions.dart';
-import 'package:shared/utils/log_utils.dart';
-import 'package:shared/utils/color_utils.dart';
-import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_appbar.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/widget_export.dart';
-import 'package:cs_resources/generated/assets.dart';
-
-import '../../../router/page/services_page_router.dart';
-import './services_list_vm.dart';
-
-@RoutePage()
-class ServicesListPage extends HookConsumerWidget {
-  const ServicesListPage({Key? key}) : super(key: key);
-
-  //启动当前页面
-  static void startInstance({BuildContext? context}) {
-    if (context != null) {
-      context.router.push(const ServicesListPageRoute());
-    } else {
-      appRouter.push(const ServicesListPageRoute());
-    }
-  }
-
-  Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
-    return Column(
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        ClipRRect(
-            borderRadius: BorderRadius.circular(10.0),
-            child: MyAssetImage(
-              item['price'],
-              width: 83,
-              height: 58,
-            )),
-      ],
-    );
-  }
-
-  Widget _buildItemRightSection(
-      BuildContext context, WidgetRef ref, item, _vm) {
-        final num = item['num'];
-    return Column(
-      crossAxisAlignment: CrossAxisAlignment.start,
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        Text(
-          item['title'],
-          style: const TextStyle(
-              fontSize: 16.0,
-              color: Colors.black,
-              fontWeight: FontWeight.w500), // 设置字体大小
-        ).marginOnly(bottom: 10),
-        Row(
-            children: [
-              SizedBox(
-                width: 100,
-                height: 16,
-                child: ListView.builder(
-                scrollDirection: Axis.horizontal,
-                itemCount: 5,
-                itemBuilder: (context, index) {
-                  return MyAssetImage(
-                    item['num']>= index+1?Assets.serviceServiceScoreYes: Assets.serviceServiceScoreNo,
-                    width: 16.5,
-                    height: 15.5,
-                  ).marginOnly(right: 4);
-                }),
-              ),
-              Text(
-                "$num",
-                style: const TextStyle(
-                    fontSize: 16.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w500), // 设置字体大小
-              ).marginOnly(left: 5),
-            ]),
-      ],
-    );
-  }
-
-  // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
-    return Container(
-      decoration: const BoxDecoration(
-        color: Colors.white,
-        borderRadius: BorderRadius.all(Radius.circular(6.0)),
-        boxShadow: [
-          BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-        ],
-      ),
-      child: Column(
-        children: [
-          Container(
-            width: MediaQuery.of(context).size.width - 30,
-            height: 85,
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              mainAxisAlignment: MainAxisAlignment.start,
-              children: [
-                _buildItemLeftSection(context, ref, item, _vm)
-                    .marginOnly(right: 20),
-                _buildItemRightSection(context, ref, item, _vm),
-              ],
-            ).paddingOnly(left: 15, right: 15),
-          ).constrained(
-            minHeight: 85,
-          ),
-        ],
-      ).onTap(() {
-        // 去详情
-        // _vm.goNewsDetail(item['title']);
-        Navigator.push(
-          context,
-          MaterialPageRoute(builder: (context) => const ServicesDetailPage()),
-        );
-      }),
-    ).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);
-      },
-    );
-  }
-
-  @override
-  Widget build(BuildContext context, WidgetRef ref) {
-    final _vm = ref.read(servicesListVmProvider.notifier);
-
-    return Scaffold(
-      appBar: MyAppBar.appBar(
-        context,
-        "Part-Time Cleaning",
-        backgroundColor: context.appColors.whiteBG,
-      ),
-      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)),
-      )),
-    );
-  }
-}

+ 0 - 70
packages/cpt_services/lib/modules/services_list/services_list_repository.dart

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

+ 0 - 27
packages/cpt_services/lib/modules/services_list/services_list_repository.g.dart

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

+ 0 - 49
packages/cpt_services/lib/modules/services_list/services_list_state.dart

@@ -1,49 +0,0 @@
-/// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
-
-import 'dart:convert';
-
-ServicesListState servicesListStateFromJson(String str) => ServicesListState.fromJson(json.decode(str));
-
-String servicesListStateToJson(ServicesListState data) => json.encode(data.toJson());
-
-class ServicesListState {
-  ServicesListState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory ServicesListState.fromJson(Map<dynamic, dynamic> json) => ServicesListState(
-    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,
-  };
-
-  ServicesListState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
-  }) {
-    return ServicesListState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
-    );
-  }
-}

+ 0 - 107
packages/cpt_services/lib/modules/services_list/services_list_vm.dart

@@ -1,107 +0,0 @@
-import 'package:cs_resources/generated/assets.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 './services_list_state.dart';
-import './services_list_repository.dart';
-part 'services_list_vm.g.dart';
-
-@riverpod
-class ServicesListVm extends _$ServicesListVm {
-  late ServicesListRepository servicesListRepository;
-  ServicesListState initState() {
-    return ServicesListState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":"List Of Service Providers",
-          "price": Assets.propertyHomeLoanBg,
-          "num":4.1,
-        },
-        {
-          "id": 2,
-          "title": "List Of Service Providers",
-          "price": Assets.propertyHomeLoanBg,
-          "num": 4.1,
-        },
-      ],
-      filterCount: 2,
-    );
-  }
-
-  @override
-  ServicesListState build() {
-    // 引入数据仓库
-    servicesListRepository = ref.read(servicesListRepositoryProvider);
-    // 初始化状态
-    ServicesListState state = initState();
-    // 初始化列表数据
-    return state;
-  }
-
-  // 初始化页面数据
-  initPageData() {
-    Log.d("----property_news_vm-----initPageData");
-    refreshListData();
-  }
-
-  // 上拉加载
-  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,);c
-    //   getListData();
-    // }
-    getListData();
-  }
-
-// 去新闻详情页
-  void goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
-  }
-
-  // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
-    try {
-      //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
-      Log.d("请求参数------$params");
-      final result = await servicesListRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
-      //校验成功失败
-      if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
-      } else {
-        ToastEngine.show(result.errorMsg ?? "Network Load Error");
-      }
-    } catch (e) {
-      ToastEngine.show("Error: $e");
-    }
-  }
-
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-}

+ 0 - 25
packages/cpt_services/lib/modules/services_list/services_list_vm.g.dart

@@ -1,25 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'services_list_vm.dart';
-
-// **************************************************************************
-// RiverpodGenerator
-// **************************************************************************
-
-String _$servicesListVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
-
-/// See also [ServicesListVm].
-@ProviderFor(ServicesListVm)
-final servicesListVmProvider =
-    AutoDisposeNotifierProvider<ServicesListVm, ServicesListState>.internal(
-  ServicesListVm.new,
-  name: r'servicesListVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$servicesListVmHash,
-  dependencies: null,
-  allTransitiveDependencies: null,
-);
-
-typedef _$ServicesListVm = AutoDisposeNotifier<ServicesListState>;
-// 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

+ 272 - 0
packages/cpt_services/lib/respository/services_respository.dart

@@ -0,0 +1,272 @@
+import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/garage_sale_rent_detail_entity.dart';
+import 'package:domain/entity/garage_sale_rent_entity.dart';
+import 'package:domain/entity/myposts_sale_rent_entity.dart';
+import 'package:domain/entity/newsfeed_foryou_entity.dart';
+import 'package:domain/entity/newsfeed_news_entity.dart';
+import 'package:domain/entity/server_time.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.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';
+import 'package:plugin_basic/provider/http_provider/http_provider.dart';
+
+
+part 'services_respository.g.dart';
+
+@Riverpod(keepAlive: true)
+ServicesRespository servicesRespository(Ref ref) {
+  final dioEngine = ref.watch(dioEngineProvider);
+  return ServicesRespository(dioEngine: dioEngine);
+}
+
+/*
+ * 数据仓库
+ */
+class ServicesRespository {
+  DioEngine dioEngine;
+
+  ServicesRespository({required this.dioEngine});
+
+  // garage 获取 分类 字典
+  Future<HttpResult<Object>> fetchGarageCateGoryList(
+      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/garage-sale/category/index', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      // var data = NewsfeedForyouEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: json);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+  // garage 获取 列表
+  Future<HttpResult<Object>> fetchGarageDataList(
+      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/garage-sale/index/type', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = GarageSaleRentEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: data);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+  // myposts 中 garage 获取 列表
+  Future<HttpResult<Object>> fetchMyPostsGarageDataList(
+      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/me/post/garage-sale', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+
+      var data = MypostsSaleRentEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: data);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+
+  // garage 点赞/取消点赞
+  Future<HttpResult<Object>> fetchGarageColleciton(
+      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/garage-sale/like/click', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.POST,
+      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataDynamic();
+      // var data = NewsfeedForyouEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: json);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+
+  // 发布 garage
+  Future<HttpResult<Object>> fetchPublishGarage(
+      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";
+
+    List<String> paths = data!["resources"] as List<String>;
+
+    Map<String, String> files = {};
+    if (paths != null && paths.isNotEmpty) {
+      paths.asMap().forEach((index, path) {
+        files["resources[$index]"] = path;
+      });
+    }
+    // 删除 resources 属性
+    params.remove("resources");
+
+    final result = await dioEngine.requestNetResult(
+      // ApiConstants.apiServerTime, // api 地址
+      '/api/v1/user/garage-sale/index/publish', // api 地址
+      params: params,
+      paths: files,
+      headers: headers,
+      method: HttpMethod.POST,
+      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      // var data = NewsfeedForyouEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: json);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+  // 获取 详情信息
+  Future<HttpResult<Object>> fetchGarageDetailInfo(
+      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/garage-sale/index/detail', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
+      networkDebounce: true,   //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = GarageSaleRentDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert(data: data);
+    }else {
+      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
+        ToastEngine.show("${result.errorMsg}");
+      }
+    }
+    return result.convert();
+  }
+
+
+}

+ 10 - 10
packages/cpt_services/lib/modules/services/services_repository.g.dart

@@ -1,28 +1,28 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of 'services_repository.dart';
+part of 'services_respository.dart';
 
 // **************************************************************************
 // RiverpodGenerator
 // **************************************************************************
 
-String _$servicesRepositoryHash() =>
-    r'68370656250ee691445b4293c3b30568d4ebf20b';
+String _$servicesRespositoryHash() =>
+    r'2d9f9726cc82cffaa117f25615d9f7035b20695e';
 
-/// See also [servicesRepository].
-@ProviderFor(servicesRepository)
-final servicesRepositoryProvider = Provider<ServicesRepository>.internal(
-  servicesRepository,
-  name: r'servicesRepositoryProvider',
+/// See also [servicesRespository].
+@ProviderFor(servicesRespository)
+final servicesRespositoryProvider = Provider<ServicesRespository>.internal(
+  servicesRespository,
+  name: r'servicesRespositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
       ? null
-      : _$servicesRepositoryHash,
+      : _$servicesRespositoryHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef ServicesRepositoryRef = ProviderRef<ServicesRepository>;
+typedef ServicesRespositoryRef = ProviderRef<ServicesRespository>;
 // 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

+ 13 - 19
packages/cpt_services/lib/router/page/services_page_router.dart

@@ -3,34 +3,28 @@ import 'package:flutter/material.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/path/router_path.dart';
 
+import '../../modules/services/homeService/home_service_page.dart';
 import '../../modules/services/services_page.dart';
-import '../../modules/services_detail/services_detail_page.dart';
-import '../../modules/services_list/services_list_page.dart';
-import '../../modules/services_contact/services_contact_page.dart';
 part 'services_page_router.gr.dart';
 
 /*\
- * Form模块的路由
+ * services模块的路由
  */
 @AutoRouterConfig(replaceInRouteName: 'Page|Screen,PageRoute')
 class ServicesPageRouter extends _$ServicesPageRouter {
   @override
   List<AutoRoute> get routes => [
-
-    CustomRoute(page: ServicesPageRoute.page, path: RouterPath.services, transitionsBuilder: applySlideTransition),
-
-    CustomRoute(
-            page: ServicesListPageRoute.page,
-            path: RouterPath.servicesList,
-            transitionsBuilder: applySlideTransition),
-
     CustomRoute(
-            page: ServicesDetailPageRoute.page,
-            path: RouterPath.servicesDetail,
-            transitionsBuilder: applySlideTransition),
-            CustomRoute(
-            page: ServicesContactPageRoute.page,
-            path: RouterPath.servicesContact,
-            transitionsBuilder: applySlideTransition),
+        page: ServicesPageRoute.page,
+        path: RouterPath.services,
+        transitionsBuilder: applySlideTransition,
+        children: [
+          CustomRoute(
+              page: HomeServicePageRoute.page,
+              path: 'home_service',
+              transitionsBuilder: applySlideTransition
+          ),
+        ]
+    ),
   ];
 }

+ 33 - 38
packages/cpt_services/lib/router/page/services_page_router.gr.dart

@@ -15,67 +15,62 @@ abstract class _$ServicesPageRouter extends RootStackRouter {
 
   @override
   final Map<String, PageFactory> pagesMap = {
+    HomeServicePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const HomeServicePage(),
+      );
+    },
     ServicesPageRoute.name: (routeData) {
+      final args = routeData.argsAs<ServicesPageRouteArgs>(
+          orElse: () => const ServicesPageRouteArgs());
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const ServicesPage(),
+        child: ServicesPage(key: args.key),
       );
-    }
+    },
   };
 }
 
 /// generated route for
-/// [ServicesPage]
-class ServicesPageRoute extends PageRouteInfo<void> {
-  const ServicesPageRoute({List<PageRouteInfo>? children})
-      : super(
-          ServicesPageRoute.name,
-          initialChildren: children,
-        );
-
-  static const String name = 'ServicesPageRoute';
-
-  static const PageInfo<void> page = PageInfo<void>(name);
-}
-
-/// generated route for
-/// [ServicesDetailPage]
-class ServicesDetailPageRoute extends PageRouteInfo<void> {
-  const ServicesDetailPageRoute({List<PageRouteInfo>? children})
+/// [HomeServicePage]
+class HomeServicePageRoute extends PageRouteInfo<void> {
+  const HomeServicePageRoute({List<PageRouteInfo>? children})
       : super(
-          ServicesDetailPageRoute.name,
+          HomeServicePageRoute.name,
           initialChildren: children,
         );
 
-  static const String name = 'ServicesDetailPageRoute';
+  static const String name = 'HomeServicePageRoute';
 
   static const PageInfo<void> page = PageInfo<void>(name);
 }
 
 /// generated route for
-/// [ServicesContactPage]
-class ServicesContactPageRoute extends PageRouteInfo<void> {
-  const ServicesContactPageRoute({List<PageRouteInfo>? children})
-      : super(
-          ServicesDetailPageRoute.name,
+/// [ServicesPage]
+class ServicesPageRoute extends PageRouteInfo<ServicesPageRouteArgs> {
+  ServicesPageRoute({
+    Key? key,
+    List<PageRouteInfo>? children,
+  }) : super(
+          ServicesPageRoute.name,
+          args: ServicesPageRouteArgs(key: key),
           initialChildren: children,
         );
 
-  static const String name = 'ServicesContactPageRoute';
+  static const String name = 'ServicesPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<ServicesPageRouteArgs> page =
+      PageInfo<ServicesPageRouteArgs>(name);
 }
 
-/// generated route for
-/// [ServicesListPage]
-class ServicesListPageRoute extends PageRouteInfo<void> {
-  const ServicesListPageRoute({List<PageRouteInfo>? children})
-      : super(
-          ServicesListPageRoute.name,
-          initialChildren: children,
-        );
+class ServicesPageRouteArgs {
+  const ServicesPageRouteArgs({this.key});
 
-  static const String name = 'ServicesListPageRoute';
+  final Key? key;
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  @override
+  String toString() {
+    return 'ServicesPageRouteArgs{key: $key}';
+  }
 }

+ 29 - 0
packages/cs_domain/lib/entity/property_news_detail_entity.dart

@@ -0,0 +1,29 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/property_news_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/property_news_detail_entity.g.dart';
+
+@JsonSerializable()
+class PropertyNewsDetailEntity {
+	int? id;
+	String? title;
+	@JSONField(name: "cover_image")
+	String? coverImage;
+	String? content;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "likes_count")
+	int? likesCount;
+	bool? liked;
+
+	PropertyNewsDetailEntity();
+
+	factory PropertyNewsDetailEntity.fromJson(Map<String, dynamic> json) => $PropertyNewsDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $PropertyNewsDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 6 - 0
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -32,6 +32,7 @@ import 'package:domain/entity/notice_board_announ_entity.dart';
 import 'package:domain/entity/notice_board_documents_entity.dart';
 import 'package:domain/entity/notice_board_event_entity.dart';
 import 'package:domain/entity/payment_page_entity.dart';
+import 'package:domain/entity/property_news_detail_entity.dart';
 import 'package:domain/entity/property_news_entity.dart';
 import 'package:domain/entity/property_sale_rent_entity.dart';
 import 'package:domain/entity/rewards_category_entity.dart';
@@ -412,6 +413,10 @@ class JsonConvert {
       return data.map<PaymentPageList>((Map<String, dynamic> e) =>
           PaymentPageList.fromJson(e)).toList() as M;
     }
+    if (<PropertyNewsDetailEntity>[] is M) {
+      return data.map<PropertyNewsDetailEntity>((Map<String, dynamic> e) =>
+          PropertyNewsDetailEntity.fromJson(e)).toList() as M;
+    }
     if (<PropertyNewsEntity>[] is M) {
       return data.map<PropertyNewsEntity>((Map<String, dynamic> e) =>
           PropertyNewsEntity.fromJson(e)).toList() as M;
@@ -618,6 +623,7 @@ class JsonConvertClassCollection {
     (NoticeBoardEventEntity).toString(): NoticeBoardEventEntity.fromJson,
     (PaymentPageEntity).toString(): PaymentPageEntity.fromJson,
     (PaymentPageList).toString(): PaymentPageList.fromJson,
+    (PropertyNewsDetailEntity).toString(): PropertyNewsDetailEntity.fromJson,
     (PropertyNewsEntity).toString(): PropertyNewsEntity.fromJson,
     (PropertyNewsList).toString(): PropertyNewsList.fromJson,
     (PropertySaleRentEntity).toString(): PropertySaleRentEntity.fromJson,

+ 70 - 0
packages/cs_domain/lib/generated/json/property_news_detail_entity.g.dart

@@ -0,0 +1,70 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/property_news_detail_entity.dart';
+
+PropertyNewsDetailEntity $PropertyNewsDetailEntityFromJson(
+    Map<String, dynamic> json) {
+  final PropertyNewsDetailEntity propertyNewsDetailEntity = PropertyNewsDetailEntity();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    propertyNewsDetailEntity.id = id;
+  }
+  final String? title = jsonConvert.convert<String>(json['title']);
+  if (title != null) {
+    propertyNewsDetailEntity.title = title;
+  }
+  final String? coverImage = jsonConvert.convert<String>(json['cover_image']);
+  if (coverImage != null) {
+    propertyNewsDetailEntity.coverImage = coverImage;
+  }
+  final String? content = jsonConvert.convert<String>(json['content']);
+  if (content != null) {
+    propertyNewsDetailEntity.content = content;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    propertyNewsDetailEntity.createdAt = createdAt;
+  }
+  final int? likesCount = jsonConvert.convert<int>(json['likes_count']);
+  if (likesCount != null) {
+    propertyNewsDetailEntity.likesCount = likesCount;
+  }
+  final bool? liked = jsonConvert.convert<bool>(json['liked']);
+  if (liked != null) {
+    propertyNewsDetailEntity.liked = liked;
+  }
+  return propertyNewsDetailEntity;
+}
+
+Map<String, dynamic> $PropertyNewsDetailEntityToJson(
+    PropertyNewsDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['title'] = entity.title;
+  data['cover_image'] = entity.coverImage;
+  data['content'] = entity.content;
+  data['created_at'] = entity.createdAt;
+  data['likes_count'] = entity.likesCount;
+  data['liked'] = entity.liked;
+  return data;
+}
+
+extension PropertyNewsDetailEntityExtension on PropertyNewsDetailEntity {
+  PropertyNewsDetailEntity copyWith({
+    int? id,
+    String? title,
+    String? coverImage,
+    String? content,
+    String? createdAt,
+    int? likesCount,
+    bool? liked,
+  }) {
+    return PropertyNewsDetailEntity()
+      ..id = id ?? this.id
+      ..title = title ?? this.title
+      ..coverImage = coverImage ?? this.coverImage
+      ..content = content ?? this.content
+      ..createdAt = createdAt ?? this.createdAt
+      ..likesCount = likesCount ?? this.likesCount
+      ..liked = liked ?? this.liked;
+  }
+}

+ 1 - 3
packages/cs_router/lib/path/router_path.dart

@@ -135,9 +135,7 @@ class RouterPath {
 
   //服务广告
   static const services = '/services';
-  static const servicesList = '/services_list';
-  static const servicesDetail = '/services_detail';
-  static const servicesContact = '/services_detail_contact';
+
 
   //全局其他
   static const previewImage = '/preview/image'; //预览图片