瀏覽代碼

TT_BaseTableV 页面秀修复

wangmeng 1 年之前
父節點
當前提交
144e6851a5
共有 27 個文件被更改,包括 1055 次插入77 次删除
  1. 70 2
      Asteria.xcodeproj/project.pbxproj
  2. 6 4
      Asteria/Base/RYNetWork/RYBaseVM.h
  3. 7 7
      Asteria/Base/RYNetWork/RYBaseVM.m
  4. 25 0
      Asteria/Category/NSMutableAttributedString+RYText.h
  5. 88 0
      Asteria/Category/NSMutableAttributedString+RYText.m
  6. 6 1
      Asteria/Fuction/Goods/M/GoodsInformationM.h
  7. 5 0
      Asteria/Fuction/Goods/M/GoodsInformationM.m
  8. 32 0
      Asteria/Fuction/Goods/M/GoodsReviewsListM.h
  9. 12 0
      Asteria/Fuction/Goods/M/GoodsReviewsListM.m
  10. 1 0
      Asteria/Fuction/Goods/VC/AS_GoodsReviewsListC.h
  11. 231 0
      Asteria/Fuction/Goods/Revies/AS_GoodsReviewsListC.m
  12. 17 0
      Asteria/Fuction/Goods/Revies/V/GoodsReviewsListTableV.h
  13. 35 0
      Asteria/Fuction/Goods/Revies/V/GoodsReviewsListTableV.m
  14. 16 0
      Asteria/Fuction/Goods/Revies/V/ReviewsTableHearV.h
  15. 87 0
      Asteria/Fuction/Goods/Revies/V/ReviewsTableHearV.m
  16. 21 0
      Asteria/Fuction/Goods/Revies/cell/GoodsReviewsCell.h
  17. 229 0
      Asteria/Fuction/Goods/Revies/cell/GoodsReviewsCell.m
  18. 23 0
      Asteria/Fuction/Goods/Revies/cell/GoodsReviewsImgV.h
  19. 67 0
      Asteria/Fuction/Goods/Revies/cell/GoodsReviewsImgV.m
  20. 5 2
      Asteria/Fuction/Goods/V/Banner/WKM_goodsBanner.m
  21. 6 0
      Asteria/Fuction/Goods/V/GoodsDetailSrcView.h
  22. 31 8
      Asteria/Fuction/Goods/V/GoodsDetailSrcView.m
  23. 26 8
      Asteria/Fuction/Goods/VC/AS_GoodsDetailsC.m
  24. 0 42
      Asteria/Fuction/Goods/VC/AS_GoodsReviewsListC.m
  25. 2 1
      Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.h
  26. 5 1
      Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.m
  27. 2 1
      Asteria/PreFixHeader.h

+ 70 - 2
Asteria.xcodeproj/project.pbxproj

@@ -182,10 +182,14 @@
 		9A2027F52A137B8600FF4DAF /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A2027F42A137B8600FF4DAF /* AuthenticationServices.framework */; };
 		9A2027F52A137B8600FF4DAF /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A2027F42A137B8600FF4DAF /* AuthenticationServices.framework */; };
 		9A31EDFD2B468A55009F11EE /* RadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A31EDFC2B468A54009F11EE /* RadioButton.m */; };
 		9A31EDFD2B468A55009F11EE /* RadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A31EDFC2B468A54009F11EE /* RadioButton.m */; };
 		9A31EE002B469A73009F11EE /* AS_GoodsReviewsListC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */; };
 		9A31EE002B469A73009F11EE /* AS_GoodsReviewsListC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */; };
+		9A32A2212B4BEA5C005A5831 /* GoodsReviewsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A32A2202B4BEA5C005A5831 /* GoodsReviewsCell.m */; };
+		9A32A2242B4BEAA8005A5831 /* GoodsReviewsImgV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A32A2222B4BEAA7005A5831 /* GoodsReviewsImgV.m */; };
 		9A337E3A2A04EE1A00D058A5 /* Target_B.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E362A04EE1A00D058A5 /* Target_B.m */; };
 		9A337E3A2A04EE1A00D058A5 /* Target_B.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E362A04EE1A00D058A5 /* Target_B.m */; };
 		9A337E3B2A04EE1A00D058A5 /* BViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E392A04EE1A00D058A5 /* BViewController.m */; };
 		9A337E3B2A04EE1A00D058A5 /* BViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E392A04EE1A00D058A5 /* BViewController.m */; };
 		9A337E4E2A04F46600D058A5 /* AViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E4D2A04F46600D058A5 /* AViewController.m */; };
 		9A337E4E2A04F46600D058A5 /* AViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E4D2A04F46600D058A5 /* AViewController.m */; };
 		9A35203A2B479BAA00D097CB /* YJLAttributesLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3520392B479BAA00D097CB /* YJLAttributesLabel.m */; };
 		9A35203A2B479BAA00D097CB /* YJLAttributesLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3520392B479BAA00D097CB /* YJLAttributesLabel.m */; };
+		9A35203E2B47FF2300D097CB /* GoodsReviewsListTableV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A35203D2B47FF2300D097CB /* GoodsReviewsListTableV.m */; };
+		9A3520412B48000F00D097CB /* GoodsReviewsListM.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3520402B48000F00D097CB /* GoodsReviewsListM.m */; };
 		9A3F5CAB2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */; };
 		9A3F5CAB2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */; };
 		9A3F5CAF2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAE2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m */; };
 		9A3F5CAF2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAE2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m */; };
 		9A3F5CB22B3BF63A00DDB6A7 /* Goods.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A3F5CB12B3BF63A00DDB6A7 /* Goods.xcassets */; };
 		9A3F5CB22B3BF63A00DDB6A7 /* Goods.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A3F5CB12B3BF63A00DDB6A7 /* Goods.xcassets */; };
@@ -246,6 +250,8 @@
 		9AD346202A08E30E005CA070 /* SelectVCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD3461F2A08E30E005CA070 /* SelectVCollectionViewCell.m */; };
 		9AD346202A08E30E005CA070 /* SelectVCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD3461F2A08E30E005CA070 /* SelectVCollectionViewCell.m */; };
 		9AD364C62A05E73E00452C7A /* AS_GoodsDetailsC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */; };
 		9AD364C62A05E73E00452C7A /* AS_GoodsDetailsC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */; };
 		9AD364D12A05EC7800452C7A /* AS_TabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD364D02A05EC7800452C7A /* AS_TabBarViewController.m */; };
 		9AD364D12A05EC7800452C7A /* AS_TabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD364D02A05EC7800452C7A /* AS_TabBarViewController.m */; };
+		9AD4D3972B48E8780086D6FB /* ReviewsTableHearV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD4D3962B48E8780086D6FB /* ReviewsTableHearV.m */; };
+		9AD4D39E2B48F5680086D6FB /* NSMutableAttributedString+RYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD4D39D2B48F5680086D6FB /* NSMutableAttributedString+RYText.m */; };
 		9AD6A53E2A120CC3001DE3D9 /* Login.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AD6A53D2A120CC3001DE3D9 /* Login.xcassets */; };
 		9AD6A53E2A120CC3001DE3D9 /* Login.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AD6A53D2A120CC3001DE3D9 /* Login.xcassets */; };
 		9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5422A1218E7001DE3D9 /* PassWordSecureBtnV.m */; };
 		9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5422A1218E7001DE3D9 /* PassWordSecureBtnV.m */; };
 		9AD6A5452A1218E8001DE3D9 /* EamilTFmatchV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5432A1218E7001DE3D9 /* EamilTFmatchV.m */; };
 		9AD6A5452A1218E8001DE3D9 /* EamilTFmatchV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5432A1218E7001DE3D9 /* EamilTFmatchV.m */; };
