Ver código fonte

易错专项 up 85%

openlockPPP 5 meses atrás
pai
commit
6f1dd82f7b
35 arquivos alterados com 1494 adições e 27 exclusões
  1. 34 0
      jiaPei.xcodeproj/project.pbxproj
  2. BIN
      jiaPei.xcworkspace/xcuserdata/mimasigeling.xcuserdatad/UserInterfaceState.xcuserstate
  3. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_left_tag.imageset/Contents.json
  4. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_left_tag.imageset/blue_left_tag@2x.png
  5. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/blue_left_tag.imageset/blue_left_tag@3x.png
  6. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_left.imageset/Contents.json
  7. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_left.imageset/white_title_left@2x.png
  8. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_left.imageset/white_title_left@3x.png
  9. 22 0
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_right.imageset/Contents.json
  10. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_right.imageset/white_title_right@2x.png
  11. BIN
      jiaPei/Images.xcassets/Modules/HomePageModule/YCZX/考点总结/white_title_right.imageset/white_title_right@3x.png
  12. 2 1
      jiaPei/Modules/HomePageModule/RQHomePageModule.h
  13. 21 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView.h
  14. 37 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView.m
  15. 23 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView01.h
  16. 43 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView01.m
  17. 17 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView02.h
  18. 21 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView02.m
  19. 6 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.h
  20. 60 3
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.m
  21. 113 6
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.xib
  22. 31 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.h
  23. 425 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.m
  24. 165 0
      jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.xib
  25. 89 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailGroupPointDataModel.h
  26. 78 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailGroupPointDataModel.m
  27. 6 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.h
  28. 56 0
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailItemModel.m
  29. 171 16
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.m
  30. 1 1
      jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseViewModel.m
  31. 2 0
      jiaPei/Modules/OtherModules/ExerciseModule/RQExerciseModule.h
  32. 1 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.h
  33. 15 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.m
  34. 1 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.h
  35. 10 0
      jiaPei/Modules/OtherModules/YDTQuestionModule/RQYDTQuestionModule.m

+ 34 - 0
jiaPei.xcodeproj/project.pbxproj

@@ -79,6 +79,11 @@
 		1DE204741E4AF95200710ECE /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DE204731E4AF95200710ECE /* CoreLocation.framework */; };
 		1DFC1E982154B82C006CD48C /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DFC1E972154B82C006CD48C /* CoreAudio.framework */; };
 		1DFC1E9F2154B85C006CD48C /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 183DE9DF1C2FA564003740D1 /* libsqlite3.0.tbd */; };
+		90038E262D0FFE49006A1637 /* NYFailItemPointCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90038E252D0FFE49006A1637 /* NYFailItemPointCellView.m */; };
+		90038E2C2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.m in Sources */ = {isa = PBXBuildFile; fileRef = 90038E2A2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.m */; };
+		90038E2D2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90038E2B2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.xib */; };
+		90038E302D117CE5006A1637 /* NYFailItemPointCellView01.m in Sources */ = {isa = PBXBuildFile; fileRef = 90038E2F2D117CE5006A1637 /* NYFailItemPointCellView01.m */; };
+		90038E332D117D13006A1637 /* NYFailItemPointCellView02.m in Sources */ = {isa = PBXBuildFile; fileRef = 90038E322D117D13006A1637 /* NYFailItemPointCellView02.m */; };
 		90044C362A4E7BF7003FBBF8 /* NYFloatingSuggestView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90044C352A4E7BF6003FBBF8 /* NYFloatingSuggestView.m */; };
 		90044C382A4E7CA0003FBBF8 /* NYFloatingSuggestView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90044C372A4E7CA0003FBBF8 /* NYFloatingSuggestView.xib */; };
 		90044C3B2A4E821E003FBBF8 /* NYFloatingSuggestViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 90044C3A2A4E821E003FBBF8 /* NYFloatingSuggestViewModel.m */; };
@@ -111,6 +116,7 @@
 		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 */; };
+		9056897C2D0C1F0700B27B7E /* NYFailGroupPointDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9056897B2D0C1F0700B27B7E /* NYFailGroupPointDataModel.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 */; };
@@ -1850,6 +1856,15 @@
 		1DFC1E9C2154B85B006CD48C /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
 		1DFC1E9D2154B85B006CD48C /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
 		1DFC1E9E2154B85C006CD48C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+		90038E242D0FFE49006A1637 /* NYFailItemPointCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailItemPointCellView.h; sourceTree = "<group>"; };
+		90038E252D0FFE49006A1637 /* NYFailItemPointCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailItemPointCellView.m; sourceTree = "<group>"; };
+		90038E292D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailSpecialExerciseDetailsCell01.h; sourceTree = "<group>"; };
+		90038E2A2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailSpecialExerciseDetailsCell01.m; sourceTree = "<group>"; };
+		90038E2B2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFailSpecialExerciseDetailsCell01.xib; sourceTree = "<group>"; };
+		90038E2E2D117CE5006A1637 /* NYFailItemPointCellView01.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailItemPointCellView01.h; sourceTree = "<group>"; };
+		90038E2F2D117CE5006A1637 /* NYFailItemPointCellView01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailItemPointCellView01.m; sourceTree = "<group>"; };
+		90038E312D117D13006A1637 /* NYFailItemPointCellView02.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailItemPointCellView02.h; sourceTree = "<group>"; };
+		90038E322D117D13006A1637 /* NYFailItemPointCellView02.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailItemPointCellView02.m; sourceTree = "<group>"; };
 		90044C342A4E7BF6003FBBF8 /* NYFloatingSuggestView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFloatingSuggestView.h; sourceTree = "<group>"; };
 		90044C352A4E7BF6003FBBF8 /* NYFloatingSuggestView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFloatingSuggestView.m; sourceTree = "<group>"; };
 		90044C372A4E7CA0003FBBF8 /* NYFloatingSuggestView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NYFloatingSuggestView.xib; sourceTree = "<group>"; };
@@ -1909,6 +1924,8 @@
 		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>"; };
+		9056897A2D0C1F0700B27B7E /* NYFailGroupPointDataModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NYFailGroupPointDataModel.h; sourceTree = "<group>"; };
+		9056897B2D0C1F0700B27B7E /* NYFailGroupPointDataModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NYFailGroupPointDataModel.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>"; };
@@ -4911,6 +4928,8 @@
 				90EAB9E42D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m */,
 				90EAB9EB2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.h */,
 				90EAB9EC2D0AE3160024F379 /* NYFailSpecialExerciseDetailItemModel.m */,
+				9056897A2D0C1F0700B27B7E /* NYFailGroupPointDataModel.h */,
+				9056897B2D0C1F0700B27B7E /* NYFailGroupPointDataModel.m */,
 			);
 			path = "易错专项";
 			sourceTree = "<group>";
@@ -4927,6 +4946,15 @@
 				90EAB9E62D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.h */,
 				90EAB9E72D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.m */,
 				90EAB9E82D0AE16F0024F379 /* NYFailSpecialExerciseDetailsCell.xib */,
+				90038E242D0FFE49006A1637 /* NYFailItemPointCellView.h */,
+				90038E252D0FFE49006A1637 /* NYFailItemPointCellView.m */,
+				90038E292D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.h */,
+				90038E2A2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.m */,
+				90038E2B2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.xib */,
+				90038E2E2D117CE5006A1637 /* NYFailItemPointCellView01.h */,
+				90038E2F2D117CE5006A1637 /* NYFailItemPointCellView01.m */,
+				90038E312D117D13006A1637 /* NYFailItemPointCellView02.h */,
+				90038E322D117D13006A1637 /* NYFailItemPointCellView02.m */,
 			);
 			path = "易错专项";
 			sourceTree = "<group>";
@@ -10346,6 +10374,7 @@
 				D0295BB5243F0B8B00B46AB1 /* 1-7-16.jpg in Resources */,
 				D0295BE6243F0B8B00B46AB1 /* 5-15-20.jpg in Resources */,
 				D0295B95243F0B8A00B46AB1 /* 1-4-78.jpg in Resources */,
+				90038E2D2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.xib in Resources */,
 				D0295C75243F0B8B00B46AB1 /* 1-11-3.jpg in Resources */,
 				D0D2D0C528616C40004E31E6 /* RQHomePageDriveMethodCell.xib in Resources */,
 				D0295C8E243F0B8B00B46AB1 /* 1-6-17.jpg in Resources */,
@@ -11315,6 +11344,7 @@
 				D02010E229373AE8001B9F4D /* UIButton+SLTitleImage.m in Sources */,
 				D08E8E5B2930C2A5001CEF97 /* RQTimeSingleItemViewModel.m in Sources */,
 				90EAB9E52D0AC76C0024F379 /* NYFailSpecialExerciseDetailsViewModel.m in Sources */,
+				90038E302D117CE5006A1637 /* NYFailItemPointCellView01.m in Sources */,
 				D004D7F527FE60EB00A96946 /* RQYDTZGZWXPQuestionModule.m in Sources */,
 				D09E5D4E25E3AA260099E87C /* BDFaceLivingConfigViewController.m in Sources */,
 				D00A150E2754A41C00793046 /* CustomTitleView.m in Sources */,
@@ -11341,6 +11371,7 @@
 				D09E5D4B25E3AA260099E87C /* BDFaceSelectConfigCell.m in Sources */,
 				D04DF6BE27006C56006E3633 /* RQTabBar.m in Sources */,
 				D0508CD927D8779500CBF1FC /* RQDspVideoDetailViewController.m in Sources */,
+				90038E2C2D116A2D006A1637 /* NYFailSpecialExerciseDetailsCell01.m in Sources */,
 				D0D68D3C2890075200600C5C /* RQExamResultViewModel.m in Sources */,
 				18C457D01C45ECCD0017FCFA /* StrongVC.m in Sources */,
 				D0D1F67E283F84DF0086C6AE /* RQExerciseViewController.m in Sources */,
@@ -11630,6 +11661,7 @@
 				D02010BB29373AE8001B9F4D /* SLAlertView.m in Sources */,
 				D02010CA29373AE8001B9F4D /* SLTimer.m in Sources */,
 				90AC53B22A9457070073D90F /* NYExerciseTestingCentreViewModel.m in Sources */,
