6 次代碼提交 846c9195a8 ... 2db68129f4

作者 SHA1 備註 提交日期
  liukai 2db68129f4 Merge remote-tracking branch 'origin/dev' into dev 1 周之前
  liukai 0c7985c936 Merge remote-tracking branch 'origin/dev' into dev 1 周之前
  liukai 2dd91b38e3 访客的创建表单 1 周之前
  liukai cd3cd0b5a9 Home页面的二级页面 1 周之前
  liukai 6dc88fe653 通知列表完成,LoadingView + Refresh 刷新,加载更多的模板。分组悬停模板 1 周之前
  liukai 2414b87cb6 首页me页面完善。 1 周之前
共有 78 個文件被更改,包括 3528 次插入95 次删除
  1. 1 1
      packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.g.dart
  2. 1 1
      packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.g.dart
  3. 9 7
      packages/cpt_main/lib/modules/home/home_view_model.dart
  4. 1 1
      packages/cpt_main/lib/modules/home/home_view_model.g.dart
  5. 55 0
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_screen.dart
  6. 31 0
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_state.dart
  7. 130 0
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.dart
  8. 27 0
      packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.g.dart
  9. 54 0
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_screen.dart
  10. 31 0
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_state.dart
  11. 130 0
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.dart
  12. 28 0
      packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.g.dart
  13. 152 0
      packages/cpt_main/lib/modules/home/latest_news/latest_news_page.dart
  14. 54 0
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_screen.dart
  15. 31 0
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_state.dart
  16. 131 0
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.dart
  17. 28 0
      packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.g.dart
  18. 54 0
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_screen.dart
  19. 31 0
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_state.dart
  20. 130 0
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.dart
  21. 28 0
      packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.g.dart
  22. 56 0
      packages/cpt_main/lib/modules/home/management_guides/item_management_guide.dart
  23. 84 0
      packages/cpt_main/lib/modules/home/management_guides/management_guides_page.dart
  24. 32 0
      packages/cpt_main/lib/modules/home/management_guides/management_guides_state.dart
  25. 144 0
      packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.dart
  26. 28 0
      packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.g.dart
  27. 4 0
      packages/cpt_main/lib/modules/home/management_guides/test_guide_bean.dart
  28. 72 0
      packages/cpt_main/lib/modules/home/property_news/home_property_news_page.dart
  29. 31 0
      packages/cpt_main/lib/modules/home/property_news/home_property_news_state.dart
  30. 130 0
      packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.dart
  31. 28 0
      packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.g.dart
  32. 68 0
      packages/cpt_main/lib/modules/home/property_news/item_list_news.dart
  33. 210 28
      packages/cpt_main/lib/modules/me/me_page.dart
  34. 46 0
      packages/cpt_main/lib/modules/me/me_view_model.dart
  35. 25 0
      packages/cpt_main/lib/modules/me/me_view_model.g.dart
  36. 99 0
      packages/cpt_main/lib/modules/notification/item_notification.dart
  37. 26 0
      packages/cpt_main/lib/modules/notification/item_notification_header.dart
  38. 6 0
      packages/cpt_main/lib/modules/notification/notification_group_data.dart
  39. 78 7
      packages/cpt_main/lib/modules/notification/notification_page.dart
  40. 31 0
      packages/cpt_main/lib/modules/notification/notification_state.dart
  41. 160 0
      packages/cpt_main/lib/modules/notification/notification_view_model.dart
  42. 27 0
      packages/cpt_main/lib/modules/notification/notification_view_model.g.dart
  43. 3 1
      packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart
  44. 3 1
      packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart
  45. 305 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_page.dart
  46. 78 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_state.dart
  47. 139 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.dart
  48. 27 0
      packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.g.dart
  49. 22 0
      packages/cpt_main/lib/router/page/main_page_router.dart
  50. 160 0
      packages/cpt_main/lib/router/page/main_page_router.gr.dart
  51. 2 0
      packages/cpt_profile/lib/modules/setting/setting_page.dart
  52. 二進制
      packages/cs_resources/assets/base_lib/item_more_black.webp
  53. 二進制
      packages/cs_resources/assets/main/feedback_waiting_icon.webp
  54. 二進制
      packages/cs_resources/assets/main/latest_info.webp
  55. 二進制
      packages/cs_resources/assets/main/latest_internal.webp
  56. 二進制
      packages/cs_resources/assets/main/latest_property.webp
  57. 二進制
      packages/cs_resources/assets/main/latest_publish.webp
  58. 二進制
      packages/cs_resources/assets/main/me_edit_icon.webp
  59. 二進制
      packages/cs_resources/assets/main/me_estate_icon.webp
  60. 二進制
      packages/cs_resources/assets/main/me_household_icon.webp
  61. 二進制
      packages/cs_resources/assets/main/me_my_post_icon.webp
  62. 二進制
      packages/cs_resources/assets/main/me_setting_icon.webp
  63. 二進制
      packages/cs_resources/assets/main/notification_item_icon.webp
  64. 二進制
      packages/cs_resources/assets/main/success_icon.webp
  65. 二進制
      packages/cs_resources/assets/main/visitor_register_date.webp
  66. 14 0
      packages/cs_resources/lib/generated/assets.dart
  67. 24 8
      packages/cs_resources/lib/generated/intl/messages_en.dart
  68. 20 8
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  69. 20 8
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  70. 128 8
      packages/cs_resources/lib/generated/l10n.dart
  71. 14 2
      packages/cs_resources/lib/l10n/intl_en.arb
  72. 14 2
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  73. 14 2
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  74. 6 0
      packages/cs_resources/lib/theme/app_colors_theme.dart
  75. 7 0
      packages/cs_router/lib/path/router_path.dart
  76. 0 1
      packages/cs_widgets/lib/my_load_image.dart
  77. 3 3
      packages/cs_widgets/lib/shatter/form_require_text.dart
  78. 3 6
      packages/cs_widgets/lib/shatter/setting_item_container.dart

+ 1 - 1
packages/cpt_main/lib/modules/feedback/history/feedback_history_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'feedback_history_view_model.dart';
 // **************************************************************************
 
 String _$feedbackHistoryViewModelHash() =>
-    r'5869d2c0a3ce33d7f4a70a08c361142737840a18';
+    r'1be8a480c3593a25a17cd22deeefe9d707f6151a';
 
 /// See also [FeedbackHistoryViewModel].
 @ProviderFor(FeedbackHistoryViewModel)

+ 1 - 1
packages/cpt_main/lib/modules/feedback/progress/feedback_progress_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'feedback_progress_view_model.dart';
 // **************************************************************************
 
 String _$feedbackProgressViewModelHash() =>
-    r'd9040263f4a23547763ff1f1325a1bff300f77f4';
+    r'0753e433b0a575a262661e6b99030d250b69d0d0';
 
 /// See also [FeedbackProgressViewModel].
 @ProviderFor(FeedbackProgressViewModel)

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

@@ -1,3 +1,4 @@
+import 'package:cpt_main/modules/home/property_news/home_property_news_page.dart';
 import 'package:cpt_main/modules/notification/notification_page.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -5,6 +6,8 @@ import 'package:router/componentRouter/community_service.dart';
 import 'package:router/componentRouter/component_service_manager.dart';
 
 import 'home_state.dart';
+import 'latest_news/latest_news_page.dart';
+import 'management_guides/management_guides_page.dart';
 
 part 'home_view_model.g.dart';
 
@@ -58,16 +61,15 @@ class HomeViewModel extends _$HomeViewModel {
     ComponentServiceManager().rewardsService.startRewardsPage();
   }
 
-  void gotoLastNewsPage(){
-    ToastEngine.show("去最近新闻的页面");
+  void gotoLastNewsPage() {
+    LatestNewsPage.startInstance();
   }
 
-  void gotoPropertyNewsPage(){
-    ToastEngine.show("去房产新闻的页面");
+  void gotoPropertyNewsPage() {
+    HomePropertyNewsPage.startInstance();
   }
 
-  void gotoManageGuidePage(){
-    ToastEngine.show("去管理员指引的页面");
+  void gotoManageGuidePage() {
+    ManagementGuidesPage.startInstance();
   }
-
 }

+ 1 - 1
packages/cpt_main/lib/modules/home/home_view_model.g.dart

@@ -6,7 +6,7 @@ part of 'home_view_model.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$homeViewModelHash() => r'6ec7a8712028daa4d43ace46ea0269981b237187';
+String _$homeViewModelHash() => r'9ad38aa4741b3216454b6652963eb10af930f3d8';
 
 /// See also [HomeViewModel].
 @ProviderFor(HomeViewModel)

+ 55 - 0
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_screen.dart

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

+ 31 - 0
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_state.dart

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

+ 130 - 0
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.dart

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

+ 27 - 0
packages/cpt_main/lib/modules/home/latest_news/info/latest_news_info_view_model.g.dart

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

+ 54 - 0
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_screen.dart

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

+ 31 - 0
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_state.dart

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

+ 130 - 0
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.dart

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

+ 28 - 0
packages/cpt_main/lib/modules/home/latest_news/internal/latest_news_internal_view_model.g.dart

@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'latest_news_internal_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$latestNewsInternalViewModelHash() =>
+    r'109c11826358639b41d979660e1528e63a002be8';
+
+/// See also [LatestNewsInternalViewModel].
+@ProviderFor(LatestNewsInternalViewModel)
+final latestNewsInternalViewModelProvider = AutoDisposeNotifierProvider<
+    LatestNewsInternalViewModel, LatestNewsInternalState>.internal(
+  LatestNewsInternalViewModel.new,
+  name: r'latestNewsInternalViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$latestNewsInternalViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$LatestNewsInternalViewModel
+    = AutoDisposeNotifier<LatestNewsInternalState>;
+// 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

+ 152 - 0
packages/cpt_main/lib/modules/home/latest_news/latest_news_page.dart

@@ -0,0 +1,152 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+import '../../../router/page/main_page_router.dart';
+
+@RoutePage()
+class LatestNewsPage extends StatelessWidget {
+  const LatestNewsPage({Key? key}) : super(key: key);
+
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LatestNewsPageRoute());
+    } else {
+      appRouter.push(const LatestNewsPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: MyAppBar.appBar(
+        context,
+        S.current.latest_news,
+        showBackButton: false,
+        backgroundColor: context.appColors.whiteBG,
+      ),
+      backgroundColor: context.appColors.backgroundDark,
+      body: AutoTabsRouter.pageView(
+        routes: const [
+          LatestNewsPropertyPageRoute(),
+          LatestNewsInternalPageRoute(),
+          LatestNewsInfoPageRoute(),
+          LatestNewsPublishPageRoute(),
+        ],
+        builder: (context, child, pageController) {
+          final tabsRouter = AutoTabsRouter.of(context);
+
+          return Column(
+            children: [
+              Container(
+                color: context.appColors.whiteBG,
+                height: 120,
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceAround,
+                  children: [
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainLatestProperty,
+                      53.5,
+                      47,
+                      S.current.property,
+                      tabsRouter.activeIndex == 0,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(0);
+                      },
+                    ),
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainLatestInternal,
+                      38.5,
+                      45.5,
+                      S.current.internal,
+                      tabsRouter.activeIndex == 1,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(1);
+                      },
+                    ),
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainLatestInfo,
+                      45,
+                      47.5,
+                      S.current.info,
+                      tabsRouter.activeIndex == 2,
+                    ).onTap(
+                      () {
+                        tabsRouter.setActiveIndex(2);
+                      },
+                    ),
+                    _buildFeedbackCategory(
+                      context,
+                      Assets.mainLatestPublish,
+                      44,
+                      47,
+                      S.current.publish,
+                      tabsRouter.activeIndex == 3,
+                    ).onTap(
+                          () {
+                        tabsRouter.setActiveIndex(3);
+                      },
+                    ),
+                  ],
+                ),
+              ),
+              Expanded(
+                child: child,
+              ),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  //顶部的Tab布局
+  Widget _buildFeedbackCategory(BuildContext context, String iconPath, double iconWidth, double iconHeight, String title, bool isSelected) {
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: <Widget>[
+        Container(
+          width: 70,
+          height: 70,
+          decoration: BoxDecoration(
+            color: context.appColors.lightBlueBg, // 设置圆形背景颜色
+            shape: BoxShape.circle, // 设置为圆形
+            boxShadow: isSelected
+                ? [
+                    BoxShadow(
+                      color: context.appColors.tabLightBlueShadow, // 设置阴影颜色
+                      blurRadius: 5, // 设置模糊半径
+                      spreadRadius: 0.05, // 控制阴影扩散
+                      offset: const Offset(0, 4), // 设置阴影偏移量
+                    ),
+                  ]
+                : [], // 未选中时无阴影,
+          ),
+          child: Center(
+            child: MyAssetImage(iconPath, width: iconWidth, height: iconHeight),
+          ),
+        ),
+        const SizedBox(height: 7),
+        MyTextView(
+          title,
+          fontSize: 15,
+          isFontMedium: true,
+          textColor: isSelected ? context.appColors.tabTextSelectedDefault : context.appColors.tabTextUnSelectedDefault,
+        ),
+      ],
+    );
+  }
+}

