瀏覽代碼

Merge branch 'master' of http://gogs.hnwmzp.cn/nzk1/Asteria-APP

# Conflicts:
#	Asteria/NetTools/ASNetApis.h
Abel 1 年之前
父節點
當前提交
e720961f48
共有 73 個文件被更改,包括 1331 次插入210 次删除
  1. 83 7
      Asteria.xcodeproj/project.pbxproj
  2. 27 0
      Asteria/Base/AlertMyCartDeleteV.h
  3. 271 0
      Asteria/Base/AlertMyCartDeleteV.m
  4. 6 0
      Asteria/Base/Assets/Base.xcassets/Contents.json
  5. 23 0
      Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/Contents.json
  6. 二進制
      Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153.png
  7. 二進制
      Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153@2x.png
  8. 二進制
      Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153@3x.png
  9. 23 0
      Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/Contents.json
  10. 二進制
      Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014.png
  11. 二進制
      Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014@2x.png
  12. 二進制
      Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014@3x.png
  13. 23 0
      Asteria/Base/Assets/Base.xcassets/base_share.imageset/Contents.json
  14. 二進制
      Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150.png
  15. 二進制
      Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150@2x.png
  16. 二進制
      Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150@3x.png
  17. 23 0
      Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/Contents.json
  18. 二進制
      Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153.png
  19. 二進制
      Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153@2x.png
  20. 二進制
      Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153@3x.png
  21. 23 0
      Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/Contents.json
  22. 二進制
      Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646.png
  23. 二進制
      Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646@2x.png
  24. 二進制
      Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646@3x.png
  25. 49 0
      Asteria/Base/RYNetWork/RYBaseVM.h
  26. 70 0
      Asteria/Base/RYNetWork/RYBaseVM.m
  27. 16 0
      Asteria/Base/RYNetWork/UIViewController+RY_configNet.h
  28. 13 0
      Asteria/Base/RYNetWork/UIViewController+RY_configNet.m
  29. 1 1
      Asteria/Fuction/AMoule/AViewController.m
  30. 6 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/Contents.json
  31. 23 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/Contents.json
  32. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718.png
  33. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718@2x.png
  34. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718@3x.png
  35. 23 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/Contents.json
  36. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗.png
  37. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗@2x.png
  38. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗@3x.png
  39. 23 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Contents.json
  40. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗.png
  41. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗@2x.png
  42. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗@3x.png
  43. 23 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/Contents.json
  44. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533.png
  45. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533@2x.png
  46. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533@3x.png
  47. 23 0
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/Contents.json
  48. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410.png
  49. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410@2x.png
  50. 二進制
      Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410@3x.png
  51. 24 52
      Asteria/Fuction/Goods/M/GoodsInformationM.h
  52. 16 39
      Asteria/Fuction/Goods/M/GoodsInformationM.m
  53. 1 1
      Asteria/Fuction/Goods/Target/Target_Goods.h
  54. 1 1
      Asteria/Fuction/Goods/Target/Target_Goods.m
  55. 3 3
      Asteria/Fuction/Goods/V/Banner/M/GoodsBannerModel.h
  56. 8 4
      Asteria/Fuction/Goods/V/Banner/M/GoodsBannerModel.m
  57. 2 2
      Asteria/Fuction/Goods/V/Banner/WKM_goodsBanner.m
  58. 216 2
      Asteria/Fuction/Goods/V/GoodsDetailSrcView.m
  59. 16 0
      Asteria/Fuction/Goods/V/GoodsDetailsBottomV.h
  60. 77 0
      Asteria/Fuction/Goods/V/GoodsDetailsBottomV.m
  61. 16 0
      Asteria/Fuction/Goods/V/GoodsDetailsIntroduceV.h
  62. 32 0
      Asteria/Fuction/Goods/V/GoodsDetailsIntroduceV.m
  63. 25 0
      Asteria/Fuction/Goods/V/GoodsDetailsPayV.h
  64. 44 0
      Asteria/Fuction/Goods/V/GoodsDetailsPayV.m
  65. 1 0
      Asteria/Fuction/Goods/VC/AS_GoodsDetailsC.h
  66. 38 25
      Asteria/Fuction/Goods/VC/AS_GoodsDetailsC.m
  67. 18 0
      Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.h
  68. 17 0
      Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.m
  69. 0 34
      Asteria/Fuction/Goods/VM/GoodsDetailsVM.h
  70. 0 35
      Asteria/Fuction/Goods/VM/GoodsDetailsVM.m
  71. 1 1
      Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.h
  72. 2 2
      Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.m
  73. 1 1
      Asteria/ThirdPartService.m

+ 83 - 7
Asteria.xcodeproj/project.pbxproj

@@ -183,13 +183,19 @@
 		9A337E3A2A04EE1A00D058A5 /* Target_B.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E362A04EE1A00D058A5 /* Target_B.m */; };
 		9A337E3B2A04EE1A00D058A5 /* BViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E392A04EE1A00D058A5 /* BViewController.m */; };
 		9A337E4E2A04F46600D058A5 /* AViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A337E4D2A04F46600D058A5 /* AViewController.m */; };
+		9A3F5CAB2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */; };
+		9A3F5CAF2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CAE2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m */; };
+		9A3F5CB22B3BF63A00DDB6A7 /* Goods.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A3F5CB12B3BF63A00DDB6A7 /* Goods.xcassets */; };
+		9A3F5CB52B3BF73100DDB6A7 /* Base.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A3F5CB42B3BF73100DDB6A7 /* Base.xcassets */; };
+		9A3F5CB82B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CB72B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.m */; };
+		9A3F5CBB2B3C192000DDB6A7 /* GoodsDetailsBottomV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A3F5CBA2B3C192000DDB6A7 /* GoodsDetailsBottomV.m */; };
 		9A5C64582A12064300CBB185 /* AS_LoginC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A5C64572A12064300CBB185 /* AS_LoginC.m */; };
 		9A5C645B2A1206E500CBB185 /* common.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A5C645A2A1206E500CBB185 /* common.xcassets */; };
 		9A65DE512A132FB700BB1269 /* LoginThirdAuthV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A65DE502A132FB700BB1269 /* LoginThirdAuthV.m */; };
 		9A788C442A08A663003E0025 /* Target_Goods.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A788C432A08A663003E0025 /* Target_Goods.m */; };
 		9A7DA6A12A0CE33500136974 /* Asteria.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A7DA6A02A0CE33500136974 /* Asteria.xcassets */; };
 		9A8DD8C52A0B8F1700573324 /* As_GoodsSizeC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8DD8C42A0B8F1700573324 /* As_GoodsSizeC.m */; };
-		9A8DD8C82A0B93F700573324 /* GoodsDetailsVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8DD8C72A0B93F600573324 /* GoodsDetailsVM.m */; };
+		9AC2CC222B3A673B005187BD /* ASGoodsDetailsVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AC2CC212B3A673B005187BD /* ASGoodsDetailsVM.m */; };
 		9ACBEC212A14585300A8F97A /* CTMediator+ASTargerts.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ACBEC202A14585300A8F97A /* CTMediator+ASTargerts.m */; };
 		9ACBEC252A14707400A8F97A /* AS_SignUpC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ACBEC242A14707400A8F97A /* AS_SignUpC.m */; };
 		9ACBEC282A1472AF00A8F97A /* LoginSignUpV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ACBEC272A1472AF00A8F97A /* LoginSignUpV.m */; };
@@ -241,6 +247,8 @@
 		9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5422A1218E7001DE3D9 /* PassWordSecureBtnV.m */; };
 		9AD6A5452A1218E8001DE3D9 /* EamilTFmatchV.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5432A1218E7001DE3D9 /* EamilTFmatchV.m */; };
 		9AD6A5492A1237D0001DE3D9 /* Target_Login.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6A5482A1237D0001DE3D9 /* Target_Login.m */; };