+				90038E332D117D13006A1637 /* NYFailItemPointCellView02.m in Sources */,
 				9078D9462C50FEF500B37D58 /* NYWPViewModel.m in Sources */,
 				D074575A29272C680050BE10 /* QMVideoTableCell.m in Sources */,
 				D0D5BF172976A0C6004DC669 /* RQVipTrainPriceCell.m in Sources */,
@@ -11861,6 +11893,7 @@
 				D0D1F697283F84E00086C6AE /* RQWrongModel.m in Sources */,
 				D0870D9A2701A6BA004EC94E /* NSDictionary+YYAdd.m in Sources */,
 				D0B54ADD28CB0EEC00F6EFC4 /* RQHomePageTitleView.m in Sources */,
+				90038E262D0FFE49006A1637 /* NYFailItemPointCellView.m in Sources */,
 				D004D7EC27FDDFCA00A96946 /* RQYDTZGZJLYQuestionModule.m in Sources */,
 				D0870D5A2701A6B9004EC94E /* LCActionSheet.m in Sources */,
 				D04DF6C527006C57006E3633 /* RQBaseNavigationController.m in Sources */,
@@ -11992,6 +12025,7 @@
 				D04DF6CB27006C57006E3633 /* RQCommonItemViewModel.m in Sources */,
 				D02010D429373AE8001B9F4D /* SLShotViewController.m in Sources */,
 				D0870D822701A6B9004EC94E /* UIColor+YYAdd.m in Sources */,
+				9056897C2D0C1F0700B27B7E /* NYFailGroupPointDataModel.m in Sources */,
 				D048E2102818E1A9005D606F /* RQProfileUserAndVipHeaderGroupViewModel.m in Sources */,
 				D0D1F67A283F84DF0086C6AE /* RQExerciseSettingItemViewModel.m in Sources */,
 				D0870E402701B5A0004EC94E /* LoginModule.m in Sources */,

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


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

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

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


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


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

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

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


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


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

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

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


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


+ 2 - 1
jiaPei/Modules/HomePageModule/RQHomePageModule.h

@@ -76,7 +76,7 @@ FOUNDATION_EXTERN NSString * const RQHomeSubEditListTypeKey;
 
 #import "NYBlockExerciseHeaderView.h"
 #import "NYBlockExerciseCell.h"
-
+#import "NYFailItemPointCellView.h"
 #import "NYHomePageOneBigCell.h"
 
 #pragma mark - ViewController
@@ -123,6 +123,7 @@ FOUNDATION_EXTERN NSString * const RQHomeSubEditListTypeKey;
 #import "RQHomePageDriveMethodItemViewModel.h"
 #import "RQHomePageSubjectModuleItemViewModel.h"
 
+#import "NYFailGroupPointDataModel.h"
 #import "NYFailSpecialExerciseDetailItemModel.h"
 #import "NYFailSpecialExerciseDetailsViewModel.h"
 #import "NYFailSpecialExerciseGroupViewModel.h"

+ 21 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView.h

@@ -0,0 +1,21 @@
+//
+//  NYFailItemPointCellView.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/16.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailItemPointCellView : UIView
+
+@property (weak, nonatomic) UILabel *content_label;
+
+@property (weak, nonatomic) UIView *line_view;
+
+@end
+
+NS_ASSUME_NONNULL_END

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

@@ -0,0 +1,37 @@
+//
+//  NYFailItemPointCellView.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/16.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailItemPointCellView.h"
+
+@implementation NYFailItemPointCellView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    if (self = [super initWithFrame:frame]) {
+        UILabel *content_label = [[UILabel alloc] initWithFrame:CGRectMake(8, 0, frame.size.width-16, frame.size.height)];
+        content_label.font = [UIFont boldSystemFontOfSize:15.f];
+        content_label.textColor = UIColorHex(0x173CA7);
+        content_label.numberOfLines = 0;
+        content_label.textAlignment = NSTextAlignmentLeft;
+        [self addSubview:content_label];
+        self.content_label = content_label;
+        
+        UIView *line_view = [[UIView alloc] initWithFrame:CGRectMake(8, frame.size.height-1, frame.size.width-8*2, 1)];
+        line_view.backgroundColor = UIColorHex(0xC1D7FF);
+        [self addSubview:line_view];
+        self.line_view = line_view;
+    }
+    return self;
+}
+
+- (void)layoutSubviews{
+    [super layoutSubviews];
+    self.content_label.frame = CGRectMake(8, 0, self.frame.size.width-16, self.frame.size.height);
+    self.line_view.frame =CGRectMake(8, self.frame.size.height-1, self.frame.size.width-8*2, 1);
+}
+
+@end

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

@@ -0,0 +1,23 @@
+//
+//  NYFailItemPointCellView01.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/17.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailItemPointCellView01 : UIView
+
+@property (weak, nonatomic) UIView *topbar_view;
+
+@property (weak, nonatomic) UILabel *topbar_label;
+
+@property (weak, nonatomic) UIView *content_view;
+
+@end
+
+NS_ASSUME_NONNULL_END

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

@@ -0,0 +1,43 @@
+//
+//  NYFailItemPointCellView01.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/17.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailItemPointCellView01.h"
+
+@implementation NYFailItemPointCellView01
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    if (self = [super initWithFrame:frame]) {
+        self.layer.cornerRadius = 5;
+        self.layer.masksToBounds = YES;
+        CGFloat topbarH = 40;
+        UIView *topbar_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, topbarH)];
+        topbar_view.backgroundColor = UIColorHex(0xC1D7FF);
+        [self addSubview:topbar_view];
+        self.topbar_view = topbar_view;
+        CGFloat contentH = frame.size.height - topbarH;
+        UIView *content_view = [[UIView alloc] initWithFrame:CGRectMake(0, topbarH, frame.size.width, contentH)];
+        [self addSubview:content_view];
+        self.content_view = content_view;
+        
+        UILabel *topbar_label = [[UILabel alloc] initWithFrame:topbar_view.bounds];
+        topbar_label.textAlignment = NSTextAlignmentCenter;
+        topbar_label.font = [UIFont boldSystemFontOfSize:15.f];
+        topbar_label.textColor = UIColorHex(0x173CA7);
+        topbar_label.text = @"考试常识";
+        [topbar_view addSubview:topbar_label];
+        self.topbar_label = topbar_label;
+        
+    }
+    return self;
+}
+
+- (void)layoutSubviews{
+    [super layoutSubviews];
+}
+
+@end

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

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

+ 21 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailItemPointCellView02.m

@@ -0,0 +1,21 @@
+//
+//  NYFailItemPointCellView02.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/17.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailItemPointCellView02.h"
+
+@implementation NYFailItemPointCellView02
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

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

@@ -12,6 +12,12 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface NYFailSpecialExerciseDetailsCell : RQCommonCollectionViewCell
 
+@property (weak, nonatomic) IBOutlet UILabel *scoreStr_label;
+
+@property (weak, nonatomic) IBOutlet UIView *tbList_view;
+
+@property (weak, nonatomic) IBOutlet UIButton *submit_btn;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 60 - 3
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.m

@@ -28,15 +28,72 @@
 - (void)bindViewModel:(NYFailSpecialExerciseDetailItemModel *)viewModel {
     
     self.viewModel = viewModel;
-
-    
+    if(viewModel.dataModel.showType.intValue == 1){
+        self.scoreStr_label.text = [NSString stringWithFormat:@"%zd分",viewModel.dataModel.score];
+        CGFloat yOffset = 0; // 初始偏移量
+        CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+        int bi = 0;
+        for (int i= 0; i<viewModel.dataModel.question_array.count; i++) {
+            NSString *title_str = [NSString stringWithFormat:@"%zd.%@",i+1,viewModel.dataModel.question_array[i]];
+            // 从 XIB 加载 NYFailItemPointCellView
+            NYFailItemPointCellView *cellView = [self.tbList_view viewWithTag:99+i];
+            cellView.hidden = NO;
+            CGSize str_size = [title_str rq_sizeWithFont:cellView.content_label.font limitWidth:cellView.content_label.width];
+            if(str_size.height>cellHeight){
+                cellHeight = str_size.height + 12.f;
+            }
+            cellView.frame = CGRectMake(0, yOffset, RQ_SCREEN_WIDTH-22*2, cellHeight);
+            cellView.content_label.text = title_str;
+            // 调整偏移量
+            yOffset += cellHeight;
+            bi = i+1;
+        }
+        for (int ci=bi; ci<30; ci++) {
+            NYFailItemPointCellView *cellView = [self.tbList_view viewWithTag:99+ci];
+            cellView.hidden = YES;
+        }
+    }
+//    RAC(self.scoreStr_label, text) = [[/*RACObserve(viewModel.dataModel, s) deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal];*/
 }
 
+- (IBAction)submit_clickdo:(UIButton *)sender {
+    NSString *questionIds = self.viewModel.dataModel.questionIds;
+    NSArray *arr = [[RQ_YDTQuestion_Module getQuestionWithExerciseType:RQExerciseType_Error_Special_List questionIds:questionIds].rac_sequence.signal map:^id _Nullable(RQYDTQuestionModel  *ydtQuestionModel) {
+        return [RQExerciseModel exerciseModelWithRQYDTQuestionModel:ydtQuestionModel];
+    }].toArray;
+    RQExerciseViewModel *exerciseViewModel = [[RQExerciseViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
+        RQHomePageCarTypeKey        : @(RQ_YDTQuestion_Module.carType),
+        RQHomePageSubjectTypeKey    : @(RQ_YDTQuestion_Module.subject),
+        RQHomeSubPageTypeKey        : @(RQHomeSubPageType_SequentialPractice),
+        RQViewModelIDKey            : @"标题",
+        RQExerciseTypeKey           : @(RQExerciseType_Error_Special_List),
+        RQViewModelUtilKey          : arr,
+    }];
+    [RQ_APPDELEGATE.services pushViewModel:exerciseViewModel animated:YES];
+
+}
 
 #pragma mark - SystemMethods
 - (void)awakeFromNib {
     [super awakeFromNib];
-    
+    [self initTbList_view];
+}
+
+- (void)initTbList_view{
+    // 初始化按钮
+    CGFloat yOffset = 0; // 初始偏移量
+    CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+    for (int i= 0; i<30; i++) {
+        // 从 XIB 加载 NYFailItemPointCellView
+        NYFailItemPointCellView *cellView = [[NYFailItemPointCellView alloc] initWithFrame:CGRectMake(0, yOffset, RQ_SCREEN_WIDTH-22*2, cellHeight)];
+        //[[NSBundle mainBundle] loadNibNamed:@"NYFailItemPointCellView" owner:nil options:nil].firstObject;
+        cellView.tag = 99+i;
+        cellView.hidden = YES;
+        // 添加到 tbList_view
+        [self.tbList_view addSubview:cellView];
+        // 调整偏移量
+        yOffset += cellHeight;
+    }
 }
 
 @end

