Browse Source

分段练习 完成, 易错专项 50%

openlockPPP 7 months ago
parent
commit
672f47b072
100 changed files with 2241 additions and 4 deletions
  1. 184 0
      jiaPei.xcodeproj/project.pbxproj
  2. BIN
      jiaPei.xcworkspace/xcuserdata/mimasigeling.xcuserdatad/UserInterfaceState.xcuserstate
  3. 6 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/Contents.json
  4. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/Contents.json
  5. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/交警手势@2x.png
  6. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/交警手势@3x.png
  7. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/Contents.json
  8. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/判刑扣留@2x.png
  9. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/判刑扣留@3x.png
  10. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/Contents.json
  11. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/周期@2x.png
  12. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/周期@3x.png
  13. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/Contents.json
  14. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/安全常识@2x.png
  15. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/安全常识@3x.png
  16. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/Contents.json
  17. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/扣分@2x.png
  18. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/扣分@3x.png
  19. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/Contents.json
  20. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/特殊天气@2x.png
  21. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/特殊天气@3x.png
  22. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/Contents.json
  23. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/电子资料@2x.png
  24. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/电子资料@3x.png
  25. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/Contents.json
  26. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/罚款@2x.png
  27. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/罚款@3x.png
  28. 6 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/Contents.json
  29. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/Contents.json
  30. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/blue_btn_bg@2x.png
  31. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/blue_btn_bg@3x.png
  32. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/Contents.json
  33. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/blue_jb_bg@2x.png
  34. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/blue_jb_bg@3x.png
  35. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/Contents.json
  36. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/分阶段视频封面@2x.png
  37. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/分阶段视频封面@3x.png
  38. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/Contents.json
  39. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/播放@2x.png
  40. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/播放@3x.png
  41. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/Contents.json
  42. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/通行原则@2x.png
  43. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/通行原则@3x.png
  44. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/Contents.json
  45. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/速度灯光@2x.png
  46. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/速度灯光@3x.png
  47. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/Contents.json
  48. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/驾驶证@2x.png
  49. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/驾驶证@3x.png
  50. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/Contents.json
  51. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/星星灰@2x.png
  52. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/星星灰@3x.png
  53. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/Contents.json
  54. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/星星黄@2x.png
  55. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/星星黄@3x.png
  56. 18 0
      jiaPei/Modules/HomePageModule/RQHomePageModule.h
  57. 1 0
      jiaPei/Modules/HomePageModule/RQHomePageModule.m
  58. 8 1
      jiaPei/Modules/HomePageModule/View/HomePage/NYHomePageOneBigCell.m
  59. 25 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.h
  60. 42 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.m
  61. 123 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.xib
  62. 24 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.h
  63. 43 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.m
  64. 143 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.xib
  65. 23 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.h
  66. 42 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.m
  67. 71 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.xib
  68. 17 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.h
  69. 43 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.m
  70. 57 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.xib
  71. 17 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.h
  72. 37 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.m
  73. 48 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.xib
  74. 17 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.h
  75. 82 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.m
  76. 22 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.xib
  77. 17 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.h
  78. 82 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.m
  79. 22 0
      jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.xib
  80. 21 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseGroupViewModel.h
  81. 13 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseGroupViewModel.m
  82. 27 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseItemModel.h
  83. 168 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseItemModel.m
  84. 19 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseViewModel.h
  85. 90 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseViewModel.m
  86. 17 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.h
  87. 13 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.m
  88. 19 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.h
  89. 103 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.m
  90. 17 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseGroupViewModel.h
  91. 13 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseGroupViewModel.m
  92. 20 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseViewModel.h
  93. 66 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseViewModel.m
  94. 4 1
      jiaPei/Modules/OtherModules/ExerciseModule/Controller/RQExerciseViewController.m
  95. 5 0
      jiaPei/Modules/OtherModules/ExerciseModule/RQExerciseModule.h
  96. 2 0
      jiaPei/Modules/OtherModules/ExerciseModule/RQExerciseModule.m
  97. 1 1
      jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.h
  98. 14 1
      jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.m
  99. 1 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.h
  100. 14 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.m

+ 184 - 0
jiaPei.xcodeproj/project.pbxproj

@@ -101,12 +101,16 @@
 		9040D28D2B6F8ACB002F4686 /* NYClassRoomPeiCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9040D28B2B6F8ACB002F4686 /* NYClassRoomPeiCell.xib */; };
 		9040D2902B6F94DA002F4686 /* NYClassRoomPeiViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9040D28F2B6F94DA002F4686 /* NYClassRoomPeiViewModel.m */; };
 		9040D2932B70E504002F4686 /* CultivateInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9040D2922B70E504002F4686 /* CultivateInfoModel.m */; };
+		9042872D2D01ABB7003D37FD /* NYBlockExerciseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9042872C2D01ABB7003D37FD /* NYBlockExerciseCell.xib */; };
+		9042872E2D01ABB7003D37FD /* NYBlockExerciseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9042872B2D01ABB7003D37FD /* NYBlockExerciseCell.m */; };
 		90439AEE2CD354BA00BEC26C /* NYExerciseQuestionItemViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90439AED2CD354BA00BEC26C /* NYExerciseQuestionItemViewModel.m */; };
 		90439AF72CD36AE000BEC26C /* NYExerciseOptionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90439AF52CD36AE000BEC26C /* NYExerciseOptionCell.m */; };
 		90439AF82CD36AE000BEC26C /* NYExerciseOptionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90439AF62CD36AE000BEC26C /* NYExerciseOptionCell.xib */; };
 		90439AFB2CD36F2D00BEC26C /* NYExerciseOptionItemViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90439AFA2CD36F2D00BEC26C /* NYExerciseOptionItemViewModel.m */; };
 		90439AFE2CD37BA800BEC26C /* NYQuestionContentViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90439AFD2CD37BA800BEC26C /* NYQuestionContentViewModel.m */; };
 		9043ADB42A56C739005F6F81 /* NYChooseTypeAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9043ADB32A56C739005F6F81 /* NYChooseTypeAlertViewController.m */; };
+		904CDEF72D02A06A0094B2D0 /* NYBlockExerciseItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 904CDEF62D02A06A0094B2D0 /* NYBlockExerciseItemModel.m */; };
+		904CDEFA2D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 904CDEF92D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.m */; };
 		905CF7A62CDA1FEC00DE1B7F /* NYExaminationTipsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 905CF7A42CDA1FEC00DE1B7F /* NYExaminationTipsViewController.m */; };
 		905CF7A72CDA1FEC00DE1B7F /* NYExaminationTipsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 905CF7A52CDA1FEC00DE1B7F /* NYExaminationTipsViewController.xib */; };
 		90626F3D2A204BC400C8FA05 /* kt_jq.db in Resources */ = {isa = PBXBuildFile; fileRef = 90626F3C2A204BC300C8FA05 /* kt_jq.db */; };
@@ -135,6 +139,15 @@
 		909F0EE72CF06D9F00834944 /* NYHomePageOneBigCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 909F0EE42CF06D9F00834944 /* NYHomePageOneBigCell.m */; };
 		909F0EED2CF0788A00834944 /* NYHomePageOneBigItemViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 909F0EEC2CF0788A00834944 /* NYHomePageOneBigItemViewModel.m */; };
 		90A2ACEB2AE7C57000FA6E20 /* RQHTTPService+NYAppleUserInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A2ACEA2AE7C57000FA6E20 /* RQHTTPService+NYAppleUserInfo.m */; };
+		90A332AE2D093954009DA36D /* NYFailSpecialExerciseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332AC2D093954009DA36D /* NYFailSpecialExerciseViewController.m */; };
+		90A332AF2D093954009DA36D /* NYFailSpecialExerciseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90A332AD2D093954009DA36D /* NYFailSpecialExerciseViewController.xib */; };
+		90A332B32D0939E9009DA36D /* NYFailSpecialExerciseViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332B22D0939E9009DA36D /* NYFailSpecialExerciseViewModel.m */; };
+		90A332B62D097A86009DA36D /* NYFailSpecialExerciseItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332B52D097A86009DA36D /* NYFailSpecialExerciseItemModel.m */; };
+		90A332BB2D098710009DA36D /* NYFailSpecialExerciseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332B92D098710009DA36D /* NYFailSpecialExerciseCell.m */; };
+		90A332BC2D098710009DA36D /* NYFailSpecialExerciseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90A332BA2D098710009DA36D /* NYFailSpecialExerciseCell.xib */; };
+		90A332C02D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332BE2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.m */; };
+		90A332C12D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90A332BF2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.xib */; };
+		90A332C42D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A332C32D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.m */; };
 		90AC53AB2A935EF90073D90F /* NYTestingCentreCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AC53A92A935EF90073D90F /* NYTestingCentreCell.m */; };
 		90AC53AC2A935EF90073D90F /* NYTestingCentreCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90AC53AA2A935EF90073D90F /* NYTestingCentreCell.xib */; };
 		90AC53B22A9457070073D90F /* NYExerciseTestingCentreViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AC53B12A9457070073D90F /* NYExerciseTestingCentreViewModel.m */; };
@@ -154,6 +167,11 @@
 		90BA2EA72A3316510029A54A /* NYGetjobStartRuleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90BA2EA52A3316510029A54A /* NYGetjobStartRuleCell.m */; };
 		90BA2EA82A3316510029A54A /* NYGetjobStartRuleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90BA2EA62A3316510029A54A /* NYGetjobStartRuleCell.xib */; };
 		90BA2EAB2A3317510029A54A /* NYGetjobStartRuleViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90BA2EAA2A3317510029A54A /* NYGetjobStartRuleViewModel.m */; };
+		90C3D1AC2D0147E300126535 /* NYBlockExerciseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C3D1AA2D0147E200126535 /* NYBlockExerciseViewController.m */; };
+		90C3D1AD2D0147E300126535 /* NYBlockExerciseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90C3D1AB2D0147E200126535 /* NYBlockExerciseViewController.xib */; };
+		90C3D1B22D01492E00126535 /* NYBlockExerciseViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C3D1B12D01492E00126535 /* NYBlockExerciseViewModel.m */; };
+		90C3D1B62D01866300126535 /* NYBlockExerciseHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C3D1B42D01866300126535 /* NYBlockExerciseHeaderView.m */; };
+		90C3D1B72D01866300126535 /* NYBlockExerciseHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90C3D1B52D01866300126535 /* NYBlockExerciseHeaderView.xib */; };
 		90C6400D2CF7024500F53201 /* NYVideoCatalogueViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C6400C2CF7024500F53201 /* NYVideoCatalogueViewController.m */; };
 		90C6401A2CF7078A00F53201 /* MultilevelTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90C640132CF7078A00F53201 /* MultilevelTableViewCell.xib */; };
 		90C6401B2CF7078A00F53201 /* MultilevelTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C640122CF7078A00F53201 /* MultilevelTableViewCell.m */; };
@@ -167,6 +185,14 @@
 		90D356C62CC0B736002B52B9 /* NYExaminationRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90D356C42CC0B736002B52B9 /* NYExaminationRoomViewController.m */; };
 		90D356C72CC0B736002B52B9 /* NYExaminationRoomViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90D356C52CC0B736002B52B9 /* NYExaminationRoomViewController.xib */; };
 		90D356CA2CC0B7C2002B52B9 /* NYExaminationRoomViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90D356C92CC0B7C2002B52B9 /* NYExaminationRoomViewModel.m */; };
+		90EAB9DD2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90EAB9DC2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.xib */; };
+		90EAB9DE2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90EAB9DB2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.m */; };
+		90EAB9E12D0AC6950024F379 /* easy_error_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 90EAB9DF2D0AC6950024F379 /* easy_error_data.json */; };
+		90EAB9E22D0AC6950024F379 /* pointData.json in Resources */ = {isa = PBXBuildFile; fileRef = 90EAB9E02D0AC6950024F379 /* pointData.json */; };
+		90EAB9E52D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90EAB9E42D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m */; };
+		90EAB9E92D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90EAB9E82D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib */; };
+		90EAB9EA2D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90EAB9E72D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m */; };
+		90EAB9ED2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90EAB9EC2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m */; };
 		90EF40692B71DBA9007EA477 /* CultivatePhotoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90EF40682B71DBA9007EA477 /* CultivatePhotoModel.m */; };
 		90FCD6A72BB517AF00E0CB61 /* NYTcarStudentLiveModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FCD6A62BB517AF00E0CB61 /* NYTcarStudentLiveModel.m */; };
 		D00177E22886A6F70078949E /* RQExerciseExplainHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = D00177E12886A6F70078949E /* RQExerciseExplainHeaderView.m */; };