@@ -617,6 +623,10 @@
 		9A31EDFC2B468A54009F11EE /* RadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadioButton.m; sourceTree = "<group>"; };
 		9A31EDFC2B468A54009F11EE /* RadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadioButton.m; sourceTree = "<group>"; };
 		9A31EDFE2B469A73009F11EE /* AS_GoodsReviewsListC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_GoodsReviewsListC.h; sourceTree = "<group>"; };
 		9A31EDFE2B469A73009F11EE /* AS_GoodsReviewsListC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_GoodsReviewsListC.h; sourceTree = "<group>"; };
 		9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_GoodsReviewsListC.m; sourceTree = "<group>"; };
 		9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_GoodsReviewsListC.m; sourceTree = "<group>"; };
+		9A32A21F2B4BEA5B005A5831 /* GoodsReviewsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GoodsReviewsCell.h; sourceTree = "<group>"; };
+		9A32A2202B4BEA5C005A5831 /* GoodsReviewsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoodsReviewsCell.m; sourceTree = "<group>"; };
+		9A32A2222B4BEAA7005A5831 /* GoodsReviewsImgV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoodsReviewsImgV.m; sourceTree = "<group>"; };
+		9A32A2232B4BEAA7005A5831 /* GoodsReviewsImgV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GoodsReviewsImgV.h; sourceTree = "<group>"; };
 		9A337E362A04EE1A00D058A5 /* Target_B.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Target_B.m; sourceTree = "<group>"; };
 		9A337E362A04EE1A00D058A5 /* Target_B.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Target_B.m; sourceTree = "<group>"; };
 		9A337E372A04EE1A00D058A5 /* Target_B.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Target_B.h; sourceTree = "<group>"; };
 		9A337E372A04EE1A00D058A5 /* Target_B.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Target_B.h; sourceTree = "<group>"; };
 		9A337E382A04EE1A00D058A5 /* BViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BViewController.h; sourceTree = "<group>"; };
 		9A337E382A04EE1A00D058A5 /* BViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BViewController.h; sourceTree = "<group>"; };
@@ -625,6 +635,10 @@
 		9A337E4D2A04F46600D058A5 /* AViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AViewController.m; sourceTree = "<group>"; };
 		9A337E4D2A04F46600D058A5 /* AViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AViewController.m; sourceTree = "<group>"; };
 		9A3520382B479BAA00D097CB /* YJLAttributesLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YJLAttributesLabel.h; sourceTree = "<group>"; };
 		9A3520382B479BAA00D097CB /* YJLAttributesLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YJLAttributesLabel.h; sourceTree = "<group>"; };
 		9A3520392B479BAA00D097CB /* YJLAttributesLabel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YJLAttributesLabel.m; sourceTree = "<group>"; };
 		9A3520392B479BAA00D097CB /* YJLAttributesLabel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YJLAttributesLabel.m; sourceTree = "<group>"; };
+		9A35203C2B47FF2300D097CB /* GoodsReviewsListTableV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsReviewsListTableV.h; sourceTree = "<group>"; };
+		9A35203D2B47FF2300D097CB /* GoodsReviewsListTableV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsReviewsListTableV.m; sourceTree = "<group>"; };
+		9A35203F2B48000F00D097CB /* GoodsReviewsListM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsReviewsListM.h; sourceTree = "<group>"; };
+		9A3520402B48000F00D097CB /* GoodsReviewsListM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsReviewsListM.m; sourceTree = "<group>"; };
 		9A3F5CA92B3BBEAB00DDB6A7 /* GoodsDetailsPayV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsDetailsPayV.h; sourceTree = "<group>"; };
 		9A3F5CA92B3BBEAB00DDB6A7 /* GoodsDetailsPayV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsDetailsPayV.h; sourceTree = "<group>"; };
 		9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsDetailsPayV.m; sourceTree = "<group>"; };
 		9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsDetailsPayV.m; sourceTree = "<group>"; };
 		9A3F5CAD2B3BC11000DDB6A7 /* AlertMyCartDeleteV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlertMyCartDeleteV.h; sourceTree = "<group>"; };
 		9A3F5CAD2B3BC11000DDB6A7 /* AlertMyCartDeleteV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlertMyCartDeleteV.h; sourceTree = "<group>"; };
@@ -744,6 +758,10 @@
 		9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_GoodsDetailsC.m; sourceTree = "<group>"; };
 		9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_GoodsDetailsC.m; sourceTree = "<group>"; };
 		9AD364CF2A05EC7800452C7A /* AS_TabBarViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_TabBarViewController.h; sourceTree = "<group>"; };
 		9AD364CF2A05EC7800452C7A /* AS_TabBarViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_TabBarViewController.h; sourceTree = "<group>"; };
 		9AD364D02A05EC7800452C7A /* AS_TabBarViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_TabBarViewController.m; sourceTree = "<group>"; };
 		9AD364D02A05EC7800452C7A /* AS_TabBarViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_TabBarViewController.m; sourceTree = "<group>"; };
+		9AD4D3952B48E8780086D6FB /* ReviewsTableHearV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReviewsTableHearV.h; sourceTree = "<group>"; };
+		9AD4D3962B48E8780086D6FB /* ReviewsTableHearV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ReviewsTableHearV.m; sourceTree = "<group>"; };
+		9AD4D39C2B48F5680086D6FB /* NSMutableAttributedString+RYText.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+RYText.h"; sourceTree = "<group>"; };
+		9AD4D39D2B48F5680086D6FB /* NSMutableAttributedString+RYText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+RYText.m"; sourceTree = "<group>"; };
 		9AD6A53D2A120CC3001DE3D9 /* Login.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Login.xcassets; sourceTree = "<group>"; };
 		9AD6A53D2A120CC3001DE3D9 /* Login.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Login.xcassets; sourceTree = "<group>"; };
 		9AD6A5402A1218E6001DE3D9 /* PassWordSecureBtnV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PassWordSecureBtnV.h; sourceTree = "<group>"; };
 		9AD6A5402A1218E6001DE3D9 /* PassWordSecureBtnV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PassWordSecureBtnV.h; sourceTree = "<group>"; };
 		9AD6A5412A1218E7001DE3D9 /* EamilTFmatchV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EamilTFmatchV.h; sourceTree = "<group>"; };
 		9AD6A5412A1218E7001DE3D9 /* EamilTFmatchV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EamilTFmatchV.h; sourceTree = "<group>"; };
@@ -1214,6 +1232,7 @@
 		8172449C29F3B2ED005FA9C9 /* Asteria */ = {
 		8172449C29F3B2ED005FA9C9 /* Asteria */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				9AD4D3982B48EB7F0086D6FB /* Category */,
 				9A3F5CAC2B3BC10400DDB6A7 /* Base */,
 				9A3F5CAC2B3BC10400DDB6A7 /* Base */,
 				81601FE72A2DC76C00E4A8F1 /* Third */,
 				81601FE72A2DC76C00E4A8F1 /* Third */,
 				9A2646BA2A187B6100CBFBDC /* Product */,
 				9A2646BA2A187B6100CBFBDC /* Product */,
@@ -1599,6 +1618,28 @@
 			path = RadioButton;
 			path = RadioButton;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		9A32A2252B4BEB2D005A5831 /* Revies */ = {
+			isa = PBXGroup;
+			children = (
+				9A31EDFE2B469A73009F11EE /* AS_GoodsReviewsListC.h */,
+				9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */,
+				9A32A2262B4BEB5F005A5831 /* V */,
+				9A35203B2B47FEDE00D097CB /* cell */,
+			);
+			path = Revies;
+			sourceTree = "<group>";
+		};
+		9A32A2262B4BEB5F005A5831 /* V */ = {
+			isa = PBXGroup;
+			children = (
+				9A35203C2B47FF2300D097CB /* GoodsReviewsListTableV.h */,
+				9A35203D2B47FF2300D097CB /* GoodsReviewsListTableV.m */,
+				9AD4D3952B48E8780086D6FB /* ReviewsTableHearV.h */,
+				9AD4D3962B48E8780086D6FB /* ReviewsTableHearV.m */,
+			);
+			path = V;
+			sourceTree = "<group>";
+		};
 		9A337E342A04EE1A00D058A5 /* BViewController */ = {
 		9A337E342A04EE1A00D058A5 /* BViewController */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1630,6 +1671,7 @@
 		9A337E4F2A04FA0A00D058A5 /* Goods */ = {
 		9A337E4F2A04FA0A00D058A5 /* Goods */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				9A32A2252B4BEB2D005A5831 /* Revies */,
 				9A3F5CB02B3BF61B00DDB6A7 /* Assets */,
 				9A3F5CB02B3BF61B00DDB6A7 /* Assets */,
 				9A8DD8C22A0B8EDD00573324 /* Size */,
 				9A8DD8C22A0B8EDD00573324 /* Size */,
 				9A3735702A0B4606008BB3CE /* VM */,
 				9A3735702A0B4606008BB3CE /* VM */,
@@ -1650,6 +1692,17 @@
 			path = YJLAttributesLabel;
 			path = YJLAttributesLabel;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		9A35203B2B47FEDE00D097CB /* cell */ = {
+			isa = PBXGroup;
+			children = (
+				9A32A21F2B4BEA5B005A5831 /* GoodsReviewsCell.h */,
+				9A32A2202B4BEA5C005A5831 /* GoodsReviewsCell.m */,
+				9A32A2232B4BEAA7005A5831 /* GoodsReviewsImgV.h */,
+				9A32A2222B4BEAA7005A5831 /* GoodsReviewsImgV.m */,
+			);
+			path = cell;
+			sourceTree = "<group>";
+		};
 		9A3735702A0B4606008BB3CE /* VM */ = {
 		9A3735702A0B4606008BB3CE /* VM */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1914,8 +1967,6 @@
 			children = (
 			children = (
 				9AD364C42A05E73E00452C7A /* AS_GoodsDetailsC.h */,
 				9AD364C42A05E73E00452C7A /* AS_GoodsDetailsC.h */,
 				9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */,
 				9AD364C52A05E73E00452C7A /* AS_GoodsDetailsC.m */,
-				9A31EDFE2B469A73009F11EE /* AS_GoodsReviewsListC.h */,
-				9A31EDFF2B469A73009F11EE /* AS_GoodsReviewsListC.m */,
 			);
 			);
 			path = VC;
 			path = VC;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1941,6 +1992,8 @@
 			children = (
 			children = (
 				9AD3461B2A08D6EF005CA070 /* GoodsInformationM.h */,
 				9AD3461B2A08D6EF005CA070 /* GoodsInformationM.h */,
 				9AD3461C2A08D6EF005CA070 /* GoodsInformationM.m */,
 				9AD3461C2A08D6EF005CA070 /* GoodsInformationM.m */,
+				9A35203F2B48000F00D097CB /* GoodsReviewsListM.h */,
+				9A3520402B48000F00D097CB /* GoodsReviewsListM.m */,
 			);
 			);
 			path = M;
 			path = M;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1980,6 +2033,15 @@
 			path = Tabber;
 			path = Tabber;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		9AD4D3982B48EB7F0086D6FB /* Category */ = {
+			isa = PBXGroup;
+			children = (
+				9AD4D39C2B48F5680086D6FB /* NSMutableAttributedString+RYText.h */,
+				9AD4D39D2B48F5680086D6FB /* NSMutableAttributedString+RYText.m */,
+			);
+			path = Category;
+			sourceTree = "<group>";
+		};
 		9AD6A53A2A120C56001DE3D9 /* Assets */ = {
 		9AD6A53A2A120C56001DE3D9 /* Assets */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -2290,6 +2352,7 @@
 				81EC47722A3402CA00516573 /* ASHomeFlashDealCell.m in Sources */,
 				81EC47722A3402CA00516573 /* ASHomeFlashDealCell.m in Sources */,
 				81601FF82A2DC78300E4A8F1 /* WMZBannerView.m in Sources */,
 				81601FF82A2DC78300E4A8F1 /* WMZBannerView.m in Sources */,
 				811F42492A40536C00DA68F1 /* ASPointHeadView.m in Sources */,
 				811F42492A40536C00DA68F1 /* ASPointHeadView.m in Sources */,
+				9A32A2242B4BEAA8005A5831 /* GoodsReviewsImgV.m in Sources */,
 				817244B029F3B2EE005FA9C9 /* main.m in Sources */,
 				817244B029F3B2EE005FA9C9 /* main.m in Sources */,
 				8131A2872B36890200A191BE /* ASWindowManager.m in Sources */,
 				8131A2872B36890200A191BE /* ASWindowManager.m in Sources */,
 				81717D202A3C4AE000648139 /* KWSearchSubTypeCell.m in Sources */,
 				81717D202A3C4AE000648139 /* KWSearchSubTypeCell.m in Sources */,
@@ -2305,6 +2368,7 @@
 				816020182A2F070B00E4A8F1 /* ASHomeCategoryModel.m in Sources */,
 				816020182A2F070B00E4A8F1 /* ASHomeCategoryModel.m in Sources */,
 				81AA11D92B23FF1F008EB5C7 /* ASCategoriesViewModel.m in Sources */,
 				81AA11D92B23FF1F008EB5C7 /* ASCategoriesViewModel.m in Sources */,
 				8131A28C2B3692F300A191BE /* APHomeActiveViewController.m in Sources */,
 				8131A28C2B3692F300A191BE /* APHomeActiveViewController.m in Sources */,
+				9AD4D3972B48E8780086D6FB /* ReviewsTableHearV.m in Sources */,
 				8134C1B72A1359E6006EB0EC /* ASSignDayView.m in Sources */,
 				8134C1B72A1359E6006EB0EC /* ASSignDayView.m in Sources */,
 				81AA11D32B23EC20008EB5C7 /* ASVipCouponModel.m in Sources */,
 				81AA11D32B23EC20008EB5C7 /* ASVipCouponModel.m in Sources */,
 				81601FF72A2DC78300E4A8F1 /* WMZBannerParam.m in Sources */,
 				81601FF72A2DC78300E4A8F1 /* WMZBannerParam.m in Sources */,
@@ -2427,6 +2491,7 @@
 				9AD3460E2A08D60F005CA070 /* ZFNetworkSpeedMonitor.m in Sources */,
 				9AD3460E2A08D60F005CA070 /* ZFNetworkSpeedMonitor.m in Sources */,
 				81AA11DC2B23FF71008EB5C7 /* ASCurrencyManager.m in Sources */,
 				81AA11DC2B23FF71008EB5C7 /* ASCurrencyManager.m in Sources */,
 				9AD346052A08D60F005CA070 /* ZFLandscapeViewController.m in Sources */,
 				9AD346052A08D60F005CA070 /* ZFLandscapeViewController.m in Sources */,
+				9A32A2212B4BEA5C005A5831 /* GoodsReviewsCell.m in Sources */,
 				81717D222A3C4AE000648139 /* KWSearchMainTypeCell.m in Sources */,
 				81717D222A3C4AE000648139 /* KWSearchMainTypeCell.m in Sources */,
 				81DFA5672A46D60900DA708B /* ASPointDetailViewController.m in Sources */,
 				81DFA5672A46D60900DA708B /* ASPointDetailViewController.m in Sources */,
 				81601FF62A2DC78300E4A8F1 /* WMZBannerFlowLayout.m in Sources */,
 				81601FF62A2DC78300E4A8F1 /* WMZBannerFlowLayout.m in Sources */,
@@ -2457,6 +2522,8 @@
 				81354BFD2A28998B0082C93A /* KWMineMoreProductsCell.m in Sources */,
 				81354BFD2A28998B0082C93A /* KWMineMoreProductsCell.m in Sources */,
 				9ACBEC252A14707400A8F97A /* AS_SignUpC.m in Sources */,
 				9ACBEC252A14707400A8F97A /* AS_SignUpC.m in Sources */,
 				81717D1F2A3C4AE000648139 /* KWMoneyTypeHeadView.m in Sources */,
 				81717D1F2A3C4AE000648139 /* KWMoneyTypeHeadView.m in Sources */,
+				9A3520412B48000F00D097CB /* GoodsReviewsListM.m in Sources */,
+				9AD4D39E2B48F5680086D6FB /* NSMutableAttributedString+RYText.m in Sources */,
 				81EC47782A3426CE00516573 /* ASHomeLookingCollCell.m in Sources */,
 				81EC47782A3426CE00516573 /* ASHomeLookingCollCell.m in Sources */,
 				81DFA5782A47F28D00DA708B /* ASCouponListCell.m in Sources */,
 				81DFA5782A47F28D00DA708B /* ASCouponListCell.m in Sources */,
 				8160201C2A2F101C00E4A8F1 /* ASHomeTipCell.m in Sources */,
 				8160201C2A2F101C00E4A8F1 /* ASHomeTipCell.m in Sources */,
@@ -2468,6 +2535,7 @@
 				815DA3D92A39575100616EF7 /* ASProductListImageCell.m in Sources */,
 				815DA3D92A39575100616EF7 /* ASProductListImageCell.m in Sources */,
 				815DA3DC2A39625200616EF7 /* ASProductListTypeDesCell.m in Sources */,
 				815DA3DC2A39625200616EF7 /* ASProductListTypeDesCell.m in Sources */,
 				81932E2B29F7539B007C37AF /* UIColor+AS.m in Sources */,
 				81932E2B29F7539B007C37AF /* UIColor+AS.m in Sources */,
+				9A35203E2B47FF2300D097CB /* GoodsReviewsListTableV.m in Sources */,
 				9ACBEC282A1472AF00A8F97A /* LoginSignUpV.m in Sources */,
 				9ACBEC282A1472AF00A8F97A /* LoginSignUpV.m in Sources */,
 				9AD346152A08D60F005CA070 /* ZFPortraitControlView.m in Sources */,
 				9AD346152A08D60F005CA070 /* ZFPortraitControlView.m in Sources */,
 				8186564A2A5BE9790049D861 /* ASSearchViewController.m in Sources */,
 				8186564A2A5BE9790049D861 /* ASSearchViewController.m in Sources */,

+ 6 - 4
Asteria/Base/RYNetWork/RYBaseVM.h

@@ -10,9 +10,10 @@
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 @protocol RY_baseVMprotocol <NSObject>
 @protocol RY_baseVMprotocol <NSObject>
 ///获取网络请求的回调
 ///获取网络请求的回调
--(void)ry_respnsParseData:(id)data
-                    sucess:(BOOL)sucessOrFail
-                      mark:(NSString *)mark;
+-(void)ry_respnsData:(id)data
+            parseAry:(NSMutableArray *)arry
+              sucess:(BOOL)sucessOrFail
+                mark:(NSString *)mark;
 
 
 
 
 ///batch 多个 网络请求同步的代理
 ///batch 多个 网络请求同步的代理
@@ -39,7 +40,8 @@ NS_ASSUME_NONNULL_BEGIN
 -(void)ry_reponsFaildWithPath:(NSString *)mark code:(NSString *)code msg:(NSString *)msg;
 -(void)ry_reponsFaildWithPath:(NSString *)mark code:(NSString *)code msg:(NSString *)msg;
 
 
 - (void)ry_VMconfigDelegateData:(id)data
 - (void)ry_VMconfigDelegateData:(id)data
-                      success:(BOOL)success
+                       parseAry:(NSMutableArray *)ary
+                        success:(BOOL)success
                            mark:(NSString *)mark;
                            mark:(NSString *)mark;
 
 
 
 

+ 7 - 7
Asteria/Base/RYNetWork/RYBaseVM.m

@@ -42,22 +42,22 @@
 
 
 //重写的方法 解析之后再传给 VC
 //重写的方法 解析之后再传给 VC
 -(void)ry_respnsSucessWithPath:(NSString *)path data:(id)data{
 -(void)ry_respnsSucessWithPath:(NSString *)path data:(id)data{
-    [self ry_VMconfigDelegateData:data success:YES mark:path];
+    [self ry_VMconfigDelegateData:data parseAry:[NSMutableArray arrayWithArray:@[data]] success:YES mark:path];
 }
 }
 
 
 -(void)ry_reponsFaildWithPath:(NSString *)path code:(NSString *)code msg:(NSString *)msg{
 -(void)ry_reponsFaildWithPath:(NSString *)path code:(NSString *)code msg:(NSString *)msg{
-
-    [self ry_VMconfigDelegateData:msg success:NO mark:path];
+    [self ry_VMconfigDelegateData:msg parseAry:[NSMutableArray arrayWithArray:@[msg]] success:NO mark:path];
 }
 }
 
 
 
 
 #pragma mark - **************** VM调用绑定 Delgate ****************
 #pragma mark - **************** VM调用绑定 Delgate ****************
 
 
 - (void)ry_VMconfigDelegateData:(id)data
 - (void)ry_VMconfigDelegateData:(id)data
-                      success:(BOOL)success
-                         mark:(NSString *)mark{
-    if([self.delegate respondsToSelector:@selector(ry_respnsParseData:sucess:mark:)]){
-        [self.delegate ry_respnsParseData:data sucess:success mark:mark];
+                       parseAry:(NSMutableArray *)ary
+                        success:(BOOL)success
+                           mark:(NSString *)mark{
+    if([self.delegate respondsToSelector:@selector(ry_respnsData:parseAry:sucess:mark:)]){
+        [self.delegate ry_respnsData:data parseAry:ary sucess:success mark:mark];
     }
     }
     
     
  }
  }

+ 25 - 0
Asteria/Category/NSMutableAttributedString+RYText.h

@@ -0,0 +1,25 @@
+//
+//  NSMutableAttributedString+RYText.h
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/6.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreText/CoreText.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSMutableAttributedString (RYText)
+
+@property (nullable, nonatomic, strong, readwrite) UIFont *font;
+- (void)setFont:(nullable UIFont *)font range:(NSRange)range;
+
+@property (nullable, nonatomic, strong, readwrite) UIColor *color;
+- (void)setColor:(nullable UIColor *)color range:(NSRange)range;
+
+@property (nonatomic, readwrite) NSUnderlineStyle underlineStyle;
+- (void)setUnderlineStyle:(NSUnderlineStyle)underlineStyle range:(NSRange)range;
+@end
+
+NS_ASSUME_NONNULL_END

+ 88 - 0
Asteria/Category/NSMutableAttributedString+RYText.m

@@ -0,0 +1,88 @@
+//
+//  NSMutableAttributedString+RYText.m
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/6.
+//
+
+#import "NSMutableAttributedString+RYText.h"
+
+@implementation NSMutableAttributedString (RYText)
+- (void)setFont:(UIFont *)font {
+    [self setFont:font range:NSMakeRange(0, self.length)];
+}
+-(void)setColor:(UIColor *)color {
+   [self setColor:color range:NSMakeRange(0, self.length)];
+}
+
+- (void)setUnderlineStyle:(NSUnderlineStyle)underlineStyle {
+    [self setUnderlineStyle:underlineStyle range:NSMakeRange(0, self.length)];
+}
+
+
+- (void)setFont:(UIFont *)font range:(NSRange)range {
+    [self setAttribute:NSFontAttributeName value:font range:range];
+}
+- (void)setColor:(UIColor *)color range:(NSRange)range {
+    [self setAttribute:NSForegroundColorAttributeName value:color range:range];
+}
+- (void)setUnderlineStyle:(NSUnderlineStyle)underlineStyle range:(NSRange)range {
+    NSNumber *style = underlineStyle == 0 ? nil : @(underlineStyle);
+    [self setAttribute:NSUnderlineStyleAttributeName value:style range:range];
+}
+
+- (void)setAttribute:(NSString *)name value:(id)value range:(NSRange)range {
+    if (!name || [NSNull isEqual:name]) return;
+    if (value && ![NSNull isEqual:value]) {
+        [self addAttribute:name value:value range:range];
+    }else{
+        [self removeAttribute:name range:range];
+    }
+}
+#pragma mark - **************** get ****************
+
+- (UIFont *)font {
+    return [self fontAtIndex:0];
+}
+
+- (UIFont *)fontAtIndex:(NSUInteger)index {
+    UIFont *font = [self attribute:NSFontAttributeName atIndex:index];
+    return font;
+}
+
+- (UIColor *)color {
+    return [self colorAtIndex:0];
+}
+
+- (UIColor *)colorAtIndex:(NSUInteger)index {
+    UIColor *color = [self attribute:NSForegroundColorAttributeName atIndex:index];
+    if (!color) {
+        CGColorRef ref = (__bridge CGColorRef)([self attribute:(NSString *)kCTForegroundColorAttributeName atIndex:index]);
+        color = [UIColor colorWithCGColor:ref];
+    }
+    if (color && ![color isKindOfClass:[UIColor class]]) {
+        if (CFGetTypeID((__bridge CFTypeRef)(color)) == CGColorGetTypeID()) {
+            color = [UIColor colorWithCGColor:(__bridge CGColorRef)(color)];
+        } else {
+            color = nil;
+        }
+    }
+    return color;
+}
+- (NSUnderlineStyle)strikethroughStyle {
+    return [self strikethroughStyleAtIndex:0];
+}
+
+- (NSUnderlineStyle)strikethroughStyleAtIndex:(NSUInteger)index {
+    NSNumber *style = [self attribute:NSStrikethroughStyleAttributeName atIndex:index];
+    return style.integerValue;
+}
+
+- (id)attribute:(NSString *)attributeName atIndex:(NSUInteger)index {
+    if (!attributeName) return nil;
+    if (index > self.length || self.length == 0) return nil;
+    if (self.length > 0 && index == self.length) index--;
+    return [self attribute:attributeName atIndex:index effectiveRange:NULL];
+}
+
+@end

+ 6 - 1
Asteria/Fuction/Goods/M/GoodsInformationM.h

@@ -13,8 +13,9 @@ NS_ASSUME_NONNULL_BEGIN
 @class OptionsModel;
 @class OptionsModel;
 @class OptionsValuesM;
 @class OptionsValuesM;
 @interface GoodsInformationM : NSObject
 @interface GoodsInformationM : NSObject
+@property (nonatomic, copy) NSString *Id;
 @property (nonatomic, copy)NSString *name;
 @property (nonatomic, copy)NSString *name;
-@property (nonatomic, copy) NSString *price;
+@property (nonatomic, copy) NSString *price; 
 @property (nonatomic, copy) NSString *final_prices;
 @property (nonatomic, copy) NSString *final_prices;
 @property (nonatomic, copy) NSString *currency_symbol;
 @property (nonatomic, copy) NSString *currency_symbol;
 @property (nonatomic, copy) NSString *sold;
 @property (nonatomic, copy) NSString *sold;
@@ -26,6 +27,10 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, strong) NSArray <NSDictionary*>*custom_attributes;
 @property (nonatomic, strong) NSArray <NSDictionary*>*custom_attributes;
 @property (nonatomic, strong)         NSArray <OptionsModel *>*options;
 @property (nonatomic, strong)         NSArray <OptionsModel *>*options;
 
 
+//add
+@property (nonatomic, strong) NSString *gooodsImgUrl;
+@property (nonatomic, strong) NSAttributedString *priceAtr;
+
 
 
 @end
 @end
 
 

+ 5 - 0
Asteria/Fuction/Goods/M/GoodsInformationM.m

@@ -9,6 +9,11 @@
 
 
 @implementation GoodsInformationM
 @implementation GoodsInformationM
 
 
++ (NSDictionary *)mj_replacedKeyFromPropertyName {
+    return @{
+        @"Id": @"id",
+    };
+}
 
 
 
 
 
 

+ 32 - 0
Asteria/Fuction/Goods/M/GoodsReviewsListM.h

@@ -0,0 +1,32 @@
+//
+//  GoodsReviewsListM.h
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/5.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GoodsReviewsListM : NSObject
+@property (nonatomic, copy)   NSString *review_id;
+@property (nonatomic, copy)   NSString *created_at;
+@property (nonatomic, copy)   NSString *entity_id;
+@property (nonatomic, copy)   NSString *entity_pk_value;
+@property (nonatomic, copy)   NSString *status_id;
+@property (nonatomic, copy)   NSString *detail_id;
+@property (nonatomic, copy)   NSString *title;
+@property (nonatomic, copy)   NSString *detail;
+@property (nonatomic, copy)   NSString *nickname;
+@property (nonatomic, copy)   NSArray<NSString *> *image_video;
+@property (nonatomic, copy)   NSString *verified_purchase;
+@property (nonatomic, copy)   NSString *customer_id;
+@property (nonatomic, copy)   NSString *zan;
+@property (nonatomic, copy)   NSString *entity_code;
+@property (nonatomic, copy)   NSString *review_value;
+@property (nonatomic, copy)   NSString *review_percent;
+@property (nonatomic, strong) NSDictionary *rating_votes;
+@end
+
+NS_ASSUME_NONNULL_END

+ 12 - 0
Asteria/Fuction/Goods/M/GoodsReviewsListM.m

@@ -0,0 +1,12 @@
+//
+//  GoodsReviewsListM.m
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/5.
+//
+
+#import "GoodsReviewsListM.h"
+
+@implementation GoodsReviewsListM
+
+@end

+ 1 - 0
Asteria/Fuction/Goods/VC/AS_GoodsReviewsListC.h

@@ -13,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
 @interface AS_GoodsReviewsListC : UCMBaseC
 @interface AS_GoodsReviewsListC : UCMBaseC
 @property (nonatomic, strong) GoodsInformationM *goodsM;
 @property (nonatomic, strong) GoodsInformationM *goodsM;
 
 
+
 @end
 @end
 
 
 NS_ASSUME_NONNULL_END
 NS_ASSUME_NONNULL_END

+ 231 - 0
Asteria/Fuction/Goods/Revies/AS_GoodsReviewsListC.m

@@ -0,0 +1,231 @@
+//
+//  AS_GoodsReviewsListC.m
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/4.
+//
+
+#import "AS_GoodsReviewsListC.h"
+#import "ASGoodsDetailsVM.h"
+#import "RadioButton.h"
+#import "GoodsReviewsListTableV.h"
+
+@interface AS_GoodsReviewsListC ()<RY_baseVMprotocol>
+@property (nonatomic, strong) ASGoodsDetailsVM *VM;
+@property (nonatomic, strong) UIView *topBgV;
+@property (nonatomic, strong) UIImageView *topImgV;
+@property (nonatomic, strong) UILabel *goodsTitleLab;
+@property (nonatomic, strong) QMUILabel *priceLab;
+@property (nonatomic, strong) QMUILabel *soldLab;
+
+@property (nonatomic, strong) NSMutableArray *radioBtnAry;
+@property (nonatomic, strong) UIView *tableHeadV;
+
+@property (nonatomic, strong) QMUILabel *reviewsLab;
+
+
+@property (nonatomic, strong) GoodsReviewsListTableV *TableV;
+
+
+@end
+
+@implementation AS_GoodsReviewsListC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.title = [NSString stringWithFormat:@"Reviews (%@)",self.goodsM.review_nums];
+    [self reqNet_Goods_productGetProductsReview];
+}
+
+- (void)initSubviews {
+    [super initSubviews];
+    [self.view addSubview:self.topBgV];
+    NSArray *segAry = @[@"All",@"Newest",@"Pictures"];
+    for (int i=0; i<segAry.count; i++) {
+        RadioButton *radBtn= [[RadioButton alloc]init];
+        radBtn.backgroundColor = [UIColor colorWithHexString:@"#FFFFFF"];
+        radBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:14];
+        radBtn.layer.cornerRadius = 4;
+        radBtn.clipsToBounds = YES;
+        radBtn.tag = i;
+        [radBtn setTitle:segAry[i] forState:UIControlStateNormal];
+        [radBtn setTitleColor:[UIColor colorWithHexString:@"#000000"] forState:UIControlStateNormal];
+        [radBtn addTarget:self action:@selector(handle_onRadioButtonValueChanged:) forControlEvents:UIControlEventValueChanged];
+        [self.view addSubview:radBtn];
+        CGFloat btnWidth =  (KScreenWidth-40)/3;
+        radBtn.frame = CGRectMake(10 + i*(btnWidth+10), CGRectGetMaxY(self.topBgV.frame)+10,btnWidth, 40);
+        [self.radioBtnAry addObject:radBtn];
+    }
+    RadioButton *firstBtn = self.radioBtnAry[0];
+    [firstBtn setGroupButtons:self.radioBtnAry];
+    firstBtn.selected = YES;
+    
+    [self setupTableV:[GoodsReviewsListTableV class] Frame:CGRectMake(0, CGRectGetMaxY(firstBtn.frame)+10, KScreenWidth, KScreenHeight- CGRectGetMaxY(firstBtn.frame)-10)];
+    self.TableV.backgroundColor = [UIColor clearColor];
+    self.TableV.tableHeaderView = self.tableHeadV;
+    self.TableV.Page = 1;
+    self.TableV.is_refreshHeader = YES;
+    self.TableV.is_refreshfoot = YES;
+}
+- (void)viewDidLayoutSubviews {
+    [super viewDidLayoutSubviews];
+    
+}
+
+- (void)ucm_changedefault{
+    [self.topImgV sd_setImageWithURL:[NSURL URLWithString:self.goodsM.gooodsImgUrl] placeholderImage:UIImageDefaultImg_SD];
+    self.goodsTitleLab.text = self.goodsM.name;
+    self.priceLab.attributedText = self.goodsM.priceAtr;
+    self.soldLab.text =  [NSString stringWithFormat:@"SOLD: %@",self.goodsM.sold];
+}
+
+- (void)ucm_bindvmmodel{
+    self.VM = [[ASGoodsDetailsVM alloc]initDelegate:self];
+}
+#pragma mark - **************** reqNet ****************
+
+-(void)reqNet_Goods_productGetProductsReview{
+    NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
+    [params setObject:self.goodsM.Id forKey:@"pid"];
+    [params setObject:@1 forKey:@"img"];
+    [params setObject:@"All" forKey:@"sortreview"];
+    [params setObject:@1 forKey:@"p"];
+    [params setObject:@10 forKey:@"limit"];
+
+    [self.VM ry_requestGetApi:Goods_productGetProductsReview param:params];
+}
+-(void)ry_respnsData:(id)data
+            parseAry:(NSMutableArray *)arry
+              sucess:(BOOL)sucessOrFail
+                mark:(NSString *)mark{
+    [MBProgressHUD hideHUDForView:self.view animated:YES];
+    if(sucessOrFail){ ///如何加载相关的评论页面
+        if([mark isEqualToString:Goods_productGetProductsReview]){
+            [self.TableV configDataNew:arry has_more:arry.count==10 ? YES : NO];
+        }
+    }
+    
+}
+
+#pragma mark - **************** handle ****************
+-(void)handle_onRadioButtonValueChanged:(RadioButton *)btn{
+    if (btn.selected) {
+        
+    }else{
+        
+    }
+}
+
+
+
+#pragma mark - **************** lazy ****************
+- (UIView *)topBgV {
+    if (!_topBgV) {
+        IPhoneXHeigh
+        UIView *v= [[UIView alloc] initWithFrame:CGRectMake(0, securitytop_Y, KScreenWidth, 60)];
+        v.backgroundColor = [UIColor colorWithHexString:@"#E0FFF5"];
+        
+        [v addSubview:self.topImgV];
+        [v addSubview:self.goodsTitleLab];
+        [v addSubview:self.priceLab];
+        [v addSubview:self.soldLab];
+        [self.topImgV mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(20);
+            make.top.mas_equalTo(10);
+            make.height.mas_equalTo(40);
+            make.width.mas_equalTo(40);
+        }];
+        [self.soldLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.right.mas_equalTo(-10);
+            make.centerY.mas_equalTo(0);
+            make.height.mas_equalTo(40);
+        }];
+        [self.goodsTitleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.equalTo(self.topImgV.mas_right).offset(10);
+            make.right.equalTo(self.soldLab.mas_left).offset(-10);
+            make.top.mas_equalTo(10);
+            make.height.mas_equalTo(20);
+        }];
+        [self.priceLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.equalTo(self.topImgV.mas_right).offset(10);
+            make.right.equalTo(self.soldLab.mas_left).offset(-10);
+            make.top.equalTo(self.goodsTitleLab.mas_bottom);
+            make.height.mas_equalTo(20);
+        }];
+        _topBgV = v;
+    }
+    return _topBgV;
+}
+
+
+- (UIImageView *)topImgV {
+    if (!_topImgV) {
+        _topImgV = [[UIImageView alloc] initWithImage:nil];
+        _topImgV.contentMode = UIViewContentModeScaleAspectFill;
+        _topImgV.clipsToBounds = YES;
+    }
+    return _topImgV;
+}
+
+- (UILabel *)goodsTitleLab {
+    if (!_goodsTitleLab) {
+        _goodsTitleLab = [[UILabel alloc] initWithFrame:CGRectZero];
+        _goodsTitleLab.textColor = [UIColor colorWithHexString:@"#B2B2B2"];
+        _goodsTitleLab.font = [UIFont fontWithName:Rob_Regular size:12];
+    }
+    return  _goodsTitleLab;
+}
+
+- (QMUILabel *)priceLab {
+    if (!_priceLab) {
+        _priceLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+     
+    }
+    return  _priceLab;
+}
+
+
+
+- (QMUILabel *)soldLab {
+    if (!_soldLab) {
+        _soldLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _soldLab.textAlignment = NSTextAlignmentRight;
+        _soldLab.textColor = [UIColor colorWithHexString:@"#000000"];
+        _soldLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        
+    }
+    return  _soldLab;
+}
+
+
+- (NSMutableArray *)radioBtnAry {
+    if (!_radioBtnAry) {
+        _radioBtnAry = [[NSMutableArray alloc] init];
+    }
+    return _radioBtnAry;
+}
+
+
+
+
+- (UIView *)tableHeadV {
+    if (!_tableHeadV) {
+        _tableHeadV = [[UIView alloc] initWithFrame:CGRectFlatMake(10, 0, KScreenHeight-20, 86)];
+        _tableHeadV.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    }
+    return _tableHeadV;
+}
+
+- (QMUILabel *)reviewsLab {
+    if (!_reviewsLab) {
+        _reviewsLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _reviewsLab.textAlignment = NSTextAlignmentLeft;
+        _reviewsLab.textColor = [UIColor blackColor];
+        _reviewsLab.font = [UIFont systemFontOfSize:18];
+        _reviewsLab.text = @"test";
+    }
+    return  _reviewsLab;
+}
+
+
+@end