+ 113 - 6
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell.xib

@@ -4,6 +4,7 @@
     <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>
@@ -20,18 +21,111 @@
                         <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"/>
+                                <rect key="frame" x="5" y="5" width="365" 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 clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="blue_jb_bg" translatesAutoresizingMaskIntoConstraints="NO" id="fAh-LT-a9N">
+                                        <rect key="frame" x="0.0" y="0.0" width="365" height="214"/>
+                                        <userDefinedRuntimeAttributes>
+                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                <integer key="value" value="5"/>
+                                            </userDefinedRuntimeAttribute>
+                                            <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        </userDefinedRuntimeAttributes>
+                                    </imageView>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="80分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="G05-l5-gNb">
+                                        <rect key="frame" x="163" y="12" width="39.333333333333343" height="20"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="30" id="KEH-0c-feF"/>
+                                            <constraint firstAttribute="height" constant="20" id="OKk-MN-bXW"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="boldSystem" pointSize="16"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="white_title_right" translatesAutoresizingMaskIntoConstraints="NO" id="dOg-lE-FtG">
+                                        <rect key="frame" x="207.33333333333334" y="11" width="22" height="22"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="22" id="bjU-vQ-xKZ"/>
+                                            <constraint firstAttribute="height" constant="22" id="zc3-bw-ctZ"/>
+                                        </constraints>
+                                    </imageView>
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Ow-34-Aeh" userLabel="View-content">
+                                        <rect key="frame" x="16" y="41" width="333" height="157"/>
+                                        <subviews>
+                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZG8-v6-VoO" userLabel="View-tblist">
+                                                <rect key="frame" x="0.0" y="0.0" width="333" height="113"/>
+                                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                            </view>
+                                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qUf-eg-gg0" userLabel="View-button">
+                                                <rect key="frame" x="0.0" y="113" width="333" height="44"/>
+                                                <subviews>
+                                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XBW-iM-cie">
+                                                        <rect key="frame" x="110" y="8" width="113" height="28"/>
+                                                        <color key="backgroundColor" red="0.28627450980392155" green="0.55686274509803924" blue="0.96078431372549022" alpha="1" colorSpace="calibratedRGB"/>
+                                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
+                                                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                                        <state key="normal" title="去练题"/>
+                                                        <userDefinedRuntimeAttributes>
+                                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                                <integer key="value" value="12"/>
+                                                            </userDefinedRuntimeAttribute>
+                                                        </userDefinedRuntimeAttributes>
+                                                        <connections>
+                                                            <action selector="submit_clickdo:" destination="gTV-IL-0wX" eventType="touchUpInside" id="1fY-GJ-MoY"/>
+                                                        </connections>
+                                                    </button>
+                                                </subviews>
+                                                <color key="backgroundColor" red="0.75686274509803919" green="0.84313725490196079" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="trailing" secondItem="XBW-iM-cie" secondAttribute="trailing" constant="110" id="KgU-fV-1vk"/>
+                                                    <constraint firstAttribute="height" constant="44" id="blU-PA-V1e"/>
+                                                    <constraint firstAttribute="bottom" secondItem="XBW-iM-cie" secondAttribute="bottom" constant="8" id="crr-q8-tj1"/>
+                                                    <constraint firstItem="XBW-iM-cie" firstAttribute="top" secondItem="qUf-eg-gg0" secondAttribute="top" constant="8" id="ndt-h3-RMw"/>
+                                                    <constraint firstItem="XBW-iM-cie" firstAttribute="leading" secondItem="qUf-eg-gg0" secondAttribute="leading" constant="110" id="zvs-do-yC4"/>
+                                                </constraints>
+                                            </view>
+                                        </subviews>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        <constraints>
+                                            <constraint firstAttribute="trailing" secondItem="qUf-eg-gg0" secondAttribute="trailing" id="04c-hr-RBy"/>
+                                            <constraint firstItem="qUf-eg-gg0" firstAttribute="top" secondItem="ZG8-v6-VoO" secondAttribute="bottom" id="7CG-XY-P8q"/>
+                                            <constraint firstItem="qUf-eg-gg0" firstAttribute="leading" secondItem="9Ow-34-Aeh" secondAttribute="leading" id="LEm-hd-S7l"/>
+                                            <constraint firstItem="ZG8-v6-VoO" firstAttribute="top" secondItem="9Ow-34-Aeh" secondAttribute="top" id="RS4-6F-QBz"/>
+                                            <constraint firstItem="ZG8-v6-VoO" firstAttribute="leading" secondItem="9Ow-34-Aeh" secondAttribute="leading" id="bb5-st-pPd"/>
+                                            <constraint firstAttribute="bottom" secondItem="qUf-eg-gg0" secondAttribute="bottom" id="sXy-Nx-InB"/>
+                                            <constraint firstAttribute="trailing" secondItem="ZG8-v6-VoO" secondAttribute="trailing" id="u16-6o-yxV"/>
+                                        </constraints>
+                                        <userDefinedRuntimeAttributes>
+                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                <integer key="value" value="5"/>
+                                            </userDefinedRuntimeAttribute>
+                                            <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        </userDefinedRuntimeAttributes>
+                                    </view>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="white_title_left" translatesAutoresizingMaskIntoConstraints="NO" id="kl6-2L-E5A">
+                                        <rect key="frame" x="136" y="11" width="22" height="22"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="22" id="l9Z-KA-Lt7"/>
+                                            <constraint firstAttribute="height" constant="22" id="pL2-Lo-VXt"/>
+                                        </constraints>
                                     </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="9Ow-34-Aeh" firstAttribute="top" secondItem="kl6-2L-E5A" secondAttribute="bottom" constant="8" id="Dcl-mY-V8t"/>
                                     <constraint firstItem="fAh-LT-a9N" firstAttribute="top" secondItem="nQV-y2-0ZW" secondAttribute="top" id="IDf-Gx-0st"/>
+                                    <constraint firstItem="dOg-lE-FtG" firstAttribute="centerY" secondItem="G05-l5-gNb" secondAttribute="centerY" id="KYs-sU-pWa"/>
+                                    <constraint firstItem="G05-l5-gNb" firstAttribute="top" secondItem="nQV-y2-0ZW" secondAttribute="top" constant="12" id="YjI-Kg-dD1"/>
+                                    <constraint firstItem="G05-l5-gNb" firstAttribute="centerX" secondItem="nQV-y2-0ZW" secondAttribute="centerX" id="ddP-xB-9jI"/>
                                     <constraint firstItem="fAh-LT-a9N" firstAttribute="leading" secondItem="nQV-y2-0ZW" secondAttribute="leading" id="dfu-Nt-PEi"/>
+                                    <constraint firstAttribute="trailing" secondItem="9Ow-34-Aeh" secondAttribute="trailing" constant="16" id="hL9-ay-CmK"/>
+                                    <constraint firstItem="kl6-2L-E5A" firstAttribute="centerY" secondItem="G05-l5-gNb" secondAttribute="centerY" id="iUt-ip-P8I"/>
+                                    <constraint firstItem="9Ow-34-Aeh" firstAttribute="leading" secondItem="nQV-y2-0ZW" secondAttribute="leading" constant="16" id="jnE-R3-cQZ"/>
+                                    <constraint firstItem="dOg-lE-FtG" firstAttribute="leading" secondItem="G05-l5-gNb" secondAttribute="trailing" constant="5" id="jqt-wZ-sjh"/>
                                     <constraint firstAttribute="trailing" secondItem="fAh-LT-a9N" secondAttribute="trailing" id="nnR-3I-JhW"/>
+                                    <constraint firstItem="G05-l5-gNb" firstAttribute="leading" secondItem="kl6-2L-E5A" secondAttribute="trailing" constant="5" id="wAz-xh-eX0"/>
+                                    <constraint firstAttribute="bottom" secondItem="9Ow-34-Aeh" secondAttribute="bottom" constant="16" id="zAj-NP-9hH"/>
                                 </constraints>
                             </view>
                         </subviews>
@@ -39,8 +133,8 @@
                         <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"/>
+                            <constraint firstAttribute="trailing" secondItem="nQV-y2-0ZW" secondAttribute="trailing" constant="5" id="awz-af-wyW"/>
+                            <constraint firstItem="nQV-y2-0ZW" firstAttribute="leading" secondItem="pGB-Ib-orj" secondAttribute="leading" constant="5" id="fCg-Da-93S"/>
                         </constraints>
                     </view>
                 </subviews>
@@ -51,7 +145,20 @@
                 <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"/>
+            <connections>
+                <outlet property="scoreStr_label" destination="G05-l5-gNb" id="qbb-kp-dcc"/>
+                <outlet property="submit_btn" destination="XBW-iM-cie" id="iU2-q9-92b"/>
+                <outlet property="tbList_view" destination="ZG8-v6-VoO" id="vtF-S7-FEf"/>
+            </connections>
+            <point key="canvasLocation" x="38.931297709923662" y="-12.67605633802817"/>
         </collectionViewCell>
     </objects>
+    <resources>
+        <image name="blue_jb_bg" width="181.66667175292969" height="270.66665649414062"/>
+        <image name="white_title_left" width="13" height="12"/>
+        <image name="white_title_right" width="13" height="12"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
 </document>

+ 31 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.h