+ 54 - 0
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_screen.dart

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

+ 31 - 0
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_state.dart

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

+ 131 - 0
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.dart

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

+ 28 - 0
packages/cpt_main/lib/modules/home/latest_news/property/latest_news_property_view_model.g.dart

@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'latest_news_property_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$latestNewsPropertyViewModelHash() =>
+    r'4c01555638d9c2819e0bd77ffb044a9bf9ff2b1f';
+
+/// See also [LatestNewsPropertyViewModel].
+@ProviderFor(LatestNewsPropertyViewModel)
+final latestNewsPropertyViewModelProvider = AutoDisposeNotifierProvider<
+    LatestNewsPropertyViewModel, LatestNewsPropertyState>.internal(
+  LatestNewsPropertyViewModel.new,
+  name: r'latestNewsPropertyViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$latestNewsPropertyViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$LatestNewsPropertyViewModel
+    = AutoDisposeNotifier<LatestNewsPropertyState>;
+// 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

+ 54 - 0
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_screen.dart

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

+ 31 - 0
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_state.dart

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

+ 130 - 0
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.dart

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

+ 28 - 0
packages/cpt_main/lib/modules/home/latest_news/publish/latest_news_publish_view_model.g.dart

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

+ 56 - 0
packages/cpt_main/lib/modules/home/management_guides/item_management_guide.dart

@@ -0,0 +1,56 @@
+import 'package:cpt_main/modules/feedback/feedback_page.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class ManagementGuideItem extends StatelessWidget {
+  final String? iconImage;
+  final String? title;
+
+  ManagementGuideItem({
+    this.iconImage,
+    this.title,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      decoration: BoxDecoration(
+        color: context.appColors.lightBlueBg,
+        borderRadius: BorderRadius.circular(5.0), // 5个圆角
+        boxShadow: [
+          BoxShadow(
+            color: const Color(0xFF656565).withOpacity(0.1), // 阴影颜色,并且设置透明度
+            offset: const Offset(0, 1.5), // 阴影的偏移量
+            blurRadius: 2.5, // 模糊半径
+            spreadRadius: 1.5, // 扩散半径
+          ),
+        ],
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        mainAxisAlignment: MainAxisAlignment.start,
+        children: [
+          AspectRatio(
+            aspectRatio: 165 / 108, // 设置宽高比例为 165:108
+            child: MyAssetImage(
+              iconImage ?? "-",
+              width: double.infinity,
+              height: double.infinity,
+            ),
+          ),
+          MyTextView(
+            title ?? "-",
+            marginLeft: 9,
+            marginTop: 15,
+            maxLines: 2,
+            fontSize: 15,
+            isFontMedium: true,
+            textColor: context.appColors.tabTextUnSelectedPrimary,
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 84 - 0
packages/cpt_main/lib/modules/home/management_guides/management_guides_page.dart

@@ -0,0 +1,84 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'item_management_guide.dart';
+import 'management_guides_view_model.dart';
+
+@RoutePage()
+class ManagementGuidesPage extends HookConsumerWidget {
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const ManagementGuidesPageRoute());
+    } else {
+      appRouter.push(const ManagementGuidesPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(managementGuidesViewModelProvider.notifier);
+    final state = ref.watch(managementGuidesViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(context, S.current.strata_management_guides, backgroundColor: context.appColors.whiteBG),
+      backgroundColor: context.appColors.backgroundDefault,
+      body: Container(
+        width: double.infinity,
+        height: double.infinity,
+        child: EasyRefresh(
+          controller: viewModel.refreshController,
+          onRefresh: viewModel.onRefresh,
+          onLoad: viewModel.loadMore,
+          child: LoadStateLayout(
+            state: state.loadingState,
+            errorMessage: state.errorMessage,
+            errorRetry: () {
+              viewModel.retryRequest();
+            },
+            successSliverWidget: [
+              SliverPadding(
+                padding: const EdgeInsets.symmetric(horizontal: 15.0,vertical: 7), // 设置四周的间距
+                sliver: SliverGrid(
+                  gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+                    crossAxisCount: 2, // 两列
+                    mainAxisSpacing: 10.0, // 主轴(上下)的间距
+                    crossAxisSpacing: 15.0, // 交叉轴(左右)的间距
+                    childAspectRatio: 165 / 181, // 子组件的宽高比
+                  ),
+                  delegate: SliverChildBuilderDelegate(
+                        (BuildContext context, int index) {
+                      return ManagementGuideItem(
+                        iconImage: state.datas[index].iconImage,
+                        title: state.datas[index].title,
+                      ); // 生成每个网格项
+                    },
+                    childCount: state.datas.length, // 总共的网格项数
+                  ),
+                ),
+              )
+            ],
+          ),
+        ).marginOnly(top: 10, bottom: 5),
+      ),
+    );
+  }
+}

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

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

+ 144 - 0
packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.dart

@@ -0,0 +1,144 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.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 {
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
+
+  @override
+  ManagementGuidesState build() {
+    return ManagementGuidesState(datas: []);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchList();
+  }
+
+  /// 获取服务器数据
+  Future fetchList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    final List<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();
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+}

+ 28 - 0
packages/cpt_main/lib/modules/home/management_guides/management_guides_view_model.g.dart

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

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

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

+ 72 - 0
packages/cpt_main/lib/modules/home/property_news/home_property_news_page.dart

@@ -0,0 +1,72 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'item_list_news.dart';
+import 'home_property_news_view_model.dart';
+
+@RoutePage()
+class HomePropertyNewsPage extends HookConsumerWidget {
+
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const HomePropertyNewsPageRoute());
+    } else {
+      appRouter.push(const HomePropertyNewsPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(homePropertyNewsViewModelProvider.notifier);
+    final state = ref.watch(homePropertyNewsViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(context, S.current.property_news, backgroundColor: context.appColors.whiteBG),
+      backgroundColor: context.appColors.backgroundDark,
+      body: Container(
+        width: double.infinity,
+        height: double.infinity,
+        child: EasyRefresh(
+          controller: viewModel.refreshController,
+          onRefresh: viewModel.onRefresh,
+          onLoad: viewModel.loadMore,
+          child: LoadStateLayout(
+            state: state.loadingState,
+            errorMessage: state.errorMessage,
+            errorRetry: () {
+              viewModel.retryRequest();
+            },
+            successSliverWidget: [
+              SliverList(
+                  delegate: SliverChildBuilderDelegate(
+                (context, index) {
+                  return ListNewsItem(index: index, item: state.datas[index]);
+                },
+                childCount: state.datas.length,
+              ))
+            ],
+          ),
+        ).marginOnly(top: 10, bottom: 5),
+      ),
+    );
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/home/property_news/home_property_news_state.dart

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

+ 130 - 0
packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.dart

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

+ 28 - 0
packages/cpt_main/lib/modules/home/property_news/home_property_news_view_model.g.dart

@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'home_property_news_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$homePropertyNewsViewModelHash() =>
+    r'9df28d33819329f1677174f3360970b126cf5f49';
+
+/// See also [HomePropertyNewsViewModel].
+@ProviderFor(HomePropertyNewsViewModel)
+final homePropertyNewsViewModelProvider = AutoDisposeNotifierProvider<
+    HomePropertyNewsViewModel, HomePropertyNewsState>.internal(
+  HomePropertyNewsViewModel.new,
+  name: r'homePropertyNewsViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$homePropertyNewsViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$HomePropertyNewsViewModel
+    = AutoDisposeNotifier<HomePropertyNewsState>;
+// 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

+ 68 - 0
packages/cpt_main/lib/modules/home/property_news/item_list_news.dart

@@ -0,0 +1,68 @@
+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';
+
+///  首页新闻News 的Item
+class ListNewsItem extends StatelessWidget {
+  final int index;
+  final String item;
+
+  const ListNewsItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      height: 117.5,
+      margin: const EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: context.appColors.whiteBG,
+        borderRadius: BorderRadius.circular(6.0), // 圆角
+        boxShadow: [
+          BoxShadow(
+            color: const Color(0xFFB8BFD9).withOpacity(0.3), // 阴影颜色
+            offset: const Offset(0, 3), // 阴影的偏移量
+            blurRadius: 8.0, // 模糊半径
+            spreadRadius: 3.0, // 扩散半径
+          ),
+        ],
+      ),
+      child: Row(
+        mainAxisSize: MainAxisSize.max,
+        children: [
+          MyLoadImage(
+            "https://pic.rmb.bdstatic.com/bjh/news/e991d703e32e11c2414ca1298410cc3a8789.jpeg",
+            width: 100,
+            height: 117.5,
+          ).marginOnly(right: 18),
+          Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              MyTextView(
+                "On Monday, the real estate market stopped falling and stabilized, and a devices",
+                marginTop: 12,
+                fontSize: 16,
+                maxLines: 3,
+                textColor: context.appColors.textBlack,
+                isFontMedium: true,
+              ).expanded(),
+              MyTextView(
+                "Monday 14 0ct 2024",
+                fontSize: 12,
+                marginBottom: 12,
+                marginTop: 12,
+                textColor: context.appColors.textBlack,
+                isFontRegular: true,
+              ),
+            ],
+          ).expanded(),
+        ],
+      ),
+    );
+  }
+}

+ 210 - 28
packages/cpt_main/lib/modules/me/me_page.dart

@@ -1,41 +1,223 @@
+import 'package:cpt_main/modules/demo_page.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:cs_resources/theme/theme_config.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
-import 'package:plugin_basic/modules/global_web_page.dart';
-import 'package:plugin_basic/provider/user_config/user_config_service.dart';
-import 'package:router/componentRouter/component_service_manager.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/setting_item_container.dart';
+
+import 'me_view_model.dart';
 
 @RoutePage()
-class MePage extends StatelessWidget {
+class MePage extends HookConsumerWidget {
   const MePage({Key? key}) : super(key: key);
 
   @override
-  Widget build(BuildContext context) {
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(meViewModelProvider.notifier);
+
     return Scaffold(
-      appBar: AppBar(title: Text("Me")),
-      body:Center(
-        child: Column(
-          children: [
-            ElevatedButton(
-              onPressed: () {
-                UserConfigService.getInstance().setUserInfo("李四");
-              },
-              child: const Text('跨页面修改用户信息'),
-            ),
-            ElevatedButton(
-              onPressed: () {
-               ComponentServiceManager().profileService.startEditProfilePage(context: context);
-              },
-              child: const Text('Go to Edit Profile Page'),
-            ),
-            ElevatedButton(
-              onPressed: () {
-               GlobalWebPage.startInstance(context: context, title: "baidu", url: "https://www.baidu.com");
-              },
-              child: const Text('Go to Global Web Page'),
-            ),
-          ],
+      appBar: MyAppBar.appBar(
+        context,
+        "",
+        showBackButton: false,
+        backgroundColor: context.appColors.btnBgDefault,
+        systemUiOverlayStyle: ThemeConfig.systemUiOverlayStyleLightThemeWhite,
+      ),
+      backgroundColor: context.appColors.backgroundDark,
+      body: SingleChildScrollView(
+        scrollDirection: Axis.vertical,
+        physics: const BouncingScrollPhysics(),
+        child: SizedBox(
+          width: double.infinity,
+          child: Column(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              //顶部信息
+              _buildTopProfile(context, ref),
+
+              //关注与粉丝
+              _buildFollower(context, ref),
+
+              //我的发布
+              SettingItemContainer(
+                title: S.current.my_post,
+                iconPath: Assets.mainMeMyPostIcon,
+                isShowMoreIcon: true,
+                rightWidget: MyTextView(
+                  "265",
+                  textColor: context.appColors.textPrimary,
+                  fontSize: 20,
+                  isFontMedium: true,
+                ),
+              ).onTap(viewModel.gotoMyPostPage).marginOnly(top: 10),
+
+              //家庭
+              SettingItemContainer(
+                title: S.current.household,
+                iconPath: Assets.mainMeHouseholdIcon,
+                isShowMoreIcon: true,
+                rightWidget: MyTextView(
+                  "2",
+                  textColor: context.appColors.textPrimary,
+                  fontSize: 20,
+                  isFontMedium: true,
+                ),
+              ).onTap(viewModel.gotoMyHouseholdPage),
+
+              //房产
+              SettingItemContainer(
+                title: S.current.estate,
+                iconPath: Assets.mainMeEstateIcon,
+                isShowMoreIcon: true,
+                rightWidget: MyTextView(
+                  "2",
+                  textColor: context.appColors.textPrimary,
+                  fontSize: 20,
+                  isFontMedium: true,
+                ),
+              ).onTap(viewModel.gotoMyEstatePage),
+
+              //设置
+              SettingItemContainer(
+                title: S.current.settings,
+                iconPath: Assets.mainMeSettingIcon,
+                isShowMoreIcon: true,
+              ).onTap(viewModel.gotoSettingPage),
+
+            ],
+          ),
         ),
       ),
     );
   }
+
+  //编辑顶部的关注与粉丝数量
+  Widget _buildFollower(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(meViewModelProvider.notifier);
+    return Container(
+      color: context.appColors.whiteSecondBG,
+      width: double.infinity,
+      height: 50,
+      child: Row(
+        children: [
+          //关注
+          Row(
+            mainAxisSize: MainAxisSize.min,
+            mainAxisAlignment: MainAxisAlignment.center,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                S.current.following,
+                isFontBold: true,
+                fontSize: 16,
+                textColor: context.appColors.textBlack,
+              ),
+              MyTextView(
+                "(26)",
+                isFontBold: true,
+                fontSize: 16,
+                textColor: context.appColors.textPrimary,
+              ),
+            ],
+          ).onTap(viewModel.gotoFollowingPage).expanded(),
+
+          Container(
+            width: 0.5,
+            height: 50,
+            color: context.appColors.dividerDefault,
+          ),
+          //粉丝
+          Row(
+            mainAxisSize: MainAxisSize.min,
+            mainAxisAlignment: MainAxisAlignment.center,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                S.current.followers,
+                isFontBold: true,
+                fontSize: 16,
+                textColor: context.appColors.textBlack,
+              ),
+              MyTextView(
+                "(12)",
+                isFontBold: true,
+                fontSize: 16,
+                textColor: context.appColors.textPrimary,
+              ),
+            ],
+          ).onTap(viewModel.gotoFollowerPage).expanded(),
+        ],
+      ),
+    );
+  }
+
+  // 编辑顶部的个人信息
+  Widget _buildTopProfile(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(meViewModelProvider.notifier);
+    return Container(
+      color: context.appColors.btnBgDefault,
+      width: double.infinity,
+      padding: const EdgeInsets.only(left: 26, right: 20, top: 5),
+      height: 120,
+      child: Row(
+        mainAxisSize: MainAxisSize.max,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyLoadImage(
+            "https://img1.baidu.com/it/u=1656098746,3560654086&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=800",
+            width: 80,
+            height: 80,
+            isCircle: true,
+          ),
+          Column(
+            mainAxisSize: MainAxisSize.min,
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Row(
+                children: [
+                  MyTextView(
+                    "Wu Bing Bing",
+                    textColor: Colors.white,
+                    fontSize: 18,
+                    isFontMedium: true,
+                  ).expanded(),
+                  const MyAssetImage(
+                    Assets.mainMeEditIcon,
+                    width: 20.5,
+                    height: 20,
+                  ).onTap(viewModel.gotoEditProfilePage, padding: 5),
+                ],
+              ),
+
+              //电话
+              MyTextView(
+                "+86 12345678901",
+                textColor: Colors.white,
+                fontSize: 15,
+                isFontRegular: true,
+              ),
+
+              //住宅
+              MyTextView(
+                "Owner135 #08-29",
+                marginTop: 12,
+                textColor: Colors.white,
+                fontSize: 15,
+                isFontRegular: true,
+              ),
+            ],
+          ).marginOnly(left: 11).expanded(),
+        ],
+      ),
+    );
+  }
 }