+ 17 - 0
Asteria/Fuction/Goods/Revies/V/GoodsReviewsListTableV.h

@@ -0,0 +1,17 @@
+//
+//  GoodsReviewsListTableV.h
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/5.
+//
+
+#import <WMBase/WMBase.h>
+#import "GoodsReviewsCell.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GoodsReviewsListTableV : TT_BaseTableV
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 35 - 0
Asteria/Fuction/Goods/Revies/V/GoodsReviewsListTableV.m

@@ -0,0 +1,35 @@
+//
+//  GoodsReviewsListTableV.m
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/5.
+//
+
+#import "GoodsReviewsListTableV.h"
+
+@implementation GoodsReviewsListTableV
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    GoodsReviewsListM *objectM =  self.infodata[indexPath.row];
+    GoodsReviewsCell *cell = [GoodsReviewsCell cellWithTableView:tableView CellClass:[GoodsReviewsCell class]];
+    [cell configData:objectM];
+    @weakify(cell)
+    cell.currencyparameterClose = ^(NSInteger type, id Data) {
+        @strongify(cell) //图片选择器展示
+    };
+
+    return cell;
+}
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return UITableViewAutomaticDimension;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
+    return 100;
+}
+- (void)configData:(id)Data{
+    NSMutableArray <GoodsReviewsListM *>*tmpAry = Data;
+    self.infodata = tmpAry;
+    [self reloadData];
+}
+@end