@@ -0,0 +1,31 @@
+//
+//  NYFailSpecialExerciseDetailsCell01.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/17.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NYFailSpecialExerciseDetailsCell01 : RQCommonCollectionViewCell
+
+@property (weak, nonatomic) IBOutlet UIView *vw_ct_view;
+
+@property (weak, nonatomic) IBOutlet UIView *vw_left_view;
+
+@property (weak, nonatomic) IBOutlet UILabel *scoreStr_label;
+
+@property (weak, nonatomic) IBOutlet UILabel *vw_left_label;
+
+@property (weak, nonatomic) IBOutlet UIButton *submit_btn;
+
+@property (weak, nonatomic) IBOutlet UIView *item_view;
+
+@property (weak, nonatomic) UIView *itop_view;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 425 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.m

@@ -0,0 +1,425 @@
+//
+//  NYFailSpecialExerciseDetailsCell01.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/17.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailSpecialExerciseDetailsCell01.h"
+
+@interface NYFailSpecialExerciseDetailsCell01 ()
+
+@property (nonatomic, readwrite, strong) NYFailSpecialExerciseDetailItemModel *viewModel;
+
+@end
+
+@implementation NYFailSpecialExerciseDetailsCell01
+
+#pragma mark - PublicMethods
++ (instancetype)cellWithCollectionView:(UICollectionView *)collectionView forIndexPath:(NSIndexPath *)indexPath {
+    static NSString *ID = @"NYFailSpecialExerciseDetailsCell01";
+    [collectionView registerNib:[UINib nibWithNibName:ID bundle:nil] forCellWithReuseIdentifier:ID];
+    NYFailSpecialExerciseDetailsCell01 *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
+    if (!cell) cell = [self rq_viewFromXib];
+    return cell;
+}
+
+- (void)bindViewModel:(NYFailSpecialExerciseDetailItemModel *)viewModel {
+    @weakify(self)
+    self.viewModel = viewModel;
+    self.scoreStr_label.text = viewModel.dataModel.title;
+    self.vw_left_label.text = viewModel.itemPointTitle;
+    __block CGFloat yOffset = 0; // 初始偏移量
+    __block CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+    int bi = 0;
+    CGFloat imgW = (RQ_SCREEN_WIDTH-22*2);
+    self.itop_view.hidden = YES;
+    if(viewModel.dataModel.con.count>0){//手势
+        for (int i= 0; i<viewModel.dataModel.con.count; i++) {
+            NYFailItemPointDataCon *con = viewModel.dataModel.con[i];
+            NSString *img_url = con.image;
+            UIImageView *image_view = [self.item_view viewWithTag:99+i];
+            __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+            dispatch_async(dispatch_get_global_queue(0, 0), ^{
+                // 处理耗时操作的代码块...
+                imageSize = [UIImage getImageSizeWithURL:img_url];
+                //通知主线程刷新
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    //回调或者说是通知主线程刷新,
+                    if (imageSize.width == 0 || imageSize.height == 0) {
+                        cellHeight = imgW * (175.f / 345.f);
+                    } else {
+                        cellHeight = imgW * (imageSize.height / imageSize.width);
+                    }
+                    image_view.frame = CGRectMake(0, yOffset, imgW, cellHeight);
+                    // 调整偏移量
+                    yOffset += cellHeight+10*(i+1);
+                });
+            });
+            [image_view sd_setImageWithURL:[NSURL URLWithString:img_url]];
+            image_view.hidden = NO;
+            bi = i+1;
+        }
+        for (int ci=bi; ci<10; ci++) {
+            UIImageView *image_view = [self.item_view viewWithTag:99+ci];
+            image_view.hidden = YES;
+        }
+    }
+    if(viewModel.dataModel.tagquestions.count>0){
+        self.vw_left_view.hidden = YES;
+        self.itop_view.hidden = NO;
+        self.itop_view.frame = CGRectMake(0, 0, imgW, viewModel.dataModel.iviewH);
+        CGFloat tagitop_yOffset = 10; // 初始偏移量
+        CGFloat tagtop_cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+        int tagitop_bi = 0;
+        int tagitop_bicc = 0;
+        int tagitop_biccc = 0;
+        for (int i= 0; i<viewModel.dataModel.tagquestions.count; i++) {
+            NYFailItemPointDataQuestions *tag = viewModel.dataModel.tagquestions[i];
+            NSString *tag_str = tag.tag;
+            // 从 XIB 加载 NYFailItemPointCellView
+            UIButton *btn = [self.itop_view viewWithTag:29+i];
+            btn.hidden = NO;
+            btn.frame = CGRectMake(10, tagitop_yOffset+10*i, 150.f, 25.f);
+            [btn setTitleNormal:tag_str];
+            // 调整偏移量
+            tagitop_yOffset += 25.f+10*i;
+            for (int z= 0; z<tag.tagCon.count; z++) {
+                NYFailItemPointDataQuesTexts *textItem = tag.tagCon[z];
+                NSString *title_str = textItem.subTitle;
+                // 从 XIB 加载 NYFailItemPointCellView
+                NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+z+tagitop_bicc];
+                cellView.hidden = NO;
+                CGSize str_size = [title_str rq_sizeWithFont:cellView.content_label.font limitWidth:cellView.content_label.width];
+                if(str_size.height>tagtop_cellHeight){
+                    tagtop_cellHeight = str_size.height + 12.f;
+                }
+                cellView.frame = CGRectMake(0, tagitop_yOffset, RQ_SCREEN_WIDTH-22*2, tagtop_cellHeight);
+                cellView.content_label.attributedText = [self getAttributedString:title_str color:UIColorHex(0xFF6714)];
+                // 调整偏移量
+                tagitop_yOffset += tagtop_cellHeight;
+                
+                if(textItem.quesItem.count>0){
+                    CGFloat ab_H = 20.f;
+                    for (int t= 0; t<textItem.quesItem.count; t++) {
+                        NSString *item_str = textItem.quesItem[t];
+                        UILabel *label = [self.itop_view viewWithTag:59+t+tagitop_biccc];
+                        label.hidden = NO;
+                        label.attributedText = [self getAttributedString:item_str color:UIColorHex(0xFF6714)];
+                        label.frame = CGRectMake(10, tagitop_yOffset, RQ_SCREEN_WIDTH-22*2, ab_H);
+                        tagitop_yOffset += ab_H;
+                    }
+                    tagitop_biccc += textItem.quesItem.count;
+                }
+            }
+            tagitop_bicc += tag.tagCon.count;
+            tagitop_bi =i+1;
+        }
+        for (int ci=tagitop_bi; ci<10; ci++) {
+            UIButton *btn = [self.itop_view viewWithTag:29+ci];
+            btn.hidden = YES;
+        }
+        for (int ci=tagitop_biccc; ci<10; ci++) {
+            UILabel *label = [self.itop_view viewWithTag:59+ci];
+            label.hidden = YES;
+        }
+        for (int ci=tagitop_bicc; ci<10; ci++) {
+            NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+ci];
+            cellView.hidden = YES;
+        }
+    }
+    if(viewModel.dataModel.iquestions.count>0){
+        for (int i= 0; i<viewModel.dataModel.iquestions.count; i++) {
+            NYFailItemPointDataQuesImage *img = viewModel.dataModel.iquestions[i];
+            NSString *img_url = img.image;
+            UIImageView *image_view = [self.item_view viewWithTag:99+i];
+            __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+            dispatch_async(dispatch_get_global_queue(0, 0), ^{
+                // 处理耗时操作的代码块...
+                imageSize = [UIImage getImageSizeWithURL:img_url];
+                //通知主线程刷新
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    //回调或者说是通知主线程刷新,
+                    if (imageSize.width == 0 || imageSize.height == 0) {
+                        cellHeight = imgW * (175.f / 345.f);
+                    } else {
+                        cellHeight = imgW * (imageSize.height / imageSize.width);
+                    }
+                    image_view.frame = CGRectMake(0, yOffset, imgW, cellHeight);
+                    // 调整偏移量
+                    yOffset += cellHeight+10*(i+1);
+                });
+            });
+            [image_view sd_setImageWithURL:[NSURL URLWithString:img_url]];
+            image_view.hidden = NO;
+            bi = i+1;
+        }
+        for (int ci=bi; ci<10; ci++) {
+            UIImageView *image_view = [self.item_view viewWithTag:99+ci];
+            image_view.hidden = YES;
+        }
+    }
+    if(viewModel.dataModel.fquestions.count>0){
+        self.vw_left_view.hidden = YES;
+        self.itop_view.hidden = NO;
+        self.itop_view.frame = CGRectMake(0, 0, imgW, viewModel.dataModel.iviewH);
+        yOffset = CGRectGetMaxY(self.itop_view.frame) +10.f;
+        CGFloat fitop_yOffset = 0; // 初始偏移量
+        CGFloat fitop_cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+        int fitop_bi = 0;
+        int fitop_bicc = 0;
+        for (int i= 0; i<viewModel.dataModel.fquestions.count; i++) {
+            NYFailItemPointDataQuesTexts *textItem = viewModel.dataModel.fquestions[i];
+            NSString *title_str = textItem.subTitle;
+            // 从 XIB 加载 NYFailItemPointCellView
+            NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+i];
+            cellView.hidden = NO;
+            CGSize str_size = [title_str rq_sizeWithFont:cellView.content_label.font limitWidth:cellView.content_label.width];
+            if(str_size.height>fitop_cellHeight){
+                fitop_cellHeight = str_size.height + 12.f;
+            }
+            cellView.frame = CGRectMake(0, fitop_yOffset, RQ_SCREEN_WIDTH-22*2, fitop_cellHeight);
+            cellView.content_label.attributedText = [self getAttributedString:title_str color:UIColorHex(0xFF6714)];
+            // 调整偏移量
+            fitop_yOffset += fitop_cellHeight;
+            fitop_bi = i+1;
+            if(textItem.quesItem.count>0){
+                CGFloat ab_H = 20.f;
+                for (int z= 0; z<textItem.quesItem.count; z++) {
+                    NSString *item_str = textItem.quesItem[z];
+                    UILabel *label = [self.itop_view viewWithTag:59+z+fitop_bicc];
+                    label.hidden = NO;
+                    label.attributedText = [self getAttributedString:item_str color:UIColorHex(0xFF6714)];
+                    label.frame = CGRectMake(10, fitop_yOffset, RQ_SCREEN_WIDTH-22*2, ab_H);
+                    fitop_yOffset += ab_H;
+                }
+                fitop_bicc += textItem.quesItem.count;
+            }
+        }
+        for (int ci=fitop_bicc; ci<10; ci++) {
+            UILabel *label = [self.itop_view viewWithTag:59+ci];
+            label.hidden = YES;
+        }
+        for (int ci=fitop_bi; ci<10; ci++) {
+            NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+ci];
+            cellView.hidden = YES;
+        }
+    }
+    if(viewModel.dataModel.questions.quesTexts.count>0){
+        self.itop_view.hidden = NO;
+        self.itop_view.frame = CGRectMake(0, 0, imgW, viewModel.dataModel.iviewH);
+        yOffset = CGRectGetMaxY(self.itop_view.frame) +10.f;
+        CGFloat itop_yOffset = 0; // 初始偏移量
+        CGFloat itop_cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+        int itop_bi = 0;
+        int itop_bicc = 0;
+        for (int i= 0; i<viewModel.dataModel.questions.quesTexts.count; i++) {
+            NYFailItemPointDataQuesTexts *textItem = viewModel.dataModel.questions.quesTexts[i];
+            NSString *title_str = textItem.subTitle;
+            // 从 XIB 加载 NYFailItemPointCellView
+            NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+i];
+            cellView.hidden = NO;
+            CGSize str_size = [title_str rq_sizeWithFont:cellView.content_label.font limitWidth:cellView.content_label.width];
+            if(str_size.height>itop_cellHeight){
+                itop_cellHeight = str_size.height + 12.f;
+            }
+            cellView.frame = CGRectMake(0, itop_yOffset, RQ_SCREEN_WIDTH-22*2, itop_cellHeight);
+            cellView.content_label.attributedText = [self getAttributedString:title_str color:UIColorHex(0xFF6714)];
+            // 调整偏移量
+            itop_yOffset += itop_cellHeight;
+            itop_bi = i+1;
+            if(textItem.quesItem.count>0){
+                CGFloat ab_H = 20.f;
+                for (int z= 0; z<textItem.quesItem.count; z++) {
+                    NSString *item_str = textItem.quesItem[z];
+                    UILabel *label = [self.itop_view viewWithTag:59+z+itop_bicc];
+                    label.hidden = NO;
+                    label.attributedText = [self getAttributedString:item_str color:UIColorHex(0xFF6714)];
+                    label.frame = CGRectMake(10, itop_yOffset, RQ_SCREEN_WIDTH-22*2, ab_H);
+                    itop_yOffset += ab_H;
+                }
+                itop_bicc += textItem.quesItem.count;
+            }
+        }
+        for (int ci=itop_bicc; ci<10; ci++) {
+            UILabel *label = [self.itop_view viewWithTag:59+ci];
+            label.hidden = YES;
+        }
+        for (int ci=itop_bi; ci<10; ci++) {
+            NYFailItemPointCellView *cellView = [self.itop_view viewWithTag:19+ci];
+            cellView.hidden = YES;
+        }
+    }
+    for (int i= 0; i<viewModel.dataModel.questions.images.count; i++) {
+        NSString *img_url = viewModel.dataModel.questions.images[i];
+        UIImageView *image_view = [self.item_view viewWithTag:99+i];
+        __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+        dispatch_async(dispatch_get_global_queue(0, 0), ^{
+            @strongify(self)
+            // 处理耗时操作的代码块...
+            imageSize = [UIImage getImageSizeWithURL:img_url];
+            //通知主线程刷新
+            dispatch_async(dispatch_get_main_queue(), ^{
+                //回调或者说是通知主线程刷新,
+                if (imageSize.width == 0 || imageSize.height == 0) {
+                    cellHeight = imgW * (175.f / 345.f);
+                } else {
+                    cellHeight = imgW * (imageSize.height / imageSize.width);
+                }
+                image_view.frame = CGRectMake(0, yOffset, imgW, cellHeight);
+                // 调整偏移量
+                yOffset += cellHeight+10*(i+1);
+            });
+        });
+        [image_view sd_setImageWithURL:[NSURL URLWithString:img_url]];
+        image_view.hidden = NO;
+        bi = i+1;
+        for (int ci=bi; ci<10; ci++) {
+            UIImageView *image_view = [self.item_view viewWithTag:99+ci];
+            image_view.hidden = YES;
+        }
+    }
+    
+}
+
+
+- (NSMutableAttributedString*)getAttributedString:(NSString *)str color:(UIColor*)color {
+    // 使用正则表达式匹配所有 [ ] 中的内容
+        NSError *error = nil;
+        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\]]+)\\]" options:0 error:&error];
+        
+        if (error) {
+            NSLog(@"正则表达式错误: %@", error.localizedDescription);
+            return [[NSMutableAttributedString alloc] initWithString:str];
+        }
+        
+        // 用于存储需要替换的内容和范围
+        NSMutableArray<NSDictionary *> *replacements = [NSMutableArray array];
+        
+        // 匹配 [ ] 中的内容
+        NSArray<NSTextCheckingResult *> *matches = [regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
+        
+        for (NSTextCheckingResult *match in matches) {
+            if (match.numberOfRanges > 1) {
+                // 提取 [ ] 内部的内容
+                NSRange innerRange = [match rangeAtIndex:1];
+                NSString *matchedText = [str substringWithRange:innerRange];
+                
+                // 保存替换内容和范围
+                [replacements addObject:@{
+                    @"text": matchedText,
+                    @"range": [NSValue valueWithRange:match.range]
+                }];
+            }
+        }
+        
+        // 创建可变字符串以进行替换
+        NSMutableString *updatedString = [NSMutableString stringWithString:str];
+        NSMutableArray<NSValue *> *highlightedRanges = [NSMutableArray array];
+        NSInteger offset = 0;
+        
+        for (NSDictionary *replacement in replacements) {
+            NSString *text = replacement[@"text"];
+            NSRange range = [replacement[@"range"] rangeValue];
+            
+            // 调整范围以匹配当前字符串的变化
+            range.location += offset;
+            
+            // 替换 [ ] 为其内部内容
+            [updatedString replaceCharactersInRange:range withString:text];
+            
+            // 记录调整后的范围
+            NSRange adjustedRange = NSMakeRange(range.location, text.length);
+            [highlightedRanges addObject:[NSValue valueWithRange:adjustedRange]];
+            
+            // 更新偏移量
+            offset += (text.length - range.length);
+        }
+        
+        // 创建 NSMutableAttributedString
+        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:updatedString];
+        
+        // 设置高亮颜色(黄色)
+        for (NSValue *rangeValue in highlightedRanges) {
+            [attributedString addAttribute:NSForegroundColorAttributeName value:color range:rangeValue.rangeValue];
+        }
+        
+    
+    return attributedString;
+}
+
+
+- (IBAction)submit_clickdo:(UIButton *)sender {
+    NSString *questionIds = self.viewModel.dataModel.questionIds;
+    NSArray *arr = [[RQ_YDTQuestion_Module getQuestionWithExerciseType:RQExerciseType_Error_Special_List questionIds:questionIds].rac_sequence.signal map:^id _Nullable(RQYDTQuestionModel  *ydtQuestionModel) {
+        return [RQExerciseModel exerciseModelWithRQYDTQuestionModel:ydtQuestionModel];
+    }].toArray;
+    RQExerciseViewModel *exerciseViewModel = [[RQExerciseViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
+        RQHomePageCarTypeKey        : @(RQ_YDTQuestion_Module.carType),
+        RQHomePageSubjectTypeKey    : @(RQ_YDTQuestion_Module.subject),
+        RQHomeSubPageTypeKey        : @(RQHomeSubPageType_SequentialPractice),
+        RQViewModelIDKey            : @"标题",
+        RQExerciseTypeKey           : @(RQExerciseType_Error_Special_List),
+        RQViewModelUtilKey          : arr,
+    }];
+    [RQ_APPDELEGATE.services pushViewModel:exerciseViewModel animated:YES];
+
+}
+
+#pragma mark - SystemMethods
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self initTbList_view];
+}
+
+- (void)initTbList_view{
+    UIView *itop_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, RQ_SCREEN_WIDTH-22*2, 20)];
+    itop_view.backgroundColor = UIColor.whiteColor;
+    itop_view.layer.cornerRadius = 5.f;
+    itop_view.layer.masksToBounds = YES;
+    itop_view.hidden = YES;
+    [self.item_view addSubview:itop_view];
+    self.itop_view = itop_view;
+    
+    //10 + 10
+    for (int i= 0; i<10; i++) {
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [btn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
+        btn.titleLabel.font =  [UIFont systemFontOfSize:15.f];
+        btn.backgroundColor = UIColorHex(0xC1D7FF);
+        btn.layer.cornerRadius = 5.f;
+        btn.layer.masksToBounds = YES;
+        btn.tag = 29+i;
+        btn.hidden = YES;
+        [self.itop_view addSubview:btn];
+    }
+    for (int i= 0; i<10; i++) {
+        NYFailItemPointCellView *cellView = [[NYFailItemPointCellView alloc] initWithFrame:CGRectMake(0, 0, RQ_SCREEN_WIDTH-22*2, 0)];
+        cellView.tag = 19+i;
+        cellView.hidden = YES;
+        [self.itop_view addSubview:cellView];
+    }
+    for (int i= 0; i<10; i++) {
+        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, RQ_SCREEN_WIDTH-22*2, 0)];
+        label.font = [UIFont systemFontOfSize:11.f];
+        label.textColor = UIColorHex(0x5C6066);
+        label.tag = 59+i;
+        label.hidden = YES;
+        [self.itop_view addSubview:label];
+    }
+    // 初始化按钮
+    CGFloat yOffset = 0; // 初始偏移量
+    CGFloat cellHeight = 1.f; // 每个 Cell 的高度(根据实际设计调整)
+    for (int i= 0; i<10; i++) {
+        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, yOffset, RQ_SCREEN_WIDTH-22*2, cellHeight)];
+        imageView.tag = 99+i;
+        imageView.hidden = YES;
+        // 添加到 tbList_view
+        [self.item_view addSubview:imageView];
+        // 调整偏移量
+        yOffset += cellHeight;
+    }
+}
+
+@end