@@ -1865,6 +1891,9 @@
 		9040D28F2B6F94DA002F4686 /* NYClassRoomPeiViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYClassRoomPeiViewModel.m; sourceTree = "<group>"; };
 		9040D2912B70E504002F4686 /* CultivateInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CultivateInfoModel.h; sourceTree = "<group>"; };
 		9040D2922B70E504002F4686 /* CultivateInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CultivateInfoModel.m; sourceTree = "<group>"; };
+		9042872A2D01ABB7003D37FD /* NYBlockExerciseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseCell.h; sourceTree = "<group>"; };
+		9042872B2D01ABB7003D37FD /* NYBlockExerciseCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseCell.m; sourceTree = "<group>"; };
+		9042872C2D01ABB7003D37FD /* NYBlockExerciseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYBlockExerciseCell.xib; sourceTree = "<group>"; };
 		90439AEC2CD354BA00BEC26C /* NYExerciseQuestionItemViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYExerciseQuestionItemViewModel.h; sourceTree = "<group>"; };
 		90439AED2CD354BA00BEC26C /* NYExerciseQuestionItemViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYExerciseQuestionItemViewModel.m; sourceTree = "<group>"; };
 		90439AF42CD36AE000BEC26C /* NYExerciseOptionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYExerciseOptionCell.h; sourceTree = "<group>"; };
@@ -1876,6 +1905,10 @@
 		90439AFD2CD37BA800BEC26C /* NYQuestionContentViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYQuestionContentViewModel.m; sourceTree = "<group>"; };
 		9043ADB22A56C739005F6F81 /* NYChooseTypeAlertViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYChooseTypeAlertViewController.h; sourceTree = "<group>"; };
 		9043ADB32A56C739005F6F81 /* NYChooseTypeAlertViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYChooseTypeAlertViewController.m; sourceTree = "<group>"; };
+		904CDEF52D02A06A0094B2D0 /* NYBlockExerciseItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseItemModel.h; sourceTree = "<group>"; };
+		904CDEF62D02A06A0094B2D0 /* NYBlockExerciseItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseItemModel.m; sourceTree = "<group>"; };
+		904CDEF82D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseGroupViewModel.h; sourceTree = "<group>"; };
+		904CDEF92D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseGroupViewModel.m; sourceTree = "<group>"; };
 		905CF7A32CDA1FEC00DE1B7F /* NYExaminationTipsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYExaminationTipsViewController.h; sourceTree = "<group>"; };
 		905CF7A42CDA1FEC00DE1B7F /* NYExaminationTipsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYExaminationTipsViewController.m; sourceTree = "<group>"; };
 		905CF7A52CDA1FEC00DE1B7F /* NYExaminationTipsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYExaminationTipsViewController.xib; sourceTree = "<group>"; };
@@ -1925,6 +1958,21 @@
 		909F0EEC2CF0788A00834944 /* NYHomePageOneBigItemViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYHomePageOneBigItemViewModel.m; sourceTree = "<group>"; };
 		90A2ACE92AE7C57000FA6E20 /* RQHTTPService+NYAppleUserInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RQHTTPService+NYAppleUserInfo.h"; sourceTree = "<group>"; };
 		90A2ACEA2AE7C57000FA6E20 /* RQHTTPService+NYAppleUserInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RQHTTPService+NYAppleUserInfo.m"; sourceTree = "<group>"; };
+		90A332AB2D093954009DA36D /* NYFailSpecialExerciseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseViewController.h; sourceTree = "<group>"; };
+		90A332AC2D093954009DA36D /* NYFailSpecialExerciseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseViewController.m; sourceTree = "<group>"; };
+		90A332AD2D093954009DA36D /* NYFailSpecialExerciseViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseViewController.xib; sourceTree = "<group>"; };
+		90A332B12D0939E9009DA36D /* NYFailSpecialExerciseViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseViewModel.h; sourceTree = "<group>"; };
+		90A332B22D0939E9009DA36D /* NYFailSpecialExerciseViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseViewModel.m; sourceTree = "<group>"; };
+		90A332B42D097A86009DA36D /* NYFailSpecialExerciseItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseItemModel.h; sourceTree = "<group>"; };
+		90A332B52D097A86009DA36D /* NYFailSpecialExerciseItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseItemModel.m; sourceTree = "<group>"; };
+		90A332B82D098710009DA36D /* NYFailSpecialExerciseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseCell.h; sourceTree = "<group>"; };
+		90A332B92D098710009DA36D /* NYFailSpecialExerciseCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseCell.m; sourceTree = "<group>"; };
+		90A332BA2D098710009DA36D /* NYFailSpecialExerciseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseCell.xib; sourceTree = "<group>"; };
+		90A332BD2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseHeaderView.h; sourceTree = "<group>"; };
+		90A332BE2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseHeaderView.m; sourceTree = "<group>"; };
+		90A332BF2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseHeaderView.xib; sourceTree = "<group>"; };
+		90A332C22D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseGroupViewModel.h; sourceTree = "<group>"; };
+		90A332C32D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseGroupViewModel.m; sourceTree = "<group>"; };
 		90AC53A82A935EF90073D90F /* NYTestingCentreCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYTestingCentreCell.h; sourceTree = "<group>"; };
 		90AC53A92A935EF90073D90F /* NYTestingCentreCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYTestingCentreCell.m; sourceTree = "<group>"; };
 		90AC53AA2A935EF90073D90F /* NYTestingCentreCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYTestingCentreCell.xib; sourceTree = "<group>"; };
@@ -1958,6 +2006,14 @@
 		90BA2EA62A3316510029A54A /* NYGetjobStartRuleCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYGetjobStartRuleCell.xib; sourceTree = "<group>"; };
 		90BA2EA92A3317510029A54A /* NYGetjobStartRuleViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYGetjobStartRuleViewModel.h; sourceTree = "<group>"; };
 		90BA2EAA2A3317510029A54A /* NYGetjobStartRuleViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYGetjobStartRuleViewModel.m; sourceTree = "<group>"; };
+		90C3D1A92D0147E200126535 /* NYBlockExerciseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseViewController.h; sourceTree = "<group>"; };
+		90C3D1AA2D0147E200126535 /* NYBlockExerciseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseViewController.m; sourceTree = "<group>"; };
+		90C3D1AB2D0147E200126535 /* NYBlockExerciseViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYBlockExerciseViewController.xib; sourceTree = "<group>"; };
+		90C3D1B02D01492E00126535 /* NYBlockExerciseViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseViewModel.h; sourceTree = "<group>"; };
+		90C3D1B12D01492E00126535 /* NYBlockExerciseViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseViewModel.m; sourceTree = "<group>"; };
+		90C3D1B32D01866300126535 /* NYBlockExerciseHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYBlockExerciseHeaderView.h; sourceTree = "<group>"; };
+		90C3D1B42D01866300126535 /* NYBlockExerciseHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYBlockExerciseHeaderView.m; sourceTree = "<group>"; };
+		90C3D1B52D01866300126535 /* NYBlockExerciseHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYBlockExerciseHeaderView.xib; sourceTree = "<group>"; };
 		90C6400B2CF7024500F53201 /* NYVideoCatalogueViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYVideoCatalogueViewController.h; sourceTree = "<group>"; };
 		90C6400C2CF7024500F53201 /* NYVideoCatalogueViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYVideoCatalogueViewController.m; sourceTree = "<group>"; };
 		90C6400F2CF7078A00F53201 /* CollectviewChooseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CollectviewChooseCell.h; sourceTree = "<group>"; };
@@ -1981,6 +2037,18 @@
 		90D356C52CC0B736002B52B9 /* NYExaminationRoomViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYExaminationRoomViewController.xib; sourceTree = "<group>"; };
 		90D356C82CC0B7C2002B52B9 /* NYExaminationRoomViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYExaminationRoomViewModel.h; sourceTree = "<group>"; };
 		90D356C92CC0B7C2002B52B9 /* NYExaminationRoomViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYExaminationRoomViewModel.m; sourceTree = "<group>"; };
+		90EAB9DA2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseDetailsViewController.h; sourceTree = "<group>"; };
+		90EAB9DB2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseDetailsViewController.m; sourceTree = "<group>"; };
+		90EAB9DC2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseDetailsViewController.xib; sourceTree = "<group>"; };
+		90EAB9DF2D0AC6950024F379 /* easy_error_data.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = easy_error_data.json; sourceTree = "<group>"; };
+		90EAB9E02D0AC6950024F379 /* pointData.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = pointData.json; sourceTree = "<group>"; };
+		90EAB9E32D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseDetailsViewModel.h; sourceTree = "<group>"; };
+		90EAB9E42D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseDetailsViewModel.m; sourceTree = "<group>"; };
+		90EAB9E62D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseDetailsCell.h; sourceTree = "<group>"; };
+		90EAB9E72D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseDetailsCell.m; sourceTree = "<group>"; };
+		90EAB9E82D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseDetailsCell.xib; sourceTree = "<group>"; };
+		90EAB9EB2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseDetailItemModel.h; sourceTree = "<group>"; };
+		90EAB9EC2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseDetailItemModel.m; sourceTree = "<group>"; };
 		90EF40672B71DBA9007EA477 /* CultivatePhotoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CultivatePhotoModel.h; sourceTree = "<group>"; };
 		90EF40682B71DBA9007EA477 /* CultivatePhotoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CultivatePhotoModel.m; sourceTree = "<group>"; };
 		90FCD6A52BB517AF00E0CB61 /* NYTcarStudentLiveModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYTcarStudentLiveModel.h; sourceTree = "<group>"; };
@@ -4437,6 +4505,8 @@
 		185F229D1BE6F38500720049 /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
+				90EAB9DF2D0AC6950024F379 /* easy_error_data.json */,
+				90EAB9E02D0AC6950024F379 /* pointData.json */,
 				D074576B29275AB10050BE10 /* Localizable.strings */,
 				185F23FF1BE702E200720049 /* PrefixHeader.pch */,
 				1863A5D61BF449C70043F1CD /* Images.xcassets */,