+ 16 - 0
Asteria/Fuction/Goods/Revies/V/ReviewsTableHearV.h

@@ -0,0 +1,16 @@
+//
+//  ReviewsTableHearV.h
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/6.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ReviewsTableHearV : TT_BaseV
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 87 - 0
Asteria/Fuction/Goods/Revies/V/ReviewsTableHearV.m

@@ -0,0 +1,87 @@
+//
+//  ReviewsTableHearV.m
+//  Asteria
+//
+//  Created by 王猛 on 2024/1/6.
+//
+
+#import "ReviewsTableHearV.h"
+@interface ReviewsTableHearV ()
+@property (nonatomic, strong) QMUILabel *reviewsLab;
+@property (nonatomic, strong) UIView *rateStarV;
+@property (nonatomic, strong) QMUIButton *writeBtn;
+@property (nonatomic, strong) QMUILabel *tipsLab;
+
+@end
+
+@implementation ReviewsTableHearV
+
+- (void)tt_setupViews{
+    UIView *topBgV = [[UIView alloc]init];
+    topBgV.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    [self addSubview:topBgV];
+    [topBgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.right.mas_equalTo(-10);
+        make.top.mas_equalTo(10);
+        make.height.mas_equalTo(86);
+    }];
+
+    [topBgV addSubview:self.reviewsLab];
+    [topBgV addSubview:self.rateStarV];
+    
+
+    
+
+
+    
+}
+#pragma mark - **************** handle ****************
+-(void)handle_writeEvent:(UIButton *)btn{
+    [self generaltriggermethodType:0 data:@""];
+}
+
+
+- (QMUILabel *)reviewsLab {
+    if (!_reviewsLab) {
+        _reviewsLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _reviewsLab.textAlignment = NSTextAlignmentLeft;
+        _reviewsLab.textColor = [UIColor colorWithHexString:@"#000000"];
+        _reviewsLab.font = [UIFont fontWithName:Rob_Bold size:12];
+        _reviewsLab.text = @"CUSTOMER REVIEWS";
+    }
+    return  _reviewsLab;
+}
+
+
+- (UIView *)rateStarV {
+    if (!_rateStarV) {
+        _rateStarV = [[UIView alloc] init];
+    }
+    return _rateStarV;
+}
+
+- (QMUIButton *)writeBtn {
+    if (!_writeBtn) {
+        _writeBtn = [QMUIButton buttonWithType:UIButtonTypeCustom];
+        NSMutableAttributedString *atr = [[NSMutableAttributedString alloc]initWithString:@"WRITE A REVIEW"];
+        atr.underlineStyle = NSUnderlineStyleSingle;
+        [_writeBtn setAttributedTitle:atr forState:UIControlStateNormal];
+        [_writeBtn addTarget:self action:@selector(handle_writeEvent:) forControlEvents:UIControlEventTouchUpInside];
+        _writeBtn.titleLabel.font = [UIFont fontWithName:Rob_Bold size:12];
+     }
+    return _writeBtn;
+}
+
+- (QMUILabel *)tipsLab {
+    if (!_tipsLab) {
+        _tipsLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _tipsLab.textAlignment = NSTextAlignmentLeft;
+        _tipsLab.textColor = [UIColor blackColor];
+        _tipsLab.font = [UIFont systemFontOfSize:18];
+        _tipsLab.text = @"Only Registered Users Can Write Reviews.please,log In Or Register";
+    }
+    return  _tipsLab;
+}
+
+@end