+		9AF9085C2B397320008AC2D2 /* UIViewController+RY_configNet.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AF9085B2B397320008AC2D2 /* UIViewController+RY_configNet.m */; };
+		9AF9085F2B3976F3008AC2D2 /* RYBaseVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AF9085E2B3976F3008AC2D2 /* RYBaseVM.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -608,6 +616,16 @@
 		9A337E392A04EE1A00D058A5 /* BViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BViewController.m; sourceTree = "<group>"; };
 		9A337E4C2A04F46600D058A5 /* AViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AViewController.h; sourceTree = "<group>"; };
 		9A337E4D2A04F46600D058A5 /* AViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AViewController.m; 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>"; };
+		9A3F5CAD2B3BC11000DDB6A7 /* AlertMyCartDeleteV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlertMyCartDeleteV.h; sourceTree = "<group>"; };
+		9A3F5CAE2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AlertMyCartDeleteV.m; sourceTree = "<group>"; };
+		9A3F5CB12B3BF63A00DDB6A7 /* Goods.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Goods.xcassets; sourceTree = "<group>"; };
+		9A3F5CB42B3BF73100DDB6A7 /* Base.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Base.xcassets; sourceTree = "<group>"; };
+		9A3F5CB62B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsDetailsIntroduceV.h; sourceTree = "<group>"; };
+		9A3F5CB72B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsDetailsIntroduceV.m; sourceTree = "<group>"; };
+		9A3F5CB92B3C192000DDB6A7 /* GoodsDetailsBottomV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsDetailsBottomV.h; sourceTree = "<group>"; };
+		9A3F5CBA2B3C192000DDB6A7 /* GoodsDetailsBottomV.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsDetailsBottomV.m; sourceTree = "<group>"; };
 		9A5C64562A12064300CBB185 /* AS_LoginC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_LoginC.h; sourceTree = "<group>"; };
 		9A5C64572A12064300CBB185 /* AS_LoginC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AS_LoginC.m; sourceTree = "<group>"; };
 		9A5C645A2A1206E500CBB185 /* common.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = common.xcassets; sourceTree = "<group>"; };
@@ -618,8 +636,8 @@
 		9A7DA6A02A0CE33500136974 /* Asteria.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Asteria.xcassets; sourceTree = "<group>"; };
 		9A8DD8C32A0B8F1700573324 /* As_GoodsSizeC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = As_GoodsSizeC.h; sourceTree = "<group>"; };
 		9A8DD8C42A0B8F1700573324 /* As_GoodsSizeC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = As_GoodsSizeC.m; sourceTree = "<group>"; };
-		9A8DD8C62A0B93F600573324 /* GoodsDetailsVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoodsDetailsVM.h; sourceTree = "<group>"; };
-		9A8DD8C72A0B93F600573324 /* GoodsDetailsVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoodsDetailsVM.m; sourceTree = "<group>"; };
+		9AC2CC202B3A673B005187BD /* ASGoodsDetailsVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASGoodsDetailsVM.h; sourceTree = "<group>"; };
+		9AC2CC212B3A673B005187BD /* ASGoodsDetailsVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASGoodsDetailsVM.m; sourceTree = "<group>"; };
 		9ACBEC1F2A14585300A8F97A /* CTMediator+ASTargerts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CTMediator+ASTargerts.h"; sourceTree = "<group>"; };
 		9ACBEC202A14585300A8F97A /* CTMediator+ASTargerts.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "CTMediator+ASTargerts.m"; sourceTree = "<group>"; };
 		9ACBEC232A14707400A8F97A /* AS_SignUpC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AS_SignUpC.h; sourceTree = "<group>"; };
@@ -724,6 +742,10 @@
 		9AD6A5432A1218E7001DE3D9 /* EamilTFmatchV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EamilTFmatchV.m; sourceTree = "<group>"; };
 		9AD6A5472A1237D0001DE3D9 /* Target_Login.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Target_Login.h; sourceTree = "<group>"; };
 		9AD6A5482A1237D0001DE3D9 /* Target_Login.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Target_Login.m; sourceTree = "<group>"; };
+		9AF9085A2B397320008AC2D2 /* UIViewController+RY_configNet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIViewController+RY_configNet.h"; sourceTree = "<group>"; };
+		9AF9085B2B397320008AC2D2 /* UIViewController+RY_configNet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+RY_configNet.m"; sourceTree = "<group>"; };
+		9AF9085D2B3976F3008AC2D2 /* RYBaseVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RYBaseVM.h; sourceTree = "<group>"; };
+		9AF9085E2B3976F3008AC2D2 /* RYBaseVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RYBaseVM.m; sourceTree = "<group>"; };
 		F28014612B0095476AA5BC1B /* Pods-Asteria-NotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Asteria-NotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-Asteria-NotificationServiceExtension/Pods-Asteria-NotificationServiceExtension.debug.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -1181,6 +1203,7 @@
 		8172449C29F3B2ED005FA9C9 /* Asteria */ = {
 			isa = PBXGroup;
 			children = (
+				9A3F5CAC2B3BC10400DDB6A7 /* Base */,
 				81601FE72A2DC76C00E4A8F1 /* Third */,
 				9A2646BA2A187B6100CBFBDC /* Product */,
 				9A2027F32A137B6A00FF4DAF /* Asteria.entitlements */,
@@ -1587,6 +1610,7 @@
 		9A337E4F2A04FA0A00D058A5 /* Goods */ = {
 			isa = PBXGroup;
 			children = (
+				9A3F5CB02B3BF61B00DDB6A7 /* Assets */,
 				9A8DD8C22A0B8EDD00573324 /* Size */,
 				9A3735702A0B4606008BB3CE /* VM */,
 				9AD364C82A05E77200452C7A /* M */,
@@ -1600,12 +1624,39 @@
 		9A3735702A0B4606008BB3CE /* VM */ = {
 			isa = PBXGroup;
 			children = (
-				9A8DD8C62A0B93F600573324 /* GoodsDetailsVM.h */,
-				9A8DD8C72A0B93F600573324 /* GoodsDetailsVM.m */,
+				9AC2CC202B3A673B005187BD /* ASGoodsDetailsVM.h */,
+				9AC2CC212B3A673B005187BD /* ASGoodsDetailsVM.m */,
 			);
 			path = VM;
 			sourceTree = "<group>";
 		};
+		9A3F5CAC2B3BC10400DDB6A7 /* Base */ = {
+			isa = PBXGroup;
+			children = (
+				9A3F5CB32B3BF71A00DDB6A7 /* Assets */,
+				9A3F5CAD2B3BC11000DDB6A7 /* AlertMyCartDeleteV.h */,
+				9A3F5CAE2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m */,
+				9AF908592B396BD1008AC2D2 /* RYNetWork */,
+			);
+			path = Base;
+			sourceTree = "<group>";
+		};
+		9A3F5CB02B3BF61B00DDB6A7 /* Assets */ = {
+			isa = PBXGroup;
+			children = (
+				9A3F5CB12B3BF63A00DDB6A7 /* Goods.xcassets */,
+			);
+			path = Assets;
+			sourceTree = "<group>";
+		};
+		9A3F5CB32B3BF71A00DDB6A7 /* Assets */ = {
+			isa = PBXGroup;
+			children = (
+				9A3F5CB42B3BF73100DDB6A7 /* Base.xcassets */,
+			);
+			path = Assets;
+			sourceTree = "<group>";
+		};
 		9A5C64522A11E58F00CBB185 /* Login */ = {
 			isa = PBXGroup;
 			children = (
@@ -1841,9 +1892,15 @@
 		9AD364C72A05E76D00452C7A /* V */ = {
 			isa = PBXGroup;
 			children = (
-				9AD3459F2A08D55D005CA070 /* Banner */,
 				9AD3459C2A08D545005CA070 /* GoodsDetailSrcView.h */,
 				9AD3459D2A08D545005CA070 /* GoodsDetailSrcView.m */,
+				9A3F5CB62B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.h */,
+				9A3F5CB72B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.m */,
+				9AD3459F2A08D55D005CA070 /* Banner */,
+				9A3F5CA92B3BBEAB00DDB6A7 /* GoodsDetailsPayV.h */,
+				9A3F5CAA2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m */,
+				9A3F5CB92B3C192000DDB6A7 /* GoodsDetailsBottomV.h */,
+				9A3F5CBA2B3C192000DDB6A7 /* GoodsDetailsBottomV.m */,
 			);
 			path = V;
 			sourceTree = "<group>";
@@ -1920,6 +1977,17 @@
 			path = Target;
 			sourceTree = "<group>";
 		};
+		9AF908592B396BD1008AC2D2 /* RYNetWork */ = {
+			isa = PBXGroup;
+			children = (
+				9AF9085A2B397320008AC2D2 /* UIViewController+RY_configNet.h */,
+				9AF9085B2B397320008AC2D2 /* UIViewController+RY_configNet.m */,
+				9AF9085D2B3976F3008AC2D2 /* RYBaseVM.h */,
+				9AF9085E2B3976F3008AC2D2 /* RYBaseVM.m */,
+			);
+			path = RYNetWork;
+			sourceTree = "<group>";
+		};
 		AD6FCC75A25F3F751CF2E2EB /* Pods */ = {
 			isa = PBXGroup;
 			children = (
@@ -2025,8 +2093,10 @@
 				814F5D0F2A11B76F003847A9 /* Roboto-Bold.ttf in Resources */,
 				814F5D0B2A11B76F003847A9 /* Roboto-LightItalic.ttf in Resources */,
 				81354BF72A288AC20082C93A /* ASUI.xcassets in Resources */,
+				9A3F5CB52B3BF73100DDB6A7 /* Base.xcassets in Resources */,
 				814F5D112A11B76F003847A9 /* Roboto-Black.ttf in Resources */,
 				814F5D0E2A11B76F003847A9 /* Roboto-BlackItalic.ttf in Resources */,
+				9A3F5CB22B3BF63A00DDB6A7 /* Goods.xcassets in Resources */,
 				814F5D072A11B76F003847A9 /* Roboto-Regular.ttf in Resources */,
 				817244AD29F3B2EE005FA9C9 /* LaunchScreen.storyboard in Resources */,
 				9AD6A53E2A120CC3001DE3D9 /* Login.xcassets in Resources */,
@@ -2164,6 +2234,7 @@
 				81C326712A37020A002EF442 /* ASProductListMenuHeaderView.m in Sources */,
 				81601FF92A2DC78300E4A8F1 /* WMZBannerControl.m in Sources */,
 				81E73EC02B1AC49D00C10938 /* ASPointsViewModel.m in Sources */,
+				9A3F5CAF2B3BC11000DDB6A7 /* AlertMyCartDeleteV.m in Sources */,
 				81717C912A3BE39C00648139 /* ASProductSortFilterView.m in Sources */,
 				81C7962E2A539F4D003083B8 /* ASMessageListCell.m in Sources */,
 				81717D382A3D322700648139 /* KWNoHisWordsCell.m in Sources */,
@@ -2177,7 +2248,6 @@
 				81E5EE972A4A822D0075695F /* ASVipCenterCollectCell.m in Sources */,
 				81C796272A4FD898003083B8 /* ASBirthdayTreatViewController.m in Sources */,
 				81717D372A3D322700648139 /* KWHisCollectHeaderView.m in Sources */,
-				9A8DD8C82A0B93F700573324 /* GoodsDetailsVM.m in Sources */,
 				9AD346132A08D60F005CA070 /* ZFLoadingView.m in Sources */,
 				9ACBEC212A14585300A8F97A /* CTMediator+ASTargerts.m in Sources */,
 				8134C1AD2A13094F006EB0EC /* Target_userCenter.m in Sources */,
@@ -2191,7 +2261,9 @@
 				817244B029F3B2EE005FA9C9 /* main.m in Sources */,
 				8131A2872B36890200A191BE /* ASWindowManager.m in Sources */,
 				81717D202A3C4AE000648139 /* KWSearchSubTypeCell.m in Sources */,
+				9A3F5CAB2B3BBEAB00DDB6A7 /* GoodsDetailsPayV.m in Sources */,
 				81C796242A4FD63A003083B8 /* ASVipCouponsViewController.m in Sources */,
+				9AC2CC222B3A673B005187BD /* ASGoodsDetailsVM.m in Sources */,
 				816020252A2F1C9E00E4A8F1 /* ASHomeMainListModel.m in Sources */,
 				81717CA82A3C0AAA00648139 /* KWProductListFilterModel.m in Sources */,
 				81717D252A3C512700648139 /* Target_Category.m in Sources */,
@@ -2210,6 +2282,7 @@
 				9AD345B22A08D5ED005CA070 /* GoodsVideoCollectionViewCell.m in Sources */,
 				814F5CEF2A11B1F2003847A9 /* ASUserCenterViewController.m in Sources */,
 				81717D1C2A3C4AE000648139 /* KWSearchSubTypeModel.m in Sources */,
+				9AF9085C2B397320008AC2D2 /* UIViewController+RY_configNet.m in Sources */,
 				8160201F2A2F11AB00E4A8F1 /* ASHomeTipCollectCell.m in Sources */,
 				812021282B185C000026B8B5 /* ASCouponsModel.m in Sources */,
 				816020042A2DCC0200E4A8F1 /* ASHomeBannerModel.m in Sources */,
@@ -2227,6 +2300,7 @@
 				81DFA5592A4681E900DA708B /* ASPointEranCell.m in Sources */,
 				81354BE72A28786C0082C93A /* ASProductBaseModel.m in Sources */,
 				9A8DD8C52A0B8F1700573324 /* As_GoodsSizeC.m in Sources */,
+				9A3F5CB82B3BF90100DDB6A7 /* GoodsDetailsIntroduceV.m in Sources */,
 				8134C1BD2A1372D5006EB0EC /* ASUserCenterTableHeadView.m in Sources */,
 				9AD346002A08D60F005CA070 /* ZFPresentTransition.m in Sources */,
 				81717D112A3C4AE000648139 /* KWSearchViewModel.m in Sources */,
@@ -2256,8 +2330,10 @@
 				815DA3DF2A396BD300616EF7 /* ASMoreBtCell.m in Sources */,
 				9A1247942A1B082300126226 /* Fuction_Tool.m in Sources */,
 				81E5EE942A4A760D0075695F /* ASVipCenterLineItemView.m in Sources */,
+				9A3F5CBB2B3C192000DDB6A7 /* GoodsDetailsBottomV.m in Sources */,
 				81601FFF2A2DC8E700E4A8F1 /* ASHomeBannerCell.m in Sources */,
 				812021212B16CD630026B8B5 /* ASSginViewModel.m in Sources */,
+				9AF9085F2B3976F3008AC2D2 /* RYBaseVM.m in Sources */,
 				81CE28972AF4953C0012AA45 /* ASGiftCardModel.m in Sources */,
 				9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */,
 				811F42462A40533C00DA68F1 /* ASPointsHomeViewController.m in Sources */,

+ 27 - 0
Asteria/Base/AlertMyCartDeleteV.h

@@ -0,0 +1,27 @@
+//
+//  AlertMyCartDeleteV.h
+//  westkissMob
+//
+//  Created by 王猛 on 2022/10/19.
+//
+
+#import "TT_BaseV.h"
+
+NS_ASSUME_NONNULL_BEGIN
+typedef void (^AlertNoAction)(void);
+typedef void (^AlertYesAction)(void);
+typedef void (^AlertCloseSuccess)(void);
+
+@interface AlertMyCartDeleteV : TT_BaseV
+- (instancetype)initWithAlertVtitle:(NSMutableAttributedString *)titile;
+
+
+- (instancetype)initWithYesBtnAlertVtitle:(NSString *)titile yesTitle:(NSString *)btnTitle;
+
+
+- (instancetype)initWithPaytypeAlertV:(UIImage *)payImg closeBtnImg:(UIImage *)closeImg;
+
+-(void)alertv_show;
+@end
+
+NS_ASSUME_NONNULL_END

+ 271 - 0
Asteria/Base/AlertMyCartDeleteV.m

@@ -0,0 +1,271 @@
+//
+//  AlertMyCartDeleteV.m
+//  westkissMob
+//
+//  Created by 王猛 on 2022/10/19.
+//
+
+#import "AlertMyCartDeleteV.h"
+
+@interface AlertMyCartDeleteV (){
+    UIView * _maskView;
+
+}
+
+@property (nonatomic, strong) UIView *bgView;
+@property (nonatomic, strong) UIButton *closeBtn;
+@property (nonatomic, strong) QMUILabel *titleLab;
+@property (nonatomic, strong) UIButton *yesBtn;
+@property (nonatomic, strong) UIButton *noBtn;
+@end
+@implementation AlertMyCartDeleteV
+
+- (instancetype)initWithPaytypeAlertV:(UIImage *)payImg closeBtnImg:(UIImage *)closeImg{
+    self = [super init];
+    if (self) {
+        [self paytype_addSubViewPayImg:payImg closeBtnImg:closeImg];
+    }
+    return self;
+}
+
+- (void)dealTap:(UITapGestureRecognizer *)tap{
+    [self alertv_remove];
+}
+-(void)paytype_addSubViewPayImg:(UIImage *)payImg closeBtnImg:(UIImage *)closeImg{
+    self.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
+    _maskView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)];
+    _maskView.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.8];
+    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dealTap:)];
+    [_maskView addGestureRecognizer:tap];
+    [self addSubview:_maskView];
+    
+    UIImageView *payImgV = [[UIImageView alloc]initWithImage:payImg];
+    payImgV.frame = CGRectMake(0, 0, payImg.size.width, payImg.size.height);
+    payImgV.center = self.center;
+    payImgV.userInteractionEnabled  = YES;
+    [self addSubview:payImgV];
+    
+    UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+    closeBtn.frame = CGRectMake((payImgV.mj_w-40)/2, 10, 40, 40);
+    [closeBtn setImage:closeImg forState:UIControlStateNormal];
+    [closeBtn addTarget:self action:@selector(handle_closeBtnEvent:) forControlEvents:UIControlEventTouchUpInside];
+    [payImgV addSubview:closeBtn];
+}
+-(void)handle_closeBtnEvent:(UIButton *)btn{
+    [self alertv_remove];
+}
+
+
+
+
+-(void)alertv_show{
+    [[UIApplication sharedApplication].keyWindow addSubview:self];
+}
+
+
+-(void)alertv_remove{
+    [_maskView removeFromSuperview];
+    [self removeFromSuperview];
+
+}
+
+- (instancetype)initWithYesBtnAlertVtitle:(NSString *)titile yesTitle:(NSString *)btnTitle;{
+    self = [super init];
+    if (self) {
+        [self tt_setupViews];
+        [self alertTitleYesBtn_AddsubViews:titile yesTitle:btnTitle];
+        
+    }
+    return self;
+}
+
+#pragma mark - **************** 特殊方法 alertTitleYesBtn ****************
+-(void)alertTitleYesBtn_AddsubViews:(NSString *)title yesTitle:(NSString *)btnTitle{
+    [self.bgView addSubview:self.titleLab];
+    [self.bgView addSubview:self.yesBtn];
+    self.titleLab.font = [UIFont fontWithName:Rob_Regular size:14];
+    self.titleLab.text = title;
+    
+    self.yesBtn.backgroundColor = [UIColor colorWithHexString:@"#000000"];
+    self.yesBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:16];
+    [self.yesBtn setTitleColor:[UIColor colorWithHexString:@"#FFFFFF"] forState:UIControlStateNormal];
+    NSAttributedString *btnStr = [[NSAttributedString alloc] initWithString:btnTitle];
+    [self.yesBtn setAttributedTitle:btnStr forState:UIControlStateNormal];
+
+    [self.yesBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.mas_equalTo(132);
+        make.height.mas_equalTo(35);
+        make.centerX.mas_equalTo(0);
+        make.bottom.mas_equalTo(-30);
+    }];
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.closeBtn.mas_bottom).offset(20);
+        make.left.mas_equalTo(20);
+        make.width.mas_equalTo(KScreenWidth -70-40);
+        make.bottom.equalTo(self.yesBtn.mas_top).offset(-20);
+    }];
+    
+}
+
+
+
+
+
+- (instancetype)initWithAlertVtitle:(NSMutableAttributedString *)titile{
+    self = [super init];
+    if (self) {
+        [self tt_setupViews];
+        [self alertTitle_AddSubViews:titile];
+    }
+    return self;
+}
+
+
+
+
+#pragma mark - **************** 特殊方法 alertTitle_****************
+
+-(void)alertTitle_AddSubViews:(NSMutableAttributedString *)title{
+    [self.bgView addSubview:self.titleLab];
+    [self.bgView addSubview:self.yesBtn];
+    [self.bgView addSubview:self.noBtn];
+    [self alertTitle_titleVFrameWithTitle:title];
+}
+
+-(void)alertTitle_titleVFrameWithTitle:(NSMutableAttributedString *)title{
+    CGSize maxsize = CGSizeMake((KScreenWidth -70-40),MAXFLOAT);
+    title.yy_font = [UIFont fontWithName:Rob_Bold size:14];
+    YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:maxsize text:title];
+    CGFloat labelHeight = layout.textBoundingSize.height;
+    self.titleLab.attributedText = title;
+
+    self.titleLab.textAlignment = NSTextAlignmentCenter;
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.closeBtn.mas_bottom).offset(20);
+        make.left.mas_equalTo(20);
+        make.width.mas_equalTo(KScreenWidth -70-40);
+        make.height.mas_equalTo(labelHeight + 20);
+    }];
+    [self.noBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.mas_equalTo(120);
+        make.height.mas_equalTo(35);
+        make.centerX.mas_equalTo(0);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(20);
+        make.bottom.mas_equalTo(-30);
+        
+    }];
+    [self.yesBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.noBtn.mas_left).offset(-15);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(20);
+        make.height.mas_equalTo(35);
+        make.width.mas_equalTo(35);
+    }];
+}
+
+
+#pragma mark - **************** 公共方法 ****************
+
+- (void)tt_setupViews{
+    self.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
+    self.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.3];
+    [[UIApplication sharedApplication].keyWindow addSubview:self];
+    [self addSubview:self.bgView];
+    [self.bgView addSubview:self.closeBtn];
+    [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(35);
+        make.right.mas_equalTo(-35);
+        make.centerY.mas_equalTo(0);
+        make.height.mas_equalTo(200);
+    }];
+    
+    [self.closeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(20);
+        make.width.height.mas_equalTo(40);
+        make.centerX.mas_equalTo(0);
+    }];
+    
+}
+
+
+
+#pragma mark - **************** handle ****************
+-(void)handle_CloseViewEvent:(UIButton *)btn{
+    [self removeFromSuperview];
+}
+-(void)handle_yesClickEvent:(UIButton *)btn{
+    if (self.ViewtapClose) {
+        self.ViewtapClose(1, @"");
+    }
+    [self removeFromSuperview];
+}
+-(void)handle_noClickEvent:(UIButton *)btn{
+    if (self.ViewtapClose) {
+        self.ViewtapClose(0, @"");
+    }
+    [self removeFromSuperview];
+}
+
+
+-(UIView *)bgView{
+    if(!_bgView){
+        _bgView = [[UIView alloc]init];
+        _bgView.backgroundColor = [UIColor colorWithHexString:@"#FFDEE2"];
+    }
+    return _bgView;
+}
+
+-(UIButton *)closeBtn{
+    if(!_closeBtn){
+        _closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [_closeBtn setImage:[UIImage imageNamed:@"base_close_black"] forState:UIControlStateNormal];
+        [_closeBtn addTarget:self action:@selector(handle_CloseViewEvent:) forControlEvents:UIControlEventTouchUpInside];
+    }
+    return _closeBtn;
+}
+
+
+-(QMUILabel *)titleLab{
+    if(!_titleLab){
+        _titleLab = [[QMUILabel alloc]init];
+        _titleLab.textAlignment = NSTextAlignmentCenter;
+        _titleLab.font = [UIFont fontWithName:Rob_Bold size:14];
+    }
+    return _titleLab;
+}
+
+
+
+-(UIButton *)yesBtn{
+    if(!_yesBtn){
+        _yesBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        _yesBtn.backgroundColor = [UIColor clearColor];
+        [_yesBtn setTitle:@"YES" forState:UIControlStateNormal];
+        [_yesBtn setTitleColor:Col_000 forState:UIControlStateNormal];
+        [_yesBtn addTarget:self action:@selector(handle_yesClickEvent:) forControlEvents:UIControlEventTouchUpInside];
+        NSMutableAttributedString *noString = [[NSMutableAttributedString alloc] initWithString:@"YES"];
+        [noString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, [noString length])];
+        [_yesBtn setAttributedTitle:noString forState:UIControlStateNormal];
+        _yesBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:16];
+    }
+    return _yesBtn;
+}
+
+
+-(UIButton *)noBtn{
+    if(!_noBtn){
+        _noBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        _noBtn.backgroundColor = Col_000;
+        [_noBtn setTitleColor:Col_FFF forState:UIControlStateNormal];
+        [_noBtn addTarget:self action:@selector(handle_noClickEvent:) forControlEvents:UIControlEventTouchUpInside];
+        NSMutableAttributedString *noString = [[NSMutableAttributedString alloc] initWithString:@"NO"];
+        [noString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, [noString length])];
+        [_noBtn setAttributedTitle:noString forState:UIControlStateNormal];
+        _noBtn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:16];
+        
+    }
+    return _noBtn;
+}
+
+
+
+@end