+ 46 - 0
packages/cpt_main/lib/modules/me/me_view_model.dart

@@ -0,0 +1,46 @@
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
+
+part 'me_view_model.g.dart';
+
+@riverpod
+class MeViewModel extends _$MeViewModel {
+  @override
+  void build() {}
+
+  //去我的房产页面
+  void gotoMyEstatePage() {
+    ToastEngine.show("去我的房产页面");
+  }
+
+  //去我的家庭成员页面
+  void gotoMyHouseholdPage() {
+    ToastEngine.show("去我的家庭成员页面");
+  }
+
+  //去我的发布页面
+  void gotoMyPostPage() {
+    ToastEngine.show("去我的发布页面");
+  }
+
+  //去设置页面
+  void gotoSettingPage() {
+    ComponentServiceManager().profileService.startSettingPage();
+  }
+
+  //我的关注Tab
+  void gotoFollowingPage() {
+    ToastEngine.show("我的关注Tab");
+  }
+
+  //我的粉丝Tab
+  void gotoFollowerPage() {
+    ToastEngine.show("我的粉丝Tab");
+  }
+
+  //编辑附加信息
+  void gotoEditProfilePage() {
+    ToastEngine.show("编辑附加信息");
+  }
+}

+ 25 - 0
packages/cpt_main/lib/modules/me/me_view_model.g.dart

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

+ 99 - 0
packages/cpt_main/lib/modules/notification/item_notification.dart