+ 21 - 0
Asteria/Fuction/Goods/Revies/cell/GoodsReviewsCell.h

@@ -0,0 +1,21 @@
+//
+//  GoodsReviewsCell.h
+//  westkissMob
+//
+//  Created by 王猛 on 2022/9/28.
+//
+
+#import "TT_BaseCell.h"
+#import "GoodsReviewsListM.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GoodsReviewsCell : TT_BaseCell
+@property (nonatomic, strong) GoodsReviewsListM *reviewM;
+
+-(void)handle_addZanBtnEvent:(UIButton *)btn;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 229 - 0
Asteria/Fuction/Goods/Revies/cell/GoodsReviewsCell.m

@@ -0,0 +1,229 @@
+//
+//  GoodsReviewsCell.m
+//  westkissMob
+//
+//  Created by 王猛 on 2022/9/28.
+//
+
+#import "GoodsReviewsCell.h"
+#import "GoodsReviewsImgV.h"
+#import "ASGoodsDetailsVM.h"
+
+@interface GoodsReviewsCell ()
+@property (nonatomic, strong) UIImageView *headImg;
+@property (nonatomic, strong) UILabel *nicknameLab;
+@property (nonatomic, strong) UILabel *creatLab;
+@property (nonatomic, strong) UIButton *zanBtn;
+@property (nonatomic, strong) UILabel *sizeTitleLab;
+@property (nonatomic, strong) UILabel *detailLab;
+@property(nonatomic, strong) GoodsReviewsImgV *reviewsImgV;
+
+@end
+@implementation GoodsReviewsCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+    // Configure the view for the selected state
+}
+- (void)configData:(id)Data{
+    GoodsReviewsListM *model = (GoodsReviewsListM *)Data;
+    self.reviewM = model;
+    self.headImg.image = UIImageDefaultImg_SD;
+    self.nicknameLab.text = model.nickname;
+    self.creatLab.text = model.created_at;
+    self.sizeTitleLab.text = model.title;
+    self.detailLab.text = model.detail;
+    ///wm_todo 点赞本地记录的表
+//    self.zanBtn.selected = [model.thumbsUp integerValue];
+    [self.zanBtn setTitle:model.zan forState:UIControlStateNormal];
+    if(!isValid(model.image_video) || model.image_video.count == 0 ){
+        [self.reviewsImgV mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(10);
+        }];
+    }else{
+        [self.reviewsImgV mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(GoodsReviewsimgWidth + 20);
+        }];
+    }
+    [self.reviewsImgV tt_confignewdata:model.image_video];
+}
+
+- (void)setupSubviewS{
+    [self.contentView addSubview:self.headImg];
+    [self.contentView addSubview:self.nicknameLab];
+    [self.contentView addSubview:self.creatLab];
+    [self.contentView addSubview:self.zanBtn];
+    [self.contentView addSubview:self.sizeTitleLab];
+    [self.contentView addSubview:self.detailLab];
+    [self.contentView addSubview:self.reviewsImgV];
+    [self setupSubViewsFrame];
+    self.backgroundColor = [UIColor clearColor];
+    @weakify(self)
+    self.reviewsImgV.ViewtapClose = ^(NSInteger num, id  _Nonnull data) {
+//        if(self.currencyparameterClose){
+//            self.currencyparameterClose(num, data);
+//        }
+        @strongify(self)
+
+        
+        if(self.currencyparameterClose){
+            self.currencyparameterClose(num, data);
+        }
+        
+    };
+}
+
+
+- (void)setupSubViewsFrame{
+    [self.headImg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.top.mas_equalTo(20);
+        make.width.mas_equalTo(40);
+        make.height.mas_equalTo(40);
+    }];
+    [self.nicknameLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.headImg.mas_right).offset(16);
+        make.top.equalTo(self.headImg);
+        make.height.mas_equalTo(20);
+        make.right.equalTo(self.zanBtn.mas_left).offset(-10);
+    }];
+    [self.creatLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.headImg.mas_right).offset(16);
+        make.top.equalTo(self.nicknameLab.mas_bottom);
+        make.height.mas_equalTo(20);
+        make.right.equalTo(self.zanBtn.mas_left).offset(-10);
+    }];
+    [self.zanBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(-10);
+        make.centerY.equalTo(self.headImg);
+        make.height.mas_equalTo(20);
+        make.width.mas_equalTo(60);
+    }];
+    [self.sizeTitleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(20);
+        make.right.mas_equalTo(-20);
+        make.top.equalTo(self.headImg.mas_bottom).offset(20);
+
+    }];
+    [self.detailLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.sizeTitleLab.mas_bottom).offset(20);
+        make.left.mas_equalTo(20);
+        make.right.mas_equalTo(-20);
+    }];
+    [self.reviewsImgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.detailLab.mas_bottom).offset(10);
+        make.left.mas_equalTo(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(GoodsReviewsimgWidth + 20);
+        make.bottom.mas_equalTo(-20);
+    }];
+}
+
+#pragma mark - **************** handle ****************
+-(void)handle_addZanBtnEvent:(UIButton *)btn{
+ /*   if (NIL(User_token)){ //判断登陆
+        [Fuction_Tool present_Loginpage];
+        return;
+    }
+    NSString *url = nil;
+    if(btn.selected){ //取消赞
+        url = BaseRequestrUrl(GoodsDetails_productDelThumbsUp);
+    }else{
+        url = BaseRequestrUrl(GoodsDetails_productAddThumbsUp);
+    }
+    UIViewController *topVC = topViewController();
+    [MBProgressHUD showHUDAddedTo:topVC.view animated:YES];
+    [PPNetworkHelper POST:url parameters:@{@"entity_id":self.reviewM.review_id} success:^(id responseObject) {
+        [MBProgressHUD hideHUDForView:topVC.view animated:YES];
+        NSDictionary *tepDic = responseObject[@"data"];
+        if(RequestSuccess){
+            btn.selected = !btn.selected;
+            self.zanBtn.selected =  btn.selected;
+            self.reviewM.thumbsUp = [NSString stringWithFormat:@"%d",![self.reviewM.thumbsUp boolValue]];
+            self.reviewM.zan = [NSString stringWithFormat:@"%@",tepDic[@"num"]];
+            [btn setTitle: self.reviewM.zan forState:UIControlStateNormal];
+            [self.zanBtn setTitle: self.reviewM.zan forState:UIControlStateNormal];
+        }
+        [topVC.view makeToast:RequestErrorMsg duration:2 position:CSToastPositionCenter];
+    } failure:^(NSError *error) {
+        [MBProgressHUD hideHUDForView:topVC.view animated:YES];
+        [topVC.view makeToast:ReqNetWorkFaild duration:2 position:CSToastPositionCenter];
+    }];
+    */
+}
+-(void)tap_imgFull:(UITapGestureRecognizer *)tap{
+    
+}
+
+-(UIImageView *)headImg{
+    if(!_headImg){
+        _headImg = [[UIImageView alloc]init];
+        _headImg.image = UIImageDefaultImg_SD;
+    }
+    return _headImg;
+}
+-(UILabel *)nicknameLab{
+    if(!_nicknameLab){
+        _nicknameLab = [[UILabel alloc]init];
+        _nicknameLab.font = [UIFont fontWithName:Rob_Bold size:12];
+    }
+    return _nicknameLab;
+}
+-(UILabel *)creatLab{
+    if(!_creatLab){
+        _creatLab = [[UILabel alloc]init];
+        _creatLab.font = [UIFont fontWithName:Rob_Regular size:12];
+    }
+    return _creatLab;
+}
+-(UIButton *)zanBtn{
+    if(!_zanBtn){
+        _zanBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [_zanBtn setImage:[UIImage imageNamed:@"goos_zan_normal"] forState:UIControlStateNormal];
+        [_zanBtn setImage:[UIImage imageNamed:@"goos_zan_select"] forState:UIControlStateSelected];
+        [_zanBtn setTitle:@"10" forState:UIControlStateNormal];
+        [_zanBtn setTitleColor:[UIColor colorWithHexString:@"#0B0B0B"] forState:UIControlStateNormal];
+        _zanBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:12];
+        [_zanBtn addTarget:self action:@selector(handle_addZanBtnEvent:) forControlEvents:UIControlEventTouchUpInside];
+        [_zanBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 8, 0, -8)];
+    }
+    return _zanBtn;
+}
+
+-(UILabel *)sizeTitleLab{
+    if(!_sizeTitleLab){
+        _sizeTitleLab = [[UILabel alloc]init];
+        _sizeTitleLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        _sizeTitleLab.textColor = [UIColor colorWithHexString:@"#B2B2B2"];
+        _sizeTitleLab.numberOfLines = 0;
+        _sizeTitleLab.preferredMaxLayoutWidth = KScreenWidth - 40;
+
+//        _sizeTitleLab.adjustsFontSizeToFitWidth  = KScreenWidth -40;
+    }
+    return _sizeTitleLab;
+}
+-(UILabel *)detailLab{
+    if(!_detailLab){
+        _detailLab = [UILabel new];
+        _detailLab.textColor = [UIColor colorWithHexString:@"#0B0B0B"];
+        _detailLab.font = [UIFont fontWithName:Rob_Regular size:12];
+//        _detailLab.adjustsFontSizeToFitWidth  = KScreenWidth -40;
+        _detailLab.numberOfLines = 0;
+        _detailLab.preferredMaxLayoutWidth = KScreenWidth - 40;
+    }
+    return _detailLab;
+}
+
+
+-(GoodsReviewsImgV *)reviewsImgV{
+    if(!_reviewsImgV){
+        _reviewsImgV = [[GoodsReviewsImgV alloc]initWithFrame:CGRectMake(10, 0, KScreenWidth-20, GoodsReviewsimgWidth +20)];
+    }
+    return _reviewsImgV;
+}
+
+@end