+ 6 - 0
Asteria/Base/Assets/Base.xcassets/Contents.json

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

+ 23 - 0
Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/Contents.json

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

二進制
Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153.png


二進制
Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153@2x.png


二進制
Asteria/Base/Assets/Base.xcassets/base_add_white.imageset/组 11153@3x.png


+ 23 - 0
Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/Contents.json

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

二進制
Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014.png


二進制
Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014@2x.png


二進制
Asteria/Base/Assets/Base.xcassets/base_close_black.imageset/组 8014@3x.png


+ 23 - 0
Asteria/Base/Assets/Base.xcassets/base_share.imageset/Contents.json

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

二進制
Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150.png


二進制
Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150@2x.png


二進制
Asteria/Base/Assets/Base.xcassets/base_share.imageset/组 11150@3x.png


+ 23 - 0
Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/Contents.json

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

二進制
Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153.png


二進制
Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153@2x.png


二進制
Asteria/Base/Assets/Base.xcassets/base_subtract_white.imageset/组 11153@3x.png


+ 23 - 0
Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/Contents.json

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

二進制
Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646.png


二進制
Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646@2x.png


二進制
Asteria/Base/Assets/Base.xcassets/goods_close_white.imageset/组 9646@3x.png


+ 49 - 0
Asteria/Base/RYNetWork/RYBaseVM.h