@@ -0,0 +1,99 @@
+import 'package:cpt_main/modules/demo_page.dart';
+import 'package:cpt_main/modules/notification/notification_group_data.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class NotificationItem extends StatelessWidget {
+  final String item;
+  final int index;
+
+  const NotificationItem({
+    required this.item,
+    required this.index,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      color: context.appColors.whiteBG,
+      padding: const EdgeInsets.only(left: 11, right: 15, top: 10.5),
+      child: Column(
+        children: [
+          Row(
+            children: [
+              const MyAssetImage(Assets.mainNotificationItemIcon, width: 42.5, height: 42.5).marginOnly(right: 16),
+              Column(
+                children: [
+                  //标题
+                  Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    children: [
+                      //未读的小圆点
+                      Container(
+                        width: 6,
+                        height: 6,
+                        margin: const EdgeInsets.only(right: 8.5),
+                        decoration: BoxDecoration(
+                          shape: BoxShape.circle,
+                          color: context.appColors.tabBgSelectedPrimary,
+                        ),
+                      ),
+
+                      //消息标题
+                      MyTextView(
+                        "NEW ANNOUNCEMENT",
+                        fontSize: 16,
+                        isFontBold: true,
+                        textColor: context.appColors.textBlack,
+                        maxLines: 2,
+                      ).expanded(),
+
+                      //消息时间
+                      MyTextView(
+                        "10:19 AM",
+                        fontSize: 13,
+                        isFontRegular: true,
+                        textColor: context.appColors.textLightPurple,
+                      ),
+                    ],
+                  ),
+
+                  //内容
+                  Row(
+                    children: [
+                      //文本内容
+                      MyTextView(
+                        "Standard operating procedure for replacement vehicles andover night parking vehicles.",
+                        fontSize: 15,
+                        marginRight: 15,
+                        isFontRegular: true,
+                        textColor: context.appColors.textBlack,
+                      ).expanded(),
+
+                      //图片
+                      MyLoadImage(
+                        "https://img1.baidu.com/it/u=1656098746,3560654086&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=800",
+                        width: 87.5,
+                        height: 60.5,
+                      ),
+                    ],
+                  ).marginOnly(top: 9),
+                ],
+              ).expanded(),
+            ],
+          ),
+          const SizedBox(height: 17.5),
+          Divider(
+            height: 0.5,
+            color: context.appColors.backgroundDark,
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 26 - 0
packages/cpt_main/lib/modules/notification/item_notification_header.dart

@@ -0,0 +1,26 @@
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/my_text_view.dart';
+
+class NotificationItemHeader extends StatelessWidget {
+  String? groupId;
+
+  NotificationItemHeader(this.groupId);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      color: context.appColors.backgroundDark,
+      padding: const EdgeInsets.symmetric(horizontal: 14),
+      child: MyTextView(
+        groupId ?? "-",
+        fontSize: 14,
+        paddingTop: 8,
+        paddingBottom: 8,
+        isFontMedium: true,
+        textColor: context.appColors.textBlack,
+      ),
+    );
+  }
+}

+ 6 - 0
packages/cpt_main/lib/modules/notification/notification_group_data.dart

@@ -0,0 +1,6 @@
+
+//对应分组的数据,需要在ViewModel中处理每一个组的数据
+class NotificationGroupData{
+  String? groupId;
+  List<String>? groupDatas=[];
+}

+ 78 - 7
packages/cpt_main/lib/modules/notification/notification_page.dart

@@ -1,11 +1,23 @@
+import 'package:cpt_main/modules/notification/item_notification_header.dart';
 import 'package:cpt_main/router/page/main_page_router.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:router/ext/auto_router_extensions.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_text_view.dart';
+import 'package:widgets/widget_export.dart';
 
-@RoutePage()
-class NotificationPage extends StatelessWidget {
+import 'item_notification.dart';
+import 'notification_view_model.dart';
 
+@RoutePage()
+class NotificationPage extends HookConsumerWidget {
   const NotificationPage({Key? key}) : super(key: key);
 
   static void startInstance({BuildContext? context}) {
@@ -17,12 +29,71 @@ class NotificationPage extends StatelessWidget {
   }
 
   @override
-  Widget build(BuildContext context) {
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.read(notificationViewModelProvider.notifier);
+    final state = ref.watch(notificationViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchList());
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
     return Scaffold(
-      appBar: AppBar(title: Text("NotificationPage")),
-      body: Center(
-        child: Text("Notification Page"),
+      appBar: MyAppBar.appBar(context, S.current.notification,
+          backgroundColor: context.appColors.whiteBG,
+          actions: [
+            Center(
+                child: MyTextView(
+              S.current.mark_all,
+              fontSize: 16,
+              textColor: context.appColors.textPrimary,
+              onClick: viewModel.markAll,
+              isFontRegular: true,
+              marginRight: 15,
+            )),
+          ],
+          showBottomDivider: false),
+      backgroundColor: context.appColors.whiteBG,
+      body: SizedBox(
+        width: double.infinity,
+        height: double.infinity,
+        child: EasyRefresh(
+          controller: viewModel.refreshController,
+          onRefresh: viewModel.onRefresh,
+          onLoad: viewModel.loadMore,
+          child: LoadStateLayout(
+            state: state.loadingState,
+            errorMessage: state.errorMessage,
+            errorRetry: () {
+              viewModel.retryRequest();
+            },
+            successSliverWidget: [
+              SliverList(
+                  delegate: SliverChildBuilderDelegate(
+                (context, index) {
+                  return StickyHeader(
+                    header: NotificationItemHeader(state.datas[index].groupId),
+                    content: Column(
+                      children: _buildGroup(state.datas[index].groupDatas!, index),
+                    ),
+                  );
+                },
+                childCount: state.datas.length,
+              ))
+            ],
+          ),
+        ),
       ),
     );
   }
-}
+
+  //当前组内的子数据
+  _buildGroup(List<String> list, int index) {
+    return list.map((item) {
+      return NotificationItem(item: item, index: index);
+    }).toList();
+  }
+}

+ 31 - 0
packages/cpt_main/lib/modules/notification/notification_state.dart

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

+ 160 - 0
packages/cpt_main/lib/modules/notification/notification_view_model.dart

@@ -0,0 +1,160 @@
+import 'package:cpt_main/modules/notification/notification_group_data.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'notification_state.dart';
+
+part 'notification_view_model.g.dart';
+
+@riverpod
+class NotificationViewModel extends _$NotificationViewModel {
+  @override
+  NotificationState build() {
+    return NotificationState(datas: []);
+  }
+
+  var _curPage = 1; //请求参数当前的页面
+  var _needShowPlaceholder = true; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchList();
+  }
+
+  /// 获取服务器数据
+  Future fetchList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    // 获取 Applied 列表
+    // var listResult = await _jobRepository.fetchJobAppliedList(
+    //   state.jobId,
+    //   state.selectedStatusId,
+    //   state.keyword,
+    //   curPage: _curPage,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // // 处理数据
+    // if (listResult.isSuccess) {
+    //   handleList(listResult.data?.rows);
+    // } else {
+    //   errorMessage = listResult.errorMsg;
+    //   changeLoadingState(LoadState.State_Error);
+    // }
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    List<NotificationGroupData> list = [];
+    if (_curPage > 1) {
+
+      //这里只加载一页吧
+    } else {
+
+      list.add(NotificationGroupData()
+        ..groupId = "Toady"
+        ..groupDatas = ["1", "2", "3", "4"]);
+
+      list.add(NotificationGroupData()
+        ..groupId = "Friday 11 oct 2024"
+        ..groupDatas = ["1", "2", "3"]);
+
+      list.add(NotificationGroupData()
+        ..groupId = "Thursday 10 oct 2024"
+        ..groupDatas = ["1", "2"]);
+
+      list.add(NotificationGroupData()
+        ..groupId = "Wednesday 9 oct 2024"
+        ..groupDatas = ["1"]);
+
+    }
+
+
+    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();
+      refreshController.finishLoad(IndicatorResult.noMore);
+
+      state = state.copyWith(datas: allList);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+// 处理数据与展示的逻辑
+// void handleList(List<JobAppliedListSGRows>? list) {
+//   if (list != null && list.isNotEmpty) {
+//     //有数据,判断是刷新还是加载更多的数据
+//     if (_curPage == 1) {
+//       //刷新的方式
+//       state.datas.clear();
+//       state.datas.addAll(list);
+//       refreshController.finishRefresh();
+//
+//       //更新展示的状态
+//       changeLoadingState(LoadState.State_Success);
+//     } else {
+//       //加载更多
+//       state.datas.addAll(list);
+//       refreshController.finishLoad();
+//       update();
+//     }
+//   } else {
+//     if (_curPage == 1) {
+//       //展示无数据的布局
+//       state.datas.clear();
+//       changeLoadingState(LoadState.State_Empty);
+//       refreshController.finishRefresh();
+//     } else {
+//       //展示加载完成,没有更多数据了
+//       refreshController.finishLoad(IndicatorResult.noMore);
+//     }
+//   }
+// }
+
+  /// 点击标记全部
+  void markAll() {
+    ToastEngine.show("点击标记全部");
+  }
+
+}

+ 27 - 0
packages/cpt_main/lib/modules/notification/notification_view_model.g.dart

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

+ 3 - 1
packages/cpt_main/lib/modules/visitor/now/visitor_now_large.dart

@@ -9,6 +9,8 @@ import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
+import '../register/visitor_register_page.dart';
+
 class VisitorNowLarge extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
@@ -33,7 +35,7 @@ class VisitorNowLarge extends StatelessWidget {
             ),
             MyButton(
               onPressed: () {
-                ToastEngine.show("去填写表单");
+                VisitorRegisterPage.startInstance(context: context);
               },
               text: S.current.visitor_registration,
               textColor: Colors.white,

+ 3 - 1
packages/cpt_main/lib/modules/visitor/now/visitor_now_small.dart

@@ -9,6 +9,8 @@ import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
+import '../register/visitor_register_page.dart';
+
 class VisitorNowSmall extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
@@ -30,7 +32,7 @@ class VisitorNowSmall extends StatelessWidget {
           ),
           MyButton(
             onPressed: (){
-              ToastEngine.show("去填写表单");
+              VisitorRegisterPage.startInstance(context: context);
             },
             text: S.current.visitor_registration,
             textColor: Colors.white,

+ 305 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_page.dart

@@ -0,0 +1,305 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+
+import '../../../router/page/main_page_router.dart';
+import 'visitor_register_state.dart';
+import 'visitor_register_view_model.dart';
+
+@RoutePage()
+class VisitorRegisterPage extends HookConsumerWidget {
+  const VisitorRegisterPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const VisitorRegisterPageRoute());
+    } else {
+      appRouter.push(const VisitorRegisterPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(visitorRegisterViewModelProvider.notifier);
+    final state = ref.watch(visitorRegisterViewModelProvider);
+    final noteCount = useState(0);
+   
+    return Scaffold(
+      appBar: MyAppBar.appBar(context, S.current.visitor_registration),
+      backgroundColor: context.appColors.whiteBG,
+      body: SingleChildScrollView(
+        scrollDirection: Axis.vertical,
+        physics: const BouncingScrollPhysics(),
+        child: Container(
+          margin: const EdgeInsets.symmetric(horizontal: 15),
+          width: double.infinity,
+          child: Column(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              //全名
+              FormRequireText(
+                text: S.current.full_name,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                marginTop: 16,
+                "full_name",
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                errorText: state.fullNameErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['phone']!['focusNode']);
+                },
+              ),
+
+              //移动电话
+              FormRequireText(
+                text: S.current.mobile_phone,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "phone",
+                marginTop: 16,
+                textInputType: TextInputType.phone,
+                textInputAction: TextInputAction.next,
+                errorText: state.phoneErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['nric']!['focusNode']);
+                },
+              ),
+
+              // 身份证
+              FormRequireText(
+                text: S.current.nric_fin,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+              ).marginOnly(top: 14.5),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "nric",
+                marginTop: 15,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                errorText: state.nricErrorText,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['plate_number']!['focusNode']);
+                },
+              ),
+
+              // 车牌号
+              MyTextView(
+                S.current.license_plate_number,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "plate_number",
+                marginTop: 15,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['access_date']!['focusNode']);
+                },
+              ),
+
+              // 通行时间
+              MyTextView(
+                S.current.access_date,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              // 表单
+              _buildInputLayout(
+                context,
+                state,
+                "access_date",
+                marginTop: 15,
+                enable: false,
+                textInputType: TextInputType.text,
+                textInputAction: TextInputAction.next,
+                showRightIcon: true,
+                rightWidget: const MyAssetImage(Assets.mainVisitorRegisterDate, width: 21, height: 20).paddingOnly(top: 13, bottom: 13),
+                onSubmit: (formKey, value) {
+                  state.formData[formKey]!['focusNode'].unfocus();
+                  FocusScope.of(context).requestFocus(state.formData['note']!['focusNode']);
+                },
+              ).onTap(() {
+                viewModel.pickAccessDate();
+              }),
+
+              // 备注
+              MyTextView(
+                S.current.notes,
+                textColor: context.appColors.textBlack,
+                fontSize: 17,
+                marginTop: 14.5,
+                isFontMedium: true,
+              ),
+              //大文本框
+              IgnoreKeyboardDismiss(
+                child: Container(
+                  height: 177,
+                  margin: const EdgeInsets.only(top: 16),
+                  padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                  decoration: BoxDecoration(
+                    color: context.appColors.authFiledBG,
+                    borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  ),
+                  child: Stack(
+                    children: [
+                      TextField(
+                        cursorColor: context.appColors.authFiledText,
+                        cursorWidth: 1.5,
+                        autofocus: false,
+                        enabled: true,
+                        focusNode: state.formData["note"]!['focusNode'],
+                        controller: state.formData["note"]!['controller'],
+                        decoration: InputDecoration(
+                          isDense: true,
+                          isCollapsed: true,
+                          border: InputBorder.none,
+                          hintText: state.formData["note"]!['hintText'],
+                          hintStyle: TextStyle(
+                            color: context.appColors.authFiledHint,
+                            fontSize: 16.0,
+                            fontWeight: FontWeight.w500,
+                          ),
+                        ),
+                        style: TextStyle(
+                          color: context.appColors.authFiledText,
+                          fontSize: 16.0,
+                          fontWeight: FontWeight.w500,
+                        ),
+                        textInputAction: TextInputAction.done,
+                        onSubmitted: (value) {
+                          FocusScope.of(context).unfocus();
+                          viewModel.submitVisitorRegister();
+                        },
+                        maxLines: null,
+                        expands: true,
+                        onChanged: (text) {
+                          // 当文本改变时,更新字符数量
+                          noteCount.value = text.length;
+                        },
+                      ),
+                      Positioned(
+                        bottom: 0.0,
+                        right: 0.0,
+                        child: Text(
+                          S.current.characters(noteCount.value),
+                          style: TextStyle(
+                            color: context.appColors.textBlack,
+                            fontSize: 15.0,
+                          ),
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+
+              MyButton(
+                onPressed: viewModel.submitVisitorRegister,
+                text: S.current.submit,
+                textColor: Colors.white,
+                backgroundColor: context.appColors.btnBgDefault,
+                fontWeight: FontWeight.w500,
+                type: ClickType.throttle,
+                fontSize: 16,
+                minHeight: 50,
+                radius: 5,
+              ).marginOnly(top: 25, bottom: 25),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+
+  /// 输入框
+  Widget _buildInputLayout(
+    BuildContext context,
+    VisitorRegisterState state,
+    String key, {
+    double marginTop = 0,
+    bool? showRightIcon = false, //是否展示右侧的布局
+    Widget? rightWidget, //右侧的布局
+    TextInputType textInputType = TextInputType.text,
+    String? errorText,
+    bool obscureText = false,
+    bool enable = true,
+    TextInputAction textInputAction = TextInputAction.done,
+    Function? onSubmit,
+  }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        state.formData[key]!['value'],
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: state.formData[key]!['controller'],
+        focusNode: state.formData[key]!['focusNode'],
+        margin: EdgeInsets.only(top: marginTop),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
+      ),
+    );
+  }
+}

+ 78 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_state.dart

@@ -0,0 +1,78 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/material.dart';
+
+class VisitorRegisterState {
+  //表单的校验与数据
+  final Map<String, Map<String, dynamic>> formData;
+
+  //表单的错误信息展示
+  String? fullNameErrorText;
+  String? phoneErrorText;
+  String? nricErrorText;
+
+  DateTime? accessDate; //通行时间
+
+  // ===================================  Begin  ↓  ===================================
+
+  VisitorRegisterState({
+    Map<String, Map<String, dynamic>>? formData,
+    this.fullNameErrorText,
+    this.phoneErrorText,
+    this.nricErrorText,
+    this.accessDate,
+  }) : formData = formData ??
+            {
+              'full_name': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'phone': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'nric': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'plate_number': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'access_date': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'obsecure': false,
+              },
+              'note': {
+                'value': '',
+                'controller': TextEditingController(),
+                'focusNode': FocusNode(),
+                'hintText': S.current.type_here,
+                'obsecure': false,
+              },
+            };
+
+  VisitorRegisterState copyWith({
+    String? fullNameErrorText,
+    String? phoneErrorText,
+    String? nricErrorText,
+    DateTime? accessDate,
+  }) {
+    return VisitorRegisterState(
+      formData: this.formData,
+      fullNameErrorText: fullNameErrorText,
+      phoneErrorText: phoneErrorText,
+      nricErrorText: nricErrorText,
+      accessDate: accessDate ?? this.accessDate,
+    );
+  }
+}

+ 139 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.dart

@@ -0,0 +1,139 @@
+
+import 'package:cpt_main/modules/main/main_page.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'visitor_register_state.dart';
+part 'visitor_register_view_model.g.dart';
+
+@riverpod
+class VisitorRegisterViewModel extends _$VisitorRegisterViewModel {
+
+  @override
+  VisitorRegisterState build(){
+    final state = VisitorRegisterState();
+    initListener(state);
+    ref.onDispose(() {
+      onDispose(state);
+    });
+    return state;
+  }
+
+  //提交表单
+  void submitVisitorRegister() {
+    state = state.copyWith(
+      fullNameErrorText: null,
+      phoneErrorText: null,
+      nricErrorText: null,
+    );
+
+    final FocusNode fullNameFocusNode = state.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = state.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = state.formData['nric']!['focusNode'];
+    final FocusNode plateNumberFocusNode = state.formData['plate_number']!['focusNode'];
+    final FocusNode noteFocusNode = state.formData['note']!['focusNode'];
+
+    fullNameFocusNode.unfocus();
+    phoneFocusNode.unfocus();
+    nricFocusNode.unfocus();
+    plateNumberFocusNode.unfocus();
+    noteFocusNode.unfocus();
+
+    final TextEditingController fullNameController = state.formData['full_name']!['controller'];
+    final TextEditingController phoneController = state.formData['phone']!['controller'];
+    final TextEditingController nricController = state.formData['nric']!['controller'];
+    final TextEditingController plateNumberController = state.formData['plate_number']!['controller'];
+    final TextEditingController noteController = state.formData['note']!['controller'];
+
+    final fullName = fullNameController.text;
+    final phone = phoneController.text;
+    final nric = nricController.text;
+    final plateNumber = plateNumberController.text;
+    final note = noteController.text;
+    final accessDate = state.accessDate == null ?  null : DateTimeUtils.formatDate(state.accessDate!,format: 'yyyy-MM-dd');
+
+    Log.d('当前待提交的 fullName:$fullName phone:$phone nric:$nric plateNumber:$plateNumber note:$note accessDate:$accessDate');
+
+    if (Utils.isEmpty(fullName)) {
+      state = state.copyWith(fullNameErrorText: "Full Name cannot be empty!");
+      return;
+    }
+
+    if (Utils.isEmpty(phone)) {
+      state = state.copyWith(phoneErrorText: "Mobile Number cannot be empty!");
+      return;
+    }
+
+    if (Utils.isEmpty(nric)) {
+      state = state.copyWith(nricErrorText: "NRIC/FIN cannot be empty!");
+      return;
+    }
+
+    //执行密码登录
+    ToastEngine.show('准备执行请求发送验证码 fullName:$fullName phone:$phone nric:$nric plateNumber:$plateNumber note:$note accessDate:$accessDate');
+
+    //去首页
+    MainPage.startInstance();
+  }
+
+  //选择通行时间
+  void pickAccessDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.accessDate ?? DateTime.now(),
+      mode: CupertinoDatePickerMode.date,
+      onDateTimeChanged: (date) {
+       state = state.copyWith(accessDate: date);
+       final TextEditingController accessDateController = state.formData['access_date']!['controller'];
+       accessDateController.text = DateTimeUtils.formatDate(date,format: 'dd MMM yyyy');
+      },
+      title: S.current.access_date,
+    );
+  }
+
+  //初始化监听
+  void initListener(VisitorRegisterState initState) {
+    final FocusNode fullNameFocusNode = initState.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = initState.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = initState.formData['nric']!['focusNode'];
+
+    fullNameFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (fullNameFocusNode.hasFocus) {
+        state = state.copyWith(fullNameErrorText: null);
+      }
+    });
+
+    phoneFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (phoneFocusNode.hasFocus) {
+        state = state.copyWith(phoneErrorText: null);
+      }
+    });
+
+    nricFocusNode.addListener(() {
+      // 获取焦点的时候清空错误文本
+      if (nricFocusNode.hasFocus) {
+        state = state.copyWith(nricErrorText: null);
+      }
+    });
+  }
+
+  //销毁资源
+  void onDispose(VisitorRegisterState initState) {
+    final FocusNode fullNameFocusNode = initState.formData['full_name']!['focusNode'];
+    final FocusNode phoneFocusNode = initState.formData['phone']!['focusNode'];
+    final FocusNode nricFocusNode = initState.formData['nric']!['focusNode'];
+    fullNameFocusNode.dispose();
+    phoneFocusNode.dispose();
+    nricFocusNode.dispose();
+
+    Log.d("VisitorRegisterViewModel 销毁 onDispose");
+  }
+
+}