+ 23 - 0
Asteria/Fuction/Goods/Revies/cell/GoodsReviewsImgV.h

@@ -0,0 +1,23 @@
+//
+//  GoodsReviewsImgV.h
+//  westkissMob
+//
+//  Created by 王猛 on 2022/9/29.
+//
+
+#import "TT_BaseV.h"
+
+NS_ASSUME_NONNULL_BEGIN
+#define GoodsReviewsimgWidth  (KScreenWidth-20 -40)/3
+
+#define GoodsReviewsCellImgsTag 1000
+
+@interface GoodsReviewsImgV : TT_BaseV
+
+@property (nonatomic, strong) NSMutableArray *imgDataAry;
+@property (nonatomic, strong) NSMutableArray *xxx_subImgAry;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 67 - 0
Asteria/Fuction/Goods/Revies/cell/GoodsReviewsImgV.m

@@ -0,0 +1,67 @@
+//
+//  GoodsReviewsImgV.m
+//  westkissMob
+//
+//  Created by 王猛 on 2022/9/29.
+//
+
+#import "GoodsReviewsImgV.h"
+
+@implementation GoodsReviewsImgV
+
+- (void)tt_setupViews{
+    self.xxx_subImgAry = [[NSMutableArray alloc]init];
+    for (int i= 0; i<3; i++) {
+        UIImageView *tempImg = [[UIImageView alloc]init];
+        tempImg.userInteractionEnabled = YES;
+        tempImg.image = UIImageDefaultImg_SD;
+        tempImg.tag =  GoodsReviewsCellImgsTag+i;
+        tempImg.contentMode = UIViewContentModeScaleAspectFill;
+        tempImg.clipsToBounds = YES;
+
+        [self addSubview:tempImg];
+        UITapGestureRecognizer *imgTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap_imgFull:)];
+        [tempImg addGestureRecognizer:imgTap];
+        tempImg.hidden = YES;
+        tempImg.frame = CGRectMake(10+(GoodsReviewsimgWidth+10)*i, 10, GoodsReviewsimgWidth, GoodsReviewsimgWidth);
+        [tempImg mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(10+(GoodsReviewsimgWidth+10)*i);
+            make.top.mas_equalTo(10);
+            make.height.mas_equalTo(GoodsReviewsimgWidth);
+            make.width.mas_equalTo(GoodsReviewsimgWidth);
+        }];
+        [self.xxx_subImgAry addObject:tempImg];
+        UIImageView *fullImg = [[UIImageView alloc] initWithImage:IMAGE(@"goods_reviews_fullscreen")];
+        fullImg.userInteractionEnabled = YES;
+        fullImg.contentMode = UIViewContentModeCenter;
+        [tempImg addSubview:fullImg];
+        fullImg.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.4];
+        fullImg.frame = CGRectMake(GoodsReviewsimgWidth-26, GoodsReviewsimgWidth-26, 26, 26);
+        [fullImg mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.right.equalTo(@0);
+            make.bottom.mas_equalTo(0);
+            make.width.mas_equalTo(26);
+            make.height.mas_equalTo(26);
+        }];
+        
+    }
+}
+
+-(void)tap_imgFull:(UITapGestureRecognizer *)tap{
+    [self generaltriggermethodType:tap.view.tag-GoodsReviewsCellImgsTag data:self.imgDataAry];
+}
+
+- (void)tt_confignewdata:(id)data{
+    for (UIImageView *imgV in self.xxx_subImgAry) {
+        imgV.hidden = YES;
+    }
+    NSArray *urlAry = (NSArray * )data;
+    self.imgDataAry = [NSMutableArray arrayWithArray:urlAry];
+    for (int i = 0; i<urlAry.count; i++) {
+        UIImageView *tepImg = [self viewWithTag:GoodsReviewsCellImgsTag+i];
+        tepImg.hidden = NO;
+        [tepImg sd_setImageWithURL:[NSURL URLWithString:((NSString *)urlAry[i]).urlEncode] placeholderImage:UIImageDefaultImg_SD];
+    }
+}
+
+@end