+ 165 - 0
jiaPei/Modules/HomePageModule/View/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsCell01.xib

@@ -0,0 +1,165 @@
+<?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="NYFailSpecialExerciseDetailsCell01">
+            <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="AB3-kb-hhX">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="224"/>
+                        <subviews>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7DJ-ub-ofg" userLabel="View-ct">
+                                <rect key="frame" x="5" y="5" width="365" height="214"/>
+                                <subviews>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="blue_jb_bg" translatesAutoresizingMaskIntoConstraints="NO" id="eY5-ix-ttB">
+                                        <rect key="frame" x="0.0" y="0.0" width="365" height="214"/>
+                                        <userDefinedRuntimeAttributes>
+                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                <integer key="value" value="5"/>
+                                            </userDefinedRuntimeAttribute>
+                                            <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        </userDefinedRuntimeAttributes>
+                                    </imageView>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="80分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="x4n-ZG-8qa">
+                                        <rect key="frame" x="162.66666666666666" y="12" width="40" height="20"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="40" id="AKD-EV-emQ"/>
+                                            <constraint firstAttribute="height" constant="20" id="lzS-Qz-BlG"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="boldSystem" pointSize="16"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="white_title_right" translatesAutoresizingMaskIntoConstraints="NO" id="QYr-eO-ybw">
+                                        <rect key="frame" x="207.66666666666666" y="11" width="22" height="22"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="22" id="LZM-Iu-BVK"/>
+                                            <constraint firstAttribute="height" constant="22" id="cDw-yV-q10"/>
+                                        </constraints>
+                                    </imageView>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="white_title_left" translatesAutoresizingMaskIntoConstraints="NO" id="Jhg-6x-fqT">
+                                        <rect key="frame" x="135.66666666666666" y="11" width="22" height="22"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="22" id="Oof-Qi-TwE"/>
+                                            <constraint firstAttribute="height" constant="22" id="pc1-qO-GpZ"/>
+                                        </constraints>
+                                    </imageView>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NfW-LJ-PIE">
+                                        <rect key="frame" x="126" y="168" width="113" height="30"/>
+                                        <color key="backgroundColor" red="0.28627450980000002" green="0.5568627451" blue="0.96078431369999995" alpha="1" colorSpace="calibratedRGB"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="30" id="cGC-BZ-CpN"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
+                                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                        <state key="normal" title="去练题"/>
+                                        <userDefinedRuntimeAttributes>
+                                            <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                                <integer key="value" value="12"/>
+                                            </userDefinedRuntimeAttribute>
+                                        </userDefinedRuntimeAttributes>
+                                        <connections>
+                                            <action selector="submit_clickdo:" destination="gTV-IL-0wX" eventType="touchUpInside" id="MZf-mH-yf5"/>
+                                        </connections>
+                                    </button>
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="80p-MY-DnZ" userLabel="View-left-tag">
+                                        <rect key="frame" x="8" y="10" width="62" height="27"/>
+                                        <subviews>
+                                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="blue_left_tag" translatesAutoresizingMaskIntoConstraints="NO" id="iIG-sY-7iv">
+                                                <rect key="frame" x="0.0" y="0.0" width="62" height="27"/>
+                                            </imageView>
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="考点1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FCO-na-l87">
+                                                <rect key="frame" x="-4" y="0.0" width="66" height="27"/>
+                                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                                <color key="textColor" red="0.1803921568627451" green="0.41176470588235292" blue="0.8666666666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                                <nil key="highlightedColor"/>
+                                            </label>
+                                        </subviews>
+                                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <constraints>
+                                            <constraint firstAttribute="trailing" secondItem="iIG-sY-7iv" secondAttribute="trailing" id="2xS-5i-jQ7"/>
+                                            <constraint firstAttribute="trailing" secondItem="FCO-na-l87" secondAttribute="trailing" id="76e-SF-KLx"/>
+                                            <constraint firstItem="iIG-sY-7iv" firstAttribute="leading" secondItem="80p-MY-DnZ" secondAttribute="leading" id="7iN-DM-SBO"/>
+                                            <constraint firstItem="FCO-na-l87" firstAttribute="leading" secondItem="80p-MY-DnZ" secondAttribute="leading" constant="-4" id="8ns-xk-4Av"/>
+                                            <constraint firstAttribute="width" constant="62" id="A4d-up-tjD"/>
+                                            <constraint firstAttribute="height" constant="27" id="Bwa-Ao-pEp"/>
+                                            <constraint firstAttribute="bottom" secondItem="FCO-na-l87" secondAttribute="bottom" id="Q0t-x6-KtO"/>
+                                            <constraint firstItem="iIG-sY-7iv" firstAttribute="top" secondItem="80p-MY-DnZ" secondAttribute="top" id="WUP-Hr-2Xu"/>
+                                            <constraint firstAttribute="bottom" secondItem="iIG-sY-7iv" secondAttribute="bottom" id="Yeh-UY-5lG"/>
+                                            <constraint firstItem="FCO-na-l87" firstAttribute="top" secondItem="80p-MY-DnZ" secondAttribute="top" id="v4D-6c-UNZ"/>
+                                        </constraints>
+                                    </view>
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KDU-E8-yHY">
+                                        <rect key="frame" x="16" y="45" width="333" height="115"/>
+                                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    </view>
+                                </subviews>
+                                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstItem="Jhg-6x-fqT" firstAttribute="centerY" secondItem="x4n-ZG-8qa" secondAttribute="centerY" id="1Ks-Qy-yg5"/>
+                                    <constraint firstItem="x4n-ZG-8qa" firstAttribute="centerX" secondItem="7DJ-ub-ofg" secondAttribute="centerX" id="1WO-hs-SUv"/>
+                                    <constraint firstItem="x4n-ZG-8qa" firstAttribute="leading" secondItem="Jhg-6x-fqT" secondAttribute="trailing" constant="5" id="7q5-Jc-t5q"/>
+                                    <constraint firstAttribute="bottom" secondItem="eY5-ix-ttB" secondAttribute="bottom" id="AGs-ms-nR6"/>
+                                    <constraint firstItem="80p-MY-DnZ" firstAttribute="top" secondItem="7DJ-ub-ofg" secondAttribute="top" constant="10" id="F0y-3v-kQY"/>
+                                    <constraint firstAttribute="trailing" secondItem="KDU-E8-yHY" secondAttribute="trailing" constant="16" id="FeL-y9-1ll"/>
+                                    <constraint firstItem="eY5-ix-ttB" firstAttribute="leading" secondItem="7DJ-ub-ofg" secondAttribute="leading" id="Htu-RQ-UzV"/>
+                                    <constraint firstItem="NfW-LJ-PIE" firstAttribute="leading" secondItem="7DJ-ub-ofg" secondAttribute="leading" constant="126" id="KfN-SU-vzc"/>
+                                    <constraint firstItem="x4n-ZG-8qa" firstAttribute="top" secondItem="7DJ-ub-ofg" secondAttribute="top" constant="12" id="Mu9-Tg-EBo"/>
+                                    <constraint firstItem="QYr-eO-ybw" firstAttribute="centerY" secondItem="x4n-ZG-8qa" secondAttribute="centerY" id="XgG-nU-fwu"/>
+                                    <constraint firstItem="NfW-LJ-PIE" firstAttribute="top" secondItem="KDU-E8-yHY" secondAttribute="bottom" constant="8" id="acx-S7-tSh"/>
+                                    <constraint firstAttribute="trailing" secondItem="eY5-ix-ttB" secondAttribute="trailing" id="adj-fM-eYR"/>
+                                    <constraint firstItem="eY5-ix-ttB" firstAttribute="top" secondItem="7DJ-ub-ofg" secondAttribute="top" id="akz-8h-vkb"/>
+                                    <constraint firstItem="KDU-E8-yHY" firstAttribute="leading" secondItem="7DJ-ub-ofg" secondAttribute="leading" constant="16" id="ieR-vN-73Q"/>
+                                    <constraint firstItem="KDU-E8-yHY" firstAttribute="top" secondItem="80p-MY-DnZ" secondAttribute="bottom" constant="8" id="lOQ-5p-fmf"/>
+                                    <constraint firstItem="QYr-eO-ybw" firstAttribute="leading" secondItem="x4n-ZG-8qa" secondAttribute="trailing" constant="5" id="o4E-yR-4p5"/>
+                                    <constraint firstItem="80p-MY-DnZ" firstAttribute="leading" secondItem="7DJ-ub-ofg" secondAttribute="leading" constant="8" id="p2L-Fc-Mpl"/>
+                                    <constraint firstAttribute="trailing" secondItem="NfW-LJ-PIE" secondAttribute="trailing" constant="126" id="qlG-c5-2xW"/>
+                                    <constraint firstAttribute="bottom" secondItem="NfW-LJ-PIE" secondAttribute="bottom" constant="16" id="tI8-ow-49D"/>
+                                </constraints>
+                            </view>
+                        </subviews>
+                        <color key="backgroundColor" red="0.94901960780000005" green="0.97254901959999995" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                        <constraints>
+                            <constraint firstItem="7DJ-ub-ofg" firstAttribute="leading" secondItem="AB3-kb-hhX" secondAttribute="leading" constant="5" id="GGA-9c-sXO"/>
+                            <constraint firstAttribute="bottom" secondItem="7DJ-ub-ofg" secondAttribute="bottom" constant="5" id="NoG-bd-l3e"/>
+                            <constraint firstAttribute="trailing" secondItem="7DJ-ub-ofg" secondAttribute="trailing" constant="5" id="eMG-OU-GyK"/>
+                            <constraint firstItem="7DJ-ub-ofg" firstAttribute="top" secondItem="AB3-kb-hhX" secondAttribute="top" constant="5" id="eoh-cH-nHN"/>
+                        </constraints>
+                    </view>
+                </subviews>
+            </view>
+            <constraints>
+                <constraint firstItem="AB3-kb-hhX" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="0yq-Ax-3Wk"/>
+                <constraint firstAttribute="bottom" secondItem="AB3-kb-hhX" secondAttribute="bottom" id="2Nj-Pi-RAg"/>
+                <constraint firstAttribute="trailing" secondItem="AB3-kb-hhX" secondAttribute="trailing" id="hbJ-WW-BDN"/>
+                <constraint firstItem="AB3-kb-hhX" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="tNA-JR-dvr"/>
+            </constraints>
+            <connections>
+                <outlet property="item_view" destination="KDU-E8-yHY" id="oRX-8m-pCz"/>
+                <outlet property="scoreStr_label" destination="x4n-ZG-8qa" id="tIY-i6-bfv"/>
+                <outlet property="submit_btn" destination="NfW-LJ-PIE" id="YgS-Z1-otx"/>
+                <outlet property="vw_ct_view" destination="7DJ-ub-ofg" id="u0c-md-C1Z"/>
+                <outlet property="vw_left_label" destination="FCO-na-l87" id="Tvu-JU-3Vj"/>
+                <outlet property="vw_left_view" destination="80p-MY-DnZ" id="JvX-7n-3QW"/>
+            </connections>
+            <point key="canvasLocation" x="52.671755725190835" y="-12.67605633802817"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="blue_jb_bg" width="181.66667175292969" height="270.66665649414062"/>
+        <image name="blue_left_tag" width="62" height="27"/>
+        <image name="white_title_left" width="13" height="12"/>
+        <image name="white_title_right" width="13" height="12"/>
+    </resources>
+</document>