+ 27 - 0
packages/cpt_main/lib/modules/visitor/register/visitor_register_view_model.g.dart

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

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

@@ -15,6 +15,14 @@ import '../../modules/visitor/visitor_page.dart';
 import '../../modules/visitor/now/visitor_now.dart';
 import '../../modules/visitor/active/visitor_active.dart';
 import '../../modules/visitor/history/visitor_history.dart';
+import '../../modules/home/property_news/home_property_news_page.dart';
+import '../../modules/home/latest_news/info/latest_news_info_screen.dart';
+import '../../modules/home/latest_news/internal/latest_news_internal_screen.dart';
+import '../../modules/home/latest_news/property/latest_news_property_screen.dart';
+import '../../modules/home/latest_news/publish/latest_news_publish_screen.dart';
+import '../../modules/home/latest_news/latest_news_page.dart';
+import '../../modules/home/management_guides/management_guides_page.dart';
+import '../../modules/visitor/register/visitor_register_page.dart';
 
 part 'main_page_router.gr.dart';
 
@@ -53,5 +61,19 @@ class MainPageRouter extends _$MainPageRouter {
           ],
         ),
         CustomRoute(page: NotificationPageRoute.page, path: RouterPath.notification, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: HomePropertyNewsPageRoute.page, path: RouterPath.homePropertyNews, transitionsBuilder: applySlideTransition),
+        CustomRoute(
+          page: LatestNewsPageRoute.page,
+          path: RouterPath.homeLatestNews,
+          transitionsBuilder: applySlideTransition,
+          children: [
+            AutoRoute(page: LatestNewsPropertyPageRoute.page, path: 'property'),
+            AutoRoute(page: LatestNewsInternalPageRoute.page, path: 'internal'),
+            AutoRoute(page: LatestNewsInfoPageRoute.page, path: 'info'),
+            AutoRoute(page: LatestNewsPublishPageRoute.page, path: 'publish'),
+          ],
+        ),
+        CustomRoute(page: ManagementGuidesPageRoute.page, path: RouterPath.homeManagementGuides, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: VisitorRegisterPageRoute.page, path: RouterPath.visitorRegister, transitionsBuilder: applySlideTransition),
       ];
 }

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

@@ -45,12 +45,54 @@ abstract class _$MainPageRouter extends RootStackRouter {
         child: const HomePage(),
       );
     },
+    HomePropertyNewsPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: HomePropertyNewsPage(),
+      );
+    },
+    LatestNewsInfoPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: LatestNewsInfoScreen(),
+      );
+    },
+    LatestNewsInternalPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: LatestNewsInternalScreen(),
+      );
+    },
+    LatestNewsPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const LatestNewsPage(),
+      );
+    },
+    LatestNewsPropertyPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: LatestNewsPropertyScreen(),
+      );
+    },
+    LatestNewsPublishPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: LatestNewsPublishScreen(),
+      );
+    },
     MainPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         child: const MainPage(),
       );
     },
+    ManagementGuidesPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: ManagementGuidesPage(),
+      );
+    },
     MePageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -87,6 +129,12 @@ abstract class _$MainPageRouter extends RootStackRouter {
         child: const VisitorPage(),
       );
     },
+    VisitorRegisterPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const VisitorRegisterPage(),
+      );
+    },
   };
 }
 
@@ -161,6 +209,90 @@ class HomePageRoute extends PageRouteInfo<void> {
 }
 
 /// generated route for