+ 5 - 2
Asteria/Fuction/Goods/V/Banner/WKM_goodsBanner.m

@@ -40,11 +40,14 @@ UICollectionViewDelegate>
 }
 }
 
 
 -(void)tt_confignewdata:(id)data{
 -(void)tt_confignewdata:(id)data{
-    GoodsInformationM *model = (GoodsInformationM *)data;
-    NSMutableArray <MediaGalleryEntriesModel *>*imgArry =[NSMutableArray arrayWithArray:model.media_gallery_entries];
+    GoodsInformationM *infoModel = (GoodsInformationM *)data;
+    NSMutableArray <MediaGalleryEntriesModel *>*imgArry =[NSMutableArray arrayWithArray:infoModel.media_gallery_entries];
     NSMutableArray *modelAry = [[NSMutableArray alloc]init];
     NSMutableArray *modelAry = [[NSMutableArray alloc]init];
     for (int i = 0; i< imgArry.count; i++) {
     for (int i = 0; i< imgArry.count; i++) {
         GoodsBannerModel *model =  [GoodsBannerModel xxx_loadWithModel:imgArry[i]];
         GoodsBannerModel *model =  [GoodsBannerModel xxx_loadWithModel:imgArry[i]];
+        if(i==0){
+            infoModel.gooodsImgUrl =   model.small;
+        }
         [modelAry addObject:model];
         [modelAry addObject:model];
     }
     }
     
     

+ 6 - 0
Asteria/Fuction/Goods/V/GoodsDetailSrcView.h

@@ -8,6 +8,12 @@
 
 
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
+typedef NS_ENUM(NSUInteger,DetailsSrcType){
+    GoodsBannerTag = 1000  ,
+    GoodsReviewsTag = 2000,
+    
+    
+} ;
 
 
 @interface GoodsDetailSrcView : TT_BaseScrollView
 @interface GoodsDetailSrcView : TT_BaseScrollView
 
 

+ 31 - 8
Asteria/Fuction/Goods/V/GoodsDetailSrcView.m

@@ -123,9 +123,11 @@
     }
     }
     RadioButton *firstBtn = self.radioBtnAry[0];
     RadioButton *firstBtn = self.radioBtnAry[0];
     [firstBtn setGroupButtons:self.radioBtnAry];
     [firstBtn setGroupButtons:self.radioBtnAry];
-    [firstBtn setSelected:YES];
-    firstBtn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+    [self.radioBtnAry[0] setSelected:YES];
+    [self xxx_onRadioButtonValueChanged:self.radioBtnAry[0]];
 
 
+ 
+    
     [self addSubview:self.wkWebView];
     [self addSubview:self.wkWebView];
     [self.wkWebView mas_makeConstraints:^(MASConstraintMaker *make) {
     [self.wkWebView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.mas_equalTo(0);
         make.left.mas_equalTo(0);
@@ -135,10 +137,14 @@
     
     
     
     
 }
 }
+
 - (void)tt_configData:(id)data{
 - (void)tt_configData:(id)data{
+ 
+
+    
     GoodsInformationM *model = (GoodsInformationM *)data;
     GoodsInformationM *model = (GoodsInformationM *)data;
     self.infoModel = model;
     self.infoModel = model;
-    [self.goodsBanner tt_confignewdata:model];
+    [self.goodsBanner tt_confignewdata:self.infoModel];
     self.titleLab.text =MM_str(model.name);
     self.titleLab.text =MM_str(model.name);
     //wm_todo  soldLab\ reviewsLab\ coupon 和 size
     //wm_todo  soldLab\ reviewsLab\ coupon 和 size
     self.soldLab.text = [NSString stringWithFormat:@"SOLD: %@",model.sold] ;
     self.soldLab.text = [NSString stringWithFormat:@"SOLD: %@",model.sold] ;
@@ -167,12 +173,13 @@
         [priceAtrSub1 addAttribute:NSFontAttributeName
         [priceAtrSub1 addAttribute:NSFontAttributeName
                         value:[UIFont fontWithName:Rob_Regular size:14]
                         value:[UIFont fontWithName:Rob_Regular size:14]
                         range:NSMakeRange(0, priceAtrSub1.length)];
                         range:NSMakeRange(0, priceAtrSub1.length)];
-        [priceAtrSub1 addAttribute:NSUnderlineStyleAttributeName
+        [priceAtrSub1 addAttribute:NSStrikethroughStyleAttributeName
                         value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
                         value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
                         range:NSMakeRange(0, priceAtrSub1.length)];
                         range:NSMakeRange(0, priceAtrSub1.length)];
         [priceAtr appendAttributedString:priceAtrSub1];
         [priceAtr appendAttributedString:priceAtrSub1];
     }
     }
     self.priceLab.attributedText = priceAtr;
     self.priceLab.attributedText = priceAtr;
+    self.infoModel.priceAtr = priceAtr;
     self.saveLab.text = saveStr;
     self.saveLab.text = saveStr;
     self.datails_payV.titleLab.text = [NSString stringWithFormat:@"Pay in 4 interest-free payments of %@%.2f with",model.currency_symbol,[model.final_prices floatValue]/4];
     self.datails_payV.titleLab.text = [NSString stringWithFormat:@"Pay in 4 interest-free payments of %@%.2f with",model.currency_symbol,[model.final_prices floatValue]/4];
     NSString *product_details= @"";
     NSString *product_details= @"";
@@ -244,20 +251,31 @@
 -(void)xxx_onRadioButtonValueChanged:(RadioButton *)btn{
 -(void)xxx_onRadioButtonValueChanged:(RadioButton *)btn{
     if (btn.selected) {
     if (btn.selected) {
         btn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
         btn.backgroundColor = [UIColor colorWithHexString:@"#113632"];
-
     }else{
     }else{
         btn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
         btn.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
         
         
     }
     }
 }
 }
+-(void)handle_couponEvent:(UIButton *)btn{
+    //wm_todo
+    btn.selected = !btn.selected;
+}
+-(void)tap_reviewsClick{
+    [self delegate_configClosetype:GoodsReviewsTag data:@""];
+}
 -(void)tap_sizeLab{ ///展开size 规格选择的页面
 -(void)tap_sizeLab{ ///展开size 规格选择的页面
     
     
 }
 }
 
 
--(void)handle_couponEvent:(UIButton *)btn{
-    //wm_todo
-    btn.selected = !btn.selected;
+
+- (void)delegate_configClosetype:(NSInteger)type data:(id)data {
+    if (self.TTscrolldelegate && [self.TTscrolldelegate respondsToSelector:@selector(tengteng_configtapchilds:data:)]) {
+        [self.TTscrolldelegate tengteng_configtapchilds:type data:data];
+    }
 }
 }
+
+
+#pragma mark - **************** lazy ****************
 - (WKM_goodsBanner *)goodsBanner {
 - (WKM_goodsBanner *)goodsBanner {
     if (!_goodsBanner) {
     if (!_goodsBanner) {
         _goodsBanner = [[WKM_goodsBanner alloc] init];
         _goodsBanner = [[WKM_goodsBanner alloc] init];
@@ -289,6 +307,10 @@
         _reviewsLab.textAlignment = NSTextAlignmentRight;
         _reviewsLab.textAlignment = NSTextAlignmentRight;
         _reviewsLab.textColor = [UIColor colorWithHexString:@"#666666"];
         _reviewsLab.textColor = [UIColor colorWithHexString:@"#666666"];
         _reviewsLab.font = [UIFont fontWithName:Rob_Regular size:12];
         _reviewsLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        _reviewsLab.userInteractionEnabled = YES;
+        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap_reviewsClick)];
+        [_reviewsLab addGestureRecognizer:tap];
+
         //    reviewsStr.underlineStyle = NSUnderlineStyleSingle;
         //    reviewsStr.underlineStyle = NSUnderlineStyleSingle;
     }
     }
     return  _reviewsLab;
     return  _reviewsLab;
@@ -347,6 +369,7 @@
         _sizeLab.layer.cornerRadius = 4;
         _sizeLab.layer.cornerRadius = 4;
         _sizeLab.clipsToBounds = YES;
         _sizeLab.clipsToBounds = YES;
         _sizeLab.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
         _sizeLab.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
+        _sizeLab.userInteractionEnabled = YES;
         UIImageView *imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"base_add_white"]];
         UIImageView *imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"base_add_white"]];
         imgV.frame = CGRectMake(_sizeLab.mj_w-45-10, 0, 45, 45);
         imgV.frame = CGRectMake(_sizeLab.mj_w-45-10, 0, 45, 45);
         imgV.userInteractionEnabled = YES;
         imgV.userInteractionEnabled = YES;