+ 89 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailGroupPointDataModel.h

@@ -0,0 +1,89 @@
+//
+//  NYFailGroupPointDataModel.h
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/13.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+
+@interface NYFailItemPointDataQuesTexts: RQBaseModel
+@property (nonatomic, copy) NSString *subTitle;
+@property (nonatomic, strong) NSArray<NSString *> *quesItem;
+@end
+
+@interface NYFailItemPointDataQuesImage: RQBaseModel
+@property (nonatomic, copy) NSString *image;
+@property (nonatomic, copy) NSString *subTitle;
+@end
+
+@interface NYFailItemPointDataCon: NSObject
+@property (nonatomic, copy) NSString *image;
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuesImage *> *questions;
+@property (nonatomic, copy) NSString *title;
+@end
+
+@interface NYFailItemPointDataQuestions: RQBaseModel
+@property (nonatomic, strong) NSArray<NSString *> *images;
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuesTexts *> *quesTexts;
+//拘留
+@property (nonatomic, copy) NSString *tag;
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuesTexts *> *tagCon;
+
+@end
+
+@interface NYFailItemPointDataModel : RQBaseModel
+@property (nonatomic, assign) NSInteger category;
+@property (nonatomic, copy) NSString *content;
+@property (nonatomic, copy) NSString *questionIds;
+@property (nonatomic, assign) NSInteger score;
+@property (nonatomic, copy) NSString *scoreDayUrl;
+@property (nonatomic, copy) NSString *scoreNightUrl;
+@property (nonatomic, copy) NSString *showType;
+@property (nonatomic, copy) NSString *titleDayUrl;
+@property (nonatomic, copy) NSString *titleNightUrl;
+@property (nonatomic, copy) NSString *title;
+@property (nonatomic, strong) NSArray *question_array;
+
+@property (nonatomic, assign) CGFloat imgsH;
+
+@property (nonatomic, assign) CGFloat iviewH;
+//驾驶证
+@property (nonatomic, copy) NSString *btnBgcColor;
+@property (nonatomic, strong) NYFailItemPointDataQuestions *questions;
+//罚款
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuesTexts *> *fquestions;
+//拘留
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuesImage *> *iquestions;
+@property (nonatomic, strong) NSArray<NYFailItemPointDataQuestions *> *tagquestions;
+//手势
+@property (nonatomic, strong) NSArray<NYFailItemPointDataCon *> *con;
+@property (nonatomic, copy) NSString *mainTit;
+
+@end
+
+@interface NYFailItemVideoDateModel : RQBaseModel
+@property (nonatomic, copy) NSString *endButtonText;
+@property (nonatomic, copy) NSString *poster;
+@property (nonatomic, copy) NSString *publicityMediumUrl;
+@property (nonatomic, copy) NSString *vipPublicityMediumUrl;
+
+@end
+
+@interface NYFailGroupPointDataModel : RQBaseModel
+
+@property (nonatomic, assign) NSInteger category;
+@property (nonatomic, copy) NSString *pageType;
+@property (nonatomic, strong) NSArray<NYFailItemPointDataModel *> *pointData;
+@property (nonatomic, copy) NSString *rightsType;
+@property (nonatomic, copy) NSString *source;
+@property (nonatomic, strong) NYFailItemVideoDateModel *videoDate;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 78 - 0
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailGroupPointDataModel.m