@@ -0,0 +1,49 @@
+//
+//  RYBaseVM.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/25.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+@protocol RY_baseVMprotocol <NSObject>
+///获取网络请求的回调
+-(void)ry_respnsParseData:(id)data
+                    sucess:(BOOL)sucessOrFail
+                      mark:(NSString *)mark;
+
+
+///batch 多个 网络请求同步的代理
+///同步时发出了a、b、c 3个网络请求,我们希望在a、b、c 3个网络请求都结束的时候获得一个通知
+//-(void)pro_batchResponAry:(NSArray <UCMHttpRequestResponse *>*)responseAry success:(BOOL)success modelData:(NSMutableArray *_Nullable)modelAry;
+
+@end
+
+@interface RYBaseVM : NSObject
+@property (nonatomic, weak) id <RY_baseVMprotocol> delegate;
+
++ (instancetype)setupVMclass:(Class)VMclass;
+- (instancetype)initDelegate:(id<RY_baseVMprotocol>)delegte;
+
+
+-(void)ry_requestPostApi:(NSString *)mark param:(NSDictionary *)param;
+-(void)ry_requestGetApi:(NSString *)mark param:(NSDictionary *)param;
+
+
+
+//重写的方法 解析之后再传给 VC
+-(void)ry_respnsSucessWithPath:(NSString *)mark data:(id)data;
+
+-(void)ry_reponsFaildWithPath:(NSString *)mark code:(NSString *)code msg:(NSString *)msg;
+
+- (void)ry_VMconfigDelegateData:(id)data
+                      success:(BOOL)success
+                           mark:(NSString *)mark;
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
Asteria/Base/RYNetWork/RYBaseVM.m

@@ -0,0 +1,70 @@
+//
+//  RYBaseVM.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/25.
+//
+
+#import "RYBaseVM.h"
+
+@implementation RYBaseVM
++ (instancetype)setupVMclass:(Class)VMclass {
+    return [[VMclass alloc]init];
+}
+- (instancetype)initDelegate:(id<RY_baseVMprotocol>)delegte;
+{
+    self = [super init];
+    if (self) {
+        _delegate = delegte;
+    }
+    return self;
+}
+
+-(void)ry_requestPostApi:(NSString *)mark param:(NSDictionary *)param{
+    [ASNetTools.shared postWithPath:mark param:param success:^(id _Nonnull json) {
+        NSLog(@"mark--%@--param-%@\n-json--%@",mark,param,json);
+        [self ry_respnsSucessWithPath:mark data:json];
+    } faild:^(NSString * _Nonnull code, NSString * _Nonnull msg) {
+        [self ry_reponsFaildWithPath:mark code:code msg:msg];
+    }];
+}
+-(void)ry_requestGetApi:(NSString *)mark param:(NSDictionary *)param{
+    [ASNetTools.shared getWithPath:mark param:param success:^(id _Nonnull  json) {
+        NSLog(@"mark--%@--param-%@\n-json--%@",mark,param,json);
+        [self ry_respnsSucessWithPath:mark data:json];
+    } faild:^(NSString * _Nonnull code, NSString * _Nonnull msg) {
+        [self ry_reponsFaildWithPath:mark code:code msg:msg];
+    }];
+}
+
+
+
+
+//重写的方法 解析之后再传给 VC
+-(void)ry_respnsSucessWithPath:(NSString *)path data:(id)data{
+    [self ry_VMconfigDelegateData:data success:YES mark:path];
+}
+
+-(void)ry_reponsFaildWithPath:(NSString *)path code:(NSString *)code msg:(NSString *)msg{
+
+    [self ry_VMconfigDelegateData:msg success:NO mark:path];
+}
+
+
+#pragma mark - **************** VM调用绑定 Delgate ****************
+
+- (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];
+    }
+    
+ }
+
+
+
+
+
+
+@end

+ 16 - 0
Asteria/Base/RYNetWork/UIViewController+RY_configNet.h

@@ -0,0 +1,16 @@
+//
+//  UIViewController+RY_configNet.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/25.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UIViewController (RY_configNet)
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
Asteria/Base/RYNetWork/UIViewController+RY_configNet.m

@@ -0,0 +1,13 @@
+//
+//  UIViewController+RY_configNet.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/25.
+//
+
+#import "UIViewController+RY_configNet.h"
+
+@implementation UIViewController (RY_configNet)
+
+
+@end

+ 1 - 1
Asteria/Fuction/AMoule/AViewController.m