@@ -4815,6 +4885,52 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
+		90A332AA2D093867009DA36D /* 易错专项 */ = {
+			isa = PBXGroup;
+			children = (
+				90A332AB2D093954009DA36D /* NYFailSpecialExerciseViewController.h */,
+				90A332AC2D093954009DA36D /* NYFailSpecialExerciseViewController.m */,
+				90A332AD2D093954009DA36D /* NYFailSpecialExerciseViewController.xib */,
+				90EAB9DA2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.h */,
+				90EAB9DB2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.m */,
+				90EAB9DC2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.xib */,
+			);
+			path = "易错专项";
+			sourceTree = "<group>";
+		};
+		90A332B02D0939A1009DA36D /* 易错专项 */ = {
+			isa = PBXGroup;
+			children = (
+				90A332B12D0939E9009DA36D /* NYFailSpecialExerciseViewModel.h */,
+				90A332B22D0939E9009DA36D /* NYFailSpecialExerciseViewModel.m */,
+				90A332B42D097A86009DA36D /* NYFailSpecialExerciseItemModel.h */,
+				90A332B52D097A86009DA36D /* NYFailSpecialExerciseItemModel.m */,
+				90A332C22D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.h */,
+				90A332C32D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.m */,
+				90EAB9E32D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.h */,
+				90EAB9E42D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m */,
+				90EAB9EB2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.h */,
+				90EAB9EC2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m */,
+			);
+			path = "易错专项";
+			sourceTree = "<group>";
+		};
+		90A332B72D0986B9009DA36D /* 易错专项 */ = {
+			isa = PBXGroup;
+			children = (
+				90A332B82D098710009DA36D /* NYFailSpecialExerciseCell.h */,
+				90A332B92D098710009DA36D /* NYFailSpecialExerciseCell.m */,
+				90A332BA2D098710009DA36D /* NYFailSpecialExerciseCell.xib */,
+				90A332BD2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.h */,
+				90A332BE2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.m */,
+				90A332BF2D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.xib */,
+				90EAB9E62D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.h */,
+				90EAB9E72D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m */,
+				90EAB9E82D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib */,
+			);
+			path = "易错专项";
+			sourceTree = "<group>";
+		};
 		90B0F6842A70E9E300B448DC /* QCloudTTSSDK */ = {
 			isa = PBXGroup;
 			children = (
@@ -4893,6 +5009,42 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		90C3D1A82D01476D00126535 /* 分段练习 */ = {
+			isa = PBXGroup;
+			children = (
+				90C3D1A92D0147E200126535 /* NYBlockExerciseViewController.h */,
+				90C3D1AA2D0147E200126535 /* NYBlockExerciseViewController.m */,
+				90C3D1AB2D0147E200126535 /* NYBlockExerciseViewController.xib */,
+			);
+			path = "分段练习";
+			sourceTree = "<group>";
+		};
+		90C3D1AE2D0148E800126535 /* 分段练习 */ = {
+			isa = PBXGroup;
+			children = (
+				90C3D1B32D01866300126535 /* NYBlockExerciseHeaderView.h */,
+				90C3D1B42D01866300126535 /* NYBlockExerciseHeaderView.m */,
+				90C3D1B52D01866300126535 /* NYBlockExerciseHeaderView.xib */,
+				9042872A2D01ABB7003D37FD /* NYBlockExerciseCell.h */,
+				9042872B2D01ABB7003D37FD /* NYBlockExerciseCell.m */,
+				9042872C2D01ABB7003D37FD /* NYBlockExerciseCell.xib */,
+			);
+			path = "分段练习";
+			sourceTree = "<group>";
+		};
+		90C3D1AF2D0148FD00126535 /* 分段练习 */ = {
+			isa = PBXGroup;
+			children = (
+				90C3D1B02D01492E00126535 /* NYBlockExerciseViewModel.h */,
+				90C3D1B12D01492E00126535 /* NYBlockExerciseViewModel.m */,
+				904CDEF52D02A06A0094B2D0 /* NYBlockExerciseItemModel.h */,
+				904CDEF62D02A06A0094B2D0 /* NYBlockExerciseItemModel.m */,
+				904CDEF82D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.h */,
+				904CDEF92D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.m */,
+			);
+			path = "分段练习";
+			sourceTree = "<group>";
+		};
 		90C6400E2CF7077300F53201 /* MuTableCollectMenu */ = {
 			isa = PBXGroup;
 			children = (
@@ -6722,6 +6874,8 @@
 		D0481FDA2863121F00BD0E4E /* HomeSubPage */ = {
 			isa = PBXGroup;
 			children = (
+				90A332B72D0986B9009DA36D /* 易错专项 */,
+				90C3D1AE2D0148E800126535 /* 分段练习 */,
 				D0B2D4EC289A567B00D6C5F4 /* 错题收藏 */,
 				D0481FDB2863122C00BD0E4E /* 专项练习 */,
 			);
@@ -7723,6 +7877,8 @@
 		D05CB34927632169006895F3 /* HomeSubPage */ = {
 			isa = PBXGroup;
 			children = (
+				90A332B02D0939A1009DA36D /* 易错专项 */,
+				90C3D1AF2D0148FD00126535 /* 分段练习 */,
 				D0B2D4ED289A568A00D6C5F4 /* 错题收藏 */,
 				D0481FCE2861F72900BD0E4E /* 专项练习 */,
 				D0D2D0D02861E672004E31E6 /* 考前秘卷 */,
@@ -7784,6 +7940,8 @@
 		D05CB39B2763216A006895F3 /* HomeSubPage */ = {
 			isa = PBXGroup;
 			children = (
+				90A332AA2D093867009DA36D /* 易错专项 */,
+				90C3D1A82D01476D00126535 /* 分段练习 */,
 				D0B2D4EB289A566A00D6C5F4 /* 错题收藏 */,
 				D0481FCD2861F71700BD0E4E /* 专项练习 */,
 				D0D2D0C92861C077004E31E6 /* 考前密卷 */,
@@ -10104,6 +10262,7 @@
 				D0295B62243F0B8A00B46AB1 /* 1-10-23.jpg in Resources */,
 				D088A7C42611B69200D9B25B /* LaunchImage.png in Resources */,
 				D0295B90243F0B8A00B46AB1 /* 1-7-15.jpg in Resources */,
+				90A332BC2D098710009DA36D /* NYFailSpecialExerciseCell.xib in Resources */,
 				D0295C9B243F0B8B00B46AB1 /* 1-11-7.jpg in Resources */,
 				D048E2152819023B005D606F /* RQProfilePracticeCell.xib in Resources */,
 				D0295CCD243F0B8B00B46AB1 /* 1-4-63.jpg in Resources */,
@@ -10221,6 +10380,7 @@
 				D0D1F6B2283F84E00086C6AE /* RQExerciseToolBarView.xib in Resources */,
 				D0295B5E243F0B8A00B46AB1 /* 1-2-37.jpg in Resources */,
 				D0295BFF243F0B8B00B46AB1 /* 1-4-125.jpg in Resources */,
+				90EAB9DD2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.xib in Resources */,
 				D0295C86243F0B8B00B46AB1 /* 1-3-23.jpg in Resources */,
 				D0508CD327D8768F00CBF1FC /* RQDspVideoDetailCell.xib in Resources */,
 				D0294817243F07E300B46AB1 /* 评价2-4@2x.png in Resources */,
@@ -10302,6 +10462,8 @@
 				D0295B68243F0B8A00B46AB1 /* 1-4-80.jpg in Resources */,
 				D0295D87243F0B8C00B46AB1 /* light8.mp3 in Resources */,
 				D0295C55243F0B8B00B46AB1 /* 6-16-3.jpg in Resources */,
+				90EAB9E12D0AC6950024F379 /* easy_error_data.json in Resources */,
+				90EAB9E22D0AC6950024F379 /* pointData.json in Resources */,
 				D0B54ADF28CB0F0E00F6EFC4 /* RQHomePageTitleView.xib in Resources */,
 				D0295B9B243F0B8A00B46AB1 /* 1-10-30.jpg in Resources */,
 				D0295D2B243F0B8C00B46AB1 /* 6-16-16.jpg in Resources */,
@@ -10526,6 +10688,7 @@
 				D0F9E8292824F6AE0073A7D1 /* RQChooseCarTypeCell.xib in Resources */,
 				D00177E42886A70C0078949E /* RQExerciseExplainHeaderView.xib in Resources */,
 				D0295D1A243F0B8C00B46AB1 /* 1-4-66.jpg in Resources */,
+				90C3D1B72D01866300126535 /* NYBlockExerciseHeaderView.xib in Resources */,
 				D0A927D827078CF4005902DB /* idl-license.face-ios in Resources */,
 				D0295CB0243F0B8B00B46AB1 /* 1-6-14.jpg in Resources */,
 				D0295D05243F0B8C00B46AB1 /* 3-13-8.jpg in Resources */,
@@ -10555,6 +10718,7 @@
 				D0295C1A243F0B8B00B46AB1 /* 1-4-120.jpg in Resources */,
 				D0295C4E243F0B8B00B46AB1 /* 1-1-24.jpg in Resources */,
 				D0295C47243F0B8B00B46AB1 /* 1-4-31.jpg in Resources */,
+				9042872D2D01ABB7003D37FD /* NYBlockExerciseCell.xib in Resources */,
 				D0295BD5243F0B8B00B46AB1 /* 1-4-21.jpg in Resources */,
 				D0295BB8243F0B8B00B46AB1 /* 1-4-47.jpg in Resources */,
 				90AC53AC2A935EF90073D90F /* NYTestingCentreCell.xib in Resources */,
@@ -10567,6 +10731,7 @@
 				D0295CD1243F0B8B00B46AB1 /* 1-6-3.jpg in Resources */,
 				90439AF82CD36AE000BEC26C /* NYExerciseOptionCell.xib in Resources */,
 				D0295D4E243F0B8C00B46AB1 /* img09.png in Resources */,
+				90C3D1AD2D0147E300126535 /* NYBlockExerciseViewController.xib in Resources */,
 				D0ED401E28F6BF1B00086901 /* RQVipContentNewCell.xib in Resources */,
 				D0295C2C243F0B8B00B46AB1 /* 1-4-18.jpg in Resources */,
 				D0B840B12850672C001DB115 /* RQProfileSubjectFourVipCell.xib in Resources */,
@@ -10592,6 +10757,7 @@
 				D0295D67243F0B8C00B46AB1 /* FaceRecongrise.mp3 in Resources */,
 				D0295B6D243F0B8A00B46AB1 /* 1-7-12.jpg in Resources */,
 				D0295C42243F0B8B00B46AB1 /* 1-3-10.jpg in Resources */,
+				90A332C12D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.xib in Resources */,
 				D0295BAB243F0B8A00B46AB1 /* 1-4-92.jpg in Resources */,
 				D0295D15243F0B8C00B46AB1 /* 1-4-70.jpg in Resources */,
 				D0295C57243F0B8B00B46AB1 /* 1-4-106.jpg in Resources */,
@@ -10659,6 +10825,7 @@
 				D05A320629220999002EB3E2 /* RQVipAuthorityNewCell.xib in Resources */,
 				D0DF83DE27CF6E9600547504 /* RQVipHeaderImageViewReusableView.xib in Resources */,
 				D09C56D428534CCD00088A2E /* RQHomePageOneOrFourBigCell.xib in Resources */,
+				90A332AF2D093954009DA36D /* NYFailSpecialExerciseViewController.xib in Resources */,
 				D0295B55243F0B8A00B46AB1 /* 1-4-42.jpg in Resources */,
 				D0295C2E243F0B8B00B46AB1 /* 1-9-3.jpg in Resources */,
 				D0295B9F243F0B8A00B46AB1 /* 3-13-1.jpg in Resources */,
@@ -10711,6 +10878,7 @@
 				D0295C4A243F0B8B00B46AB1 /* 1-4-28.jpg in Resources */,
 				D0295C79243F0B8B00B46AB1 /* 1-4-110.jpg in Resources */,
 				D0295BF0243F0B8B00B46AB1 /* 2-12-7.jpg in Resources */,
+				90EAB9E92D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib in Resources */,
 				D0295C30243F0B8B00B46AB1 /* 5-15-30.jpg in Resources */,
 				D048E228281A80BD005D606F /* RQProfileVipCell.xib in Resources */,
 				D084D87327CDFF2D00E521F0 /* RQVipAuthoritySmallCell.xib in Resources */,
@@ -10962,6 +11130,7 @@
 				D09E5D5525E3AA260099E87C /* BDFaceRemindView.m in Sources */,
 				D0D2D0D32861E69A004E31E6 /* RQHoursBeforeExamHomeViewModel.m in Sources */,
 				D0B2D4F0289A56C900D6C5F4 /* RQErrorAndCollectViewController.m in Sources */,
+				90EAB9EA2D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m in Sources */,
 				D048E2142819023B005D606F /* RQProfilePracticeCell.m in Sources */,
 				D04DF7A627006F72006E3633 /* MBProgressHUD+RQExtension.m in Sources */,
 				D074575F29272C680050BE10 /* QMPickedPhotoViewController.m in Sources */,
@@ -11085,6 +11254,7 @@
 				1809CA4B1D48A69B005D16DA /* PeriodVC.m in Sources */,
 				D0F8F10D2929C6F50008019C /* Evaluation.m in Sources */,
 				D0295ECD243F1EC800B46AB1 /* payRequsestHandler.mm in Sources */,
+				90C3D1B22D01492E00126535 /* NYBlockExerciseViewModel.m in Sources */,
 				9040D2882B6F7E07002F4686 /* NYClassRoomViewModel.m in Sources */,
 				D04DF7A327006F72006E3633 /* UISearchBar+RQExtension.m in Sources */,
 				D0481FEB2863284A00BD0E4E /* RQSpecialAddCell.m in Sources */,
@@ -11130,6 +11300,7 @@
 				D06BBFBE276722ED00D7A2EE /* RQHomeSubPageNormalItemViewModel.m in Sources */,
 				D0D1F684283F84DF0086C6AE /* RQExerciseModule.m in Sources */,
 				D0BD3F332664D1A5006858B7 /* RQRemoteTheoryManager.m in Sources */,
+				90EAB9ED2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m in Sources */,
 				18C1F7311BF844D3001955D6 /* STButton.m in Sources */,
 				18A917B61BE8A73C0022B452 /* TrainRecord.m in Sources */,
 				D0D1F6A5283F84E00086C6AE /* JXCategoryTitleBackgroundCell.m in Sources */,
@@ -11143,6 +11314,7 @@
 				D073984328D46C8D003496F9 /* RQAboutViewModel.m in Sources */,
 				D02010E229373AE8001B9F4D /* UIButton+SLTitleImage.m in Sources */,
 				D08E8E5B2930C2A5001CEF97 /* RQTimeSingleItemViewModel.m in Sources */,
+				90EAB9E52D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m in Sources */,
 				D004D7F527FE60EB00A96946 /* RQYDTZGZWXPQuestionModule.m in Sources */,
 				D09E5D4E25E3AA260099E87C /* BDFaceLivingConfigViewController.m in Sources */,
 				D00A150E2754A41C00793046 /* CustomTitleView.m in Sources */,
@@ -11153,6 +11325,7 @@
 				906D06A72CCF8F6F004F51B4 /* NYChartMatrixView.m in Sources */,
 				D01F24FD292600AA0014E209 /* RQVipTimeCell.m in Sources */,
 				D004D7E827FD9CB400A96946 /* RQYDTMTCQuestionModule.m in Sources */,
+				90A332AE2D093954009DA36D /* NYFailSpecialExerciseViewController.m in Sources */,
 				185C0D471F3F05CE009082AD /* ShiCaoPeriodVC.m in Sources */,
 				D048E21C28193D4B005D606F /* RQProfilePracticeItemViewModel.m in Sources */,
 				D074576029272C680050BE10 /* QMPickedVideoViewController.m in Sources */,
@@ -11174,6 +11347,7 @@
 				D01CF3BA2892812F009EEA12 /* QMUIConfigurationTemplatePinkRose.m in Sources */,
 				D074575D29272C680050BE10 /* QMFileModel.m in Sources */,
 				D00A152F2754AF7E00793046 /* JXPagerView+RQExtension.m in Sources */,
+				9042872E2D01ABB7003D37FD /* NYBlockExerciseCell.m in Sources */,
 				D0D1F689283F84DF0086C6AE /* RQHTTPService+RQCancleCollectionRecord.m in Sources */,
 				D05EF12F28C873A8002BFC0A /* RQStrongViewModel.m in Sources */,
 				D0481DBE2899442D00F90D55 /* RQSimulateExamBeginCell.m in Sources */,
@@ -11280,6 +11454,7 @@
 				D02010E029373AE8001B9F4D /* WKWebView+SLExtension.m in Sources */,
 				D02010E329373AE8001B9F4D /* NSDictionary+SLExtension.m in Sources */,
 				D0B351DD281588BC0046A872 /* CYAnyCornerRadiusUtil.m in Sources */,
+				90C3D1AC2D0147E300126535 /* NYBlockExerciseViewController.m in Sources */,
 				D048E220281A2A13005D606F /* RQHTTPService+RQGetMenuInfo.m in Sources */,
 				D0D1F687283F84DF0086C6AE /* RQCollectionModel.m in Sources */,
 				D0D1F68B283F84DF0086C6AE /* RQExerciseModel.m in Sources */,
@@ -11396,6 +11571,7 @@
 				D048E20C2818E0F1005D606F /* RQProfileUserAndVipHeaderView.m in Sources */,
 				D09E5D4525E3AA260099E87C /* BDFaceAdjustParamsConstants.m in Sources */,
 				D04DF7C527006F73006E3633 /* RQControllerHelper.m in Sources */,
+				90A332BB2D098710009DA36D /* NYFailSpecialExerciseCell.m in Sources */,
 				D057C1CA29F50FC5002F4AB2 /* RQPlaceListFooterView.m in Sources */,
 				D074574129272C680050BE10 /* QMChatRoomBaseCell.m in Sources */,
 				D0913E0D28A6AA6600F28430 /* UIViewController+RQChangeIconNoAlert.m in Sources */,
@@ -11427,6 +11603,7 @@
 				D074574B29272C680050BE10 /* QMChatRoomInputView.m in Sources */,
 				D0D2D0C028615954004E31E6 /* RQHomePageJiaoGuan12123ItemViewModel.m in Sources */,
 				D074573929272C670050BE10 /* QMChatRoomRichTextCell.m in Sources */,
+				90A332B32D0939E9009DA36D /* NYFailSpecialExerciseViewModel.m in Sources */,
 				D0B2D514289D18C900D6C5F4 /* RQVipCenterViewModel.m in Sources */,
 				D04DF79427006F72006E3633 /* YYAnimatedImageView+RQExtension.m in Sources */,
 				90798B012A517B2500E68461 /* NYSerialQueueManager.m in Sources */,
@@ -11501,6 +11678,7 @@
 				1D6EB9ED1E7250D4009A7D01 /* ImitatePeriodVC.m in Sources */,
 				1D4D5BBB1E8249C600518BA5 /* ShiCaotableView.m in Sources */,
 				D0F8F13A2929E3830008019C /* ThirdLoginBindYunGuanVC.m in Sources */,
+				90C3D1B62D01866300126535 /* NYBlockExerciseHeaderView.m in Sources */,
 				D057C1F729F5107A002F4AB2 /* RQPlaceDetailDescribeViewModel.m in Sources */,
 				D0D68D33288FDEF700600C5C /* RQChapterAndPointListViewController.m in Sources */,
 				D0870D7B2701A6B9004EC94E /* A2DynamicDelegate.m in Sources */,
@@ -11516,6 +11694,7 @@
 				18ACEEF41C3E5FCA00C5DE05 /* InputView.m in Sources */,
 				D04DF7AE27006F72006E3633 /* SAMKeychain+RQUtil.m in Sources */,
 				D0870D722701A6B9004EC94E /* UIImagePickerController+BlocksKit.m in Sources */,
+				904CDEFA2D02D5E10094B2D0 /* NYBlockExerciseGroupViewModel.m in Sources */,
 				D04DF6C627006C57006E3633 /* RQCommonCollectionItemViewModel.m in Sources */,
 				90958FA02BAD65BA009BAA71 /* NYTools.m in Sources */,
 				D056D3BC28B749A90003F024 /* RQHTTPService+RQSaveBetchFavQuestion.m in Sources */,
@@ -11524,6 +11703,7 @@
 				D01CF43C2893CFA4009EEA12 /* RQExamProbabilyCell.m in Sources */,
 				D07426D9280D5EBB00CD7EFF /* RQRetrainOrderViewModel.m in Sources */,
 				D0D1F66F283F84DF0086C6AE /* RQExerciseOptionSureBtnItemViewModel.m in Sources */,
+				904CDEF72D02A06A0094B2D0 /* NYBlockExerciseItemModel.m in Sources */,
 				D029479C243EF3DB00B46AB1 /* Order.m in Sources */,
 				D00A15012754A41C00793046 /* RQHTTPService+RQGetTreeList.m in Sources */,
 				D0870D912701A6BA004EC94E /* NSObject+YYAdd.m in Sources */,
@@ -11538,10 +11718,12 @@
 				90D356C62CC0B736002B52B9 /* NYExaminationRoomViewController.m in Sources */,
 				18541E001C018CF20097606A /* CommentCell.m in Sources */,
 				D0354AFD230E333200E1C54D /* MyWebViewVC.m in Sources */,
+				90EAB9DE2D0AC3DD0024F379 /* NYFailSpecialExerciseDetailsViewController.m in Sources */,
 				D073984628D46F2A003496F9 /* RQAboutUsHeaderView.m in Sources */,
 				D0B2D50E289CEB6700D6C5F4 /* RQErrorAndCollectItemViewModel.m in Sources */,
 				D074576529272C680050BE10 /* QMAlert.m in Sources */,
 				D0D1F6B4283F84E00086C6AE /* RQExerciseSettingCell.m in Sources */,
+				90A332C02D0990F0009DA36D /* NYFailSpecialExerciseHeaderView.m in Sources */,
 				D0D1F690283F84DF0086C6AE /* RQGetScoreInfoAllModel.m in Sources */,
 				D02559EE285EE281002D8A1F /* JXPagerSmoothView+RQExtension.m in Sources */,
 				D02010CE29373AE8001B9F4D /* SLViewController.m in Sources */,
@@ -11675,6 +11857,7 @@
 				D09E5D4225E3AA260099E87C /* BDFaceSelectConfigModel.m in Sources */,
 				D02010DF29373AE8001B9F4D /* UIView+SLFrame.m in Sources */,
 				D0D1F6B0283F84E00086C6AE /* RQExerciseToolBarView.m in Sources */,
+				90A332B62D097A86009DA36D /* NYFailSpecialExerciseItemModel.m in Sources */,
 				D0D1F697283F84E00086C6AE /* RQWrongModel.m in Sources */,
 				D0870D9A2701A6BA004EC94E /* NSDictionary+YYAdd.m in Sources */,
 				D0B54ADD28CB0EEC00F6EFC4 /* RQHomePageTitleView.m in Sources */,
@@ -11788,6 +11971,7 @@
 				D05A6FB227F2E5F100C096DB /* RQYDTUserQuestionModule.m in Sources */,
 				D0870E442701B5A0004EC94E /* RQHTTPService+RQUpdatePassword.m in Sources */,
 				D074573E29272C680050BE10 /* QMChatRoomRobotCell.m in Sources */,
+				90A332C42D099637009DA36D /* NYFailSpecialExerciseGroupViewModel.m in Sources */,
 				D0870D7C2701A6B9004EC94E /* NSObject+A2DynamicDelegate.m in Sources */,
 				D057C1D029F50FC5002F4AB2 /* RQPlaceListTableViewHeaderView.m in Sources */,
 				D02010DD29373AE8001B9F4D /* SLEditSelectedBox.m in Sources */,

BIN
jiaPei.xcworkspace/xcuserdata/mimasigeling.xcuserdatad/UserInterfaceState.xcuserstate


+ 6 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "交警手势@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "交警手势@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/交警手势@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/交警手势.imageset/交警手势@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "判刑扣留@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "判刑扣留@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/判刑扣留@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/判刑扣留.imageset/判刑扣留@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "周期@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "周期@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/周期@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/周期.imageset/周期@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "安全常识@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "安全常识@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/安全常识@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/安全常识.imageset/安全常识@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "扣分@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "扣分@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/扣分@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/扣分.imageset/扣分@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "特殊天气@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "特殊天气@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/特殊天气@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/特殊天气.imageset/特殊天气@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "电子资料@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "电子资料@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/电子资料@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/电子资料H.imageset/电子资料@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "罚款@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "罚款@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/罚款@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/罚款.imageset/罚款@3x.png


+ 6 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "blue_btn_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "blue_btn_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/blue_btn_bg@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_btn_bg.imageset/blue_btn_bg@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "blue_jb_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "blue_jb_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/blue_jb_bg@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_jb_bg.imageset/blue_jb_bg@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "分阶段视频封面@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "分阶段视频封面@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/分阶段视频封面@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/分阶段视频封面.imageset/分阶段视频封面@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "播放@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "播放@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/播放@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/播放.imageset/播放@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "通行原则@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "通行原则@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/通行原则@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/通行原则.imageset/通行原则@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "速度灯光@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "速度灯光@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/速度灯光@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/速度灯光.imageset/速度灯光@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "驾驶证@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "驾驶证@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/驾驶证@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/驾驶证.imageset/驾驶证@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "星星灰@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "星星灰@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/星星灰@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/星星灰.imageset/星星灰@3x.png


+ 22 - 0
jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "星星黄@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "星星黄@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/星星黄@2x.png


BIN
jiaPei/Images.xcassets/Modules/HomePageModule/星星黄.imageset/星星黄@3x.png


+ 18 - 0
jiaPei/Modules/HomePageModule/RQHomePageModule.h

@@ -15,6 +15,7 @@ FOUNDATION_EXTERN CGFloat const RQHeightForPinSectionHeaderInPagerView;
 FOUNDATION_EXTERN CGFloat const RQHeightForPinSectionHeaderInPagerView_One;
 FOUNDATION_EXTERN CGFloat const RQHeightForPinSectionHeaderInPagerView_Two;
 FOUNDATION_EXTERN CGFloat const RQHomeSubPageEditListToolBarHeight;
+FOUNDATION_EXTERN NSString * const RQHomePageSpTitleKey;
 /// 首页车型选项Key
 FOUNDATION_EXTERN NSString * const RQHomePageCarTypeKey;
 /// 首页科目选项Key
@@ -70,6 +71,12 @@ FOUNDATION_EXTERN NSString * const RQHomeSubEditListTypeKey;
 #import "RQPlaceDetaiIQuestionCell.h"
 #import "RQTeachSchoolVideoCell.h"
 
+#import "NYFailSpecialExerciseHeaderView.h"
+#import "NYFailSpecialExerciseCell.h"
+
+#import "NYBlockExerciseHeaderView.h"
+#import "NYBlockExerciseCell.h"
+
 #import "NYHomePageOneBigCell.h"
 
 #pragma mark - ViewController
@@ -81,6 +88,9 @@ FOUNDATION_EXTERN NSString * const RQHomeSubEditListTypeKey;
 #import "RQHomeSubPageVideoScrollViewController.h"
 #import "RQHomeSubPageVideoScrollSubViewController.h"
 
+#import "NYFailSpecialExerciseDetailsViewController.h"
+#import "NYFailSpecialExerciseViewController.h"               /// 易错专项
+#import "NYBlockExerciseViewController.h"
 #import "RQSpecialPractiseViewController.h"                  /// 专项练习
 #import "RQChapterAndPointListViewController.h"
 #import "RQHoursBeforeExamHomeViewController.h"              /// 考前秘卷
@@ -113,6 +123,14 @@ FOUNDATION_EXTERN NSString * const RQHomeSubEditListTypeKey;
 #import "RQHomePageDriveMethodItemViewModel.h"
 #import "RQHomePageSubjectModuleItemViewModel.h"
 
+#import "NYFailSpecialExerciseDetailItemModel.h"
+#import "NYFailSpecialExerciseDetailsViewModel.h"
+#import "NYFailSpecialExerciseGroupViewModel.h"
+#import "NYFailSpecialExerciseItemModel.h"
+#import "NYFailSpecialExerciseViewModel.h"                        /// 易错专项
+#import "NYBlockExerciseGroupViewModel.h"
+#import "NYBlockExerciseItemModel.h"
+#import "NYBlockExerciseViewModel.h"
 #import "RQSpecialPractiseViewModel.h"                      /// 专项练习
 #import "RQSpecialPracticeItemViewModel.h"
 #import "RQSpecialAddItemViewModel.h"

+ 1 - 0
jiaPei/Modules/HomePageModule/RQHomePageModule.m

@@ -15,6 +15,7 @@ CGFloat const RQHeightForPinSectionHeaderInPagerView = 47.f;
 CGFloat const RQHeightForPinSectionHeaderInPagerView_One = 0.f;
 CGFloat const RQHeightForPinSectionHeaderInPagerView_Two = 50.f;
 CGFloat const RQHomeSubPageEditListToolBarHeight = 49.f;
+NSString * const RQHomePageSpTitleKey = @"RQHomePageSpTitleKey";
 /// 首页车型选项Key
 NSString * const RQHomePageCarTypeKey = @"RQHomePageCarTypeKey";
 /// 首页科目选项Key

+ 8 - 1
jiaPei/Modules/HomePageModule/View/HomePage/NYHomePageOneBigCell.m

@@ -179,12 +179,19 @@
 
 //分阶段练习
 - (IBAction)btnCateLxAction:(UIButton *)sender {
-    
+    NYBlockExerciseViewModel *blockExerciseViewModel = [[NYBlockExerciseViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
+        RQHomePageSubjectTypeKey : @(self.viewModel.homePageSubjectType),
+    }];
+    [RQ_APPDELEGATE.services pushViewModel:blockExerciseViewModel animated:YES];
 }
 
 //易错专项
 - (IBAction)btnFallibilityAction:(UIButton *)sender {
     
+    NYFailSpecialExerciseViewModel *failSpecialExerciseViewModel = [[NYFailSpecialExerciseViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
+        RQHomePageSubjectTypeKey : @(self.viewModel.homePageSubjectType),
+    }];
+    [RQ_APPDELEGATE.services pushViewModel:failSpecialExerciseViewModel animated:YES];
 }
 
 //500精选

+ 25 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.h

@@ -0,0 +1,25 @@
+//
+//  NYBlockExerciseCell.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseCell : RQCommonCollectionViewCell
+
+@property (weak, nonatomic) IBOutlet UILabel *leftStr_label;
+
+@property (weak, nonatomic) IBOutlet UIButton *right_btn;
+
+@property (weak, nonatomic) IBOutlet UIProgressView *progress_view;
+
+@property (weak, nonatomic) IBOutlet UILabel *progress_label;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 42 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.m

@@ -0,0 +1,42 @@
+//
+//  NYBlockExerciseCell.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseCell.h"
+
+@interface NYBlockExerciseCell ()
+@property (nonatomic, readwrite, strong) NYBlockExerciseItemModel *viewModel;
+
+@end
+
+@implementation NYBlockExerciseCell
+
+#pragma mark - PublicMethods
++ (instancetype)cellWithCollectionView:(UICollectionView *)collectionView forIndexPath:(NSIndexPath *)indexPath {
+    static NSString *ID = @"NYBlockExerciseCell";
+    [collectionView registerNib:[UINib nibWithNibName:ID bundle:nil] forCellWithReuseIdentifier:ID];
+    NYBlockExerciseCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
+    if (!cell) cell = [self rq_viewFromXib];
+    return cell;
+}
+
+- (void)bindViewModel:(NYBlockExerciseItemModel *)viewModel {
+    self.viewModel = viewModel;
+    RAC(self.leftStr_label, text) = [[RACObserve(viewModel, leftStr) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];
+    RAC(self.right_btn, selected) = [[RACObserve(viewModel, isfinish) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];
+    RAC(self.progress_view, progress) = [[RACObserve(viewModel, progress) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];
+    RAC(self.progress_label, text) = [[RACObserve(viewModel, progressStr) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];
+}
+
+
+#pragma mark - SystemMethods
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    
+}
+
+@end

+ 123 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseCell.xib

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="NYBlockExerciseCell">
+            <rect key="frame" x="0.0" y="0.0" width="180" height="74"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="180" height="74"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mjo-bx-vQo">
+                        <rect key="frame" x="0.0" y="0.0" width="180" height="74"/>
+                        <subviews>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cAn-FT-txL" userLabel="View-cent">
+                                <rect key="frame" x="10" y="10" width="160" height="54"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="试题一" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sOd-Nb-6TC">
+                                        <rect key="frame" x="15" y="11" width="50" height="18"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="50" id="Nze-M3-HSL"/>
+                                            <constraint firstAttribute="height" constant="18" id="ldY-eO-eAX"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                        <color key="textColor" red="0.039215686274509803" green="0.10196078431372549" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i32-Dc-hkj">
+                                        <rect key="frame" x="101" y="11" width="44" height="20"/>
+                                        <color key="backgroundColor" red="0.88235294117647056" green="0.90588235294117647" blue="0.94117647058823528" alpha="1" colorSpace="calibratedRGB"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="44" id="baB-qm-qRe"/>
+                                            <constraint firstAttribute="height" constant="20" id="bqB-QK-yS4"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                        <state key="normal" title="待处理">
+                                            <color key="titleColor" red="0.54117647058823526" green="0.56470588235294117" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                        </state>
+                                        <state key="selected" title="已完成">
+                                            <color key="titleColor" red="0.28627450980392155" green="0.55686274509803924" blue="0.96078431372549022" alpha="1" colorSpace="calibratedRGB"/>
+                                        </state>
+                                        <userDefinedRuntimeAttributes>
+                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                <integer key="value" value="2"/>
+                                            </userDefinedRuntimeAttribute>
+                                        </userDefinedRuntimeAttributes>
+                                    </button>
+                                    <progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="VqC-SB-L8h">
+                                        <rect key="frame" x="15" y="40" width="87" height="4"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="4" id="iRl-bO-jlV"/>
+                                        </constraints>
+                                    </progressView>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="100%" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="12V-xt-B0y">
+                                        <rect key="frame" x="110" y="35" width="35" height="14"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="35" id="OEW-Cj-3Zj"/>
+                                            <constraint firstAttribute="height" constant="14" id="cx5-8a-0t3"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                        <color key="textColor" red="0.54117647058823526" green="0.56470588235294117" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="0.96862745098039216" green="0.97254901960784312" blue="0.98039215686274506" alpha="1" colorSpace="calibratedRGB"/>
+                                <constraints>
+                                    <constraint firstItem="VqC-SB-L8h" firstAttribute="centerY" secondItem="12V-xt-B0y" secondAttribute="centerY" id="3P0-jl-3YS"/>
+                                    <constraint firstItem="VqC-SB-L8h" firstAttribute="leading" secondItem="cAn-FT-txL" secondAttribute="leading" constant="15" id="3V1-zm-MYp"/>
+                                    <constraint firstItem="sOd-Nb-6TC" firstAttribute="top" secondItem="cAn-FT-txL" secondAttribute="top" constant="11" id="94v-GA-dcb"/>
+                                    <constraint firstItem="12V-xt-B0y" firstAttribute="top" secondItem="i32-Dc-hkj" secondAttribute="bottom" constant="4" id="Qtl-NS-dlf"/>
+                                    <constraint firstAttribute="trailing" secondItem="i32-Dc-hkj" secondAttribute="trailing" constant="15" id="W3U-UR-Zlu"/>
+                                    <constraint firstItem="12V-xt-B0y" firstAttribute="leading" secondItem="VqC-SB-L8h" secondAttribute="trailing" constant="8" symbolic="YES" id="e4d-PO-c9o"/>
+                                    <constraint firstItem="sOd-Nb-6TC" firstAttribute="leading" secondItem="cAn-FT-txL" secondAttribute="leading" constant="15" id="hx9-DY-cSq"/>
+                                    <constraint firstItem="i32-Dc-hkj" firstAttribute="top" secondItem="cAn-FT-txL" secondAttribute="top" constant="11" id="k9i-s7-YeR"/>
+                                    <constraint firstAttribute="trailing" secondItem="12V-xt-B0y" secondAttribute="trailing" constant="15" id="nG7-u4-KDN"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                        <integer key="value" value="5"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="cAn-FT-txL" firstAttribute="top" secondItem="mjo-bx-vQo" secondAttribute="top" constant="10" id="Am0-lb-Vq9"/>
+                            <constraint firstItem="cAn-FT-txL" firstAttribute="leading" secondItem="mjo-bx-vQo" secondAttribute="leading" constant="10" id="IRU-Yg-SwS"/>
+                            <constraint firstAttribute="bottom" secondItem="cAn-FT-txL" secondAttribute="bottom" constant="10" id="OgB-gs-Qwg"/>
+                            <constraint firstAttribute="trailing" secondItem="cAn-FT-txL" secondAttribute="trailing" constant="10" id="YnN-0m-XVD"/>
+                        </constraints>
+                    </view>
+                </subviews>
+            </view>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="mjo-bx-vQo" secondAttribute="bottom" id="AN0-Rm-ofy"/>
+                <constraint firstAttribute="trailing" secondItem="mjo-bx-vQo" secondAttribute="trailing" id="DfN-99-x4m"/>
+                <constraint firstItem="mjo-bx-vQo" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="eS6-Er-5s6"/>
+                <constraint firstItem="mjo-bx-vQo" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="xo1-kI-P0s"/>
+            </constraints>
+            <connections>
+                <outlet property="leftStr_label" destination="sOd-Nb-6TC" id="fuS-SV-3YP"/>
+                <outlet property="progress_label" destination="12V-xt-B0y" id="yc8-hH-cbX"/>
+                <outlet property="progress_view" destination="VqC-SB-L8h" id="bgb-F6-k95"/>
+                <outlet property="right_btn" destination="i32-Dc-hkj" id="VlL-c5-hFC"/>
+            </connections>
+            <point key="canvasLocation" x="51.908396946564885" y="-12.67605633802817"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 24 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.h

@@ -0,0 +1,24 @@
+//
+//  NYBlockExerciseHeaderView.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseHeaderView : RQCommonReusableView
+
+@property (weak, nonatomic) IBOutlet UILabel *name_label;
+
+@property (weak, nonatomic) IBOutlet UILabel *des_label;
+
+@property (weak, nonatomic) IBOutlet UIView *stars_view;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 43 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.m

@@ -0,0 +1,43 @@
+//
+//  NYBlockExerciseHeaderView.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseHeaderView.h"
+
+@interface NYBlockExerciseHeaderView ()
+@property (nonatomic, readwrite, strong) NYBlockExerciseGroupViewModel *viewModel;
+
+@end
+
+@implementation NYBlockExerciseHeaderView
+
++ (instancetype)reusableViewWithCollectionView:(UICollectionView *)collectionView OfKind:(NSString *)elementKind forIndexPath:(NSIndexPath *)indexPath {
+    NSString *ID = [NSString stringWithFormat:@"%@%@", @"NYBlockExerciseHeaderView",elementKind];
+    [collectionView registerNib:[UINib nibWithNibName:@"NYBlockExerciseHeaderView" bundle:nil] forSupplementaryViewOfKind:elementKind withReuseIdentifier:ID];
+    NYBlockExerciseHeaderView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:ID forIndexPath:indexPath];
+    if (!reusableView) reusableView = [self rq_viewFromXib];
+    return reusableView;
+}
+
+
+- (void)bindViewModel:(NYBlockExerciseGroupViewModel *)viewModel {
+    self.viewModel = viewModel;
+    self.name_label.text  = viewModel.header;
+    self.des_label.text = viewModel.headerDesStr;
+    if(viewModel.star>0){
+        for(int i=0;i<viewModel.star;i++){
+            UIButton *btn = [self.stars_view viewWithTag:10+i];
+            btn.selected = YES;
+        }
+    }
+}
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+@end

+ 143 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/分段练习/NYBlockExerciseHeaderView.xib

@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="U6b-Vx-4bR" customClass="NYBlockExerciseHeaderView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="80"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HjC-Ig-dWL">
+                    <rect key="frame" x="0.0" y="0.0" width="320" height="80"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.夯实基础" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qQX-wM-c7x">
+                            <rect key="frame" x="15" y="20" width="92" height="21"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="92" id="E9x-vl-kbH"/>
+                                <constraint firstAttribute="height" constant="21" id="tLA-d4-6b9"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
+                            <color key="textColor" red="0.039215686274509803" green="0.10196078431372549" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="覆盖大多知识考点,建立扎实的知识基础" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZyJ-1b-iDm">
+                            <rect key="frame" x="15" y="49" width="290" height="17"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="17" id="zgc-7l-JAA"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.36078431372549019" green="0.37647058823529411" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KLD-QV-gt7" userLabel="View-star">
+                            <rect key="frame" x="107" y="20" width="104" height="21"/>
+                            <subviews>
+                                <button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="b3u-AN-80e" userLabel="Button-0">
+                                    <rect key="frame" x="0.0" y="0.0" width="15" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="15" id="4Ni-bN-gRc"/>
+                                        <constraint firstAttribute="height" constant="20" id="oaU-W1-nQi"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="星星灰"/>
+                                    <state key="selected" image="星星黄"/>
+                                </button>
+                                <button opaque="NO" tag="11" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="o4X-wT-oA7" userLabel="Button-1">
+                                    <rect key="frame" x="15" y="0.0" width="15" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="CJh-Ww-qMw"/>
+                                        <constraint firstAttribute="width" constant="15" id="pFo-aL-znW"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="星星灰"/>
+                                    <state key="selected" image="星星黄"/>
+                                </button>
+                                <button opaque="NO" tag="12" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5ZR-S0-QFP" userLabel="Button-2">
+                                    <rect key="frame" x="30" y="0.0" width="15" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="15" id="4uv-Pf-B6y"/>
+                                        <constraint firstAttribute="height" constant="20" id="9bG-2R-eZ8"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="星星灰"/>
+                                    <state key="selected" image="星星黄"/>
+                                </button>
+                                <button opaque="NO" tag="13" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WbT-68-kGE" userLabel="Button-3">
+                                    <rect key="frame" x="45" y="0.0" width="15" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="HU2-3g-f8G"/>
+                                        <constraint firstAttribute="width" constant="15" id="doY-5p-9qb"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="星星灰"/>
+                                    <state key="selected" image="星星黄"/>
+                                </button>
+                                <button opaque="NO" tag="14" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="U9q-G9-aRb" userLabel="Button-4">
+                                    <rect key="frame" x="60" y="0.0" width="15" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="15" id="CgX-HS-o2p"/>
+                                        <constraint firstAttribute="height" constant="20" id="soH-MD-IF9"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="星星灰"/>
+                                    <state key="selected" image="星星黄"/>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="U9q-G9-aRb" firstAttribute="top" secondItem="KLD-QV-gt7" secondAttribute="top" id="1Uv-8E-Dk6"/>
+                                <constraint firstItem="WbT-68-kGE" firstAttribute="leading" secondItem="5ZR-S0-QFP" secondAttribute="trailing" id="9ts-uO-2hX"/>
+                                <constraint firstItem="5ZR-S0-QFP" firstAttribute="leading" secondItem="o4X-wT-oA7" secondAttribute="trailing" id="A07-gQ-7Qp"/>
+                                <constraint firstItem="b3u-AN-80e" firstAttribute="leading" secondItem="KLD-QV-gt7" secondAttribute="leading" id="FK6-KW-GDo"/>
+                                <constraint firstItem="o4X-wT-oA7" firstAttribute="top" secondItem="KLD-QV-gt7" secondAttribute="top" id="IhK-vD-bFq"/>
+                                <constraint firstItem="o4X-wT-oA7" firstAttribute="leading" secondItem="b3u-AN-80e" secondAttribute="trailing" id="MxY-69-Wz1"/>
+                                <constraint firstItem="b3u-AN-80e" firstAttribute="top" secondItem="KLD-QV-gt7" secondAttribute="top" id="Xs7-nt-58s"/>
+                                <constraint firstAttribute="height" constant="21" id="ckl-oy-7P6"/>
+                                <constraint firstAttribute="width" constant="104" id="fWP-Vp-edi"/>
+                                <constraint firstItem="5ZR-S0-QFP" firstAttribute="top" secondItem="KLD-QV-gt7" secondAttribute="top" id="gZR-qm-ZTU"/>
+                                <constraint firstItem="U9q-G9-aRb" firstAttribute="leading" secondItem="WbT-68-kGE" secondAttribute="trailing" id="kOE-JC-gd8"/>
+                                <constraint firstItem="WbT-68-kGE" firstAttribute="top" secondItem="KLD-QV-gt7" secondAttribute="top" id="kOf-gI-aOa"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="qQX-wM-c7x" firstAttribute="leading" secondItem="HjC-Ig-dWL" secondAttribute="leading" constant="15" id="0mL-cM-gWA"/>
+                        <constraint firstItem="ZyJ-1b-iDm" firstAttribute="top" secondItem="qQX-wM-c7x" secondAttribute="bottom" constant="8" symbolic="YES" id="Yon-yn-R0d"/>
+                        <constraint firstItem="qQX-wM-c7x" firstAttribute="top" secondItem="HjC-Ig-dWL" secondAttribute="top" constant="20" id="fqV-VL-1pP"/>
+                        <constraint firstAttribute="trailing" secondItem="ZyJ-1b-iDm" secondAttribute="trailing" constant="15" id="kbx-1i-YGV"/>
+                        <constraint firstItem="KLD-QV-gt7" firstAttribute="centerY" secondItem="qQX-wM-c7x" secondAttribute="centerY" id="qmO-Uh-9sn"/>
+                        <constraint firstItem="KLD-QV-gt7" firstAttribute="leading" secondItem="qQX-wM-c7x" secondAttribute="trailing" id="rpE-EI-SC6"/>
+                        <constraint firstItem="ZyJ-1b-iDm" firstAttribute="leading" secondItem="HjC-Ig-dWL" secondAttribute="leading" constant="15" id="u58-LP-61B"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <constraints>
+                <constraint firstItem="HjC-Ig-dWL" firstAttribute="leading" secondItem="U6b-Vx-4bR" secondAttribute="leading" id="7Ae-im-sb7"/>
+                <constraint firstAttribute="bottom" secondItem="HjC-Ig-dWL" secondAttribute="bottom" id="7s8-Om-dby"/>
+                <constraint firstAttribute="trailing" secondItem="HjC-Ig-dWL" secondAttribute="trailing" id="Gzs-ab-dcm"/>
+                <constraint firstItem="HjC-Ig-dWL" firstAttribute="top" secondItem="U6b-Vx-4bR" secondAttribute="top" id="RCF-za-hyU"/>
+            </constraints>
+            <connections>
+                <outlet property="des_label" destination="ZyJ-1b-iDm" id="ze8-1m-9B6"/>
+                <outlet property="name_label" destination="qQX-wM-c7x" id="Bom-rK-LDx"/>
+                <outlet property="stars_view" destination="KLD-QV-gt7" id="UDV-bM-MlK"/>
+            </connections>
+            <point key="canvasLocation" x="51.908396946564885" y="-12.67605633802817"/>
+        </collectionReusableView>
+    </objects>
+    <resources>
+        <image name="星星灰" width="12" height="11.333333015441895"/>
+        <image name="星星黄" width="12" height="11.333333015441895"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 23 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.h

@@ -0,0 +1,23 @@
+//
+//  NYFailSpecialExerciseCell.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseCell : RQCommonCollectionViewCell
+
+
+@property (weak, nonatomic) IBOutlet UIImageView *icon_imageView;
+
+@property (weak, nonatomic) IBOutlet UILabel *title_label;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 42 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.m

@@ -0,0 +1,42 @@
+//
+//  NYFailSpecialExerciseCell.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseCell.h"
+
+@interface NYFailSpecialExerciseCell ()
+@property (nonatomic, readwrite, strong) NYFailSpecialExerciseItemModel *viewModel;
+
+@end
+
+@implementation NYFailSpecialExerciseCell
+
+#pragma mark - PublicMethods
++ (instancetype)cellWithCollectionView:(UICollectionView *)collectionView forIndexPath:(NSIndexPath *)indexPath {
+    static NSString *ID = @"NYFailSpecialExerciseCell";
+    [collectionView registerNib:[UINib nibWithNibName:ID bundle:nil] forCellWithReuseIdentifier:ID];
+    NYFailSpecialExerciseCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
+    if (!cell) cell = [self rq_viewFromXib];
+    return cell;
+}
+
+- (void)bindViewModel:(NYFailSpecialExerciseItemModel *)viewModel {
+    
+    self.viewModel = viewModel;
+    self.icon_imageView.image = [UIImage imageNamed:viewModel.icon];
+    RAC(self.title_label, text) = [[RACObserve(viewModel, title) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];
+    
+}
+
+
+#pragma mark - SystemMethods
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    
+}
+
+@end

+ 71 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseCell.xib

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="NYFailSpecialExerciseCell">
+            <rect key="frame" x="0.0" y="0.0" width="120" height="100"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="120" height="100"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="v4l-t6-8ZK">
+                        <rect key="frame" x="6" y="6" width="108" height="88"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="扣分" translatesAutoresizingMaskIntoConstraints="NO" id="a5Q-Rq-HF8">
+                                <rect key="frame" x="39" y="16" width="30" height="30"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="30" id="1BN-bm-hOn"/>
+                                    <constraint firstAttribute="width" constant="30" id="Lz5-6m-7MZ"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="扣分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s4N-ai-wC2">
+                                <rect key="frame" x="5" y="51" width="98" height="18"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="18" id="9mQ-n6-4Y7"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                <color key="textColor" red="0.039215686274509803" green="0.10196078431372549" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" red="0.96862745098039216" green="0.97254901960784312" blue="0.98039215686274506" alpha="1" colorSpace="calibratedRGB"/>
+                        <constraints>
+                            <constraint firstItem="a5Q-Rq-HF8" firstAttribute="centerX" secondItem="v4l-t6-8ZK" secondAttribute="centerX" id="08S-38-BtS"/>
+                            <constraint firstAttribute="trailing" secondItem="s4N-ai-wC2" secondAttribute="trailing" constant="5" id="e2P-LL-ANb"/>
+                            <constraint firstItem="s4N-ai-wC2" firstAttribute="top" secondItem="a5Q-Rq-HF8" secondAttribute="bottom" constant="5" id="ngI-zc-dd4"/>
+                            <constraint firstItem="a5Q-Rq-HF8" firstAttribute="top" secondItem="v4l-t6-8ZK" secondAttribute="top" constant="16" id="rrc-G9-0ZD"/>
+                            <constraint firstItem="s4N-ai-wC2" firstAttribute="leading" secondItem="v4l-t6-8ZK" secondAttribute="leading" constant="5" id="sMs-Hi-BZ2"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                <integer key="value" value="5"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+            </view>
+            <constraints>
+                <constraint firstItem="v4l-t6-8ZK" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="6" id="Njq-Ma-Zem"/>
+                <constraint firstItem="v4l-t6-8ZK" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="6" id="cQF-Z9-j1g"/>
+                <constraint firstAttribute="trailing" secondItem="v4l-t6-8ZK" secondAttribute="trailing" constant="6" id="jMf-f3-eGI"/>
+                <constraint firstAttribute="bottom" secondItem="v4l-t6-8ZK" secondAttribute="bottom" constant="6" id="t00-86-xEt"/>
+            </constraints>
+            <connections>
+                <outlet property="icon_imageView" destination="a5Q-Rq-HF8" id="VTp-Xk-mbd"/>
+                <outlet property="title_label" destination="s4N-ai-wC2" id="9nq-kf-9Hk"/>
+            </connections>
+            <point key="canvasLocation" x="23" y="-12"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="扣分" width="30" height="30"/>
+    </resources>
+</document>

+ 17 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.h

@@ -0,0 +1,17 @@
+//
+//  NYFailSpecialExerciseDetailsCell.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseDetailsCell : RQCommonCollectionViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 43 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.m

@@ -0,0 +1,43 @@
+//
+//  NYFailSpecialExerciseDetailsCell.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseDetailsCell.h"
+
+@interface NYFailSpecialExerciseDetailsCell ()
+
+@property (nonatomic, readwrite, strong) NYFailSpecialExerciseDetailItemModel *viewModel;
+
+@end
+
+@implementation NYFailSpecialExerciseDetailsCell
+
+#pragma mark - PublicMethods
++ (instancetype)cellWithCollectionView:(UICollectionView *)collectionView forIndexPath:(NSIndexPath *)indexPath {
+    static NSString *ID = @"NYFailSpecialExerciseDetailsCell";
+    [collectionView registerNib:[UINib nibWithNibName:ID bundle:nil] forCellWithReuseIdentifier:ID];
+    NYFailSpecialExerciseDetailsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
+    if (!cell) cell = [self rq_viewFromXib];
+    return cell;
+}
+
+- (void)bindViewModel:(NYFailSpecialExerciseDetailItemModel *)viewModel {
+    
+    self.viewModel = viewModel;
+
+    
+}
+
+
+#pragma mark - SystemMethods
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    
+}
+
+@end
+

+ 57 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.xib

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="NYFailSpecialExerciseDetailsCell">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="224"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="375" height="224"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pGB-Ib-orj">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="224"/>
+                        <subviews>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nQV-y2-0ZW" userLabel="View-ct">
+                                <rect key="frame" x="15" y="5" width="345" height="214"/>
+                                <subviews>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="fAh-LT-a9N">
+                                        <rect key="frame" x="0.0" y="0.0" width="345" height="214"/>
+                                    </imageView>
+                                </subviews>
+                                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstAttribute="bottom" secondItem="fAh-LT-a9N" secondAttribute="bottom" id="3kz-ag-x4E"/>
+                                    <constraint firstItem="fAh-LT-a9N" firstAttribute="top" secondItem="nQV-y2-0ZW" secondAttribute="top" id="IDf-Gx-0st"/>
+                                    <constraint firstItem="fAh-LT-a9N" firstAttribute="leading" secondItem="nQV-y2-0ZW" secondAttribute="leading" id="dfu-Nt-PEi"/>
+                                    <constraint firstAttribute="trailing" secondItem="fAh-LT-a9N" secondAttribute="trailing" id="nnR-3I-JhW"/>
+                                </constraints>
+                            </view>
+                        </subviews>
+                        <color key="backgroundColor" red="0.94901960784313721" green="0.97254901960784312" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                        <constraints>
+                            <constraint firstItem="nQV-y2-0ZW" firstAttribute="top" secondItem="pGB-Ib-orj" secondAttribute="top" constant="5" id="6Og-Ro-HY4"/>
+                            <constraint firstAttribute="bottom" secondItem="nQV-y2-0ZW" secondAttribute="bottom" constant="5" id="XSV-du-uNK"/>
+                            <constraint firstAttribute="trailing" secondItem="nQV-y2-0ZW" secondAttribute="trailing" constant="15" id="awz-af-wyW"/>
+                            <constraint firstItem="nQV-y2-0ZW" firstAttribute="leading" secondItem="pGB-Ib-orj" secondAttribute="leading" constant="15" id="fCg-Da-93S"/>
+                        </constraints>
+                    </view>
+                </subviews>
+            </view>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="pGB-Ib-orj" secondAttribute="trailing" id="2hQ-LL-Wzz"/>
+                <constraint firstAttribute="bottom" secondItem="pGB-Ib-orj" secondAttribute="bottom" id="MEM-dP-vOQ"/>
+                <constraint firstItem="pGB-Ib-orj" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="OYN-EK-uQR"/>
+                <constraint firstItem="pGB-Ib-orj" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="ReY-LX-UUa"/>
+            </constraints>
+            <point key="canvasLocation" x="40" y="-12"/>
+        </collectionViewCell>
+    </objects>
+</document>

+ 17 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.h

@@ -0,0 +1,17 @@
+//
+//  NYFailSpecialExerciseHeaderView.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseHeaderView : RQCommonReusableView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 37 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.m

@@ -0,0 +1,37 @@
+//
+//  NYFailSpecialExerciseHeaderView.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseHeaderView.h"
+
+@interface NYFailSpecialExerciseHeaderView ()
+@property (nonatomic, readwrite, strong) NYFailSpecialExerciseGroupViewModel *viewModel;
+
+@end
+
+@implementation NYFailSpecialExerciseHeaderView
+
++ (instancetype)reusableViewWithCollectionView:(UICollectionView *)collectionView OfKind:(NSString *)elementKind forIndexPath:(NSIndexPath *)indexPath {
+    NSString *ID = [NSString stringWithFormat:@"%@%@", @"NYFailSpecialExerciseHeaderView",elementKind];
+    [collectionView registerNib:[UINib nibWithNibName:@"NYFailSpecialExerciseHeaderView" bundle:nil] forSupplementaryViewOfKind:elementKind withReuseIdentifier:ID];
+    NYFailSpecialExerciseHeaderView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:ID forIndexPath:indexPath];
+    if (!reusableView) reusableView = [self rq_viewFromXib];
+    return reusableView;
+}
+
+
+- (void)bindViewModel:(NYFailSpecialExerciseGroupViewModel *)viewModel {
+    self.viewModel = viewModel;
+    
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+@end

+ 48 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseHeaderView.xib

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="U6b-Vx-4bR" customClass="NYFailSpecialExerciseHeaderView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="130"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gye-4e-HJt">
+                    <rect key="frame" x="0.0" y="0.0" width="320" height="130"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="电子资料H" translatesAutoresizingMaskIntoConstraints="NO" id="OQr-iA-tOi">
+                            <rect key="frame" x="0.0" y="0.0" width="320" height="130"/>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="OQr-iA-tOi" secondAttribute="trailing" id="DVa-Ol-s3E"/>
+                        <constraint firstItem="OQr-iA-tOi" firstAttribute="leading" secondItem="gye-4e-HJt" secondAttribute="leading" id="j8f-9f-k1c"/>
+                        <constraint firstItem="OQr-iA-tOi" firstAttribute="top" secondItem="gye-4e-HJt" secondAttribute="top" id="jk7-l3-fjP"/>
+                        <constraint firstAttribute="bottom" secondItem="OQr-iA-tOi" secondAttribute="bottom" id="qIg-u7-jb4"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="gye-4e-HJt" secondAttribute="bottom" id="8d9-vc-MXG"/>
+                <constraint firstItem="gye-4e-HJt" firstAttribute="top" secondItem="U6b-Vx-4bR" secondAttribute="top" id="Bop-HS-2q3"/>
+                <constraint firstItem="gye-4e-HJt" firstAttribute="leading" secondItem="U6b-Vx-4bR" secondAttribute="leading" id="G1h-rP-MQI"/>
+                <constraint firstAttribute="trailing" secondItem="gye-4e-HJt" secondAttribute="trailing" id="RSZ-hM-i7N"/>
+            </constraints>
+            <point key="canvasLocation" x="43" y="-12"/>
+        </collectionReusableView>
+    </objects>
+    <resources>
+        <image name="电子资料H" width="345" height="130"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 17 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.h

@@ -0,0 +1,17 @@
+//
+//  NYBlockExerciseViewController.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "RQBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseViewController : RQCommonCollectionViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 82 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.m

@@ -0,0 +1,82 @@
+//
+//  NYBlockExerciseViewController.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseViewController.h"
+
+@interface NYBlockExerciseViewController ()
+/// viewModel
+@property (nonatomic, readonly, strong) NYBlockExerciseViewModel *viewModel;
+
+@end
+
+@implementation NYBlockExerciseViewController
+
+@dynamic viewModel;
+#pragma mark - SystemMethod
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    /// 初始化
+    [self rq_setup];
+}
+
+- (void)viewDidLayoutSubviews {
+    [super viewDidLayoutSubviews];
+    self.view.frame = CGRectMake(0, 0, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT);
+}
+
+#pragma mark - PrivateMethods
+/// 初始化
+- (void)rq_setup {
+    /// set up ...
+    self.collectionView.bounces = NO;
+    self.collectionView.backgroundColor = UIColor.clearColor;
+}
+
+#pragma mark - OverrideMethods
+/// 配置collectionView的区域
+- (UIEdgeInsets)contentInset {
+    return UIEdgeInsetsMake(RQ_APPLICATION_STATUS_BAR_HEIGHT + RQ_APPLICATION_NAV_BAR_HEIGHT, 0, 0, 0);
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath {
+    RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+    RQCommonCollectionItemViewModel *itemViewModel = groupViewModel.itemViewModels[indexPath.row];
+    UICollectionViewCell *cell = [NSClassFromString(itemViewModel.itemClassName) cellWithCollectionView:collectionView forIndexPath:indexPath];
+    return cell;
+}
+
+- (void)configureCell:(RQCommonCell *)cell atIndexPath:(NSIndexPath *)indexPath withObject:(id)object {
+    [cell bindViewModel:object];
+}
+
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
+    return UIEdgeInsetsMake(0, 16, 0, 16);
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
+    @weakify(self)
+    RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+    // 如果是头视图
+    if (kind == UICollectionElementKindSectionHeader) {
+        if ([groupViewModel isKindOfClass:[NYBlockExerciseGroupViewModel class]]) {
+            NYBlockExerciseHeaderView *headerView = [NYBlockExerciseHeaderView reusableViewWithCollectionView:collectionView OfKind:kind forIndexPath:indexPath];
+            RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+            [headerView bindViewModel:groupViewModel];
+            headerView.headerContentLabel.hidden = YES;
+            headerView.footerContentLabel.hidden = YES;
+            return headerView;
+        }
+    }
+    RQCommonReusableView *headerView = [RQCommonReusableView reusableViewWithCollectionView:collectionView OfKind:kind forIndexPath:indexPath];
+    [headerView bindViewModel:groupViewModel];
+    headerView.headerContentLabel.hidden = YES;
+    headerView.footerContentLabel.hidden = YES;
+    return headerView;
+}
+
+@end

+ 22 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/分段练习/NYBlockExerciseViewController.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NYBlockExerciseViewController">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
+        </view>
+    </objects>
+</document>

+ 17 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.h

@@ -0,0 +1,17 @@
+//
+//  NYFailSpecialExerciseViewController.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseViewController : RQCommonCollectionViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 82 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.m

@@ -0,0 +1,82 @@
+//
+//  NYFailSpecialExerciseViewController.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseViewController.h"
+
+@interface NYFailSpecialExerciseViewController ()
+/// viewModel
+@property (nonatomic, readonly, strong) NYFailSpecialExerciseViewModel *viewModel;
+
+@end
+
+@implementation NYFailSpecialExerciseViewController
+
+@dynamic viewModel;
+#pragma mark - SystemMethod
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    /// 初始化
+    [self rq_setup];
+}
+
+- (void)viewDidLayoutSubviews {
+    [super viewDidLayoutSubviews];
+    self.view.frame = CGRectMake(0, 0, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT);
+}
+
+#pragma mark - PrivateMethods
+/// 初始化
+- (void)rq_setup {
+    /// set up ...
+    self.collectionView.bounces = NO;
+    self.collectionView.backgroundColor = UIColor.clearColor;
+}
+
+#pragma mark - OverrideMethods
+/// 配置collectionView的区域
+- (UIEdgeInsets)contentInset {
+    return UIEdgeInsetsMake(RQ_APPLICATION_STATUS_BAR_HEIGHT + RQ_APPLICATION_NAV_BAR_HEIGHT, 0, 0, 0);
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath {
+    RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+    RQCommonCollectionItemViewModel *itemViewModel = groupViewModel.itemViewModels[indexPath.row];
+    UICollectionViewCell *cell = [NSClassFromString(itemViewModel.itemClassName) cellWithCollectionView:collectionView forIndexPath:indexPath];
+    return cell;
+}
+
+- (void)configureCell:(RQCommonCell *)cell atIndexPath:(NSIndexPath *)indexPath withObject:(id)object {
+    [cell bindViewModel:object];
+}
+
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
+    return UIEdgeInsetsMake(0, 16, 0, 16);
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
+    @weakify(self)
+    RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+    // 如果是头视图
+    if (kind == UICollectionElementKindSectionHeader) {
+        if ([groupViewModel isKindOfClass:[NYFailSpecialExerciseGroupViewModel class]]) {
+            NYFailSpecialExerciseHeaderView *headerView = [NYFailSpecialExerciseHeaderView reusableViewWithCollectionView:collectionView OfKind:kind forIndexPath:indexPath];
+            RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
+            [headerView bindViewModel:groupViewModel];
+            headerView.headerContentLabel.hidden = YES;
+            headerView.footerContentLabel.hidden = YES;
+            return headerView;
+        }
+    }
+    RQCommonReusableView *headerView = [RQCommonReusableView reusableViewWithCollectionView:collectionView OfKind:kind forIndexPath:indexPath];
+    [headerView bindViewModel:groupViewModel];
+    headerView.headerContentLabel.hidden = YES;
+    headerView.footerContentLabel.hidden = YES;
+    return headerView;
+}
+
+@end

+ 22 - 0
jiaPei/Modules/HomePageModule/ViewController/HomeSubPage/易错专项/NYFailSpecialExerciseViewController.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NYFailSpecialExerciseViewController">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
+        </view>
+    </objects>
+</document>

+ 21 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseGroupViewModel.h

@@ -0,0 +1,21 @@
+//
+//  NYBlockExerciseGroupViewModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/6.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "RQCommonGroupViewModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseGroupViewModel : RQCommonGroupViewModel
+
+@property (nonatomic, copy) NSString *headerDesStr;
+
+@property (nonatomic, assign) NSInteger star;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseGroupViewModel.m

@@ -0,0 +1,13 @@
+//
+//  NYBlockExerciseGroupViewModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/6.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseGroupViewModel.h"
+
+@implementation NYBlockExerciseGroupViewModel
+
+@end

+ 27 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseItemModel.h

@@ -0,0 +1,27 @@
+//
+//  NYBlockExerciseItemModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/6.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "RQCommonCollectionItemViewModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseItemModel : RQCommonCollectionItemViewModel
+
+@property (nonatomic, copy) NSString *leftStr;
+@property (nonatomic, assign) bool isfinish;
+@property (nonatomic, assign) double progress;
+@property (nonatomic, copy) NSString *progressStr;
+@property (nonatomic, assign) int group;
+
+- (instancetype)initWithLeftStr:(NSString *)leftStr group:(NSInteger)group;
+
+- (void)updateData;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 168 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseItemModel.m

@@ -0,0 +1,168 @@
+//
+//  NYBlockExerciseItemModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/6.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseItemModel.h"
+
+@implementation NYBlockExerciseItemModel
+
+- (instancetype)init {
+    if (self = [super init]) {
+        self.itemSize = CGSizeMake(RQ_SCREEN_WIDTH*0.5-20.f, RQ_FIT_HORIZONTAL(74.f) + 8.f);
+    }
+    return self;
+}
+
+- (NSString *)itemClassName {
+    return @"NYBlockExerciseCell";
+}
+
+- (void)updateData{
+    int code = 0;
+    NSString *leftStr = self.leftStr;
+    if(self.group==0){
+        if([@"试题一" isEqualToString:leftStr]){
+            code = 201;
+        }else if([@"试题二" isEqualToString:leftStr]){
+            code = 202;
+        }
+        else if([@"试题三" isEqualToString:leftStr]){
+            code = 203;
+        }
+        else if([@"试题四" isEqualToString:leftStr]){
+            code = 204;
+        }
+        else if([@"试题五" isEqualToString:leftStr]){
+            code = 205;
+        }
+        else if([@"试题六" isEqualToString:leftStr]){
+            code = 206;
+        }
+    }else if(self.group==1){
+        if([@"试题一" isEqualToString:leftStr]){
+            code = 301;
+        }else if([@"试题二" isEqualToString:leftStr]){
+            code = 302;
+        }
+        else if([@"试题三" isEqualToString:leftStr]){
+            code = 303;
+        }
+        else if([@"试题四" isEqualToString:leftStr]){
+            code = 304;
+        }
+    }else if(self.group==2){
+        if([@"试题一" isEqualToString:leftStr]){
+            code = 401;
+        }else if([@"试题二" isEqualToString:leftStr]){
+            code = 402;
+        }
+    }
+    
+    NSArray *arr = [[RQ_YDTQuestion_Module getQuestionWithExerciseType:RQExerciseType_Block_List code:code].rac_sequence.signal map:^id _Nullable(RQYDTQuestionModel  *ydtQuestionModel) {
+        return [RQExerciseModel exerciseModelWithRQYDTQuestionModel:ydtQuestionModel];
+    }].toArray;
+    NSArray *readList = [NYTools readExerciseListUserKey:RQ_USER_MANAGER.currentUser.outId carType:RQ_YDTQuestion_Module.carType subject:RQ_YDTQuestion_Module.subject exerciseType:RQ_Exercise_Module.currentExerciseType];
+    NSLog(@"readList=%@",readList);
+    int inId_count = 0;
+    if(readList.count>0){ //遍历用户做的题目
+        for (NSDictionary *item in readList) {
+            NSInteger ID = [item[@"ID"] unsignedIntValue];//题目id
+            //查找对应题目
+            NSArray *filteredArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ydtQuestionModel.ID == %d", ID]];
+            if (filteredArray.count > 0) {
+                inId_count++;
+            }
+        }
+    }
+    double progress = (double)inId_count/arr.count;
+    self.progress = progress;
+    self.isfinish = progress >=1.0 ? YES:NO;
+    self.progressStr = [NSString stringWithFormat:@"%.0f%%",progress*100];
+}
+
+- (instancetype)initWithLeftStr:(NSString *)leftStr group:(NSInteger)group{
+    if (self = [self init]) {
+        self.leftStr = leftStr;
+        self.group = group;
+        int code = 0;
+        if(group==0){
+            if([@"试题一" isEqualToString:leftStr]){
+                code = 201;
+            }else if([@"试题二" isEqualToString:leftStr]){
+                code = 202;
+            }
+            else if([@"试题三" isEqualToString:leftStr]){
+                code = 203;
+            }
+            else if([@"试题四" isEqualToString:leftStr]){
+                code = 204;
+            }
+            else if([@"试题五" isEqualToString:leftStr]){
+                code = 205;
+            }
+            else if([@"试题六" isEqualToString:leftStr]){
+                code = 206;
+            }
+        }else if(group==1){
+            if([@"试题一" isEqualToString:leftStr]){
+                code = 301;
+            }else if([@"试题二" isEqualToString:leftStr]){
+                code = 302;
+            }
+            else if([@"试题三" isEqualToString:leftStr]){
+                code = 303;
+            }
+            else if([@"试题四" isEqualToString:leftStr]){
+                code = 304;
+            }
+        }else if(group==2){
+            if([@"试题一" isEqualToString:leftStr]){
+                code = 401;
+            }else if([@"试题二" isEqualToString:leftStr]){
+                code = 402;
+            }
+        }
+        
+        NSArray *arr = [[RQ_YDTQuestion_Module getQuestionWithExerciseType:RQExerciseType_Block_List code:code].rac_sequence.signal map:^id _Nullable(RQYDTQuestionModel  *ydtQuestionModel) {
+            return [RQExerciseModel exerciseModelWithRQYDTQuestionModel:ydtQuestionModel];
+        }].toArray;
+        NSArray *readList = [NYTools readExerciseListUserKey:RQ_USER_MANAGER.currentUser.outId carType:RQ_YDTQuestion_Module.carType subject:RQ_YDTQuestion_Module.subject exerciseType:RQ_Exercise_Module.currentExerciseType];
+        NSLog(@"readList=%@",readList);
+        int inId_count = 0;
+        if(readList.count>0){ //遍历用户做的题目
+            for (NSDictionary *item in readList) {
+                NSInteger ID = [item[@"ID"] unsignedIntValue];//题目id
+                //查找对应题目
+                NSArray *filteredArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ydtQuestionModel.ID == %d", ID]];
+                if (filteredArray.count > 0) {
+                    inId_count++;
+                }
+            }
+        }
+        double progress = (double)inId_count/arr.count;
+        self.progress = progress;
+        self.isfinish = progress >=1.0 ? YES:NO;
+        self.progressStr = [NSString stringWithFormat:@"%.0f%%",progress*100];
+        self.operation = ^{
+            RQ_Exercise_Module.codeStr = [NSString stringWithFormat:@"%d",code];
+            NSLog(@"%@点击了",leftStr);
+            RQExerciseViewModel *exerciseViewModel = [[RQExerciseViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
+                RQHomePageCarTypeKey        : @(RQ_YDTQuestion_Module.carType),
+                RQHomePageSubjectTypeKey    : @(RQ_YDTQuestion_Module.subject),
+                RQHomeSubPageTypeKey        : @(RQHomeSubPageType_SequentialPractice),
+                RQViewModelIDKey            : leftStr,
+                RQExerciseTypeKey           : @(RQExerciseType_Block_List),
+                RQViewModelUtilKey          : arr,
+            }];
+            [RQ_APPDELEGATE.services pushViewModel:exerciseViewModel animated:YES];
+        };
+    }
+    return self;
+}
+
+
+@end

+ 19 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseViewModel.h

@@ -0,0 +1,19 @@
+//
+//  NYBlockExerciseViewModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYBlockExerciseViewModel : RQCommonViewModel
+
+@property (nonatomic, readonly, assign) RQHomePageSubjectType homePageSubjectType;
+
+
+@end
+NS_ASSUME_NONNULL_END

+ 90 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/分段练习/NYBlockExerciseViewModel.m

@@ -0,0 +1,90 @@
+//
+//  NYBlockExerciseViewModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/5.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYBlockExerciseViewModel.h"
+
+@interface NYBlockExerciseViewModel ()
+@property (nonatomic, readwrite, strong) RQTreeListModel *treeListModel;
+@property (nonatomic, readwrite, assign) RQHomePageSubjectType homePageSubjectType;
+@property (nonatomic, readwrite, assign) NSInteger mySection;
+
+@end
+
+@implementation NYBlockExerciseViewModel
+#pragma mark - Public Method
+- (instancetype)initWithServices:(id<RQViewModelServices>)services params:(NSDictionary *)params {
+    if (self = [super initWithServices:services params:params]) {
+        self.homePageSubjectType =  [params[RQHomePageSubjectTypeKey] integerValue];
+    }
+    return self;
+}
+
+- (void)dealloc{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)initialize {
+    [super initialize];
+    /// 配置标题
+    self.title = @"分段练习题";
+    [self rq_configureData];
+    //通知-刷新
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(my_readData) name:NYBlockExerciseUpdateNotification object:nil];
+}
+
+- (void)my_readData {
+    for (NYBlockExerciseGroupViewModel *group in self.dataSource) {
+        for (NYBlockExerciseItemModel *item in group.itemViewModels) {
+            [item updateData];
+        }
+    }
+}
+
+#pragma mark - ConfigureData
+- (void)rq_configureData {
+    RQ_Exercise_Module.currentExerciseType = RQExerciseType_Block_List;
+    /// 数据源
+    RAC(self, dataSource) = [RACSignal
+                            combineLatest:@[RACObserve(RQ_USER_MANAGER, isCykh)]
+                            reduce:^(NSNumber *isCykh) {
+        NYBlockExerciseGroupViewModel *group0 = [NYBlockExerciseGroupViewModel groupViewModel];
+        group0.header = @"1.夯实基础";
+        group0.headerDesStr = @"覆盖大多知识考点,建立扎实的知识基础";
+        group0.star = 3;
+        group0.headerHeight = 80.f;
+        NYBlockExerciseItemModel *itemModel_0 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题一" group:0];
+        NYBlockExerciseItemModel *itemModel_1 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题二" group:0];
+        NYBlockExerciseItemModel *itemModel_2 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题三" group:0];
+        NYBlockExerciseItemModel *itemModel_3 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题四" group:0];
+        NYBlockExerciseItemModel *itemModel_4 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题五" group:0];
+        NYBlockExerciseItemModel *itemModel_5 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题六" group:0];
+        group0.itemViewModels = @[itemModel_0,itemModel_1,itemModel_2,itemModel_3,itemModel_4,itemModel_5];
+        
+        NYBlockExerciseGroupViewModel *group1 = [NYBlockExerciseGroupViewModel groupViewModel];
+        group1.header = @"2.拔高拓展";
+        group1.headerDesStr = @"突破驾考理论重难点,掌握更全面考点";
+        group1.star = 4;
+        group1.headerHeight = 80.f;
+        NYBlockExerciseItemModel *itemModel1_0 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题一" group:1];
+        NYBlockExerciseItemModel *itemModel1_1 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题二" group:1];
+        group1.itemViewModels = @[itemModel1_0,itemModel1_1];
+        
+        NYBlockExerciseGroupViewModel *group2 = [NYBlockExerciseGroupViewModel groupViewModel];
+        group2.header = @"3.巩固练习";
+        group2.headerDesStr = @"深化理解记忆题目细节,提高答题正确率";
+        group2.star = 5;
+        group2.headerHeight = 80.f;
+        NYBlockExerciseItemModel *itemModel2_0 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题一" group:2];
+        NYBlockExerciseItemModel *itemModel2_1 = [[NYBlockExerciseItemModel alloc] initWithLeftStr:@"试题二" group:2];
+        group2.itemViewModels = @[itemModel2_0,itemModel2_1];
+        
+        return @[group0,group1,group2];
+
+    }];
+}
+@end

+ 17 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.h

@@ -0,0 +1,17 @@
+//
+//  NYFailSpecialExerciseDetailItemModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseDetailItemModel : RQCommonCollectionItemViewModel
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.m

@@ -0,0 +1,13 @@
+//
+//  NYFailSpecialExerciseDetailItemModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseDetailItemModel.h"
+
+@implementation NYFailSpecialExerciseDetailItemModel
+
+@end

+ 19 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.h

@@ -0,0 +1,19 @@
+//
+//  NYFailSpecialExerciseDetailsViewModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseDetailsViewModel : RQCommonViewModel
+
+@property (nonatomic, readonly, assign) RQHomePageSubjectType homePageSubjectType;
+
+
+@end
+NS_ASSUME_NONNULL_END

+ 103 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.m

@@ -0,0 +1,103 @@
+//
+//  NYFailSpecialExerciseDetailsViewModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/12.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseDetailsViewModel.h"
+
+@interface NYFailSpecialExerciseDetailsViewModel ()
+
+@property (nonatomic, readwrite, assign) RQHomePageSubjectType homePageSubjectType;
+
+@property (nonatomic, readwrite, strong) NSDictionary *dataDicts;
+
+@property (nonatomic, readwrite, strong) NSDictionary *titleDict;
+
+@end
+
+@implementation NYFailSpecialExerciseDetailsViewModel
+#pragma mark - Public Method
+- (instancetype)initWithServices:(id<RQViewModelServices>)services params:(NSDictionary *)params {
+    if (self = [super initWithServices:services params:params]) {
+        self.homePageSubjectType =  [params[RQHomePageSubjectTypeKey] integerValue];
+        self.title = params[RQHomePageSpTitleKey];
+    }
+    return self;
+}
+
+- (void)initialize {
+    [super initialize];
+    [self loadPointData];
+    [self rq_configureData];
+}
+
+#pragma mark - ConfigureData
+- (void)rq_configureData {
+    /// 数据源
+    RAC(self, dataSource) = [RACSignal
+                            combineLatest:@[RACObserve(RQ_USER_MANAGER, isCykh)]
+                            reduce:^(NSNumber *isCykh) {
+        NYFailSpecialExerciseGroupViewModel *group0 = [NYFailSpecialExerciseGroupViewModel groupViewModel];
+        group0.headerHeight = RQ_FIT_HORIZONTAL(130);
+        
+        NYFailSpecialExerciseItemModel *itemModel_0 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"扣分" icon:@"扣分"];
+        NYFailSpecialExerciseItemModel *itemModel_1 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"驾驶证" icon:@"驾驶证"];
+        NYFailSpecialExerciseItemModel *itemModel_2 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"罚款" icon:@"罚款"];
+        NYFailSpecialExerciseItemModel *itemModel_3 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"判刑扣留" icon:@"判刑扣留"];
+    
+        group0.itemViewModels = @[itemModel_0,itemModel_1,itemModel_2,itemModel_3
+        ];
+        
+        RQCommonGroupViewModel *group2 = [RQCommonGroupViewModel groupViewModel];
+        RQTimeADItemViewModel *timeADItemViewModel = [[RQTimeADItemViewModel alloc] init];
+        group2.itemViewModels = @[timeADItemViewModel];
+        
+        return @[group0,group2];
+
+    }];
+}
+
+// 加载 JSON 文件并解析
+- (void)loadPointData {
+    // 获取资源文件路径
+    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"pointData" ofType:@"json"];
+    if (filePath) {
+        // 读取文件数据
+        NSData *data = [NSData dataWithContentsOfFile:filePath];
+        
+        if (data) {
+            NSError *error = nil;
+            // 使用 JSONSerialization 解析 JSON 数据
+            self.dataDicts = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
+            NSLog(@"%@",self.dataDicts.allKeys);
+            if (error) {
+                NSLog(@"JSON解析错误: %@", error.localizedDescription);
+            }
+        } else {
+            NSLog(@"文件读取失败");
+        }
+    } else {
+        NSLog(@"文件路径未找到");
+    }
+}
+
+- (NSDictionary *)titleDict{
+    if(!_titleDict){
+        _titleDict = @{@"扣分":@"koufen",
+                       @"驾驶证":@"jiashizheng",
+                       @"罚款":@"fakuan",
+                       @"判刑扣留":@"juliu",
+                       @"安全常识":@"anquanchangshi",
+                       @"交警手势":@"shoushi",
+                       @"周期":@"zhouqi",
+                       @"特殊天气":@"tianqi",
+                       @"速度灯光":@"dengguang",
+                       @"通行原则":@"tongxing"};
+    }
+    return _titleDict;
+}
+
+@end

+ 17 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseGroupViewModel.h

@@ -0,0 +1,17 @@
+//
+//  NYFailSpecialExerciseGroupViewModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseGroupViewModel : RQCommonGroupViewModel
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseGroupViewModel.m

@@ -0,0 +1,13 @@
+//
+//  NYFailSpecialExerciseGroupViewModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseGroupViewModel.h"
+
+@implementation NYFailSpecialExerciseGroupViewModel
+
+@end

+ 20 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseViewModel.h

@@ -0,0 +1,20 @@
+//
+//  NYFailSpecialExerciseViewModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseViewModel : RQCommonViewModel
+
+@property (nonatomic, readonly, assign) RQHomePageSubjectType homePageSubjectType;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 66 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseViewModel.m

@@ -0,0 +1,66 @@
+//
+//  NYFailSpecialExerciseViewModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/11.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseViewModel.h"
+
+@interface NYFailSpecialExerciseViewModel ()
+@property (nonatomic, readwrite, strong) RQTreeListModel *treeListModel;
+@property (nonatomic, readwrite, assign) RQHomePageSubjectType homePageSubjectType;
+@property (nonatomic, readwrite, assign) NSInteger mySection;
+
+@end
+
+@implementation NYFailSpecialExerciseViewModel
+#pragma mark - Public Method
+- (instancetype)initWithServices:(id<RQViewModelServices>)services params:(NSDictionary *)params {
+    if (self = [super initWithServices:services params:params]) {
+        self.homePageSubjectType =  [params[RQHomePageSubjectTypeKey] integerValue];
+    }
+    return self;
+}
+
+- (void)initialize {
+    [super initialize];
+    /// 配置标题
+    self.title = @"题错专项";
+    [self rq_configureData];
+}
+
+#pragma mark - ConfigureData
+- (void)rq_configureData {
+    RQ_Exercise_Module.currentExerciseType = RQExerciseType_Block_List;
+    /// 数据源
+    RAC(self, dataSource) = [RACSignal
+                            combineLatest:@[RACObserve(RQ_USER_MANAGER, isCykh)]
+                            reduce:^(NSNumber *isCykh) {
+        NYFailSpecialExerciseGroupViewModel *group0 = [NYFailSpecialExerciseGroupViewModel groupViewModel];
+        group0.headerHeight = RQ_FIT_HORIZONTAL(130);
+        
+        NYFailSpecialExerciseItemModel *itemModel_0 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"扣分" icon:@"扣分"];
+        NYFailSpecialExerciseItemModel *itemModel_1 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"驾驶证" icon:@"驾驶证"];
+        NYFailSpecialExerciseItemModel *itemModel_2 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"罚款" icon:@"罚款"];
+        NYFailSpecialExerciseItemModel *itemModel_3 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"判刑扣留" icon:@"判刑扣留"];
+        NYFailSpecialExerciseItemModel *itemModel_4 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"安全常识" icon:@"安全常识"];
+        NYFailSpecialExerciseItemModel *itemModel_5 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"交警手势" icon:@"交警手势"];
+        NYFailSpecialExerciseItemModel *itemModel_6 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"周期" icon:@"周期"];
+        NYFailSpecialExerciseItemModel *itemModel_7 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"特殊天气" icon:@"特殊天气"];
+        NYFailSpecialExerciseItemModel *itemModel_8 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"速度灯光" icon:@"速度灯光"];
+        NYFailSpecialExerciseItemModel *itemModel_9 = [[NYFailSpecialExerciseItemModel alloc] initWithTitle:@"通行原则" icon:@"通行原则"];
+        group0.itemViewModels = @[itemModel_0,itemModel_1,itemModel_2,itemModel_3,itemModel_4,itemModel_5,
+                                  itemModel_6,itemModel_7,itemModel_8,itemModel_9,
+        ];
+        
+        RQCommonGroupViewModel *group2 = [RQCommonGroupViewModel groupViewModel];
+        RQTimeADItemViewModel *timeADItemViewModel = [[RQTimeADItemViewModel alloc] init];
+        group2.itemViewModels = @[timeADItemViewModel];
+        
+        return @[group0,group2];
+
+    }];
+}
+@end