+/// [HomePropertyNewsPage]
+class HomePropertyNewsPageRoute extends PageRouteInfo<void> {
+  const HomePropertyNewsPageRoute({List<PageRouteInfo>? children})
+      : super(
+          HomePropertyNewsPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'HomePropertyNewsPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LatestNewsInfoScreen]
+class LatestNewsInfoPageRoute extends PageRouteInfo<void> {
+  const LatestNewsInfoPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LatestNewsInfoPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LatestNewsInfoPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LatestNewsInternalScreen]
+class LatestNewsInternalPageRoute extends PageRouteInfo<void> {
+  const LatestNewsInternalPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LatestNewsInternalPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LatestNewsInternalPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LatestNewsPage]
+class LatestNewsPageRoute extends PageRouteInfo<void> {
+  const LatestNewsPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LatestNewsPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LatestNewsPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LatestNewsPropertyScreen]
+class LatestNewsPropertyPageRoute extends PageRouteInfo<void> {
+  const LatestNewsPropertyPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LatestNewsPropertyPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LatestNewsPropertyPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LatestNewsPublishScreen]
+class LatestNewsPublishPageRoute extends PageRouteInfo<void> {
+  const LatestNewsPublishPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LatestNewsPublishPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LatestNewsPublishPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [MainPage]
 class MainPageRoute extends PageRouteInfo<void> {
   const MainPageRoute({List<PageRouteInfo>? children})
@@ -175,6 +307,20 @@ class MainPageRoute extends PageRouteInfo<void> {
 }
 
 /// generated route for
+/// [ManagementGuidesPage]
+class ManagementGuidesPageRoute extends PageRouteInfo<void> {
+  const ManagementGuidesPageRoute({List<PageRouteInfo>? children})
+      : super(
+          ManagementGuidesPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'ManagementGuidesPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [MePage]
 class MePageRoute extends PageRouteInfo<void> {
   const MePageRoute({List<PageRouteInfo>? children})
@@ -257,3 +403,17 @@ class VisitorPageRoute extends PageRouteInfo<void> {
 
   static const PageInfo<void> page = PageInfo<void>(name);
 }
+
+/// generated route for
+/// [VisitorRegisterPage]
+class VisitorRegisterPageRoute extends PageRouteInfo<void> {
+  const VisitorRegisterPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorRegisterPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorRegisterPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}

+ 2 - 0
packages/cpt_profile/lib/modules/setting/setting_page.dart

@@ -54,6 +54,7 @@ class SettingPage extends HookConsumerWidget {
                   viewModel.changeEnableNotification(value);
                 },
               ),
+              isShowMoreIcon: false,
             ),
 
             //修改手机号码
@@ -83,6 +84,7 @@ class SettingPage extends HookConsumerWidget {
                 fontSize: 15,
                 isFontMedium: true,
               ),
+              isShowMoreIcon: false,
             ),
 
             //提交按钮

二進制
packages/cs_resources/assets/base_lib/item_more_black.webp


二進制
packages/cs_resources/assets/main/feedback_waiting_icon.webp


二進制
packages/cs_resources/assets/main/latest_info.webp


二進制
packages/cs_resources/assets/main/latest_internal.webp


二進制
packages/cs_resources/assets/main/latest_property.webp


二進制
packages/cs_resources/assets/main/latest_publish.webp


二進制
packages/cs_resources/assets/main/me_edit_icon.webp


二進制
packages/cs_resources/assets/main/me_estate_icon.webp


二進制
packages/cs_resources/assets/main/me_household_icon.webp


二進制
packages/cs_resources/assets/main/me_my_post_icon.webp


二進制
packages/cs_resources/assets/main/me_setting_icon.webp


二進制
packages/cs_resources/assets/main/notification_item_icon.webp


二進制
packages/cs_resources/assets/main/success_icon.webp


二進制
packages/cs_resources/assets/main/visitor_register_date.webp


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

@@ -20,6 +20,7 @@ class Assets {
   static const String baseLibDialogDeleteIcon = 'assets/base_lib/dialog_delete_icon.webp';
   static const String baseLibImageAddIcon = 'assets/base_lib/image_add_icon.webp';
   static const String baseLibImageDefaultPlaceholder = 'assets/base_lib/image_default_placeholder.png';
+  static const String baseLibItemMoreBlack = 'assets/base_lib/item_more_black.webp';
   static const String baseLibItemMoreIcon = 'assets/base_lib/item_more_icon.webp';
   static const String baseLibSearchIcon = 'assets/base_lib/search_icon.webp';
   static const String baseLibWhiteBack = 'assets/base_lib/white_back.webp';
@@ -53,6 +54,7 @@ class Assets {
   static const String mainFeedbackItemIcon = 'assets/main/feedback_item_icon.webp';
   static const String mainFeedbackSend = 'assets/main/feedback_send.webp';
   static const String mainFeedbackSendImg = 'assets/main/feedback_send_img.webp';
+  static const String mainFeedbackWaitingIcon = 'assets/main/feedback_waiting_icon.webp';
   static const String mainHomeBoticeBoardIcon = 'assets/main/home_botice_board_icon.webp';
   static const String mainHomeCommunityIcon = 'assets/main/home_community_icon.webp';
   static const String mainHomeFacilityIcon = 'assets/main/home_facility_icon.webp';
@@ -68,8 +70,19 @@ class Assets {
   static const String mainHomeRewardsIcon = 'assets/main/home_rewards_icon.webp';
   static const String mainHomeServiceIcon = 'assets/main/home_service_icon.webp';
   static const String mainIntroductionGuide = 'assets/main/introduction_guide.webp';
+  static const String mainLatestInfo = 'assets/main/latest_info.webp';
+  static const String mainLatestInternal = 'assets/main/latest_internal.webp';
+  static const String mainLatestProperty = 'assets/main/latest_property.webp';
+  static const String mainLatestPublish = 'assets/main/latest_publish.webp';
+  static const String mainMeEditIcon = 'assets/main/me_edit_icon.webp';
+  static const String mainMeEstateIcon = 'assets/main/me_estate_icon.webp';
+  static const String mainMeHouseholdIcon = 'assets/main/me_household_icon.webp';
+  static const String mainMeMyPostIcon = 'assets/main/me_my_post_icon.webp';
+  static const String mainMeSettingIcon = 'assets/main/me_setting_icon.webp';
+  static const String mainNotificationItemIcon = 'assets/main/notification_item_icon.webp';
   static const String mainPropertyGuide = 'assets/main/property_guide.webp';
   static const String mainRolesGuide = 'assets/main/roles_guide.webp';
+  static const String mainSuccessIcon = 'assets/main/success_icon.webp';
   static const String mainTabFeedbackSelected = 'assets/main/tab_feedback_selected.webp';
   static const String mainTabFeedbackUnselected = 'assets/main/tab_feedback_unselected.webp';
   static const String mainTabHomeSelected = 'assets/main/tab_home_selected.webp';
@@ -82,6 +95,7 @@ class Assets {
   static const String mainVisitorHistory = 'assets/main/visitor_history.webp';
   static const String mainVisitorNow = 'assets/main/visitor_now.webp';
   static const String mainVisitorNowImg = 'assets/main/visitor_now_img.webp';
+  static const String mainVisitorRegisterDate = 'assets/main/visitor_register_date.webp';
   static const String noticeBoardAnnouncementIcon = 'assets/notice_board/announcement_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';

+ 24 - 8
packages/cs_resources/lib/generated/intl/messages_en.dart

@@ -22,21 +22,22 @@ class MessageLookup extends MessageLookupByLibrary {
 
   static String m0(count) => "${count} Characters";
 
-  static String m1(count) => "Followers(${count})";
-
-  static String m2(count) => "Following(${count})";
-
-  static String m3(name) => "Welcome ${name}";
+  static String m1(name) => "Welcome ${name}";
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images": MessageLookupByLibrary.simpleMessage(
+            "(Up to 10 images can be uploaded)"),
         "access_date": MessageLookupByLibrary.simpleMessage("Access Date"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request."),
         "account_deactivation":
             MessageLookupByLibrary.simpleMessage("Account Deactivation"),
+        "administrator_reply":
+            MessageLookupByLibrary.simpleMessage("Administrator Reply"),
         "agree_to": MessageLookupByLibrary.simpleMessage("Agree to"),
         "alert": MessageLookupByLibrary.simpleMessage("Alert"),
+        "back_home": MessageLookupByLibrary.simpleMessage("Back Home"),
         "block": MessageLookupByLibrary.simpleMessage("Block"),
         "block_desc": MessageLookupByLibrary.simpleMessage(
             "Block refers to the street number of the unit\'s official mailing address"),
@@ -48,6 +49,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "change_mobile_phone":
             MessageLookupByLibrary.simpleMessage("Change Mobile Phone"),
         "characters": m0,
+        "choose_category":
+            MessageLookupByLibrary.simpleMessage("Choose a Category"),
         "community": MessageLookupByLibrary.simpleMessage("Community"),
         "confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
         "confirm_new_password":
@@ -58,6 +61,8 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Create New FeedBack"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("Create New YY Home Account"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("Describe Your FeedBack"),
         "did_not_receive":
             MessageLookupByLibrary.simpleMessage("Did Not Receive?"),
         "email": MessageLookupByLibrary.simpleMessage("Email"),
@@ -75,8 +80,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
             "there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!"),
         "first_name": MessageLookupByLibrary.simpleMessage("First Name"),
-        "followers": m1,
-        "following": m2,
+        "followers": MessageLookupByLibrary.simpleMessage("Followers"),
+        "following": MessageLookupByLibrary.simpleMessage("Following"),
         "forgot_password":
             MessageLookupByLibrary.simpleMessage("Forgot Password?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage(
@@ -104,6 +109,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "logout": MessageLookupByLibrary.simpleMessage("Logout"),
         "logout_alert": MessageLookupByLibrary.simpleMessage(
             "Are you sure you want to logout?"),
+        "mark_all": MessageLookupByLibrary.simpleMessage("Mark All"),
         "me": MessageLookupByLibrary.simpleMessage("Me"),
         "mobile_phone": MessageLookupByLibrary.simpleMessage("Mobile Phone"),
         "my_post": MessageLookupByLibrary.simpleMessage("My Posts"),
@@ -144,11 +150,16 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Property Guide"),
         "property_news": MessageLookupByLibrary.simpleMessage("Property News"),
         "publish": MessageLookupByLibrary.simpleMessage("Publish"),
+        "published_successful_txt": MessageLookupByLibrary.simpleMessage(
+            "Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!"),
+        "published_successfully":
+            MessageLookupByLibrary.simpleMessage("Published Successfully"),
         "rate_us": MessageLookupByLibrary.simpleMessage("Rate Us"),
         "resend_code": MessageLookupByLibrary.simpleMessage("Resend Code"),
         "reset_password":
             MessageLookupByLibrary.simpleMessage("Reset Password"),
         "rewards": MessageLookupByLibrary.simpleMessage("Rewards"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("Send FeedBack"),
         "sent": MessageLookupByLibrary.simpleMessage("Sent"),
         "service": MessageLookupByLibrary.simpleMessage("Service"),
         "settings": MessageLookupByLibrary.simpleMessage("Settings"),
@@ -176,6 +187,7 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Terms & Conditions"),
         "terms_of_service":
             MessageLookupByLibrary.simpleMessage("Terms of Service"),
+        "title": MessageLookupByLibrary.simpleMessage("Title"),
         "tries_left": MessageLookupByLibrary.simpleMessage("Tries Left"),
         "type_here": MessageLookupByLibrary.simpleMessage("Type Here"),
         "unit_number": MessageLookupByLibrary.simpleMessage("Unit Number"),
@@ -188,6 +200,8 @@ class MessageLookup extends MessageLookupByLibrary {
             "(2)Tenancy Agreement Stamp Duty receipt"),
         "upload_documents":
             MessageLookupByLibrary.simpleMessage("Upload Documents"),
+        "upload_pictures":
+            MessageLookupByLibrary.simpleMessage("Upload Pictures"),
         "verification_code":
             MessageLookupByLibrary.simpleMessage("Verification Code"),
         "version_no": MessageLookupByLibrary.simpleMessage("Version No."),
@@ -198,7 +212,9 @@ class MessageLookup extends MessageLookupByLibrary {
         "visitor_now": MessageLookupByLibrary.simpleMessage("Now"),
         "visitor_registration":
             MessageLookupByLibrary.simpleMessage("Visitor Registration"),
-        "welcome_name": m3,
+        "waiting_for_the_administrator": MessageLookupByLibrary.simpleMessage(
+            "Waiting for the administrator"),
+        "welcome_name": m1,
         "who_are_owners":
             MessageLookupByLibrary.simpleMessage("Who are owners?"),
         "who_are_tenants":

+ 20 - 8
packages/cs_resources/lib/generated/intl/messages_zh_CN.dart

@@ -22,20 +22,20 @@ class MessageLookup extends MessageLookupByLibrary {
 
   static String m0(count) => "${count} 字符";
 
-  static String m1(count) => "粉丝(${count})";
-
-  static String m2(count) => "关注(${count})";
-
-  static String m3(name) => "欢迎你 ${name}";
+  static String m1(name) => "欢迎你 ${name}";
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images":
+            MessageLookupByLibrary.simpleMessage("(您最多可以上传10张图片)"),
         "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
+        "administrator_reply": MessageLookupByLibrary.simpleMessage("管理员回复"),
         "agree_to": MessageLookupByLibrary.simpleMessage("同意"),
         "alert": MessageLookupByLibrary.simpleMessage("提示"),
+        "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -45,6 +45,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m0,
+        "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
@@ -52,6 +53,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("描述您的反馈"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "email": MessageLookupByLibrary.simpleMessage("邮箱"),
         "enable_notification": MessageLookupByLibrary.simpleMessage("允许通知"),
@@ -66,8 +69,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
             "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m1,
-        "following": m2,
+        "followers": MessageLookupByLibrary.simpleMessage("粉丝"),
+        "following": MessageLookupByLibrary.simpleMessage("关注"),
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表单"),
@@ -89,6 +92,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
+        "mark_all": MessageLookupByLibrary.simpleMessage("标记全部"),
         "me": MessageLookupByLibrary.simpleMessage("我的"),
         "mobile_phone": MessageLookupByLibrary.simpleMessage("手机号码"),
         "my_post": MessageLookupByLibrary.simpleMessage("我的发布"),
@@ -119,10 +123,14 @@ class MessageLookup extends MessageLookupByLibrary {
         "property_guide": MessageLookupByLibrary.simpleMessage("物业指南"),
         "property_news": MessageLookupByLibrary.simpleMessage("资产新闻"),
         "publish": MessageLookupByLibrary.simpleMessage("公布"),
+        "published_successful_txt":
+            MessageLookupByLibrary.simpleMessage("您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!"),
+        "published_successfully": MessageLookupByLibrary.simpleMessage("发布成功"),
         "rate_us": MessageLookupByLibrary.simpleMessage("评价我们"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("奖励"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("发送反馈"),
         "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
@@ -144,6 +152,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "tenants_desc4": MessageLookupByLibrary.simpleMessage("管理员将相应地验证您的申请"),
         "terms_conditions": MessageLookupByLibrary.simpleMessage("服务条款"),
         "terms_of_service": MessageLookupByLibrary.simpleMessage("服务条款"),
+        "title": MessageLookupByLibrary.simpleMessage("标题"),
         "tries_left": MessageLookupByLibrary.simpleMessage("次尝试机会"),
         "type_here": MessageLookupByLibrary.simpleMessage("在此输入"),
         "unit_number": MessageLookupByLibrary.simpleMessage("单元"),
@@ -155,6 +164,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "upload_doc_desc2":
             MessageLookupByLibrary.simpleMessage("(2)租赁协议印花税收据"),
         "upload_documents": MessageLookupByLibrary.simpleMessage("上传文档"),
+        "upload_pictures": MessageLookupByLibrary.simpleMessage("上传图片"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
@@ -163,7 +173,9 @@ class MessageLookup extends MessageLookupByLibrary {
             "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
         "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
         "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
-        "welcome_name": m3,
+        "waiting_for_the_administrator":
+            MessageLookupByLibrary.simpleMessage("等待管理员回复"),
+        "welcome_name": m1,
         "who_are_owners": MessageLookupByLibrary.simpleMessage("怎样才算业主?"),
         "who_are_tenants": MessageLookupByLibrary.simpleMessage("怎样才算租户?"),
         "yes": MessageLookupByLibrary.simpleMessage("是"),

+ 20 - 8
packages/cs_resources/lib/generated/intl/messages_zh_HK.dart

@@ -22,20 +22,20 @@ class MessageLookup extends MessageLookupByLibrary {
 
   static String m0(count) => "${count} 字符";
 
-  static String m1(count) => "粉丝(${count})";
-
-  static String m2(count) => "关注(${count})";
-
-  static String m3(name) => "欢迎你 ${name}";
+  static String m1(name) => "欢迎你 ${name}";
 
   final messages = _notInlinedMessages(_notInlinedMessages);
   static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
+        "Up_to_max_images":
+            MessageLookupByLibrary.simpleMessage("(您最多可以上传10张图片)"),
         "access_date": MessageLookupByLibrary.simpleMessage("访问日期"),
         "account_deactivate_alert": MessageLookupByLibrary.simpleMessage(
             "您确定要停用您的帐户吗?一旦您继续执行请求,您将无法登录应用程序。"),
         "account_deactivation": MessageLookupByLibrary.simpleMessage("删除账号"),
+        "administrator_reply": MessageLookupByLibrary.simpleMessage("管理员回复"),
         "agree_to": MessageLookupByLibrary.simpleMessage("同意"),
         "alert": MessageLookupByLibrary.simpleMessage("提示"),
+        "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -45,6 +45,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancel": MessageLookupByLibrary.simpleMessage("取消"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m0,
+        "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "confirm": MessageLookupByLibrary.simpleMessage("确认"),
         "confirm_new_password": MessageLookupByLibrary.simpleMessage("确认新密码"),
@@ -52,6 +53,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "create_new_feedback": MessageLookupByLibrary.simpleMessage("创建新的反馈"),
         "create_new_yy_home_account":
             MessageLookupByLibrary.simpleMessage("创建新的 YY Home 账户"),
+        "describe_your_feedback":
+            MessageLookupByLibrary.simpleMessage("描述您的反馈"),
         "did_not_receive": MessageLookupByLibrary.simpleMessage("没有收到验证码?"),
         "email": MessageLookupByLibrary.simpleMessage("邮箱"),
         "enable_notification": MessageLookupByLibrary.simpleMessage("允许通知"),
@@ -66,8 +69,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "feedback_msg_2": MessageLookupByLibrary.simpleMessage(
             "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!"),
         "first_name": MessageLookupByLibrary.simpleMessage("名"),
-        "followers": m1,
-        "following": m2,
+        "followers": MessageLookupByLibrary.simpleMessage("粉丝"),
+        "following": MessageLookupByLibrary.simpleMessage("关注"),
         "forgot_password": MessageLookupByLibrary.simpleMessage("忘记密码?"),
         "forgot_text": MessageLookupByLibrary.simpleMessage("请输入您的邮箱和手机号码"),
         "form": MessageLookupByLibrary.simpleMessage("表單"),
@@ -89,6 +92,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
+        "mark_all": MessageLookupByLibrary.simpleMessage("标记全部"),
         "me": MessageLookupByLibrary.simpleMessage("我的"),
         "mobile_phone": MessageLookupByLibrary.simpleMessage("手机号码"),
         "my_post": MessageLookupByLibrary.simpleMessage("我的发布"),
@@ -111,10 +115,14 @@ class MessageLookup extends MessageLookupByLibrary {
         "property_guide": MessageLookupByLibrary.simpleMessage("物业指南"),
         "property_news": MessageLookupByLibrary.simpleMessage("资产新闻"),
         "publish": MessageLookupByLibrary.simpleMessage("公布"),
+        "published_successful_txt":
+            MessageLookupByLibrary.simpleMessage("您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!"),
+        "published_successfully": MessageLookupByLibrary.simpleMessage("发布成功"),
         "rate_us": MessageLookupByLibrary.simpleMessage("评价我们"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),
         "rewards": MessageLookupByLibrary.simpleMessage("獎勵"),
+        "send_feedback": MessageLookupByLibrary.simpleMessage("发送反馈"),
         "sent": MessageLookupByLibrary.simpleMessage("发送"),
         "service": MessageLookupByLibrary.simpleMessage("服务"),
         "settings": MessageLookupByLibrary.simpleMessage("设置"),
@@ -131,6 +139,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "submit": MessageLookupByLibrary.simpleMessage("提交"),
         "terms_conditions": MessageLookupByLibrary.simpleMessage("服务条款"),
         "terms_of_service": MessageLookupByLibrary.simpleMessage("服务条款"),
+        "title": MessageLookupByLibrary.simpleMessage("标题"),
         "tries_left": MessageLookupByLibrary.simpleMessage("次尝试机会"),
         "type_here": MessageLookupByLibrary.simpleMessage("在此输入"),
         "unit_number": MessageLookupByLibrary.simpleMessage("单元"),
@@ -142,6 +151,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "upload_doc_desc2":
             MessageLookupByLibrary.simpleMessage("(2)租赁协议印花税收据"),
         "upload_documents": MessageLookupByLibrary.simpleMessage("上传文档"),
+        "upload_pictures": MessageLookupByLibrary.simpleMessage("上传图片"),
         "verification_code": MessageLookupByLibrary.simpleMessage("验证码"),
         "version_no": MessageLookupByLibrary.simpleMessage("版本号."),
         "visitor": MessageLookupByLibrary.simpleMessage("访客"),
@@ -150,7 +160,9 @@ class MessageLookup extends MessageLookupByLibrary {
             "社区访客系统是一个智能系统,旨在加强社区安全管理,方便访客访问。"),
         "visitor_now": MessageLookupByLibrary.simpleMessage("当前的"),
         "visitor_registration": MessageLookupByLibrary.simpleMessage("访客登记"),
-        "welcome_name": m3,
+        "waiting_for_the_administrator":
+            MessageLookupByLibrary.simpleMessage("等待管理员回复"),
+        "welcome_name": m1,
         "yes": MessageLookupByLibrary.simpleMessage("是"),
         "you_have": MessageLookupByLibrary.simpleMessage("你还有"),
         "your_roles_responsibilities":

+ 128 - 8
packages/cs_resources/lib/generated/l10n.dart

@@ -670,23 +670,23 @@ class S {
     );
   }
 
-  /// `Following({count})`
-  String following(Object count) {
+  /// `Following`
+  String get following {
     return Intl.message(
-      'Following($count)',
+      'Following',
       name: 'following',
       desc: '',
-      args: [count],
+      args: [],
     );
   }
 
-  /// `Followers({count})`
-  String followers(Object count) {
+  /// `Followers`
+  String get followers {
     return Intl.message(
-      'Followers($count)',
+      'Followers',
       name: 'followers',
       desc: '',
-      args: [count],
+      args: [],
     );
   }
 
@@ -1260,6 +1260,126 @@ class S {
     );
   }
 
+  /// `Mark All`
+  String get mark_all {
+    return Intl.message(
+      'Mark All',
+      name: 'mark_all',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Choose a Category`
+  String get choose_category {
+    return Intl.message(
+      'Choose a Category',
+      name: 'choose_category',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Title`
+  String get title {
+    return Intl.message(
+      'Title',
+      name: 'title',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Describe Your FeedBack`
+  String get describe_your_feedback {
+    return Intl.message(
+      'Describe Your FeedBack',
+      name: 'describe_your_feedback',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Upload Pictures`
+  String get upload_pictures {
+    return Intl.message(
+      'Upload Pictures',
+      name: 'upload_pictures',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Send FeedBack`
+  String get send_feedback {
+    return Intl.message(
+      'Send FeedBack',
+      name: 'send_feedback',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `(Up to 10 images can be uploaded)`
+  String get Up_to_max_images {
+    return Intl.message(
+      '(Up to 10 images can be uploaded)',
+      name: 'Up_to_max_images',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Published Successfully`
+  String get published_successfully {
+    return Intl.message(
+      'Published Successfully',
+      name: 'published_successfully',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!`
+  String get published_successful_txt {
+    return Intl.message(
+      'Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!',
+      name: 'published_successful_txt',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Back Home`
+  String get back_home {
+    return Intl.message(
+      'Back Home',
+      name: 'back_home',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Waiting for the administrator`
+  String get waiting_for_the_administrator {
+    return Intl.message(
+      'Waiting for the administrator',
+      name: 'waiting_for_the_administrator',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Administrator Reply`
+  String get administrator_reply {
+    return Intl.message(
+      'Administrator Reply',
+      name: 'administrator_reply',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Other`
   String get other {
     return Intl.message(

+ 14 - 2
packages/cs_resources/lib/l10n/intl_en.arb

@@ -61,8 +61,8 @@
   "upload_doc_desc1": "(1)A valid tenancy agreement showing your name,unit numper,tenancy expiration date and a list of occupants (if applicable)",
   "upload_doc_desc2": "(2)Tenancy Agreement Stamp Duty receipt",
   "upload": "Upload",
-  "following": "Following({count})",
-  "followers": "Followers({count})",
+  "following": "Following",
+  "followers": "Followers",
   "my_post": "My Posts",
   "household": "Household",
   "estate": "Estate",
@@ -120,5 +120,17 @@
   "feedback_msg_1": "Help us keep your estate beautiful",
   "feedback_msg_2": "there is something that requires ourattention or if you have an awesome suggestion, we would like to hear from you!",
   "create_new_feedback": "Create New FeedBack",
+  "mark_all": "Mark All",
+  "choose_category": "Choose a Category",
+  "title": "Title",
+  "describe_your_feedback": "Describe Your FeedBack",
+  "upload_pictures": "Upload Pictures",
+  "send_feedback": "Send FeedBack",
+  "Up_to_max_images": "(Up to 10 images can be uploaded)",
+  "published_successfully": "Published Successfully",
+  "published_successful_txt": "Your feedback has been successfully sent! We will reply to you as soon as possible! thank you!",
+  "back_home": "Back Home",
+  "waiting_for_the_administrator": "Waiting for the administrator",
+  "administrator_reply": "Administrator Reply",
   "other": "Other"
 }

+ 14 - 2
packages/cs_resources/lib/l10n/intl_zh_CN.arb

@@ -61,8 +61,8 @@
   "upload_doc_desc1": "(1)一份有效的租赁协议,显示您的姓名、单位编号、租赁到期日期和居住者名单(如果适用)",
   "upload_doc_desc2": "(2)租赁协议印花税收据",
   "upload": "上传",
-  "following": "关注({count})",
-  "followers": "粉丝({count})",
+  "following": "关注",
+  "followers": "粉丝",
   "my_post": "我的发布",
   "household": "家庭",
   "estate": "房产",
@@ -120,5 +120,17 @@
   "feedback_msg_1": "帮助我们保持您的房产美丽",
   "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
   "create_new_feedback": "创建新的反馈",
+  "mark_all": "标记全部",
+  "choose_category": "选择类型",
+  "title": "标题",
+  "describe_your_feedback": "描述您的反馈",
+  "upload_pictures": "上传图片",
+  "send_feedback": "发送反馈",
+  "Up_to_max_images": "(您最多可以上传10张图片)",
+  "published_successfully": "发布成功",
+  "published_successful_txt": "您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!",
+  "back_home": "返回首页",
+  "waiting_for_the_administrator": "等待管理员回复",
+  "administrator_reply": "管理员回复",
   "other": "其他"
 }

+ 14 - 2
packages/cs_resources/lib/l10n/intl_zh_HK.arb

@@ -47,8 +47,8 @@
   "upload_doc_desc1": "(1)一份有效的租赁协议,显示您的姓名、单位编号、租赁到期日期和居住者名单(如果适用)",
   "upload_doc_desc2": "(2)租赁协议印花税收据",
   "upload": "上传",
-  "following": "关注({count})",
-  "followers": "粉丝({count})",
+  "following": "关注",
+  "followers": "粉丝",
   "my_post": "我的发布",
   "household": "家庭",
   "estate": "房产",
@@ -106,5 +106,17 @@
   "feedback_msg_1": "帮助我们保持您的房产美丽",
   "feedback_msg_2": "有些事情需要我们关注,或者如果你有一个很棒的建议,我们想听听你的意见!",
   "create_new_feedback": "创建新的反馈",
+  "mark_all": "标记全部",
+  "choose_category": "选择类型",
+  "title": "标题",
+  "describe_your_feedback": "描述您的反馈",
+  "upload_pictures": "上传图片",
+  "send_feedback": "发送反馈",
+  "Up_to_max_images": "(您最多可以上传10张图片)",
+  "published_successfully": "发布成功",
+  "published_successful_txt": "您的反馈已发送成功,我们会尽快回复您的反馈,谢谢!",
+  "back_home": "返回首页",
+  "waiting_for_the_administrator": "等待管理员回复",
+  "administrator_reply": "管理员回复",
   "other": "其他"
 }

+ 6 - 0
packages/cs_resources/lib/theme/app_colors_theme.dart

@@ -28,6 +28,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   static const _colorEFF3FF = Color(0xFFEFF3FF);
   static const _colorDFF0FF = Color(0xFFDFF0FF);
   static const _color1B61CA = Color(0X4D1B61CA);
+  static const _color8B96BA = Color(0xFF8B96BA);
 
   //暗色主题的一些自定义颜色值
   static const _darkBlackBg = Color(0xFF0F0F0F);
@@ -64,6 +65,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   final Color tabTextSelectedDefault; //Tab文本,选中主题蓝,黑暗模式为白色
   final Color tabTextUnSelectedDefault; //Tab文本,未选中 亮色为黑色,黑暗模式为灰色
   final Color tabLightBlueShadow; //Tab的淡蓝色阴影
+  final Color textLightPurple; //文本淡紫色
 
   // 私有的构造函数
   const AppColorsTheme._internal({
@@ -93,6 +95,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
     required this.tabLightBlueShadow,
     required this.tabTextSelectedDefault,
     required this.tabTextUnSelectedDefault,
+    required this.textLightPurple,
   });
 
   // 浅色主题工厂方法
@@ -124,6 +127,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       tabLightBlueShadow: _color1B61CA,
       tabTextSelectedDefault: _colorPrimary,
       tabTextUnSelectedDefault: Colors.black,
+      textLightPurple: _color8B96BA,
     );
   }
 
@@ -156,6 +160,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       tabLightBlueShadow: _darkBlackItemLightShadow,
       tabTextSelectedDefault: Colors.white,
       tabTextUnSelectedDefault: _darkBlackItemLightMost,
+      textLightPurple: Colors.white,
     );
   }
 
@@ -197,6 +202,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       tabTextSelectedDefault: Color.lerp(tabTextSelectedDefault, other.tabTextSelectedDefault, t)!,
       tabLightBlueShadow: Color.lerp(tabLightBlueShadow, other.tabLightBlueShadow, t)!,
       tabTextUnSelectedDefault: Color.lerp(tabTextUnSelectedDefault, other.tabTextUnSelectedDefault, t)!,
+      textLightPurple: Color.lerp(textLightPurple, other.textLightPurple, t)!,
     );
   }
 }

+ 7 - 0
packages/cs_router/lib/path/router_path.dart

@@ -23,6 +23,13 @@ class RouterPath {
   static const settings = '/settings';
   static const settingsChangeMobile = '/settings/change/mobile';
   static const settingsResetPassword = '/settings/reset/psd';
+  static const homePropertyNews = '/home/property/news';
+  static const homeLatestNews = '/home/latest/news';
+  static const homeManagementGuides = '/home/management/guides';
+  static const visitorRegister = '/visitor/register';
+  static const feedbackCreate = '/feedback/create';
+  static const feedbackCreateSuccess = '/feedback/create/success';
+  static const feedbackDetail = '/feedback/detail';
 
   //用户
   static const profileEdit = '/profile/edit';

+ 0 - 1
packages/cs_widgets/lib/my_load_image.dart

@@ -256,7 +256,6 @@ class MyAssetImage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     var finalPath = ImagePathUtils.getImgPath(image);
-    print("finalPath:$finalPath");
     return Image.asset(
       finalPath,
       package: 'cs_resources',

+ 3 - 3
packages/cs_widgets/lib/shatter/form_require_text.dart

@@ -6,8 +6,8 @@ import 'package:flutter/material.dart';
  */
 class FormRequireText extends StatelessWidget {
   final String text;
-  FontWeight? fontWeight = FontWeight.w400;
-  Color? textColor = Colors.white;
+  FontWeight? fontWeight;
+  Color? textColor = Colors.black;
   double? fontSize = 15.0;
 
   FormRequireText({required this.text, this.textColor, this.fontSize, this.fontWeight});
@@ -16,7 +16,7 @@ class FormRequireText extends StatelessWidget {
   Widget build(BuildContext context) {
     return RichText(
       text: TextSpan(
-        style: TextStyle(fontSize: fontSize, fontWeight: fontWeight, color: textColor),
+        style: TextStyle(fontSize: fontSize, fontWeight: fontWeight ?? FontWeight.w500, color: textColor),
         children: <TextSpan>[
           TextSpan(
             text: text,

+ 3 - 6
packages/cs_widgets/lib/shatter/setting_item_container.dart

@@ -33,7 +33,7 @@ class SettingItemContainer extends StatelessWidget {
         mainAxisAlignment: MainAxisAlignment.start,
         crossAxisAlignment: CrossAxisAlignment.center,
         children: [
-          iconPath == null ? const SizedBox() : MyAssetImage(iconPath!, width: 30.2, height: 30.2).marginOnly(right: 11),
+          iconPath == null ? const SizedBox() : MyAssetImage(iconPath!, width: 25, height: 25).marginOnly(right: 11),
           MyTextView(
             title,
             isFontMedium: true,
@@ -41,11 +41,8 @@ class SettingItemContainer extends StatelessWidget {
             marginRight: 11,
             textColor: context.appColors.textBlack,
           ).expanded(),
-          isShowMoreIcon
-              ? rightWidget == null
-                  ?  const MyAssetImage(Assets.baseLibItemMoreIcon, width: 7.5, height: 13.5, color: Color(0XFF28394A))
-                  : rightWidget!
-              :  const SizedBox(),
+          rightWidget == null ? const SizedBox() : rightWidget!,
+          isShowMoreIcon ? const MyAssetImage(Assets.baseLibItemMoreBlack, width: 6.5, height: 11.5).marginOnly(left: 12) : const SizedBox()
         ],
       ),
     );