@@ -41,7 +41,7 @@
 - (void)didTappedPushBViewControllerButton:(UIButton *)button
 {
  
-    UIViewController *viewController = [[CTMediator sharedInstance] Goods_GoodsDetaileC:@{@"entity_id":@"40018"}];
+    UIViewController *viewController = [[CTMediator sharedInstance] Goods_GoodsDetailsC:@{@"entity_id":@"40018"}];
     [self.navigationController pushViewController:viewController animated:YES];
     
     

+ 6 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/Contents.json

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

+ 23 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/Contents.json

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

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_add_cart.imageset/组 10718@3x.png


+ 23 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/Contents.json

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

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_afterpay.imageset/afterpay弹窗@3x.png


+ 23 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Pay in 4 弹窗.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Pay in 4 弹窗@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Pay in 4 弹窗@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_alertv_paypal.imageset/Pay in 4 弹窗@3x.png


+ 23 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/Contents.json

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

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_afterpay.imageset/组 6533@3x.png


+ 23 - 0
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/Contents.json

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

二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410@2x.png


二進制
Asteria/Fuction/Goods/Assets/Goods.xcassets/goods_pay_paypal.imageset/组 8410@3x.png


+ 24 - 52
Asteria/Fuction/Goods/M/GoodsInformationM.h

@@ -8,70 +8,42 @@
 #import <Foundation/Foundation.h>
 
 NS_ASSUME_NONNULL_BEGIN
-@class GoodsCoupon;
-@class reviewsModel;
-@interface GoodsInformationM : NSObject
-@property (nonatomic, copy) NSString *product_details;
-
-@property(nonatomic, copy) NSString *goodsId;
-@property (nonatomic, copy) NSArray *imgarr;
-@property (nonatomic, copy) NSArray *imgDicAry;
-@property (nonatomic, copy) NSString *mp4Str;
-
-@property(nonatomic, copy) NSString *title;
-@property(nonatomic, copy) NSString *sale_num;
-@property(nonatomic, copy) NSString *reviews_count;
-@property (nonatomic, copy) NSString *href;
-@property (nonatomic, copy) NSString *href_normal;
-@property(nonatomic, copy) NSString *price;
-@property(nonatomic, copy) NSString *price_normal;
-@property(nonatomic, copy) NSString *final_price;
-@property(nonatomic, copy) NSString *final_price_normal;
-@property(nonatomic, copy) NSString *save_price;
-@property(nonatomic, copy) NSString *save_price_normal;
-///货币单位,后台给定,个人切换
-@property(nonatomic, copy) NSString *price_unit;
 
-///折扣
-@property(nonatomic, copy) NSString *percent;
-///优惠码
-@property (nonatomic, strong) NSArray <GoodsCoupon *>*coupon;
-@property (nonatomic, copy) NSString *countdown_status;
-@property (nonatomic, copy) NSString *countdown_details;
-
-///分期
-@property(nonatomic, copy) NSString *stages;
+@class MediaGalleryEntriesModel;
+@class OptionsModel;
+@class OptionsValuesM;
+@interface GoodsInformationM : NSObject
+@property (nonatomic, copy)NSString *name;
+@property (nonatomic, copy) NSString *price;
+@property (nonatomic, copy) NSString *final_prices;
+@property (nonatomic, copy) NSString *currency_symbol;
+@property (nonatomic, copy) NSString *sold;
+@property (nonatomic, copy) NSString *review_nums;
 
+@property (nonatomic, strong) NSArray <MediaGalleryEntriesModel *>*media_gallery_entries;
+@property (nonatomic, strong)         NSArray <OptionsModel *>*options;
 
-///short_description
-@property (nonatomic, copy) NSString *short_description;
 
-@property (nonatomic, strong)reviewsModel *reviews;
+@end
 
-///积分商品参数
-@property (nonatomic, copy) NSString *points;
+@interface MediaGalleryEntriesModel : NSObject
 
-+ (GoodsInformationM *)wm_demoData;
+@property (nonatomic, copy)           NSString *media_type;
+@property (nonatomic, copy)             NSString *label;
+@property (nonatomic, copy)             NSString *file;
 @end
 
+@interface OptionsModel : NSObject
+@property (nonatomic, copy) NSString *product_sku;
+@property (nonatomic, copy) NSString *title;
 
-@interface GoodsCoupon : NSObject
-@property(nonatomic, copy) NSString *coupon_title;
-///优惠码
-@property(nonatomic, copy) NSString *coupon_details;
-@property(nonatomic, copy) NSString *coupon_code;
-
+@property (nonatomic, strong) NSArray <OptionsValuesM *>*values;
 
 @end
 
-
-@interface reviewsModel : NSObject
-@property(nonatomic, copy) NSString *startsNum;
-@property(nonatomic, copy) NSString *reviewsNum;
-@property(nonatomic, strong) NSArray *showImgurls;
-@property(nonatomic, copy) NSString *picturesNum;
-
+@interface OptionsValuesM : NSObject
+@property (nonatomic, copy) NSString *title;
+@property (nonatomic, assign) double price;
 
 @end
-
 NS_ASSUME_NONNULL_END

+ 16 - 39
Asteria/Fuction/Goods/M/GoodsInformationM.m

@@ -9,57 +9,34 @@
 
 @implementation GoodsInformationM
 
-+ (GoodsInformationM *)wm_demoData {
-    GoodsInformationM *m = [[GoodsInformationM alloc] init];
-    m.title = @"Highlight Bob Wig Straight Middle Part Bob With Grey Highlights";
-    m.sale_num = @"15K";
-    m.reviews_count = @"231";
-    m.href = @"www.baidu.com";
-    m.price = @"146.10";
-    m.final_price = @"146.10";
-    m.price = @"171.88";
-    m.save_price = @"13.65";
-    NSMutableArray *couponAry = [[NSMutableArray alloc]init];
-    for (int i=0; i<4; i++) {
-        GoodsCoupon * coupon = [[GoodsCoupon alloc]init];
-        coupon.coupon_title = @"99";
-        coupon.coupon_details = @"5";
-        coupon.coupon_code = @"111111";
-        [couponAry addObject:coupon];
-    }
-    m.coupon = [couponAry copy];
-    
-    
-    reviewsModel *reviewM = [[reviewsModel alloc]init];
-    reviewM.startsNum = @"5";
-    reviewM.reviewsNum = @"621";
-    reviewM.showImgurls = @[@"https://media.glamour.com/photos/5f3e9ad26ed7249924aba0c7/1:1/w_1234,h_1234,c_limit/IMG_2772.jpg",
-                            @"https://media.glamour.com/photos/5f3e9ad26ed7249924aba0c7/1:1/w_1234,h_1234,c_limit/IMG_2772.jpg",
-                            @"https://media.glamour.com/photos/5f3e9ad26ed7249924aba0c7/1:1/w_1234,h_1234,c_limit/IMG_2772.jpg"];
-    reviewM.picturesNum = @"100";
-    m.reviews = reviewM;
-    return m;
-}
+
 
 
 + (NSDictionary *)mj_objectClassInArray
 {
-    return @{@"coupon": @"GoodsCoupon",
-    };
-}
-
-+ (NSDictionary *)mj_replacedKeyFromPropertyName {
     return @{
-        @"goodsId": @"id",
+        @"media_gallery_entries": @"MediaGalleryEntriesModel",
+        @"options" : @"OptionsModel",
     };
 }
 
 
 
+
+
 @end
-@implementation GoodsCoupon
+@implementation MediaGalleryEntriesModel
 @end
 
 
-@implementation reviewsModel
+@implementation OptionsModel
++ (NSDictionary *)mj_objectClassInArray
+{
+    return @{
+        @"values": @"OptionsValuesM",
+    };
+}
+@end
+
+@implementation OptionsValuesM
 @end

+ 1 - 1
Asteria/Fuction/Goods/Target/Target_Goods.h

@@ -10,7 +10,7 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @interface Target_Goods : NSObject
-- (UIViewController *)Action_GoodsDetaileC:(NSDictionary *)params;
+- (UIViewController *)Action_GoodsDetailsC:(NSDictionary *)params;
 @end
 
 NS_ASSUME_NONNULL_END

+ 1 - 1
Asteria/Fuction/Goods/Target/Target_Goods.m

@@ -9,7 +9,7 @@
 #import "AS_GoodsDetailsC.h"
 
 @implementation Target_Goods
-- (UIViewController *)Action_GoodsDetaileC:(NSDictionary *)params{
+- (UIViewController *)Action_GoodsDetailsC:(NSDictionary *)params{
     AS_GoodsDetailsC *vc = [[AS_GoodsDetailsC alloc]init];
     vc.entity_id = params[@"AS_GoodsDetailsC"];
     return vc;

+ 3 - 3
Asteria/Fuction/Goods/V/Banner/M/GoodsBannerModel.h

@@ -6,7 +6,7 @@
 //
 
 #import <Foundation/Foundation.h>
-
+#import "GoodsInformationM.h"
 NS_ASSUME_NONNULL_BEGIN
 typedef NS_ENUM(NSUInteger,CellContentType){
     CellContentTypeImg  ,
@@ -16,9 +16,9 @@ typedef NS_ENUM(NSUInteger,CellContentType){
 @interface GoodsBannerModel : NSObject
 @property(nonatomic, assign) CellContentType cellType;
 @property (nonatomic, copy) NSString *url;
-@property (nonatomic, copy) NSString *label;
+@property (nonatomic, copy) NSString *small;
 
-+(GoodsBannerModel *)xxx_loadWithModel:(NSDictionary *)bannerDic;
++(GoodsBannerModel *)xxx_loadWithModel:(MediaGalleryEntriesModel *)tempModel;
 @end
 
 NS_ASSUME_NONNULL_END

+ 8 - 4
Asteria/Fuction/Goods/V/Banner/M/GoodsBannerModel.m

@@ -9,15 +9,19 @@
 
 @implementation GoodsBannerModel
 
-+ (GoodsBannerModel *)xxx_loadWithModel:(NSDictionary *)bannerDic{
++ (GoodsBannerModel *)xxx_loadWithModel:(MediaGalleryEntriesModel *)tempModel{
     GoodsBannerModel *model = [[GoodsBannerModel alloc]init];
-    model.url = bannerDic[@"url"];
-    model.label = bannerDic[@"label"];
-    if([bannerDic[@"type"] isEqualToString:@"mp4"]){
+    if([tempModel.media_type isEqualToString:@"external-video"]){
         model.cellType = CellContentTypeVideo;
+        model.url = tempModel.label;
+        model.small = [NSString stringWithFormat:@"https:%@%@%@",HostPath,ProductImgPath,tempModel.file];
     }else{
         model.cellType = CellContentTypeImg;
+        model.url = [NSString stringWithFormat:@"https:%@%@%@",HostPath,ProductImgPath,tempModel.file];
+        model.small = [NSString stringWithFormat:@"https:%@%@%@",HostPath,ProductImgPath,tempModel.file];
     }
+    
+    
     return model;
 }
 

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

@@ -41,7 +41,7 @@ UICollectionViewDelegate>
 
 -(void)tt_confignewdata:(id)data{
     GoodsInformationM *model = (GoodsInformationM *)data;
-    NSMutableArray *imgArry =[NSMutableArray arrayWithArray:model.imgarr];
+    NSMutableArray <MediaGalleryEntriesModel *>*imgArry =[NSMutableArray arrayWithArray:model.media_gallery_entries];
     NSMutableArray *modelAry = [[NSMutableArray alloc]init];
     for (int i = 0; i< imgArry.count; i++) {
         GoodsBannerModel *model =  [GoodsBannerModel xxx_loadWithModel:imgArry[i]];
@@ -158,7 +158,7 @@ UICollectionViewDelegate>
 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
     GoodsBannerModel *model = self.dataAry[indexPath.row];
     SelectVCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SelectVCollectionViewCellID forIndexPath:indexPath];
-    [cell.imgV sd_setImageWithURL:[NSURL URLWithString:model.url] placeholderImage:UIImageDefaultImg_SD];
+    [cell.imgV sd_setImageWithURL:[NSURL URLWithString:model.small] placeholderImage:UIImageDefaultImg_SD];
     return cell;
 }
 

+ 216 - 2
Asteria/Fuction/Goods/V/GoodsDetailSrcView.m

@@ -7,16 +7,21 @@
 
 #import "GoodsDetailSrcView.h"
 #import "WKM_goodsBanner.h"
+#import "GoodsDetailsPayV.h"
+#import "GoodsDetailsIntroduceV.h"
 
 @interface GoodsDetailSrcView ()
 @property (nonatomic, strong) GoodsInformationM *infoModel;
-
 @property (nonatomic, strong) WKM_goodsBanner *goodsBanner;
 @property (nonatomic, strong) QMUILabel *titleLab;
 @property (nonatomic, strong) QMUILabel *soldLab;
 @property (nonatomic, strong) QMUILabel *reviewsLab;
 @property (nonatomic, strong) QMUILabel *priceLab;
-
+@property (nonatomic, strong) QMUILabel *saveLab;
+@property (nonatomic, strong) QMUILabel *couponLab;
+@property (nonatomic, strong) QMUILabel *sizeLab;
+@property (nonatomic, strong) GoodsDetailsPayV *datails_payV;
+@property (nonatomic, strong) GoodsDetailsIntroduceV *datails_IntroduceV;
 
 @end
 
@@ -24,24 +29,233 @@
 
 - (void)tt_addsubviewS{
     [self addSubview:self.goodsBanner];
+    [self addSubview:self.titleLab];
+    [self addSubview:self.soldLab];
+    [self addSubview:self.reviewsLab];
+    [self addSubview:self.priceLab];
+    [self addSubview:self.saveLab];
+    [self addSubview:self.couponLab];
+    [self addSubview:self.sizeLab];
+    [self addSubview:self.datails_payV];
+    [self addSubview:self.datails_IntroduceV];
+    
     [self.goodsBanner mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.top.mas_equalTo(0);
         make.width.mas_equalTo(KScreenWidth);
         make.height.mas_equalTo(KScreenWidth+112+10);
     }];
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.top.equalTo(self.goodsBanner.mas_bottom).offset(20);
+        make.height.mas_equalTo(45);
+    }];
+    [self.soldLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.height.mas_equalTo(16);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(10);
+    }];
+    [self.reviewsLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.titleLab.mas_right);
+        make.height.mas_equalTo(16);
+        make.top.equalTo(self.titleLab.mas_bottom).offset(10);
+    }];
+    [self.priceLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.reviewsLab.mas_bottom).offset(20);
+        make.height.mas_equalTo(24);
+    }];
+    [self.saveLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.priceLab.mas_right).offset(10);
+        make.height.mas_equalTo(20);
+        make.centerY.equalTo(self.priceLab);
+    }];
+    [self.couponLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.priceLab.mas_bottom).offset(20);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(45);
+    }];
+    [self.sizeLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.couponLab.mas_bottom).offset(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(45);
+    }];
+    [self.datails_payV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.sizeLab.mas_bottom).offset(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(78);
+    }];
+    [self.datails_IntroduceV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(10);
+        make.top.equalTo(self.datails_payV.mas_bottom).offset(10);
+        make.width.mas_equalTo(KScreenWidth-20);
+        make.height.mas_equalTo(120);
+    }];
 }
 - (void)tt_configData:(id)data{
     GoodsInformationM *model = (GoodsInformationM *)data;
     self.infoModel = model;
     [self.goodsBanner tt_confignewdata:model];
+    self.titleLab.text =MM_str(model.name);
+    //wm_todo  soldLab\ reviewsLab\ coupon 和 size
+    self.soldLab.text = [NSString stringWithFormat:@"SOLD: %@",model.sold] ;
+    NSMutableAttributedString *reviewsStr = [[NSMutableAttributedString alloc]
+                                             initWithString:[NSString stringWithFormat:@"REVIEWS:%@",model.review_nums]];
+    NSRange contentRange = {0,[reviewsStr length]};
+    [reviewsStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:contentRange];
+    self.reviewsLab.attributedText = reviewsStr;
+    self.reviewsLab.textAlignment = NSTextAlignmentRight;
+    
+    NSMutableAttributedString *priceAtr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@%@",model.currency_symbol,model.final_prices]];
+    [priceAtr addAttribute: NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#0B0B0B"] range:NSMakeRange(0, priceAtr.length)];
+    [priceAtr addAttribute:NSFontAttributeName value:[UIFont fontWithName:Rob_Bold size:20] range:NSMakeRange(0, priceAtr.length)];
+    NSString *saveStr = @"";
+    if(model.final_prices == model.price){
+        self.saveLab.hidden = YES;
+    }else{
+        self.saveLab.hidden = NO;
+        double savePrice = [model.price doubleValue]-[model.final_prices doubleValue];
+        saveStr = [NSString stringWithFormat:@"Save %@%.2f",model.currency_symbol,savePrice];
+        [priceAtr yy_appendString:@"  "];
+        NSMutableAttributedString *priceAtrSub1 = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@",model.price]];
+        priceAtrSub1.yy_color = [UIColor colorWithHexString:@"#8c8c8c"];
+        priceAtrSub1.yy_font = [UIFont fontWithName:Rob_Regular size:14];
+        priceAtrSub1.yy_strikethroughStyle =  NSUnderlineStyleSingle;
+        [priceAtr appendAttributedString:priceAtrSub1];
+    }
+    self.priceLab.attributedText = priceAtr;
+    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];
+    
 }
 