@@ -0,0 +1,78 @@
+//
+//  NYFailGroupPointDataModel.m
+//  jiaPei
+//
+//  Created by Ning.ge on 2024/12/13.
+//  Copyright © 2024 JCZ. All rights reserved.
+//
+
+#import "NYFailGroupPointDataModel.h"
+
+@implementation NYFailItemPointDataCon
+// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
++ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass {
+    return @{
+                @"questions"     :         [NYFailItemPointDataQuesImage class],
+            };
+}
+
+@end
+
+@implementation NYFailItemPointDataQuesImage
+
+@end
+
+@implementation NYFailItemPointDataQuesTexts
+
+@end
+
+@implementation NYFailItemPointDataQuestions
+
+// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
++ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass {
+    return @{
+                @"quesTexts"     :         [NYFailItemPointDataQuesTexts class],
+                @"tagCon"     :         [NYFailItemPointDataQuesTexts class],
+            };
+}
+@end
+
+@implementation NYFailItemPointDataModel
+// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
++ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass {
+    return @{
+                @"questions"     :         [NYFailItemPointDataQuestions class],
+                @"fquestions"     :         [NYFailItemPointDataQuesTexts class],
+                @"iquestions"     :         [NYFailItemPointDataQuesImage class],
+                @"tagquestions"     :         [NYFailItemPointDataQuestions class],
+                @"con"     :         [NYFailItemPointDataCon class],
+            };
+}
+
+- (NSArray *)question_array {
+    if(!_question_array){
+        _question_array = @[];
+        if(self.content.length>0){
+            _question_array = [self.content componentsSeparatedByString:@";"];
+        }
+    }
+    return _question_array;
+}
+
+@end
+
+@implementation NYFailItemVideoDateModel
+
+@end
+
+@implementation NYFailGroupPointDataModel
+
+// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
++ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass {
+    return @{
+                @"pointData"     :         [NYFailItemPointDataModel class],
+                @"videoDate"          :         [NYFailItemVideoDateModel class],
+            };
+}
+
+@end

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

@@ -12,6 +12,12 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface NYFailSpecialExerciseDetailItemModel : RQCommonCollectionItemViewModel
 
+@property (nonatomic, strong) NYFailItemPointDataModel *dataModel;
+
+@property (nonatomic, copy) NSString *itemPointTitle;
+
+- (instancetype)initWithTitle:(NSString *)title dataModel:(NYFailItemPointDataModel *)dataModel;
+
 @end
 
 NS_ASSUME_NONNULL_END

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

@@ -8,6 +8,62 @@
 
 #import "NYFailSpecialExerciseDetailItemModel.h"
 
+
+@interface NYFailSpecialExerciseDetailItemModel()
+
+
+@end
+
 @implementation NYFailSpecialExerciseDetailItemModel
 
+- (instancetype)init {
+    if (self = [super init]) {
+        self.itemSize = CGSizeMake(RQ_SCREEN_WIDTH, RQ_FIT_HORIZONTAL(160));
+    }
+    return self;
+}
+
+- (NSString *)itemClassName {
+    if([self.title isEqualToString:@"koufen"]){
+        return @"NYFailSpecialExerciseDetailsCell";
+    }
+    return @"NYFailSpecialExerciseDetailsCell01";
+}
+
+
+- (nonnull instancetype)initWithTitle:(nonnull NSString *)title dataModel:(NYFailItemPointDataModel *)dataModel {
+    if (self = [self init]) {
+        @weakify(self)
+        self.title = title;
+        self.dataModel = dataModel;
+        if(dataModel.showType.intValue == 1){
+            CGFloat yOffset = 0; // 初始偏移量
+            CGFloat cellHeight = 35.f;
+            for (int i= 0; i<dataModel.question_array.count; i++) {
+                NSString *title_str = [NSString stringWithFormat:@"%zd.%@",i+1,dataModel.question_array[i]];
+                CGSize str_size = [title_str rq_sizeWithFont:[UIFont boldSystemFontOfSize:15.f] limitWidth:RQ_SCREEN_WIDTH-22*2-16];
+                if(str_size.height>cellHeight){
+                    cellHeight = str_size.height + 12.f;
+                }
+                // 调整偏移量
+                yOffset += cellHeight;
+            }
+            self.itemSize = CGSizeMake(RQ_SCREEN_WIDTH, RQ_FIT_HORIZONTAL(130)+yOffset);
+        }else{
+            CGFloat itemH = 0.f;
+            if(dataModel.imgsH > 0){
+                itemH +=dataModel.imgsH;
+            }
+            if(dataModel.iviewH > 0){
+                itemH +=dataModel.iviewH;
+            }
+            self.itemSize = CGSizeMake(RQ_SCREEN_WIDTH, RQ_FIT_HORIZONTAL(130)+itemH);
+        }
+        self.operation = ^{
+            
+        };
+    }
+    return self;
+}
+
 @end

+ 171 - 16
jiaPei/Modules/HomePageModule/ViewModel/HomeSubPage/易错专项/NYFailSpecialExerciseDetailsViewModel.m

@@ -16,6 +16,8 @@
 
 @property (nonatomic, readwrite, strong) NSDictionary *titleDict;
 
+@property (nonatomic, readwrite, strong) NSMutableDictionary *datakeyDicts;
+
 @end
 
 @implementation NYFailSpecialExerciseDetailsViewModel
@@ -31,7 +33,10 @@
 - (void)initialize {
     [super initialize];
     [self loadPointData];
-    [self rq_configureData];
+    [self loadKeyDicts];
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [self rq_configureData];
+    });
 }
 
 #pragma mark - ConfigureData