+ 4 - 1
jiaPei/Modules/OtherModules/ExerciseModule/Controller/RQExerciseViewController.m

@@ -149,7 +149,10 @@
 - (void)rq_back {
     if (RQ_Exercise_Module.currentExerciseType == RQExerciseType_Exam) {
         [self.viewModel.services popToRootViewModelAnimated:YES];
-    } else {
+    }else if (RQ_Exercise_Module.currentExerciseType == RQExerciseType_Block_List) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:NYBlockExerciseUpdateNotification object:nil];
+        [self.viewModel.services popViewModelAnimated:YES];
+    }else {
         [self.viewModel.services popViewModelAnimated:YES];
     }
     [NY_VOICE_MANAGER stopPayVoiceAction];//停止读题

+ 5 - 0
jiaPei/Modules/OtherModules/ExerciseModule/RQExerciseModule.h

@@ -29,6 +29,8 @@ FOUNDATION_EXTERN NSString * const RQCancelWrongNotification;
 FOUNDATION_EXTERN NSString * const RQCancelWrongExerciseModelKey;
 /// 跳转到下一题通知
 FOUNDATION_EXTERN NSString * const RQAutoJumpNextNotification;
+/// 通知刷新
+FOUNDATION_EXTERN NSString * const NYBlockExerciseUpdateNotification;
 /// 习题页面类型
 typedef NS_ENUM(NSUInteger, RQExerciseType) {
     /// 顺序练习
@@ -87,6 +89,8 @@ typedef NS_ENUM(NSUInteger, RQExerciseType) {
     RQExerciseType_Chapter,
     /// 本地考题
     RQExerciseType_Locality,
+    /// 分段练习
+    RQExerciseType_Block_List,
 };
 
 
@@ -227,6 +231,7 @@ typedef NS_ENUM(NSUInteger, RQExerciseAlertType) {
 @property (nonatomic, readwrite, assign) RQExerciseType currentExerciseType;
 @property (nonatomic, readwrite, copy) NSString *otherStr;
 
+@property (nonatomic, readwrite, copy) NSString *codeStr;
 
 /// 单例
 + (instancetype) sharedInstance;

+ 2 - 0
jiaPei/Modules/OtherModules/ExerciseModule/RQExerciseModule.m

@@ -27,6 +27,8 @@ NSString * const RQCancelWrongNotification = @"RQCancelWrongNotification";
 NSString * const RQCancelWrongExerciseModelKey = @"RQCancelWrongExerciseModelKey";
 /// 跳转到下一题通知
 NSString * const RQAutoJumpNextNotification = @"RQAutoJumpNextNotification";
+NSString * const NYBlockExerciseUpdateNotification = @"NYBlockExerciseUpdateNotification";
+
 
 @interface RQExerciseModule ()
 @property (nonatomic, readwrite, strong) SCLAlertView *alert;

+ 1 - 1
jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.h

@@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (NSArray *)getPoint;
 - (NSArray *)getPointQuestionWithPointId:(NSInteger)pointId;
 - (NSArray *)getPointQuestionWithPointId:(NSInteger)pointId exerciseType:(RQExerciseType)exerciseType;
-
+- (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType code:(NSInteger)code;
 - (BOOL)isNewRuleQuestionWithQuestionId:(NSInteger)questionId;
 - (NSData *)getMediaDataWithMediaName:(NSString *)mediaName;
 - (BOOL)upMediaDataWithMediaName:(NSString *)mediaName data:(NSData*)data;

+ 14 - 1
jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.m

@@ -91,7 +91,20 @@ static id rq_ydtXcQuestionModule = nil;
     return version;
 }
 
-
+- (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType code:(NSInteger)code {
+    NSMutableArray *arr = @[].mutableCopy;
+    if (exerciseType == RQExerciseType_Block_List) {
+        ///  车型
+        NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
+        ///  科目
+        NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]];
+        NSString *inSql = [NSString stringWithFormat:@"SELECT question_id FROM t_app_question_category WHERE category = %zd",code];
+        NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND ID in (%@) ", questionTableNameStr, queryCarTypeStr, querySubjectTypeStr,inSql];
+        NSArray *list = [self queryQuestionWithQueryStr:queryStr];
+        [arr addObjectsFromArray:list];
+    }
+    return arr;
+}
 
 - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType {
     @weakify(self)

+ 1 - 0
jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.h

@@ -111,6 +111,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (NSString *)getCarTypeCNTiKuUpdateNameWithCarType:(RQHomePageCarType)carType;
 - (RQHomePageCarType)getCarTypeWithCarTypeName:(NSString *)carTypeName;
 - (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType;
+- (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType code:(NSInteger)code;
 - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType;
 - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType isNeedMediaData:(BOOL)isNeedMediaData;
 - (NSInteger)getQuestionNumWithWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType;

+ 14 - 0
jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.m

@@ -367,6 +367,16 @@ static id rq_ydtQuestionModule = nil;
     }
 }
 
+- (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType code:(NSInteger)code {
+    switch (self.carType) {
+        case RQHomePageCarType_Car:
+            return [RQ_YDT_XC_Question_Module getQuestionWithSubject:self.subject exerciseType:exerciseType code:code];
+        default:
+            return [RQ_YDT_XC_Question_Module getQuestionWithSubject:self.subject exerciseType:exerciseType];
+    }
+    return @[];
+}
+
 - (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType {
     switch (self.carType) {
         case RQHomePageCarType_Car:
@@ -651,6 +661,8 @@ static id rq_ydtQuestionModule = nil;
     NSString *key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0"];
     if ((RQ_Exercise_Module.currentExerciseType == RQExerciseType_Point || RQ_Exercise_Module.currentExerciseType == RQExerciseType_Chapter) && RQStringIsNotEmpty(RQ_Exercise_Module.otherStr)) {
         key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0", RQ_Exercise_Module.otherStr];
+    }else if(RQ_Exercise_Module.currentExerciseType == RQExerciseType_Block_List) {
+        key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@-%@-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0", RQ_Exercise_Module.otherStr,RQ_Exercise_Module.codeStr];
     }
     id object = [RQ_COMMON_MANAGER getObjectWithKey:key];
     if (RQObjectIsNil(object)) {
@@ -666,6 +678,8 @@ static id rq_ydtQuestionModule = nil;
     NSString *key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0"];
     if ((RQ_Exercise_Module.currentExerciseType == RQExerciseType_Point || RQ_Exercise_Module.currentExerciseType == RQExerciseType_Chapter) && RQStringIsNotEmpty(RQ_Exercise_Module.otherStr)) {
         key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0", RQ_Exercise_Module.otherStr];
+    }else if(RQ_Exercise_Module.currentExerciseType == RQExerciseType_Block_List) {
+        key = [NSString stringWithFormat:@"HistoryQuestionNum%ld-%ld-%ld-%@-%@-%@",self.subject,self.carType,RQ_Exercise_Module.currentExerciseType,RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.loginCode)? RQ_USER_MANAGER.currentUser.loginCode : @"0", RQ_Exercise_Module.otherStr,RQ_Exercise_Module.codeStr];
     }
     [RQ_SHARE_FUNCTION saveObjectWithObject:@(questionId) ForKey:key];
 }

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