+#pragma mark - **************** handle ****************
+-(void)tap_sizeLab{ ///展开size 规格选择的页面
+    
+}
 
+-(void)handle_couponEvent:(UIButton *)btn{
+    //wm_todo
+    btn.selected = !btn.selected;
+}
 - (WKM_goodsBanner *)goodsBanner {
     if (!_goodsBanner) {
         _goodsBanner = [[WKM_goodsBanner alloc] init];
     }
     return _goodsBanner;
 }
+- (QMUILabel *)titleLab {
+    if (!_titleLab) {
+        _titleLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _titleLab.textAlignment = NSTextAlignmentLeft;
+        _titleLab.numberOfLines = 2;
+        _titleLab.textColor = [UIColor colorWithHexString:@"#000000"];
+        _titleLab.font = [UIFont fontWithName:Rob_Bold size:16];
+    }
+    return  _titleLab;
+}
+- (QMUILabel *)soldLab {
+    if (!_soldLab) {
+        _soldLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _soldLab.textAlignment = NSTextAlignmentLeft;
+        _soldLab.textColor = [UIColor colorWithHexString:@"#666666"];
+        _soldLab.font = [UIFont systemFontOfSize:12];
+    }
+    return  _soldLab;
+}
+- (QMUILabel *)reviewsLab {
+    if (!_reviewsLab) {
+        _reviewsLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _reviewsLab.textAlignment = NSTextAlignmentRight;
+        _reviewsLab.textColor = [UIColor colorWithHexString:@"#666666"];
+        _reviewsLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        //    reviewsStr.underlineStyle = NSUnderlineStyleSingle;
+    }
+    return  _reviewsLab;
+}
+- (QMUILabel *)priceLab {
+    if (!_priceLab) {
+        _priceLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _priceLab.textAlignment = NSTextAlignmentLeft;
+        _priceLab.textColor = [UIColor blackColor];
+        _priceLab.font = [UIFont systemFontOfSize:18];
+    }
+    return  _priceLab;
+}
+- (QMUILabel *)saveLab {
+    if (!_saveLab) {
+        _saveLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _saveLab.contentEdgeInsets= UIEdgeInsetsMake(10, 10, 10, 10);
+        _saveLab.backgroundColor = [UIColor colorWithHexString:@"#E0FFF5"];
+        _saveLab.textAlignment = NSTextAlignmentCenter;
+        _saveLab.textColor = [UIColor colorWithHexString:@"#113632"];
+        _saveLab.font = [UIFont fontWithName:Rob_Bold size:12];
+    }
+    return  _saveLab;
+}
+- (QMUILabel *)couponLab {
+    if (!_couponLab) {
+        _couponLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _couponLab.mj_size = CGSizeMake(KScreenWidth-20, 45);
+        _couponLab.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+        _couponLab.textAlignment = NSTextAlignmentLeft;
+        _couponLab.textColor = [UIColor colorWithHexString:@"#FFFFFF"];
+        _couponLab.font = [UIFont fontWithName:Rob_Bold size:14];
+        _couponLab.text = @"COUPON";
+        _couponLab.layer.cornerRadius = 4;
+        _couponLab.clipsToBounds = YES;
+        _couponLab.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
+        UIButton *btn = [[UIButton alloc]init];
+        btn.selected = NO;
+        [btn addTarget:self action:@selector(handle_couponEvent:) forControlEvents:UIControlEventTouchUpInside];
+        btn.frame = CGRectMake(_couponLab.mj_w-45-10, 0, 45, 45);
+        [btn setImage:[UIImage imageNamed:@"base_add_white"] forState:UIControlStateNormal];
+        [btn setImage:[UIImage imageNamed:@"base_subtract_white"] forState:UIControlStateSelected];
+        [_couponLab addSubview:btn];
+    }
+    return  _couponLab;
+}
+- (QMUILabel *)sizeLab {
+    if (!_sizeLab) {
+        _sizeLab = [[QMUILabel alloc] initWithFrame:CGRectZero];
+        _sizeLab.mj_size = CGSizeMake(KScreenWidth-20, 45);
+        _sizeLab.backgroundColor = [UIColor colorWithHexString:@"#113632"];
+        _sizeLab.textAlignment = NSTextAlignmentLeft;
+        _sizeLab.textColor = [UIColor colorWithHexString:@"#FFFFFF"];
+        _sizeLab.font = [UIFont fontWithName:Rob_Bold size:14];
+        _sizeLab.text = @"Size Selection";
+        _sizeLab.layer.cornerRadius = 4;
+        _sizeLab.clipsToBounds = YES;
+        _sizeLab.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
+        UIImageView *imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"base_add_white"]];
+        imgV.frame = CGRectMake(_sizeLab.mj_w-45-10, 0, 45, 45);
+        imgV.userInteractionEnabled = YES;
+        imgV.contentMode = UIViewContentModeCenter;
+        [_sizeLab addSubview:imgV];
+        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap_sizeLab)];
+        [_sizeLab addGestureRecognizer:tap];
+    }
+    return  _sizeLab;
+}
+-(GoodsDetailsPayV *)datails_payV{
+    if (!_datails_payV) {
+        _datails_payV = [[GoodsDetailsPayV alloc]initWithFrame:CGRectMake(10, 0, KScreenWidth-20, 78)];
+        _datails_payV.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+        _datails_payV.layer.cornerRadius = 4;
+        _datails_payV.clipsToBounds = YES;
+    }
+    return _datails_payV;
+}
+- (GoodsDetailsIntroduceV *)datails_IntroduceV {
+    if (!_datails_IntroduceV) {
+        _datails_IntroduceV = [[GoodsDetailsIntroduceV alloc] initWithFrame:CGRectMake(10, 0, KScreenWidth-20, 120)];
+        _datails_IntroduceV.backgroundColor = _F5F5F5;
+        _datails_IntroduceV.clipsToBounds = YES;
+    }
+    return _datails_IntroduceV;
+}
 
 @end