@@ -42,24 +47,173 @@
                             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];
+        NSString *keyStr = self.titleDict[self.title];
+        NYFailGroupPointDataModel *model = self.datakeyDicts[keyStr];
+        //[NYFailGroupPointDataModel modelWithDictionary:self.dataDicts[keyStr]];
+        NSMutableArray *mt_array = @[].mutableCopy;//解析json 数据daocell
+        if(model){
+            int indx = 1;
+            for (NYFailItemPointDataModel *item in model.pointData) {
+                NYFailSpecialExerciseDetailItemModel *itemModel = [[NYFailSpecialExerciseDetailItemModel alloc] initWithTitle:keyStr dataModel:item];
+                itemModel.itemPointTitle = [NSString stringWithFormat:@"考点%d",indx];
+                [mt_array addObject:itemModel];
+                indx++;
+            }
+        }
+        group0.itemViewModels = mt_array;
+        return @[group0];
 
     }];
 }
 
+
+- (void)loadKeyDicts {
+//    @weakify(self)
+    if(self.datakeyDicts.count>0)return;
+    self.datakeyDicts = [NSMutableDictionary dictionary];
+    for (NSString *key in  self.titleDict.allKeys) {
+        NSString *key_value = self.titleDict[key];
+        NYFailGroupPointDataModel *model = [NYFailGroupPointDataModel modelWithDictionary:self.dataDicts[key_value]];
+        for (NYFailItemPointDataModel *item in model.pointData) {
+            if(item.showType.intValue == 1) continue;
+            if(item.con.count>0){//手势
+                __block CGFloat yOffset = 0; // 初始偏移量
+                __block CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+                CGFloat imgW = (RQ_SCREEN_WIDTH-22*2);
+                for (int i= 0; i<item.con.count; i++) {
+                    NYFailItemPointDataCon *con = item.con[i];
+                    NSString *img_url = con.image;
+                    if(img_url.length>0){
+                        __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+                        dispatch_async(dispatch_get_global_queue(0, 0), ^{
+                            // 处理耗时操作的代码块...
+                            imageSize = [UIImage getImageSizeWithURL:img_url];
+                            //通知主线程刷新
+                            dispatch_async(dispatch_get_main_queue(), ^{
+                                //回调或者说是通知主线程刷新,
+                                if (imageSize.width == 0 || imageSize.height == 0) {
+                                    cellHeight = imgW * (175.f / 345.f);
+                                } else {
+                                    cellHeight = imgW * (imageSize.height / imageSize.width);
+                                }
+                                yOffset += cellHeight+4.f;
+                                item.imgsH = yOffset;
+                            });
+                        });
+                    }
+                }
+                item.imgsH = yOffset;
+            }
+            if(item.tagquestions.count>0){//拘留
+                CGFloat cellH = 0.f;
+                for (int i= 0; i<item.tagquestions.count; i++) {
+                    NYFailItemPointDataQuestions *itemData = item.tagquestions[i];
+                    NSLog(@"tag=========%@",itemData.tag);
+                    for (int z= 0; z<itemData.tagCon.count; z++) {
+                        NYFailItemPointDataQuesTexts *texts = itemData.tagCon[z];
+                        NSString *title_str = texts.subTitle;
+                        CGSize str_size = [title_str rq_sizeWithFont:[UIFont boldSystemFontOfSize:15.f] limitWidth:(RQ_SCREEN_WIDTH-22*2)];
+                        if(str_size.height>cellH){
+                            cellH += str_size.height + 12.f;
+                        }else{
+                            cellH +=35.f;
+                        }
+                        if(texts.quesItem.count>0){
+                            cellH += 22.f*texts.quesItem.count;
+                        }
+                    }
+                }
+                item.iviewH = cellH + 45.f+45.f*item.tagquestions.count;
+            }
+            if(item.iquestions.count>0){//拘留
+                __block CGFloat yOffset = 0; // 初始偏移量
+                __block CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+                CGFloat imgW = (RQ_SCREEN_WIDTH-22*2);
+                for (int i= 0; i<item.iquestions.count; i++) {
+                    NYFailItemPointDataQuesImage *img = item.iquestions[i];
+                    NSString *img_url = img.image;
+                    __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+                    dispatch_async(dispatch_get_global_queue(0, 0), ^{
+                        // 处理耗时操作的代码块...
+                        imageSize = [UIImage getImageSizeWithURL:img_url];
+                        //通知主线程刷新
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            //回调或者说是通知主线程刷新,
+                            if (imageSize.width == 0 || imageSize.height == 0) {
+                                cellHeight = imgW * (175.f / 345.f);
+                            } else {
+                                cellHeight = imgW * (imageSize.height / imageSize.width);
+                            }
+                            yOffset += cellHeight+4.f;
+                            item.imgsH = yOffset;
+                        });
+                    });
+                }
+            }
+            if(item.fquestions.count>0){//罚款
+                CGFloat cellH = 0.f;
+                for (int i= 0; i<item.fquestions.count; i++) {
+                    NYFailItemPointDataQuesTexts *texts = item.fquestions[i];
+                    NSString *title_str = texts.subTitle;
+                    CGSize str_size = [title_str rq_sizeWithFont:[UIFont boldSystemFontOfSize:15.f] limitWidth:(RQ_SCREEN_WIDTH-22*2)];
+                    if(str_size.height>cellH){
+                        cellH += str_size.height + 12.f;
+                    }else{
+                        cellH +=35.f;
+                    }
+                    if(texts.quesItem.count>0){
+                        cellH += 22.f*texts.quesItem.count;
+                    }
+                }
+                item.iviewH = cellH + 20.f;
+            }
+            if(item.questions.quesTexts.count>0){
+                CGFloat cellH = 0.f;
+                for (int i= 0; i<item.questions.quesTexts.count; i++) {
+                    NYFailItemPointDataQuesTexts *texts = item.questions.quesTexts[i];
+                    NSString *title_str = texts.subTitle;
+                    CGSize str_size = [title_str rq_sizeWithFont:[UIFont boldSystemFontOfSize:15.f] limitWidth:(RQ_SCREEN_WIDTH-22*2)];
+                    if(str_size.height>cellH){
+                        cellH += str_size.height + 12.f;
+                    }else{
+                        cellH +=35.f;
+                    }
+                    if(texts.quesItem.count>0){
+                        cellH += 22.f*texts.quesItem.count;
+                    }
+                }
+                item.iviewH = cellH + 20.f;
+            }
+            if(item.questions.images.count > 0){
+                __block CGFloat yOffset = 0; // 初始偏移量
+                __block CGFloat cellHeight = 35.f; // 每个 Cell 的高度(根据实际设计调整)
+                CGFloat imgW = (RQ_SCREEN_WIDTH-22*2);
+                for (int i= 0; i<item.questions.images.count; i++) {
+                    NSString *img_url = item.questions.images[i];
+                    __block CGSize imageSize = CGSizeMake(imgW,cellHeight);
+                    dispatch_async(dispatch_get_global_queue(0, 0), ^{
+                        // 处理耗时操作的代码块...
+                        imageSize = [UIImage getImageSizeWithURL:img_url];
+                        //通知主线程刷新
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            //回调或者说是通知主线程刷新,
+                            if (imageSize.width == 0 || imageSize.height == 0) {
+                                cellHeight = imgW * (175.f / 345.f);
+                            } else {
+                                cellHeight = imgW * (imageSize.height / imageSize.width);
+                            }
+                            yOffset += cellHeight;
+                            item.imgsH = yOffset;
+                        });
+                    });
+                }
+            }
+        }
+        self.datakeyDicts[key_value] = model;
+    }
+}
+
+
 // 加载 JSON 文件并解析
 - (void)loadPointData {
     // 获取资源文件路径
@@ -67,7 +221,6 @@
     if (filePath) {
         // 读取文件数据
         NSData *data = [NSData dataWithContentsOfFile:filePath];
-        
         if (data) {
             NSError *error = nil;
             // 使用 JSONSerialization 解析 JSON 数据
@@ -100,4 +253,6 @@
     return _titleDict;
 }
 
+
+
 @end

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

@@ -27,7 +27,7 @@
 - (void)initialize {
     [super initialize];
     /// 配置标题
-    self.title = @"题错专项";
+    self.title = @"易错考点总结";
     [self rq_configureData];
 }
 

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

@@ -91,6 +91,8 @@ typedef NS_ENUM(NSUInteger, RQExerciseType) {
     RQExerciseType_Locality,
     /// 分段练习
     RQExerciseType_Block_List,
+    /// 易错专项
+    RQExerciseType_Error_Special_List,
 };
 
 

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

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

+ 15 - 0
jiaPei/Modules/OtherModules/YDTQuestionModule/Modules/RQYDTXCQuestionModule.m

@@ -91,6 +91,21 @@ static id rq_ydtXcQuestionModule = nil;
     return version;
 }
 
+- (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType questionIds:(NSString*)questionIds {
+    NSMutableArray *arr = @[].mutableCopy;
+    if (exerciseType == RQExerciseType_Error_Special_List) {
+        ///  车型
+        NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
+        ///  科目
+        NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]];
+        NSString *inSql = questionIds;
+        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 code:(NSInteger)code {
     NSMutableArray *arr = @[].mutableCopy;
     if (exerciseType == RQExerciseType_Block_List) {

+ 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 questionIds:(NSString*)questionIds;
 - (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType code:(NSInteger)code;
 - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType;
 - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType isNeedMediaData:(BOOL)isNeedMediaData;

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

@@ -367,6 +367,16 @@ static id rq_ydtQuestionModule = nil;
     }
 }
 
+- (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType questionIds:(NSString*)questionIds {
+    switch (self.carType) {
+        case RQHomePageCarType_Car:
+            return [RQ_YDT_XC_Question_Module getQuestionWithSubject:self.subject exerciseType:exerciseType questionIds:questionIds];
+        default:
+            return [RQ_YDT_XC_Question_Module getQuestionWithSubject:self.subject exerciseType:exerciseType];
+    }
+    return @[];
+}
+
 - (NSArray *)getQuestionWithExerciseType:(RQExerciseType)exerciseType code:(NSInteger)code {
     switch (self.carType) {
         case RQHomePageCarType_Car: