Преглед изворни кода

首页的管理员指引的列表与详情

liukai пре 2 месеци
родитељ
комит
e75e50b538

+ 7 - 5
packages/cpt_main/lib/modules/home/home_page.dart

@@ -458,11 +458,13 @@ class HomePage extends HookConsumerWidget {
           physics: const BouncingScrollPhysics(),
           clipBehavior: Clip.none,
           child: Row(
-            children: List.generate(state.manageGuide.length, (index) {
-              return ManageGuideItem(
-                manageGuide: state.manageGuide[index],
-              );
-            }),
+            children: state.homeIndex?.strataManagementGuides == null
+                ? [const SizedBox.shrink()]
+                : List.generate(state.homeIndex!.strataManagementGuides.length, (index) {
+                    return ManageGuideItem(
+                      manageGuide: state.homeIndex!.strataManagementGuides[index],
+                    );
+                  }),
           ),
         )
       ],

+ 0 - 28
packages/cpt_main/lib/modules/home/home_state.dart

@@ -5,14 +5,11 @@ import 'package:domain/entity/home_list_entity.dart';
 class HomeState {
   final List<Map<String, dynamic>> homeCategory;
   final List<Map<String, dynamic>> lastNews;
-  final List<Map<String, dynamic>> manageGuide;
-
   HomeListEntity? homeIndex;
 
   HomeState({
     List<Map<String, dynamic>>? homeCategory,
     List<Map<String, dynamic>>? lastNews,
-    List<Map<String, dynamic>>? manageGuide,
     this.homeIndex,
   })  : homeCategory = homeCategory ??
             [
@@ -71,30 +68,6 @@ class HomeState {
                 'icon_height': 42.5,
                 'margin_right': 11.0,
               }
-            ],
-        manageGuide = manageGuide ??
-            [
-              {
-                'category_name': S.current.introduction_to_info_pack,
-                'category_icon': Assets.mainIntroductionGuide,
-                'icon_width': 118.5,
-                'icon_height': 73.5,
-                'margin_top': 12.0,
-              },
-              {
-                'category_name': S.current.your_roles_responsibilities,
-                'category_icon': Assets.mainRolesGuide,
-                'icon_width': 116,
-                'icon_height': 78,
-                'margin_top': 8.5,
-              },
-              {
-                'category_name': S.current.property_guide,
-                'category_icon': Assets.mainPropertyGuide,
-                'icon_width': 117.0,
-                'icon_height': 76.5,
-                'margin_top': 10.0,
-              },
             ];
 
   HomeState copyWith({
@@ -104,7 +77,6 @@ class HomeState {
       homeIndex: homeIndex ?? this.homeIndex,
       homeCategory: homeCategory,
       lastNews: lastNews,
-      manageGuide: manageGuide,
     );
   }
 }

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

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

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

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

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

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

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

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

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

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

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

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

+ 6 - 0
packages/cs_domain/lib/constants/api_constants.dart

@@ -62,6 +62,12 @@ class ApiConstants {
   //首页-最新新闻列表
   static const apiLatestNewsDetail = "/api/v1/user/latest/news/detail";
 
+  //首页-管理员指引列表
+  static const apiManageGuideList = "/api/v1/user/strata-management/guide/list";
+
+  //首页-管理员详情
+  static const apiManageGuideDetail = "/api/v1/user/strata-management/guide/detail";
+
   // =========================== Profile ↓=========================================
 
   //用户Me页面详情

+ 51 - 49
packages/cs_domain/lib/entity/home_list_entity.dart

@@ -5,80 +5,82 @@ export 'package:domain/generated/json/home_list_entity.g.dart';
 
 @JsonSerializable()
 class HomeListEntity {
-	List<HomeListBanners> banners = [];
-	@JSONField(name: "latest_transactions")
-	List<HomeListLatestTransactions> latestTransactions = [];
-	@JSONField(name: "property_news")
-	List<HomeListPropertyNews> propertyNews = [];
+  List<HomeListBanners> banners = [];
+  @JSONField(name: "latest_transactions")
+  List<HomeListLatestTransactions> latestTransactions = [];
+  @JSONField(name: "property_news")
+  List<HomeListPropertyNews> propertyNews = [];
+  @JSONField(name: "strata_management_guides")
+  List<HomeListPropertyNews> strataManagementGuides = [];
 
-	HomeListEntity();
+  HomeListEntity();
 
-	factory HomeListEntity.fromJson(Map<String, dynamic> json) => $HomeListEntityFromJson(json);
+  factory HomeListEntity.fromJson(Map<String, dynamic> json) => $HomeListEntityFromJson(json);
 
-	Map<String, dynamic> toJson() => $HomeListEntityToJson(this);
+  Map<String, dynamic> toJson() => $HomeListEntityToJson(this);
 
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
 }
 
 @JsonSerializable()
 class HomeListBanners {
-	String? id;
-	String? name;
-	String? image;
+  String? id;
+  String? name;
+  String? image;
 
-	HomeListBanners();
+  HomeListBanners();
 
-	factory HomeListBanners.fromJson(Map<String, dynamic> json) => $HomeListBannersFromJson(json);
+  factory HomeListBanners.fromJson(Map<String, dynamic> json) => $HomeListBannersFromJson(json);
 
-	Map<String, dynamic> toJson() => $HomeListBannersToJson(this);
+  Map<String, dynamic> toJson() => $HomeListBannersToJson(this);
 
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
 }
 
 @JsonSerializable()
 class HomeListLatestTransactions {
-	String? id;
-	int type = 0;
-	String? title;
-	String? price;
-	@JSONField(name: "created_at")
-	String? createdAt;
+  String? id;
+  int type = 0;
+  String? title;
+  String? price;
+  @JSONField(name: "created_at")
+  String? createdAt;
 
-	HomeListLatestTransactions();
+  HomeListLatestTransactions();
 
-	factory HomeListLatestTransactions.fromJson(Map<String, dynamic> json) => $HomeListLatestTransactionsFromJson(json);
+  factory HomeListLatestTransactions.fromJson(Map<String, dynamic> json) => $HomeListLatestTransactionsFromJson(json);
 
-	Map<String, dynamic> toJson() => $HomeListLatestTransactionsToJson(this);
+  Map<String, dynamic> toJson() => $HomeListLatestTransactionsToJson(this);
 
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
 }
 
 @JsonSerializable()
 class HomeListPropertyNews {
-	String? id;
-	String? title;
-	@JSONField(name: "cover_image")
-	String? coverImage;
-	@JSONField(name: "created_at")
-	String? createdAt;
+  String? id;
+  String? title;
+  @JSONField(name: "cover_image")
+  String? coverImage;
+  @JSONField(name: "created_at")
+  String? createdAt;
 
-	HomeListPropertyNews();
+  HomeListPropertyNews();
 
-	factory HomeListPropertyNews.fromJson(Map<String, dynamic> json) => $HomeListPropertyNewsFromJson(json);
+  factory HomeListPropertyNews.fromJson(Map<String, dynamic> json) => $HomeListPropertyNewsFromJson(json);
 
-	Map<String, dynamic> toJson() => $HomeListPropertyNewsToJson(this);
+  Map<String, dynamic> toJson() => $HomeListPropertyNewsToJson(this);
 
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
-}
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
+}

+ 9 - 1
packages/cs_domain/lib/generated/json/home_list_entity.g.dart

@@ -18,6 +18,11 @@ HomeListEntity $HomeListEntityFromJson(Map<String, dynamic> json) {
   if (propertyNews != null) {
     homeListEntity.propertyNews = propertyNews;
   }
+  final List<HomeListPropertyNews>? strataManagementGuides = (json['strata_management_guides'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<HomeListPropertyNews>(e) as HomeListPropertyNews).toList();
+  if (strataManagementGuides != null) {
+    homeListEntity.strataManagementGuides = strataManagementGuides;
+  }
   return homeListEntity;
 }
 
@@ -26,6 +31,7 @@ Map<String, dynamic> $HomeListEntityToJson(HomeListEntity entity) {
   data['banners'] = entity.banners.map((v) => v.toJson()).toList();
   data['latest_transactions'] = entity.latestTransactions.map((v) => v.toJson()).toList();
   data['property_news'] = entity.propertyNews.map((v) => v.toJson()).toList();
+  data['strata_management_guides'] = entity.strataManagementGuides.map((v) => v.toJson()).toList();
   return data;
 }
 
@@ -34,11 +40,13 @@ extension HomeListEntityExtension on HomeListEntity {
     List<HomeListBanners>? banners,
     List<HomeListLatestTransactions>? latestTransactions,
     List<HomeListPropertyNews>? propertyNews,
+    List<HomeListPropertyNews>? strataManagementGuides,
   }) {
     return HomeListEntity()
       ..banners = banners ?? this.banners
       ..latestTransactions = latestTransactions ?? this.latestTransactions
-      ..propertyNews = propertyNews ?? this.propertyNews;
+      ..propertyNews = propertyNews ?? this.propertyNews
+      ..strataManagementGuides = strataManagementGuides ?? this.strataManagementGuides;
   }
 }
 

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

@@ -313,4 +313,54 @@ class MainRepository {
     }
     return result.convert();
   }
+
+  /// 获取首页管理员指引的列表
+  Future<HttpResult<LatestNewsPageEntity>> fetchManageGuideList({
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['page'] = curPage.toString();
+    params['limit'] = "10";
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiManageGuideList,
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = LatestNewsPageEntity.fromJson(json!);
+      return result.convert<LatestNewsPageEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取首页管理员指引的详情
+  Future<HttpResult<LatestNewsDetailEntity>> fetchManageGuideDetail({
+    required String id,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['id'] = id;
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiManageGuideDetail,
+      params: params,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: true,
+      networkDebounce: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = LatestNewsDetailEntity.fromJson(json!);
+      return result.convert<LatestNewsDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
 }