+ 16 - 0
Asteria/Fuction/Goods/V/GoodsDetailsBottomV.h

@@ -0,0 +1,16 @@
+//
+//  GoodsDetailsBottomV.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GoodsDetailsBottomV : TT_BaseV
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 77 - 0
Asteria/Fuction/Goods/V/GoodsDetailsBottomV.m

@@ -0,0 +1,77 @@
+//
+//  GoodsDetailsBottomV.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import "GoodsDetailsBottomV.h"
+@interface GoodsDetailsBottomV ()
+@property (nonatomic, strong) QMUIButton *shopBtn;
+@property (nonatomic, strong) QMUIButton *addCartBtn;
+@end
+@implementation GoodsDetailsBottomV
+
+- (void)tt_setupViews{
+    UIView *lineV = [[UIView alloc]init];
+    lineV.backgroundColor = [UIColor colorWithHexString:@"#666666"];
+    lineV.frame = CGRectMake(0, 0, KScreenWidth, 0.5);
+    [self addSubview:lineV];
+    [self addSubview:self.shopBtn];
+    [self addSubview:self.addCartBtn];
+    [self btnSetCornRious];
+    
+    
+}
+-(void)btnSetCornRious{
+    
+    UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.shopBtn.mj_w,  self.shopBtn.mj_h) byRoundingCorners: UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(4, 4)];
+    CAShapeLayer* shape = [[CAShapeLayer alloc] init];
+    shape.frame = CGRectMake(0, 0, self.shopBtn.mj_w, self.shopBtn.mj_h);
+    [shape setPath:rounded.CGPath];
+    self.shopBtn.layer.mask = shape;
+   
+    UIBezierPath* rounded1 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.addCartBtn.mj_w, self.addCartBtn.mj_h) byRoundingCorners:  UIRectCornerTopRight | UIRectCornerBottomRight cornerRadii:CGSizeMake(4, 4)];
+    CAShapeLayer* shape1 = [[CAShapeLayer alloc] init];
+    shape1.frame = CGRectMake(0, 0, self.addCartBtn.mj_w, self.addCartBtn.mj_h);
+    [shape1 setPath:rounded1.CGPath];
+    self.addCartBtn.layer.mask = shape1;
+}
+-(void)handle_shopEvent:(UIButton *)btn{
+    [self generaltriggermethodType:1 data:@""];
+}
+-(void)handle_addCartEvent:(UIButton *)btn{
+    [self generaltriggermethodType:2 data:@""];
+}
+
+
+- (QMUIButton *)shopBtn {
+    if (!_shopBtn) {
+        _shopBtn = [QMUIButton buttonWithType:UIButtonTypeCustom];
+        _shopBtn.backgroundColor = [UIColor colorWithHexString:@"#82E8CD"];
+        _shopBtn.frame = CGRectMake(10, 10, (self.mj_w-20)/3, 45);
+        [_shopBtn setTitleColor:Col_000 forState:UIControlStateNormal];
+        _shopBtn.titleLabel.font = [UIFont fontWithName:Rob_Bold size:16];
+        [_shopBtn setTitle:@"SHOP NOW" forState:UIControlStateNormal];
+         [_shopBtn addTarget:self action:@selector(handle_shopEvent:) forControlEvents:UIControlEventTouchUpInside];
+     }
+    return _shopBtn;
+}
+
+- (QMUIButton *)addCartBtn {
+    if (!_addCartBtn) {
+        _addCartBtn = [[QMUIButton alloc]init];
+        _addCartBtn.frame = CGRectMake((CGRectGetMaxX(self.shopBtn.frame)), 10, (self.mj_w-20)/3*2, 45);
+        _addCartBtn.backgroundColor = [UIColor colorWithHexString:@"#32CFB0"];
+        [_addCartBtn setTitleColor:Col_000 forState:UIControlStateNormal];
+        _addCartBtn.titleLabel.font = [UIFont fontWithName:Rob_Bold size:16];
+        [_addCartBtn setTitle:@"ADD TO CART" forState:UIControlStateNormal];
+        [_addCartBtn setImage:[UIImage imageNamed:@"goods_add_cart"] forState:UIControlStateNormal];
+         [_addCartBtn addTarget:self action:@selector(handle_addCartEvent:) forControlEvents:UIControlEventTouchUpInside];
+        _addCartBtn.imagePosition = QMUIButtonImagePositionLeft;
+        _addCartBtn.spacingBetweenImageAndTitle =10.0f;
+     }
+    return _addCartBtn;
+}
+
+@end

+ 16 - 0
Asteria/Fuction/Goods/V/GoodsDetailsIntroduceV.h

@@ -0,0 +1,16 @@
+//
+//  GoodsDetailsIntroduceV.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GoodsDetailsIntroduceV : TT_BaseV
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 32 - 0
Asteria/Fuction/Goods/V/GoodsDetailsIntroduceV.m

@@ -0,0 +1,32 @@
+//
+//  GoodsDetailsIntroduceV.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import "GoodsDetailsIntroduceV.h"
+#import "ASHomeTipCollectCell.h"
+
+@implementation GoodsDetailsIntroduceV
+- (void)tt_setupViews{
+    NSArray *titleArr = [NSArray arrayWithObjects:@"USA UK CAN\nFREE SHIPPING",@"INTERNATIONAL\nEXPRESS SHIPPING",@"SECURE PAYMENTS\nCREDIT PAY IN 4",@"30 DAYS FREE\nRETURN/EXCHANGE", nil];
+    NSArray *imgArr = @[@"trade_tip",@"air_tip",@"pay_tip",@"box_tip"];
+    
+    CGFloat margin = 10;
+    CGFloat w = (KScreenWidth- 3*margin-1)/2;
+    CGFloat h = w/172*55;
+    
+    for (int i=0; i<titleArr.count; i++) {
+        ASHomeTipCollectCell *cellV = [[ASHomeTipCollectCell alloc]init];
+        cellV.frame = CGRectFlatMake(i%2*(w+10), i/2*h, w, h);
+        NSString *titleStr = titleArr[i];
+        NSString *imgName = imgArr[i];
+        cellV.imgV.image = [UIImage imageNamed:imgName];
+        cellV.titleLb.text = titleStr;
+        [self addSubview:cellV];
+    }
+}
+
+
+@end

+ 25 - 0
Asteria/Fuction/Goods/V/GoodsDetailsPayV.h

@@ -0,0 +1,25 @@
+//
+//  GoodsDetailsPayV.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import <WMBase/WMBase.h>
+
+NS_ASSUME_NONNULL_BEGIN
+#define GoodsInfoPayTypeTag 10000
+
+typedef NS_ENUM(NSUInteger,GoodsInfoPayType){
+    GoodsInfoPayTypePaypal  ,
+    GoodsInfoPayTypeKlarna ,
+    GoodsInfoPayTypeAfeterpay
+    
+} ;
+
+@interface GoodsDetailsPayV : TT_BaseV
+@property (nonatomic, strong) QMUILabel *titleLab;
+@property (nonatomic, assign) GoodsInfoPayType btnPayType;
+@end
+
+NS_ASSUME_NONNULL_END

+ 44 - 0
Asteria/Fuction/Goods/V/GoodsDetailsPayV.m

@@ -0,0 +1,44 @@
+//
+//  GoodsDetailsPayV.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/27.
+//
+
+#import "GoodsDetailsPayV.h"
+#import "AlertMyCartDeleteV.h"
+
+@implementation GoodsDetailsPayV
+
+- (void)tt_setupViews{
+    [self addSubview:self.titleLab];
+    self.titleLab.frame = CGRectMake(10, 10, self.mj_w-20, 20);
+    NSArray *imgAry = @[@"goods_pay_paypal",@"goods_pay_afterpay"];
+    for (int i = 0; i<imgAry.count; i++) {
+        NSString *imgstr = imgAry[i];
+        UIButton *payBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [payBtn setImage:[UIImage imageNamed:imgstr] forState:UIControlStateNormal];
+        payBtn.tag =  GoodsInfoPayTypeTag+i;
+        [self addSubview:payBtn];
+        [payBtn addTarget:self action:@selector(pay_payBtnType:) forControlEvents:UIControlEventTouchUpInside];
+        payBtn.frame = CGRectMake(10+(10+76)*i, CGRectGetMaxY(self.titleLab.frame) + 10, 76, 24);
+    }
+}
+
+-(void)pay_payBtnType:(UIButton *)btn{
+    NSArray *alertvImgAry = @[@"goods_alertv_paypal",@"goods_alertv_afterpay"];
+    NSArray *closeImgAry = @[@"base_close_white",@"base_close_black"];
+    AlertMyCartDeleteV *payAlertV = [[AlertMyCartDeleteV alloc]initWithPaytypeAlertV:[UIImage imageNamed:alertvImgAry[btn.tag-GoodsInfoPayTypeTag]] closeBtnImg:[UIImage imageNamed:closeImgAry[btn.tag-GoodsInfoPayTypeTag]]];
+    [payAlertV alertv_show];
+    
+}
+- (QMUILabel *)titleLab{
+    if(!_titleLab){
+        _titleLab = [[QMUILabel alloc]init];
+        _titleLab.font = [UIFont fontWithName:Rob_Regular size:12];
+        _titleLab.textColor = [UIColor colorWithHexString:@"#0D1623"];
+    }
+    return _titleLab;
+}
+
+@end

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

@@ -9,6 +9,7 @@
 #import <WMBase/WMBase.h>
 NS_ASSUME_NONNULL_BEGIN
 
+
 @interface AS_GoodsDetailsC : UCMBaseC
 @property (nonatomic, copy) NSString *entity_id;
 

+ 38 - 25
Asteria/Fuction/Goods/VC/AS_GoodsDetailsC.m

@@ -7,10 +7,14 @@
 
 #import "AS_GoodsDetailsC.h"
 #import "GoodsDetailSrcView.h"