+ 26 - 8
Asteria/Fuction/Goods/VC/AS_GoodsDetailsC.m

@@ -9,6 +9,8 @@
 #import "GoodsDetailSrcView.h"
 #import "GoodsDetailSrcView.h"
 #import "ASGoodsDetailsVM.h"
 #import "ASGoodsDetailsVM.h"
 #import "GoodsDetailsBottomV.h"
 #import "GoodsDetailsBottomV.h"
+#import "AS_GoodsReviewsListC.h"
+
 @interface AS_GoodsDetailsC ()<TT_BaseScrollViewDelegate,RY_baseVMprotocol>
 @interface AS_GoodsDetailsC ()<TT_BaseScrollViewDelegate,RY_baseVMprotocol>
 @property (nonatomic, strong) GoodsInformationM *model;
 @property (nonatomic, strong) GoodsInformationM *model;
 @property (nonatomic, strong) ASGoodsDetailsVM *VM;
 @property (nonatomic, strong) ASGoodsDetailsVM *VM;
@@ -22,6 +24,7 @@
 - (void)viewDidLoad {
 - (void)viewDidLoad {
     [super viewDidLoad];
     [super viewDidLoad];
     [self reqNet_GoodsDetails_productGetProduct];
     [self reqNet_GoodsDetails_productGetProduct];
+    [self sub_veiwTapBlock];
     
     
 }
 }
 - (void)initSubviews{
 - (void)initSubviews{
@@ -30,6 +33,8 @@
     [self.view addSubview:self.bottomV];
     [self.view addSubview:self.bottomV];
     
     
 }
 }
+
+
 - (void)viewDidLayoutSubviews{
 - (void)viewDidLayoutSubviews{
     IPhoneXHeigh
     IPhoneXHeigh
     [self.scrV mas_makeConstraints:^(MASConstraintMaker *make) {
     [self.scrV mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -51,20 +56,37 @@
     [MBProgressHUD showHUDAddedTo:self.view animated:YES];
     [MBProgressHUD showHUDAddedTo:self.view animated:YES];
     [self.VM ry_requestGetApi:Goods_productGetProductsById param:params];
     [self.VM ry_requestGetApi:Goods_productGetProductsById param:params];
 }
 }
--(void)ry_respnsParseData:(id)data
-                    sucess:(BOOL)sucessOrFail
-                     mark:(NSString *)mark{
+-(void)ry_respnsData:(id)data
+            parseAry:(NSMutableArray *)arry
+              sucess:(BOOL)sucessOrFail
+                mark:(NSString *)mark{
     [MBProgressHUD hideHUDForView:self.view animated:YES];
     [MBProgressHUD hideHUDForView:self.view animated:YES];
     if(sucessOrFail){
     if(sucessOrFail){
         if([mark isEqualToString:Goods_productGetProductsById]){
         if([mark isEqualToString:Goods_productGetProductsById]){
-            GoodsInformationM *model = (GoodsInformationM *)data;
+            GoodsInformationM *model = (GoodsInformationM *)[arry firstObject];
+            self.model = model;
             self.title = model.name;
             self.title = model.name;
             [self.scrV tt_configData:model];
             [self.scrV tt_configData:model];
         }
         }
     }
     }
 }
 }
 
 
+#pragma mark - **************** TT_BaseScrollViewDelegate ****************
+-(void)tengteng_configtapchilds:(NSInteger)num data:(id)data{
+    if(num == GoodsReviewsTag){
+        [self action_GoodsReviewsListC];
+    }
+}
+
+#pragma mark - **************** action ****************
 
 
+-(void)action_GoodsReviewsListC{
+    AS_GoodsReviewsListC *allPic = [[AS_GoodsReviewsListC alloc]init];
+    allPic.goodsM = self.model;
+    [self.navigationController pushViewController:allPic animated:YES];
+}
+
+#pragma mark - **************** lazy ****************
 
 
 - (GoodsDetailSrcView *)scrV {
 - (GoodsDetailSrcView *)scrV {
     if (!_scrV) {
     if (!_scrV) {
@@ -75,10 +97,6 @@
     return _scrV;
     return _scrV;
 }
 }
 
 
-
-
-
-
 - (GoodsDetailsBottomV *)bottomV {
 - (GoodsDetailsBottomV *)bottomV {
     if (!_bottomV) {
     if (!_bottomV) {
         IPhoneXHeigh
         IPhoneXHeigh

+ 0 - 42
Asteria/Fuction/Goods/VC/AS_GoodsReviewsListC.m

@@ -1,42 +0,0 @@
-//
-//  AS_GoodsReviewsListC.m
-//  Asteria
-//
-//  Created by 王猛 on 2024/1/4.
-//
-
-#import "AS_GoodsReviewsListC.h"
-#import "ASGoodsDetailsVM.h"
-
-@interface AS_GoodsReviewsListC ()
-@property (nonatomic, strong) UIView *topBgV;
-@property (nonatomic, strong) QMUILabel *hotLab;
-@property (nonatomic, strong) UIImageView *topImgV;
-@property (nonatomic, strong) UILabel *goodsTitleLab;
-@property (nonatomic, strong) QMUILabel *priceLab;
-@property (nonatomic, strong) UIButton *cartBtn;
-
-@end
-
-@implementation AS_GoodsReviewsListC
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-}
-
-
-
-- (UIView *)topBgV {
-    if (!_topBgV) {
-        UIView *v= [[UIView alloc] init];
-        [v addSubview:self.hotLab];
-        [v addSubview:self.topImgV];
-        [v addSubview:self.goodsTitleLab];
-        [v addSubview:self.priceLab];
-        [v addSubview:self.cartBtn];
-        _topBgV = v;
-    }
-    return _topBgV;
-}
-
-@end

+ 2 - 1
Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.h

@@ -7,9 +7,10 @@
 
 
 #import "RYBaseVM.h"
 #import "RYBaseVM.h"
 #import "GoodsInformationM.h"
 #import "GoodsInformationM.h"
+#import "GoodsReviewsListM.h"
 
 
 #define Goods_productGetProductsById  BaseRequestrUrl(@"rewrite/product/getProductsById")
 #define Goods_productGetProductsById  BaseRequestrUrl(@"rewrite/product/getProductsById")
-#define Goods_productGetProductsReview  BaseRequestrUrl(@"rewrite/product/getProductsReview")
+#define Goods_productGetProductsReview  BaseRequestrUrl(@"rewrite/product/getProductReview")
 
 
 NS_ASSUME_NONNULL_BEGIN
 NS_ASSUME_NONNULL_BEGIN
 
 

+ 5 - 1
Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.m

@@ -11,7 +11,11 @@
 - (void)ry_respnsSucessWithPath:(NSString *)mark data:(id)data{
 - (void)ry_respnsSucessWithPath:(NSString *)mark data:(id)data{
     if([mark isEqualToString:Goods_productGetProductsById]){
     if([mark isEqualToString:Goods_productGetProductsById]){
         GoodsInformationM *model = [GoodsInformationM mj_objectWithKeyValues:data];
         GoodsInformationM *model = [GoodsInformationM mj_objectWithKeyValues:data];
-        [self ry_VMconfigDelegateData:model success:YES mark:mark];
+        NSMutableArray *ary = [NSMutableArray arrayWithArray:@[model]];
+        [self ry_VMconfigDelegateData:data parseAry:ary success:YES mark:mark];
+    }else if ([mark isEqualToString:Goods_productGetProductsReview]){
+        NSMutableArray <GoodsReviewsListM *>*array = [GoodsReviewsListM mj_objectArrayWithKeyValuesArray:data[@"items"]];
+        [self ry_VMconfigDelegateData:data parseAry:array success:YES mark:mark];
     }
     }
 }
 }
 @end
 @end

+ 2 - 1
Asteria/PreFixHeader.h

@@ -26,8 +26,9 @@
 #import "ColorDefine.h"
 #import "ColorDefine.h"
 #import "SizeDefine.h"
 #import "SizeDefine.h"
 
 
-
 ///Third 添加的本地三方库
 ///Third 添加的本地三方库
+#import "NSMutableAttributedString+RYText.h"
+
 
 
 //所有功能模块需要依赖的 项目(需变化)特定内容,相关内容和不变化的Base无关
 //所有功能模块需要依赖的 项目(需变化)特定内容,相关内容和不变化的Base无关
 #import "ProjectConfigDefine.h"
 #import "ProjectConfigDefine.h"