-#import "GoodsDetailsVM.h"
-@interface AS_GoodsDetailsC ()<TT_BaseScrollViewDelegate>
-@property (nonatomic, strong) GoodsDetailSrcView *scrV;
+#import "ASGoodsDetailsVM.h"
+#import "GoodsDetailsBottomV.h"
+@interface AS_GoodsDetailsC ()<TT_BaseScrollViewDelegate,RY_baseVMprotocol>
 @property (nonatomic, strong) GoodsInformationM *model;
+@property (nonatomic, strong) ASGoodsDetailsVM *VM;
+@property (nonatomic, strong) GoodsDetailSrcView *scrV;
+@property (nonatomic, strong) GoodsDetailsBottomV *bottomV;
+
 @end
 
 @implementation AS_GoodsDetailsC
@@ -23,57 +27,66 @@
 - (void)initSubviews{
     [super initSubviews];
     [self.view addSubview:self.scrV];
+    [self.view addSubview:self.bottomV];
     
 }
 - (void)viewDidLayoutSubviews{
     IPhoneXHeigh
     [self.scrV mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.right.bottom.mas_equalTo(0);
+        make.left.mas_equalTo(0);
+        make.width.mas_equalTo(KScreenWidth);
         make.top.mas_equalTo(securitytop_Y);
         make.bottom.mas_equalTo(-65-securityBottom_H);
     }];
 }
 
 - (void)ucm_bindvmmodel{
-    [self ucm_setupvm:[GoodsDetailsVM class]];
+    self.VM = [[ASGoodsDetailsVM alloc]initDelegate:self];
 }
 -(void)reqNet_GoodsDetails_productGetProduct{
     NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
-//    [params setObject:self.entity_id forKey:@"entity_id"];
-    [params setObject:@"48187" forKey:@"entity_id"];
+//    [params setObject:@"55475" forKey:@"productId"];
+    [params setObject:@"31556" forKey:@"productId"];
+    [params setObject:@"USD" forKey:@"currencyCode"];
     [MBProgressHUD showHUDAddedTo:self.view animated:YES];
-    [self ucm_confignetworkforname:GoodsDetails_productGetProduct params:params vmClass:[GoodsDetailsVM class]];
+    [self.VM ry_requestGetApi:Goods_productGetProductsById param:params];
 }
-- (void)ucm_vcResponseAllData:(UCMHttpRequestResponse *)allData Data:(NSMutableArray *)Data is_showmsg:(BOOL)is_showmsg is_list:(BOOL)is_list SucessORfail:(BOOL)SucessORfail has_more:(BOOL)has_more mark:(NSString *)mark extend_info:(NSDictionary *)extend_info{
+-(void)ry_respnsParseData:(id)data
+                    sucess:(BOOL)sucessOrFail
+                     mark:(NSString *)mark{
     [MBProgressHUD hideHUDForView:self.view animated:YES];
-    if(!SucessORfail){
-        if([mark isEqualToString:GoodsDetails_productGetProduct]){
-            [self.view makeToast:allData.ucm_responseMessage duration:2 position:CSToastPositionCenter title:@"" image:nil style:nil completion:^(BOOL didTap) {
-                [self.navigationController popViewControllerAnimated:YES];
-            }];
-        }else{
-            [self.view makeToast:allData.ucm_responseMessage duration:2 position:CSToastPositionCenter];
+    if(sucessOrFail){
+        if([mark isEqualToString:Goods_productGetProductsById]){
+            GoodsInformationM *model = (GoodsInformationM *)data;
+            self.title = model.name;
+            [self.scrV tt_configData:model];
         }
-        return;
-    }
-    if([mark isEqualToString:GoodsDetails_productGetProduct]){
-        GoodsInformationM *model =[Data firstObject];
-        self.title = model.title;
-//        double totalPay = [model.price stringByReplacingOccurrencesOfString:model.price_unit withString:@""].doubleValue;
-        self.model = model;
-        [self.scrV tt_configData:model];
     }
 }
 
 
 
-
 - (GoodsDetailSrcView *)scrV {
     if (!_scrV) {
         _scrV = [[GoodsDetailSrcView alloc] init];
+        _scrV.contentSize = CGSizeMake(KScreenWidth, MAXFLOAT);
         _scrV.TTscrolldelegate = self;
     }
     return _scrV;
 }
 
+
+
+
+
+- (GoodsDetailsBottomV *)bottomV {
+    if (!_bottomV) {
+        IPhoneXHeigh
+        _bottomV = [[GoodsDetailsBottomV alloc] initWithFrame:CGRectMake(0, KScreenHeight - securityBottom_H-65, KScreenWidth, securityBottom_H+65)];
+        _bottomV.backgroundColor = Col_FFF;
+        
+    }
+    return _bottomV;
+}
+
 @end

+ 18 - 0
Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.h

@@ -0,0 +1,18 @@
+//
+//  ASGoodsDetailsVM.h
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/26.
+//
+
+#import "RYBaseVM.h"
+#import "GoodsInformationM.h"
+
+#define Goods_productGetProductsById  BaseRequestrUrl(@"rewrite/product/getProductsById")
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASGoodsDetailsVM : RYBaseVM
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 17 - 0
Asteria/Fuction/Goods/VM/ASGoodsDetailsVM.m

@@ -0,0 +1,17 @@
+//
+//  ASGoodsDetailsVM.m
+//  Asteria
+//
+//  Created by 王猛 on 2023/12/26.
+//
+
+#import "ASGoodsDetailsVM.h"
+
+@implementation ASGoodsDetailsVM
+- (void)ry_respnsSucessWithPath:(NSString *)mark data:(id)data{
+    if([mark isEqualToString:Goods_productGetProductsById]){
+        GoodsInformationM *model = [GoodsInformationM mj_objectWithKeyValues:data];
+        [self ry_VMconfigDelegateData:model success:YES mark:mark];
+    }
+}
+@end

+ 0 - 34
Asteria/Fuction/Goods/VM/GoodsDetailsVM.h

@@ -1,34 +0,0 @@
-//
-//  GoodsDetailsVM.h
-//  Asteria
-//
-//  Created by 王猛 on 2023/5/10.
-//
-
-#import <WMBase/WMBase.h>
-#import "GoodsInformationM.h"
-NS_ASSUME_NONNULL_BEGIN
-
-@interface GoodsDetailsVM : UCMHttpRequestBaseVM
-///获取商品详情
-#define GoodsDetails_productGetProduct  @"product/getProduct"
-//获取商品评论图片
-#define GoodsDetails_productGetReviewImg @"product/getReviewImg"
-///获取商品评论列表
-#define GoodsDetails_productGetReviewList @"product/getReviewList"
-
-//////根据评论ID点赞
-#define GoodsDetails_productAddThumbsUp @"product/addThumbsUp"
-///根据评论ID取消点赞
-#define GoodsDetails_productDelThumbsUp @"product/delThumbsUp"
-
-///加评论上传图片
-#define WriteReview_indexUploader @"index/uploader"
-///添加商品评论
-#define WriteReview_productAaddReview @"product/addReview"
-
-///商品加购
-#define Cart_CarAdd @"car/add"
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 35
Asteria/Fuction/Goods/VM/GoodsDetailsVM.m

@@ -1,35 +0,0 @@
-//
-//  GoodsDetailsVM.m
-//  Asteria
-//
-//  Created by 王猛 on 2023/5/10.
-//
-
-#import "GoodsDetailsVM.h"
-
-@implementation GoodsDetailsVM
-
--(void)ucm_confignormalnetworksuccesswithresponse:(UCMHttpRequestResponse *)response{
-    if([response.ucm_responseObject[@"code"] integerValue] == -1){
-        [MBProgressHUD hideHUDForView:[Current_normalTool topViewController].view animated:YES];
-        return;
-    }
-    if([response.ucm_responseMark isEqualToString:GoodsDetails_productGetProduct]){
-        GoodsInformationM *model = [GoodsInformationM mj_objectWithKeyValues:response.ucm_responseObject[@"data"][@"product"]];
-        NSMutableArray *tempImgAry = [[NSMutableArray alloc]init];
-        for (NSDictionary *tempDic in model.imgarr) {
-            if([tempDic[@"type"] isEqualToString:@"mp4"]){
-                model.mp4Str = tempDic[@"url"];
-            }else if([tempDic[@"type"] isEqualToString:@"img"]){
-                [tempImgAry addObject:tempDic];
-            }
-        }
-        model.imgDicAry  = [tempImgAry copy];
-        [self ucm_configNewsRepose:response data:[NSMutableArray arrayWithObject:model] success:YES has_more:NO mark:response.ucm_responseMark extend_info:@{}];
-    }
-}
--(void)ucm_confignormalnetworkfailwithresponse:(UCMHttpRequestResponse *)response{
-    [self ucm_configNewsRepose:response data:[NSMutableArray array] is_showmsg:YES is_list:NO success:NO has_more:NO mark:response.ucm_responseMark extend_info:@{}];
-}
-
-@end

+ 1 - 1
Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.h

@@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
 -(UIViewController *)B_viewControllerWithContentText:(NSDictionary *)params;
 
 ///商品详情页面
--(UIViewController *)Goods_GoodsDetaileC:(NSDictionary *)params;
+-(UIViewController *)Goods_GoodsDetailsC:(NSDictionary *)params;
 
 ///登录页面
 -(UIViewController *)Login_LoginC:(NSDictionary *)params;

+ 2 - 2
Asteria/Product/CTMediatoaTargets/CTMediator+ASTargerts.m

@@ -14,8 +14,8 @@
     return [self performTarget:@"B" action:@"viewController" params:params shouldCacheTarget:NO];
 }
 
--(UIViewController *)Goods_GoodsDetaileC:(NSDictionary *)params{
-    return [self performTarget:@"Goods" action:@"GoodsDetaileC" params:params shouldCacheTarget:NO];
+-(UIViewController *)Goods_GoodsDetailsC:(NSDictionary *)params{
+    return [self performTarget:@"Goods" action:@"GoodsDetailsC" params:params shouldCacheTarget:NO];
 }
 
 -(UIViewController *)Login_LoginC:(NSDictionary *)params{

+ 1 - 1
Asteria/ThirdPartService.m

@@ -56,7 +56,7 @@
     Reachability* curReach = [note object];
     if ([curReach isKindOfClass:[Reachability class]]) {
         NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
-        [self updateInterfaceWithReachability: curReach];
+//        [self updateInterfaceWithReachability: curReach];
     } else {
         UIViewController *topVc = topViewController();
         [topVc.view makeToast:@"Network status has been switched."];