Explorar o código

Merge branch 'feature/liuxuqing' of http://git.caihongxingqiu.net/rainbow/platform-ios into feature/liuxuqing

Chris %!s(int64=6) %!d(string=hai) anos
pai
achega
fa5d3091c7
Modificáronse 77 ficheiros con 2846 adicións e 110 borrados
  1. 237 17
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 2 0
      RainbowPlanet/RainbowPlanet/Macro/ColorMacro.swift
  3. 60 0
      RainbowPlanet/RainbowPlanet/Modules/CommonModules/PickView/PickHeaderView.swift
  4. 136 0
      RainbowPlanet/RainbowPlanet/Modules/CommonModules/PickView/PickViewOneComponentsView.swift
  5. 76 0
      RainbowPlanet/RainbowPlanet/Modules/CommonModules/ShareModule/View/ShareCollectionViewCell.swift
  6. 143 0
      RainbowPlanet/RainbowPlanet/Modules/CommonModules/ShareModule/View/ShareView.swift
  7. 63 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailDescription/ProductDetailDescriptionTableViewCell.swift
  8. 88 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailEvaluation/ProductDetailEvaluationTableViewCell.swift
  9. 131 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailEvaluationList/ProductDetailEvaluationListTableViewCell.swift
  10. 129 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailHotSell/ProductDetailHotSellTableViewCell.swift
  11. 91 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailParameter/ProductDetailParameterTableViewCell.swift
  12. 218 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductInfo/ProductDetailProductInfoTableViewCell.swift
  13. 66 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuIconCollectionViewCell.swift
  14. 58 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuLabelCollectionViewCell.swift
  15. 209 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuTableViewCell.swift
  16. 101 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailShop/ProductDetailShopTableViewCell.swift
  17. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailFSPagerViewCell.swift
  18. 94 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailSectionHeader.swift
  19. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailTableViewHeaderView.swift
  20. 0 85
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailProductInfoTableViewCell.swift
  21. 152 7
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailView.swift
  22. 161 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductDetailHotSell/ProductDetailHotSellCollectionViewCell.swift
  23. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallBarChart/ProductMallBarChartCollectionViewCell.swift
  24. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallRightSideleftPicture/ProductRightSideleftPictureCollectionViewCell.swift
  25. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallSlidingLeftRight/ProductSlidingLeftRightCollectionViewCell.swift
  26. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductSlidingTopBottom/ProductSlidingTopBottomCollectionViewCell.swift
  27. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorBannerView.swift
  28. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorCenterHeaderCollectionReusableView.swift
  29. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorCenterTitleView.swift
  30. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorFullLeftHeaderCollectionReusableView.swift
  31. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorLeftHeaderCollectionReusableView.swift
  32. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorTitleView.swift
  33. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/TableViewCell/ProductHBigTableViewCell.swift
  34. 0 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/TableViewCell/ProductHSmallTableViewCell.swift
  35. 48 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopSectionHeaderView.swift
  36. 106 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopView.swift
  37. 105 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopViewShopInfoTableViewCell.swift
  38. 103 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopViewTableViewCell.swift
  39. 43 0
      RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/ViewController/ShopViewController.swift
  40. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/Contents.json
  41. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link.png
  42. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link@2x.png
  43. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link@3x.png
  44. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/Contents.json
  45. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments.png
  46. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments@2x.png
  47. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments@3x.png
  48. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/Contents.json
  49. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq.png
  50. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq@2x.png
  51. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq@3x.png
  52. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/Contents.json
  53. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone.png
  54. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone@2x.png
  55. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone@3x.png
  56. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/Contents.json
  57. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat.png
  58. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat@2x.png
  59. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat@3x.png
  60. 0 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/Contents.json
  61. 0 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload.png
  62. 0 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload@2x.png
  63. 0 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload@3x.png
  64. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/Contents.json
  65. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white.png
  66. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white@2x.png
  67. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white@3x.png
  68. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white.png
  69. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white@2x.png
  70. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white@3x.png
  71. 6 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/Contents.json
  72. 23 0
      RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/Contents.json
  73. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top.png
  74. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top@2x.png
  75. BIN=BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top@3x.png
  76. 33 0
      RainbowPlanet/RainbowPlanet/Tools/AlertSheetView/AlertSheetView.swift
  77. 26 1
      RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+NSMutableAttributedString.swift

+ 237 - 17
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -17,6 +17,27 @@
 		A70B2C252286C03800B2449F /* NXLPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C242286C03800B2449F /* NXLPageControl.swift */; };
 		A70B2C272286C5D600B2449F /* ProductDetailFSPagerViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C262286C5D600B2449F /* ProductDetailFSPagerViewCell.swift */; };
 		A70B2C292286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C282286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift */; };
+		A70B2C2D2286E29900B2449F /* Product.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A70B2C2C2286E29900B2449F /* Product.xcassets */; };
+		A70B2C3322880BB700B2449F /* ProductDetailProductSkuTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C3222880BB700B2449F /* ProductDetailProductSkuTableViewCell.swift */; };
+		A70B2C35228815F700B2449F /* ProductDetailProductSkuLabelCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C34228815F700B2449F /* ProductDetailProductSkuLabelCollectionViewCell.swift */; };
+		A70B2C372288177300B2449F /* ProductDetailProductSkuIconCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C362288177300B2449F /* ProductDetailProductSkuIconCollectionViewCell.swift */; };
+		A70B2C3E228825B100B2449F /* ProductDetailEvaluationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C3D228825B100B2449F /* ProductDetailEvaluationTableViewCell.swift */; };
+		A70B2C402288312900B2449F /* ProductDetailSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C3F2288312900B2449F /* ProductDetailSectionHeader.swift */; };
+		A70B2C4322883B4E00B2449F /* ProductDetailShopTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C4222883B4E00B2449F /* ProductDetailShopTableViewCell.swift */; };
+		A70B2C46228840B100B2449F /* ProductDetailHotSellTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C45228840B100B2449F /* ProductDetailHotSellTableViewCell.swift */; };
+		A70B2C492288416F00B2449F /* ProductDetailHotSellCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C482288416F00B2449F /* ProductDetailHotSellCollectionViewCell.swift */; };
+		A70B2C4C228845E800B2449F /* ProductDetailParameterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C4B228845E800B2449F /* ProductDetailParameterTableViewCell.swift */; };
+		A70B2C4E22884AE800B2449F /* ProductDetailDescriptionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C4D22884AE800B2449F /* ProductDetailDescriptionTableViewCell.swift */; };
+		A70B2C532288584500B2449F /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C522288584500B2449F /* ShareView.swift */; };
+		A70B2C5522885AF500B2449F /* ShareCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C5422885AF500B2449F /* ShareCollectionViewCell.swift */; };
+		A70B2C5A22886ADF00B2449F /* ShopViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C5922886ADF00B2449F /* ShopViewController.swift */; };
+		A70B2C5C22886B0000B2449F /* ShopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C5B22886B0000B2449F /* ShopView.swift */; };
+		A70B2C5E22886F4D00B2449F /* ShopViewTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C5D22886F4D00B2449F /* ShopViewTableViewCell.swift */; };
+		A70B2C60228870CE00B2449F /* ShopSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C5F228870CE00B2449F /* ShopSectionHeaderView.swift */; };
+		A70B2C64228875DE00B2449F /* ShopViewShopInfoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C63228875DE00B2449F /* ShopViewShopInfoTableViewCell.swift */; };
+		A70B2C6722887B2B00B2449F /* ProductDetailEvaluationListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C6622887B2B00B2449F /* ProductDetailEvaluationListTableViewCell.swift */; };
+		A70B2C6B2288815300B2449F /* PickHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C6A2288815300B2449F /* PickHeaderView.swift */; };
+		A70B2C6D2288815E00B2449F /* PickViewOneComponentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70B2C6C2288815E00B2449F /* PickViewOneComponentsView.swift */; };
 		A70EBBC022561179000AD74F /* Extension+UITableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70EBBBF22561179000AD74F /* Extension+UITableView.swift */; };
 		A7190167227543DB00104A50 /* baidu_cityid_rel.json in Resources */ = {isa = PBXBuildFile; fileRef = A7190166227543DB00104A50 /* baidu_cityid_rel.json */; };
 		A71901692275464000104A50 /* ProvinceCityAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71901682275464000104A50 /* ProvinceCityAreaView.swift */; };
@@ -311,6 +332,27 @@
 		A70B2C242286C03800B2449F /* NXLPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NXLPageControl.swift; sourceTree = "<group>"; };
 		A70B2C262286C5D600B2449F /* ProductDetailFSPagerViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailFSPagerViewCell.swift; sourceTree = "<group>"; };
 		A70B2C282286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailProductInfoTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C2C2286E29900B2449F /* Product.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Product.xcassets; sourceTree = "<group>"; };
+		A70B2C3222880BB700B2449F /* ProductDetailProductSkuTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailProductSkuTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C34228815F700B2449F /* ProductDetailProductSkuLabelCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailProductSkuLabelCollectionViewCell.swift; sourceTree = "<group>"; };
+		A70B2C362288177300B2449F /* ProductDetailProductSkuIconCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailProductSkuIconCollectionViewCell.swift; sourceTree = "<group>"; };
+		A70B2C3D228825B100B2449F /* ProductDetailEvaluationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailEvaluationTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C3F2288312900B2449F /* ProductDetailSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailSectionHeader.swift; sourceTree = "<group>"; };
+		A70B2C4222883B4E00B2449F /* ProductDetailShopTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailShopTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C45228840B100B2449F /* ProductDetailHotSellTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailHotSellTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C482288416F00B2449F /* ProductDetailHotSellCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailHotSellCollectionViewCell.swift; sourceTree = "<group>"; };
+		A70B2C4B228845E800B2449F /* ProductDetailParameterTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailParameterTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C4D22884AE800B2449F /* ProductDetailDescriptionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailDescriptionTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C522288584500B2449F /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
+		A70B2C5422885AF500B2449F /* ShareCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareCollectionViewCell.swift; sourceTree = "<group>"; };
+		A70B2C5922886ADF00B2449F /* ShopViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopViewController.swift; sourceTree = "<group>"; };
+		A70B2C5B22886B0000B2449F /* ShopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopView.swift; sourceTree = "<group>"; };
+		A70B2C5D22886F4D00B2449F /* ShopViewTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopViewTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C5F228870CE00B2449F /* ShopSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopSectionHeaderView.swift; sourceTree = "<group>"; };
+		A70B2C63228875DE00B2449F /* ShopViewShopInfoTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopViewShopInfoTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C6622887B2B00B2449F /* ProductDetailEvaluationListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailEvaluationListTableViewCell.swift; sourceTree = "<group>"; };
+		A70B2C6A2288815300B2449F /* PickHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PickHeaderView.swift; sourceTree = "<group>"; };
+		A70B2C6C2288815E00B2449F /* PickViewOneComponentsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PickViewOneComponentsView.swift; sourceTree = "<group>"; };
 		A70EBBBF22561179000AD74F /* Extension+UITableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+UITableView.swift"; sourceTree = "<group>"; };
 		A7190166227543DB00104A50 /* baidu_cityid_rel.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = baidu_cityid_rel.json; sourceTree = "<group>"; };
 		A71901682275464000104A50 /* ProvinceCityAreaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProvinceCityAreaView.swift; sourceTree = "<group>"; };
@@ -652,25 +694,26 @@
 		A70B2C112286B10000B2449F /* ProductDetail */ = {
 			isa = PBXGroup;
 			children = (
-				A70B2C1A2286B4F900B2449F /* ViewController */,
 				A70B2C192286B4ED00B2449F /* View */,
+				A70B2C1A2286B4F900B2449F /* ViewController */,
 			);
 			path = ProductDetail;
 			sourceTree = "<group>";
 		};
-		A70B2C122286B14C00B2449F /* Product */ = {
+		A70B2C122286B14C00B2449F /* ProductView */ = {
 			isa = PBXGroup;
 			children = (
 				A7B4E732228177BC0012914A /* ProductCollectionReusableView */,
 				A70B2C182286B48600B2449F /* TableViewCell */,
 				A70B2C132286B1C500B2449F /* CollectionViewCell */,
 			);
-			path = Product;
+			path = ProductView;
 			sourceTree = "<group>";
 		};
 		A70B2C132286B1C500B2449F /* CollectionViewCell */ = {
 			isa = PBXGroup;
 			children = (
+				A70B2C472288413E00B2449F /* ProductDetailHotSell */,
 				A70B2C172286B47B00B2449F /* ProductSlidingTopBottom */,
 				A70B2C162286B44600B2449F /* ProductMallBarChart */,
 				A70B2C152286B44600B2449F /* ProductMallRightSideleftPicture */,
@@ -723,10 +766,9 @@
 		A70B2C192286B4ED00B2449F /* View */ = {
 			isa = PBXGroup;
 			children = (
+				A70B2C3B228819E900B2449F /* ProductDetailHeader */,
+				A70B2C39228819CA00B2449F /* Cell */,
 				A70B2C1F2286B54500B2449F /* ProductDetailView.swift */,
-				A70B2C212286BF5900B2449F /* ProductDetailTableViewHeaderView.swift */,
-				A70B2C262286C5D600B2449F /* ProductDetailFSPagerViewCell.swift */,
-				A70B2C282286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -747,6 +789,159 @@
 			path = NXLPageControl;
 			sourceTree = "<group>";
 		};
+		A70B2C38228819B500B2449F /* ProductDetailProductSku */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C3222880BB700B2449F /* ProductDetailProductSkuTableViewCell.swift */,
+				A70B2C34228815F700B2449F /* ProductDetailProductSkuLabelCollectionViewCell.swift */,
+				A70B2C362288177300B2449F /* ProductDetailProductSkuIconCollectionViewCell.swift */,
+			);
+			path = ProductDetailProductSku;
+			sourceTree = "<group>";
+		};
+		A70B2C39228819CA00B2449F /* Cell */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C6522887B1600B2449F /* ProductDetailEvaluationList */,
+				A70B2C4F22884EF100B2449F /* ProductDetailDescription */,
+				A70B2C4A228845B200B2449F /* ProductDetailParameter */,
+				A70B2C442288408E00B2449F /* ProductDetailHotSell */,
+				A70B2C4122883B2F00B2449F /* ProductDetailShop */,
+				A70B2C3C2288259200B2449F /* ProductDetailEvaluation */,
+				A70B2C3A228819DC00B2449F /* ProductDetailProductInfo */,
+				A70B2C38228819B500B2449F /* ProductDetailProductSku */,
+			);
+			path = Cell;
+			sourceTree = "<group>";
+		};
+		A70B2C3A228819DC00B2449F /* ProductDetailProductInfo */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C282286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift */,
+			);
+			path = ProductDetailProductInfo;
+			sourceTree = "<group>";
+		};
+		A70B2C3B228819E900B2449F /* ProductDetailHeader */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C212286BF5900B2449F /* ProductDetailTableViewHeaderView.swift */,
+				A70B2C262286C5D600B2449F /* ProductDetailFSPagerViewCell.swift */,
+				A70B2C3F2288312900B2449F /* ProductDetailSectionHeader.swift */,
+			);
+			path = ProductDetailHeader;
+			sourceTree = "<group>";
+		};
+		A70B2C3C2288259200B2449F /* ProductDetailEvaluation */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C3D228825B100B2449F /* ProductDetailEvaluationTableViewCell.swift */,
+			);
+			path = ProductDetailEvaluation;
+			sourceTree = "<group>";
+		};
+		A70B2C4122883B2F00B2449F /* ProductDetailShop */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C4222883B4E00B2449F /* ProductDetailShopTableViewCell.swift */,
+			);
+			path = ProductDetailShop;
+			sourceTree = "<group>";
+		};
+		A70B2C442288408E00B2449F /* ProductDetailHotSell */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C45228840B100B2449F /* ProductDetailHotSellTableViewCell.swift */,
+			);
+			path = ProductDetailHotSell;
+			sourceTree = "<group>";
+		};
+		A70B2C472288413E00B2449F /* ProductDetailHotSell */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C482288416F00B2449F /* ProductDetailHotSellCollectionViewCell.swift */,
+			);
+			path = ProductDetailHotSell;
+			sourceTree = "<group>";
+		};
+		A70B2C4A228845B200B2449F /* ProductDetailParameter */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C4B228845E800B2449F /* ProductDetailParameterTableViewCell.swift */,
+			);
+			path = ProductDetailParameter;
+			sourceTree = "<group>";
+		};
+		A70B2C4F22884EF100B2449F /* ProductDetailDescription */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C4D22884AE800B2449F /* ProductDetailDescriptionTableViewCell.swift */,
+			);
+			path = ProductDetailDescription;
+			sourceTree = "<group>";
+		};
+		A70B2C502288581600B2449F /* ShareModule */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C512288582800B2449F /* View */,
+			);
+			path = ShareModule;
+			sourceTree = "<group>";
+		};
+		A70B2C512288582800B2449F /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C522288584500B2449F /* ShareView.swift */,
+				A70B2C5422885AF500B2449F /* ShareCollectionViewCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A70B2C5622886AAA00B2449F /* Shop */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C5822886ACC00B2449F /* ViewController */,
+				A70B2C5722886AC700B2449F /* View */,
+			);
+			path = Shop;
+			sourceTree = "<group>";
+		};
+		A70B2C5722886AC700B2449F /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C5B22886B0000B2449F /* ShopView.swift */,
+				A70B2C5D22886F4D00B2449F /* ShopViewTableViewCell.swift */,
+				A70B2C63228875DE00B2449F /* ShopViewShopInfoTableViewCell.swift */,
+				A70B2C5F228870CE00B2449F /* ShopSectionHeaderView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A70B2C5822886ACC00B2449F /* ViewController */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C5922886ADF00B2449F /* ShopViewController.swift */,
+			);
+			path = ViewController;
+			sourceTree = "<group>";
+		};
+		A70B2C6522887B1600B2449F /* ProductDetailEvaluationList */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C6622887B2B00B2449F /* ProductDetailEvaluationListTableViewCell.swift */,
+			);
+			path = ProductDetailEvaluationList;
+			sourceTree = "<group>";
+		};
+		A70B2C692288810700B2449F /* PickView */ = {
+			isa = PBXGroup;
+			children = (
+				A70B2C6A2288815300B2449F /* PickHeaderView.swift */,
+				A70B2C6C2288815E00B2449F /* PickViewOneComponentsView.swift */,
+			);
+			path = PickView;
+			sourceTree = "<group>";
+		};
 		A71901622275411C00104A50 /* ProvinceCityArea */ = {
 			isa = PBXGroup;
 			children = (
@@ -1002,6 +1197,8 @@
 		A729B5A52266DBC9004AE098 /* CommonModules */ = {
 			isa = PBXGroup;
 			children = (
+				A70B2C692288810700B2449F /* PickView */,
+				A70B2C502288581600B2449F /* ShareModule */,
 				A72C011F2275399D0065E0C3 /* ProvinceCityAreaModules */,
 				A7636ABD2268123B00374F9E /* LocationModule */,
 				A71AF0A3226E9D8A001730FE /* SearchModule */,
@@ -1182,24 +1379,24 @@
 			children = (
 				A72A728C22321DE000B21995 /* Extension+UIImage.swift */,
 				A72A728D22321DE000B21995 /* Extension+UITextView.swift */,
-				A72A728E22321DE000B21995 /* Extension+NSRange.swift */,
-				A72A729022321DE000B21995 /* Extension+UserDefaults.swift */,
-				A72A729122321DE000B21995 /* Extension+Array.swift */,
-				A72A729222321DE000B21995 /* Extension+String.swift */,
 				A72A729322321DE000B21995 /* Extension+UILabel.swift */,
+				A7778CB92244F14B00C7C47A /* Extension+UIViewController.swift */,
 				A72A729422321DE000B21995 /* Extension+UIAlertController.swift */,
-				A72A729722321DE000B21995 /* Extension+UIColor.swift */,
-				A72A729822321DE000B21995 /* Extension+RxTimer.swift */,
+				A70EBBBF22561179000AD74F /* Extension+UITableView.swift */,
+				A738D201225AD6AD00EEE860 /* Extension+UICollectionView.swift */,
+				A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */,
 				A72A729922321DE000B21995 /* Extension+UIButton.swift */,
+				A72A729722321DE000B21995 /* Extension+UIColor.swift */,
 				A72A729A22321DE000B21995 /* Extension+UIView.swift */,
 				A72A728F22321DE000B21995 /* Extension+NSMutableAttributedString.swift */,
+				A72A729222321DE000B21995 /* Extension+String.swift */,
+				A72A728E22321DE000B21995 /* Extension+NSRange.swift */,
+				A72A729122321DE000B21995 /* Extension+Array.swift */,
+				A72A729022321DE000B21995 /* Extension+UserDefaults.swift */,
 				A72A729D22321DE000B21995 /* Extension+Date.swift */,
 				A72A729E22321DE000B21995 /* Extension+CAGradientLayer.swift */,
 				A7778CA82244904500C7C47A /* Extension+Gifu.GIFImageView.swift */,
-				A7778CB92244F14B00C7C47A /* Extension+UIViewController.swift */,
-				A70EBBBF22561179000AD74F /* Extension+UITableView.swift */,
-				A738D201225AD6AD00EEE860 /* Extension+UICollectionView.swift */,
-				A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */,
+				A72A729822321DE000B21995 /* Extension+RxTimer.swift */,
 			);
 			path = Extension;
 			sourceTree = "<group>";
@@ -1632,7 +1829,8 @@
 		A77F2CA32232010F001BD3F6 /* ShoppingMallModule */ = {
 			isa = PBXGroup;
 			children = (
-				A70B2C122286B14C00B2449F /* Product */,
+				A70B2C5622886AAA00B2449F /* Shop */,
+				A70B2C122286B14C00B2449F /* ProductView */,
 				A70B2C112286B10000B2449F /* ProductDetail */,
 				A77F2CA42232010F001BD3F6 /* ShoppingMall */,
 				A7A98E03227EB7FD005306E9 /* Category */,
@@ -1740,6 +1938,7 @@
 				A71AF0BD226F1792001730FE /* ShoppingMallModule.xcassets */,
 				BD20F1D72283D2AA00677D8E /* ShoppingCartModule.xcassets */,
 				A7CC74DD22703B4A003C4F38 /* MineModule.xcassets */,
+				A70B2C2C2286E29900B2449F /* Product.xcassets */,
 				A729B5A92266F6FD004AE098 /* Launch Screen.storyboard */,
 				A77F2C6C2231FB4A001BD3F6 /* Info.plist */,
 			);
@@ -2519,6 +2718,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				A7CC74DE22703B4A003C4F38 /* MineModule.xcassets in Resources */,
+				A70B2C2D2286E29900B2449F /* Product.xcassets in Resources */,
 				A71AF0BE226F1792001730FE /* ShoppingMallModule.xcassets in Resources */,
 				A7778C9722438F5D00C7C47A /* AlipaySDK.bundle in Resources */,
 				A7190167227543DB00104A50 /* baidu_cityid_rel.json in Resources */,
@@ -2672,6 +2872,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A70B2C3322880BB700B2449F /* ProductDetailProductSkuTableViewCell.swift in Sources */,
 				A72A72BA22321DE000B21995 /* Extension+String.swift in Sources */,
 				A77F2CA02231FE45001BD3F6 /* BaseWebViewController.swift in Sources */,
 				BD20F1D52283D15500677D8E /* ShoppingCartPayFailureCell.swift in Sources */,
@@ -2679,6 +2880,7 @@
 				BD7AB83A2284288D0030646A /* ShoppingCartPayOrderFooter.swift in Sources */,
 				A72A72C522321DE000B21995 /* WKWebViewConfig.swift in Sources */,
 				A72A72BB22321DE000B21995 /* Extension+UILabel.swift in Sources */,
+				A70B2C372288177300B2449F /* ProductDetailProductSkuIconCollectionViewCell.swift in Sources */,
 				A77F2C9E2231FDDC001BD3F6 /* BaseViewController.swift in Sources */,
 				A7284A75225465DD000BAEC4 /* SwiftMoyaNetWorkServicePay.swift in Sources */,
 				A77F2CC722320627001BD3F6 /* WRNavigationBar.swift in Sources */,
@@ -2712,6 +2914,7 @@
 				A73D7C682268A032002A4CE3 /* SwiftyStarRatingView.swift in Sources */,
 				A71AA5102272156A008FF1A5 /* ExpressAddressListViewController.swift in Sources */,
 				A7A98E14227ED0E2005306E9 /* CategoryListModel.swift in Sources */,
+				A70B2C532288584500B2449F /* ShareView.swift in Sources */,
 				A71AF0AE226EF0A3001730FE /* SearchHeaderCollectionReusableView.swift in Sources */,
 				A7636AC52268139C00374F9E /* LocationViewController.swift in Sources */,
 				A7D46090227617D200A5A54E /* SQLModel.swift in Sources */,
@@ -2732,6 +2935,8 @@
 				BD20F1CD2283C51300677D8E /* ShoppingCartFinishPayController.swift in Sources */,
 				A729B5B022671310004AE098 /* MobileLoginView.swift in Sources */,
 				A71AA50C2272126A008FF1A5 /* EditAddressFooterView.swift in Sources */,
+				A70B2C35228815F700B2449F /* ProductDetailProductSkuLabelCollectionViewCell.swift in Sources */,
+				A70B2C60228870CE00B2449F /* ShopSectionHeaderView.swift in Sources */,
 				A7CC7528227196C4003C4F38 /* AccountSecuritySetTableViewCell.swift in Sources */,
 				A70B2C292286D77200B2449F /* ProductDetailProductInfoTableViewCell.swift in Sources */,
 				A72A726822321DBD00B21995 /* UMManager.swift in Sources */,
@@ -2761,6 +2966,7 @@
 				A7824B082271F53A00ABA381 /* EditSetDefaultTableViewCell.swift in Sources */,
 				A77F2CC3223203BA001BD3F6 /* AppDelegate+Window.swift in Sources */,
 				A7824B062271F25400ABA381 /* EditAddressTableViewCell.swift in Sources */,
+				A70B2C4C228845E800B2449F /* ProductDetailParameterTableViewCell.swift in Sources */,
 				A70EBBC022561179000AD74F /* Extension+UITableView.swift in Sources */,
 				A72A72B022321DE000B21995 /* CGView.swift in Sources */,
 				A7A98E0B227EBD04005306E9 /* CategorySearchView.swift in Sources */,
@@ -2773,6 +2979,7 @@
 				A757C9302274839900226355 /* SelfMentionAddressListModel.swift in Sources */,
 				A72A72D522321E2700B21995 /* ColorMacro.swift in Sources */,
 				A72A7333223256E100B21995 /* PayManager.swift in Sources */,
+				A70B2C6722887B2B00B2449F /* ProductDetailEvaluationListTableViewCell.swift in Sources */,
 				A775CC00223774A300EBDCF8 /* ShoppingMallView.swift in Sources */,
 				A7CC7526227196A8003C4F38 /* AccountSecurityTableViewCell.swift in Sources */,
 				A7CC74F122706FE3003C4F38 /* MessageOneCollectionViewCell.swift in Sources */,
@@ -2791,19 +2998,24 @@
 				A7D460942276854500A5A54E /* BaiduToCity2Model.swift in Sources */,
 				A72A72D422321E2700B21995 /* EnumMacro.swift in Sources */,
 				A7A98E41228046C5005306E9 /* ShoppingMallSepcialTableViewCell.swift in Sources */,
+				A70B2C5E22886F4D00B2449F /* ShopViewTableViewCell.swift in Sources */,
 				A7CC753A2271B98B003C4F38 /* AddressManagerAddTableViewCell.swift in Sources */,
 				A71AF0AC226EDE37001730FE /* SearchNavigationbarView.swift in Sources */,
+				A70B2C6D2288815E00B2449F /* PickViewOneComponentsView.swift in Sources */,
 				BDD4FB1422840954006FE833 /* ShoppingCartOrderPayView.swift in Sources */,
 				A70B2C222286BF5900B2449F /* ProductDetailTableViewHeaderView.swift in Sources */,
 				A7CC75432271E038003C4F38 /* SelfMentionContactsListViewController.swift in Sources */,
 				BDF47D872282C92200941AB9 /* ShoppingCartListTableViewHeader.swift in Sources */,
+				A70B2C46228840B100B2449F /* ProductDetailHotSellTableViewCell.swift in Sources */,
 				A7778CDF22461BAD00C7C47A /* PhoneCountryAreaSectionHeaderView.swift in Sources */,
 				A7A98E2D22801642005306E9 /* SwiftMoyaServiceCMSApi.swift in Sources */,
+				A70B2C402288312900B2449F /* ProductDetailSectionHeader.swift in Sources */,
 				A7A98E3122801B10005306E9 /* ShoppingMallListView.swift in Sources */,
 				A7CC751A22716254003C4F38 /* SetTableViewCell.swift in Sources */,
 				BD20F1D32283D0ED00677D8E /* ShoppingCartPaySuccessCell.swift in Sources */,
 				A71AA52822732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift in Sources */,
 				A775CC0322377C6500EBDCF8 /* EmptyView.swift in Sources */,
+				A70B2C4322883B4E00B2449F /* ProductDetailShopTableViewCell.swift in Sources */,
 				A70B2C102286A3BC00B2449F /* ProductDetailModel.swift in Sources */,
 				A72A72A922321DE000B21995 /* NumberKeyboard.swift in Sources */,
 				A79057082276FEB00037F823 /* SelfMentionContactsModel.swift in Sources */,
@@ -2839,6 +3051,7 @@
 				A72A72BC22321DE000B21995 /* Extension+UIAlertController.swift in Sources */,
 				A7BB68662269B1DD00AB07A2 /* AddressPOIView.swift in Sources */,
 				A72A72C322321DE000B21995 /* Extension+Date.swift in Sources */,
+				A70B2C5522885AF500B2449F /* ShareCollectionViewCell.swift in Sources */,
 				A7A98E3A2280312C005306E9 /* ShoppingMallCategoryTableViewCell.swift in Sources */,
 				A7778CAB2244B12500C7C47A /* CountDownManager.swift in Sources */,
 				A775CBFE2237493600EBDCF8 /* ShoppingMallNavigationBarView.swift in Sources */,
@@ -2850,6 +3063,7 @@
 				A72A73162232481600B21995 /* WeChatpayManager.swift in Sources */,
 				A7CC750F22715AAC003C4F38 /* MessageDetailesTableViewCell.swift in Sources */,
 				A7B4E72D228176060012914A /* ProductMallBarChartCollectionViewCell.swift in Sources */,
+				A70B2C4E22884AE800B2449F /* ProductDetailDescriptionTableViewCell.swift in Sources */,
 				A7CC7516227161D5003C4F38 /* SetViewController.swift in Sources */,
 				A7778CBA2244F14B00C7C47A /* Extension+UIViewController.swift in Sources */,
 				A7CC752C2271A1AE003C4F38 /* SetPasswordViewController.swift in Sources */,
@@ -2872,12 +3086,16 @@
 				A7CC751C22716426003C4F38 /* SetLogoutTableViewCell.swift in Sources */,
 				A7CC74F3227070D2003C4F38 /* MessageTwoCollectionViewCell.swift in Sources */,
 				A7778CD522460D8E00C7C47A /* PhoneCountryAreaTableViewCell.swift in Sources */,
+				A70B2C5C22886B0000B2449F /* ShopView.swift in Sources */,
 				A7CC750A22715755003C4F38 /* MessageDetailesViewController.swift in Sources */,
 				A71AF0B8226EF9EC001730FE /* SearchResultNavigationbarView.swift in Sources */,
+				A70B2C5A22886ADF00B2449F /* ShopViewController.swift in Sources */,
+				A70B2C3E228825B100B2449F /* ProductDetailEvaluationTableViewCell.swift in Sources */,
 				A79057022276C9770037F823 /* SetPasswordModel.swift in Sources */,
 				A729B5B42267254B004AE098 /* PasswordLoginViewController.swift in Sources */,
 				A7B4E7582282897B0012914A /* ProductFloorLeftHeaderCollectionReusableView.swift in Sources */,
 				A7D4608E227616F800A5A54E /* SQLiteManager.swift in Sources */,
+				A70B2C6B2288815300B2449F /* PickHeaderView.swift in Sources */,
 				A77F2C612231FB49001BD3F6 /* AppDelegate.swift in Sources */,
 				A729B5A82266F2E0004AE098 /* AlertSheetView.swift in Sources */,
 				A7CC75382271ADD6003C4F38 /* AddressManagerSelfMentionExpressHeaderView.swift in Sources */,
@@ -2887,6 +3105,7 @@
 				A7A98DFD227E84F4005306E9 /* SwiftMoyaServiceProductApi.swift in Sources */,
 				BD7AB8452284398A0030646A /* OrderPaySelfPickAddInfoCell.swift in Sources */,
 				A72A72D222321E2700B21995 /* Common.swift in Sources */,
+				A70B2C64228875DE00B2449F /* ShopViewShopInfoTableViewCell.swift in Sources */,
 				BDEF7791228571DC00ED0AC0 /* CommonPayView.swift in Sources */,
 				A71AF0A6226EDDC8001730FE /* SearchViewController.swift in Sources */,
 				BD20F1CF2283CE2300677D8E /* ShoppingCartFinishPayView.swift in Sources */,
@@ -2908,6 +3127,7 @@
 				A7284A522252EE9A000BAEC4 /* RootModel.swift in Sources */,
 				A72A7388223396CB00B21995 /* ApiMacro.swift in Sources */,
 				A72A72B922321DE000B21995 /* Extension+Array.swift in Sources */,
+				A70B2C492288416F00B2449F /* ProductDetailHotSellCollectionViewCell.swift in Sources */,
 				A71901692275464000104A50 /* ProvinceCityAreaView.swift in Sources */,
 				A7CC753E2271C4C2003C4F38 /* AddressManagerExpressTableViewCell.swift in Sources */,
 				A7778CDD2246121500C7C47A /* PhoneCountryAreaListMdoel.swift in Sources */,

+ 2 - 0
RainbowPlanet/RainbowPlanet/Macro/ColorMacro.swift

@@ -24,6 +24,8 @@ let kEnabledTitleColor = UIColor(hexString: "#FFFFFF")
 
 let k333333Color = UIColor(hexString: "333333")
 
+let k404040Color = UIColor(hexString: "404040")
+
 let kFE352BColor = UIColor(hexString: "FE352B")
 
 let k666666Color = UIColor(hexString: "666666")

+ 60 - 0
RainbowPlanet/RainbowPlanet/Modules/CommonModules/PickView/PickHeaderView.swift

@@ -0,0 +1,60 @@
+//
+//  PickHeaderView.swift
+//  ReceptionHall
+//
+//  Created by 南鑫林 on 2019/5/5.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+
+class PickHeaderView: BaseView {
+
+    override func setupViews() {
+        backgroundColor = kf5f5f5Color
+        addSubview(titleLabel)
+        addSubview(cancleButton)
+        addSubview(sureButton)
+    }
+    
+    override func setupLayouts() {
+        titleLabel.snp.makeConstraints { (make) in
+            make.center.equalToSuperview()
+        }
+        cancleButton.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.size.equalTo(kScaleWidth * 30)
+            make.left.equalTo(kScaleWidth * 7)
+        }
+        sureButton.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.size.equalTo(kScaleWidth * 30)
+            make.right.equalTo(kScaleWidth * -7)
+        }
+    }
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        return titleLabel
+    }()
+    
+    lazy var cancleButton: UIButton = {
+        let cancleButton = UIButton(type: UIButton.ButtonType.custom)
+        cancleButton.setTitle("取消", for: UIControl.State.normal)
+        return cancleButton
+    }()
+    
+    lazy var sureButton: UIButton = {
+        let sureButton = UIButton(type: UIButton.ButtonType.custom)
+        sureButton.setTitle("完成", for: UIControl.State.normal)
+
+        return sureButton
+    }()
+    
+    var title: String? {
+        didSet {
+            titleLabel.text = title
+        }
+    }
+
+}

+ 136 - 0
RainbowPlanet/RainbowPlanet/Modules/CommonModules/PickView/PickViewOneComponentsView.swift

@@ -0,0 +1,136 @@
+//
+//  SexView.swift
+//  ReceptionHall
+//
+//  Created by 南鑫林 on 2019/5/10.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+import FWPopupView
+import RxSwift
+import RxCocoa
+
+class PickViewOneComponentsView: FWPopupView {
+    
+    typealias SureClosure = (_ row: Int?,_ value:String?) -> Void
+    var sureClosure : SureClosure?
+    
+    var titles : [String]!
+    var title : String!
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    init(titles:[String],title:String) {
+        self.init()
+        self.titles = titles
+        self.title = title
+        setupViews()
+        setupLayouts()
+        setupData()
+    }
+
+    func setupViews() {
+        
+        addSubview(pickHeaderView)
+        addSubview(pickerView)
+    }
+    
+    func setupLayouts() {
+        pickHeaderView.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.height.equalTo(50)
+        }
+        pickerView.snp.makeConstraints { (make) in
+            make.top.equalTo(pickHeaderView.snp.bottom)
+            make.left.right.equalToSuperview()
+            make.bottom.equalTo(-kSafeTabBarHeight)
+        }
+    }
+    
+    func setupData() {
+        //按钮点击响应
+        pickHeaderView.sureButton.rx.tap
+            .bind { [weak self] in
+                self?.getPickerViewValue()
+            }
+            .disposed(by: disposeBag)
+        pickHeaderView.cancleButton.rx.tap.subscribe(onNext: {
+            (data) in
+            self.hide()
+        }).disposed(by: disposeBag)
+    }
+    
+    let disposeBag = DisposeBag()
+    
+    //触摸按钮时,获得被选中的索引
+    @objc func getPickerViewValue(){
+        let row = pickerView.selectedRow(inComponent: 0)
+        let value = titles![row]
+        if let sureClosure = sureClosure {
+            sureClosure(row,value)
+        }
+    }
+    
+    lazy var pickHeaderView: PickHeaderView = {
+        let pickHeaderView = PickHeaderView()
+        pickHeaderView.title = title
+        return pickHeaderView
+    }()
+    
+    lazy var pickerView: UIPickerView = {
+        let pickerView = UIPickerView()
+        //将dataSource设置成自己
+        pickerView.dataSource = self
+        //将delegate设置成自己
+        pickerView.delegate = self
+        return pickerView
+    }()
+
+}
+
+extension PickViewOneComponentsView : UIPickerViewDelegate,UIPickerViewDataSource {
+    //设置选择框的列数为1列,继承于UIPickerViewDataSource协议
+    func numberOfComponents(in pickerView: UIPickerView) -> Int {
+        return 1
+    }
+    
+    //设置选择框的行数为9行,继承于UIPickerViewDataSource协议
+    func pickerView(_ pickerView: UIPickerView,
+                    numberOfRowsInComponent component: Int) -> Int {
+        return titles.count
+    }
+    
+    //设置选择框各选项的内容,继承于UIPickerViewDelegate协议
+    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int,
+                    forComponent component: Int) -> String? {
+        for subView in pickerView.subviews {
+            if subView.frame.size.height < 1 {
+                //获取分割线view
+                subView.isHidden = false
+                let view = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 0.667))
+                view.backgroundColor = kf5f5f5Color //设置分割线颜色
+                subView.addSubview(view)
+            }
+        }
+        return titles[row]
+    }
+    
+    //设置列宽
+    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
+            //第一列变宽
+            return kScreenWidth
+    }
+    
+    // 设置行高
+    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int)
+        -> CGFloat {
+            return 48
+    }
+}

+ 76 - 0
RainbowPlanet/RainbowPlanet/Modules/CommonModules/ShareModule/View/ShareCollectionViewCell.swift

@@ -0,0 +1,76 @@
+//
+//  ShareCollectionViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShareCollectionViewCell: UICollectionViewCell {
+    class func cellWith(collectionView:UICollectionView,indexPath:IndexPath) -> ShareCollectionViewCell {
+        let ID = "ShareCollectionViewCell"
+        collectionView.register(ShareCollectionViewCell.self, forCellWithReuseIdentifier: ID)
+        let cell : ShareCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: ID, for: indexPath) as! ShareCollectionViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    //MARK: - indexPath
+    var indexPath: IndexPath?{
+        didSet {
+            
+        }
+    }
+    //MARK: - 初始化
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    //MARK: - 设置view
+    private func setupViews() {
+        addSubview(iconImageView)
+        addSubview(titleLabel)
+    }
+    
+    private func setupLayouts() {
+        iconImageView.snp.makeConstraints { (make) in
+            make.top.centerX.equalToSuperview()
+            make.size.equalTo(45)
+        }
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(iconImageView.snp.bottom).offset(8)
+            make.centerX.bottom.equalToSuperview()
+        }
+    }
+    
+    lazy var iconImageView: UIImageView = {
+        let iconImageView = UIImageView()
+        return iconImageView
+    }()
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kRegularFont13
+        return titleLabel
+    }()
+    
+    var titles : [String]? {
+        didSet {
+            titleLabel.text = titles![(indexPath?.row)!]
+        }
+    }
+    
+    var icons : [String]? {
+        didSet {
+            iconImageView.image = kImage(name: icons![(indexPath?.row)!])
+        }
+    }
+}

+ 143 - 0
RainbowPlanet/RainbowPlanet/Modules/CommonModules/ShareModule/View/ShareView.swift

@@ -0,0 +1,143 @@
+//
+//  ShareView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import FWPopupView
+import RxSwift
+import RxCocoa
+class ShareView: FWPopupView {
+    
+    let disposeBag = DisposeBag()
+    let titles = ["微信","朋友圈","QQ","QQ空间","复制链接"]
+    let icons = ["common_share_wechat","common_share_moments","common_share_qq","common_share_qzone","common_share_link"]
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    func setupViews() {
+        addSubview(titleLabel)
+        addSubview(oneLineLabel)
+        addSubview(twoLineLabel)
+        addSubview(cancelButton)
+        addSubview(collectionView)
+    }
+    
+    func setupLayouts() {
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.height.equalTo(48)
+        }
+        oneLineLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(titleLabel.snp.bottom)
+            make.left.right.equalToSuperview()
+            make.height.equalTo(1)
+        }
+        cancelButton.snp.makeConstraints { (make) in
+            make.left.right.equalToSuperview()
+            make.height.equalTo(48)
+            make.bottom.equalTo(-kSafeTabBarHeight)
+        }
+        twoLineLabel.snp.makeConstraints { (make) in
+            make.bottom.equalTo(cancelButton.snp.top)
+            make.left.right.equalToSuperview()
+            make.height.equalTo(1)
+        }
+        collectionView.snp.makeConstraints { (make) in
+            make.top.equalTo(oneLineLabel.snp.bottom)
+            make.bottom.equalTo(twoLineLabel.snp.top)
+            make.left.right.equalToSuperview()
+        }
+    }
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "分享至"
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kMediumFont16
+        titleLabel.textAlignment = .center
+        return titleLabel
+    }()
+    
+    lazy var oneLineLabel: UILabel = {
+        let oneLineLabel = UILabel()
+        oneLineLabel.backgroundColor = kf5f5f5Color
+        return oneLineLabel
+    }()
+    
+    lazy var twoLineLabel: UILabel = {
+        let twoLineLabel = UILabel()
+        twoLineLabel.backgroundColor = kf5f5f5Color
+        return twoLineLabel
+    }()
+    
+    lazy var cancelButton: UIButton = {
+        let cancelButton = UIButton()
+        cancelButton.setTitle("取消", for: UIControl.State.normal)
+        cancelButton.setTitleColor(k333333Color, for: UIControl.State.normal)
+        cancelButton.titleLabel?.font = kMediumFont16
+        cancelButton.rx.tap.subscribe(onNext: {
+            [weak self] (data) in
+            self?.hide()
+        }).disposed(by: disposeBag)
+        return cancelButton
+    }()
+    
+    private lazy var collectionView: UICollectionView = {
+        let collectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: collectionViewLayout)
+        collectionView.backgroundColor = UIColor.white
+        collectionView.delegate = self;
+        collectionView.dataSource = self;
+        collectionView.showsVerticalScrollIndicator = false
+        collectionView.showsHorizontalScrollIndicator = false
+        return collectionView
+    }()
+    
+    private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
+        let collectionViewLayout = UICollectionViewFlowLayout.init()
+        collectionViewLayout.scrollDirection = .horizontal
+        collectionViewLayout.minimumLineSpacing = 0
+        collectionViewLayout.minimumInteritemSpacing = 0
+        return collectionViewLayout
+    }()
+    
+}
+
+extension ShareView: UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
+    func numberOfSections(in collectionView: UICollectionView) -> Int {
+        return 1
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return titles.count
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = ShareCollectionViewCell.cellWith(collectionView: collectionView, indexPath: indexPath)
+        cell.titles = titles
+        cell.icons = icons
+        return cell
+        
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
+        return CGSize(width:kScreenWidth/5, height: 72)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
+        return UIEdgeInsets(top: 40, left: 0, bottom: 40, right: 0)
+    }
+    
+}
+

+ 63 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailDescription/ProductDetailDescriptionTableViewCell.swift

@@ -0,0 +1,63 @@
+//
+//  ProductDetailDescriptionTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailDescriptionTableViewCell: UITableViewCell {
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> UITableViewCell {
+        let ID = "ProductDetailDescriptionTableViewCell"
+        tableView.register(ProductDetailDescriptionTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailDescriptionTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailDescriptionTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(descriptionLabel)
+    }
+    
+    private func setupLayouts() {
+        descriptionLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(10)
+            make.bottom.equalTo(-10)
+            make.left.equalTo(14)
+            make.right.equalTo(-14)
+        }
+    }
+    
+    private lazy var descriptionLabel: UILabel = {
+        let descriptionLabel = UILabel()
+        let str = "<p>你好</p ><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是一个例子,请显示</p ><p>外加一个table</p ><table><tbody><tr class=\"firstRow\"><td valign=\"top\" width=\"261\">aaaa</td><td valign=\"top\" width=\"261\">bbbb</td><td valign=\"top\" width=\"261\">cccc</td></tr></tbody></table><p></p >"
+        let htmlData = NSString(string: str).data(using: String.Encoding.unicode.rawValue)
+        let options = [NSAttributedString.DocumentReadingOptionKey.documentType:
+            NSAttributedString.DocumentType.html]
+        let attributedString = try? NSMutableAttributedString(data: htmlData ?? Data(),options: options,documentAttributes: nil)
+        descriptionLabel.attributedText = attributedString
+        descriptionLabel.numberOfLines = 0
+        return descriptionLabel
+    }()
+
+}

+ 88 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailEvaluation/ProductDetailEvaluationTableViewCell.swift

@@ -0,0 +1,88 @@
+//
+//  ProductDetailEvaluationTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailEvaluationTableViewCell: UITableViewCell {
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ProductDetailEvaluationTableViewCell {
+        let ID = "ProductDetailEvaluationTableViewCell"
+        tableView.register(ProductDetailEvaluationTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailEvaluationTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailEvaluationTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(avatarImageView)
+        addSubview(nickNameLabel)
+        addSubview(evaluationLabel)
+    }
+    
+    private func setupLayouts() {
+        avatarImageView.snp.makeConstraints { (make) in
+            make.top.left.equalTo(14)
+            make.size.equalTo(24)
+        }
+        nickNameLabel.snp.makeConstraints { (make) in
+            make.centerY.equalTo(avatarImageView)
+            make.left.equalTo(avatarImageView.snp.right).offset(6)
+            make.right.equalTo(-14)
+        }
+        evaluationLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(avatarImageView.snp.bottom).offset(5)
+            make.left.equalTo(avatarImageView)
+            make.right.bottom.equalTo(-14)
+        }
+    }
+    
+    lazy var avatarImageView: UIImageView = {
+        let avatarImageView = UIImageView()
+        avatarImageView.image = kImage(name: "pic_preload")
+        avatarImageView.cornerRadius = 12
+        avatarImageView.masksToBounds = true
+        return avatarImageView
+    }()
+    
+    private lazy var nickNameLabel: UILabel = {
+        let nickNameLabel = UILabel()
+        nickNameLabel.text = "昵称"
+        nickNameLabel.textColor = k333333Color
+        nickNameLabel.font = kRegularFont13
+        return nickNameLabel
+    }()
+    
+    private lazy var evaluationLabel: UILabel = {
+        let evaluationLabel = UILabel()
+        evaluationLabel.textColor = k999999Color
+        evaluationLabel.font = kRegularFont13
+        evaluationLabel.numberOfLines = 0
+        let attributeString = NSMutableAttributedString(string:"猪肉很新鲜特别棒,配送很迅速第二天一大早就拿到手了,以后会常来的猪肉很新鲜特别棒,配送很迅速第二天一大早就拿到手了,以后会常来的")
+        attributeString.changeAllLineSpacing(2)
+        evaluationLabel.attributedText = attributeString
+        return evaluationLabel
+    }()
+
+}

+ 131 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailEvaluationList/ProductDetailEvaluationListTableViewCell.swift

@@ -0,0 +1,131 @@
+//
+//  ProductDetailEvaluationListTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/13.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailEvaluationListTableViewCell: UITableViewCell {
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> UITableViewCell {
+        let ID = "ProductDetailEvaluationListTableViewCell"
+        tableView.register(ProductDetailEvaluationListTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailEvaluationListTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailEvaluationListTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(avatarImagView)
+        addSubview(nameLabel)
+        addSubview(timeLabel)
+        addSubview(infoLabel)
+        addSubview(skuLabel)
+        addSubview(lineLabel)
+        
+    }
+    
+    private func setupLayouts() {
+        avatarImagView.snp.makeConstraints { (make) in
+            make.top.equalTo(20)
+            make.left.equalTo(14)
+            make.size.equalTo(28)
+        }
+        nameLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(avatarImagView.snp.right).offset(8)
+            make.centerY.equalTo(avatarImagView)
+            make.right.equalTo(timeLabel.snp.left).offset(-10)
+        }
+        timeLabel.snp.makeConstraints { (make) in
+            make.right.equalTo(-14)
+            make.centerY.equalTo(avatarImagView)
+        }
+        infoLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(avatarImagView.snp.bottom).offset(15)
+            make.left.equalTo(avatarImagView)
+            make.right.equalTo(timeLabel)
+        }
+        skuLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(infoLabel.snp.bottom).offset(15)
+            make.left.equalTo(avatarImagView)
+            make.right.equalTo(timeLabel)
+        }
+        lineLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(skuLabel.snp.bottom).offset(20)
+            make.left.equalTo(avatarImagView)
+            make.right.bottom.equalToSuperview()
+            make.height.equalTo(1)
+        }
+    }
+    
+    private lazy var avatarImagView: UIImageView = {
+        let avatarImagView = UIImageView()
+        avatarImagView.image = kImage(name: "pic_preload")
+        avatarImagView.cornerRadius = 14
+        avatarImagView.masksToBounds = true
+        return avatarImagView
+    }()
+    
+    private lazy var nameLabel: UILabel = {
+        let nameLabel = UILabel()
+        nameLabel.text = "昵称"
+        nameLabel.textColor = k333333Color
+        nameLabel.font = kRegularFont14
+        return nameLabel
+    }()
+    
+    private lazy var timeLabel: UILabel = {
+        let timeLabel = UILabel()
+        timeLabel.text = "2019-03-29 23:05"
+        timeLabel.textColor = kbbbbbbColor
+        timeLabel.font = kRegularFont12
+        return timeLabel
+    }()
+    
+    private lazy var infoLabel: UILabel = {
+        let infoLabel = UILabel()
+        infoLabel.textColor = k333333Color
+        infoLabel.font = kRegularFont14
+        infoLabel.numberOfLines = 0
+        let str = "猪肉很新鲜特别棒,配送很迅速第二天一大早就拿到手了,以后会常来的猪肉很新鲜特别棒,配送很迅速第二天一大早就拿到手了,以后会常来的"
+        let attributeString = NSMutableAttributedString(string:str)
+        attributeString.changeAllLineSpacing(2)
+        infoLabel.attributedText = attributeString
+        return infoLabel
+    }()
+    
+    private lazy var skuLabel: UILabel = {
+        let skuLabel = UILabel()
+        skuLabel.text = "规格:500g"
+        skuLabel.textColor = kbbbbbbColor
+        skuLabel.font = kRegularFont12
+        return skuLabel
+    }()
+    
+    private lazy var lineLabel: UILabel = {
+        let lineLabel = UILabel()
+        lineLabel.backgroundColor = kf5f5f5Color
+        return lineLabel
+    }()
+
+}

+ 129 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailHotSell/ProductDetailHotSellTableViewCell.swift

@@ -0,0 +1,129 @@
+//
+//  ProductDetailHotSellTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailHotSellTableViewCell: UITableViewCell {
+
+    var productModels : [ProductModel]? {
+        didSet {
+            collectionView.reloadData()
+        }
+    }
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ProductDetailHotSellTableViewCell {
+        let ID = "ProductDetailHotSellTableViewCell"
+        tableView.register(ProductDetailHotSellTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailHotSellTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailHotSellTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+
+        backgroundColor = kf7f8faColor
+        addSubview(collectionView)
+    }
+    
+    private func setupLayouts() {
+        collectionView.snp.remakeConstraints {(make) in
+            make.edges.equalToSuperview()
+        }
+    }
+    
+    private lazy var collectionView: UICollectionView = {
+        let collectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: collectionViewLayout)
+        collectionView.backgroundColor = UIColor.white
+        collectionView.delegate = self;
+        collectionView.dataSource = self;
+        collectionView.showsVerticalScrollIndicator = false
+        collectionView.showsHorizontalScrollIndicator = false
+        collectionView.cornerRadius = 4
+        collectionView.masksToBounds = true
+        return collectionView
+    }()
+    
+    private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
+        let collectionViewLayout = UICollectionViewFlowLayout.init()
+        collectionViewLayout.minimumLineSpacing = 7
+        collectionViewLayout.minimumInteritemSpacing = 0
+        collectionViewLayout.scrollDirection = .horizontal
+        return collectionViewLayout
+    }()
+    
+    /// 添加购物车
+    ///
+    /// - Returns:
+    func addCart(productModel:ProductModel,indexPath:IndexPath) {
+        productModel.isSelect = 1
+        productModel.amount = 1
+        SwiftMoyaNetWorkServiceProduct.shared().productCartAddApi(productMdl: productModel) {
+            [weak self] (cartAmountModel) -> (Void) in
+            let cartAmountModel = cartAmountModel as? CartAmountModel
+            let productModel = self?.productModels![indexPath.row]
+            productModel!.cartId = cartAmountModel?.id ?? 0
+            productModel!.amount = 1
+            self!.collectionView.reloadItems(at: [indexPath])
+            SwiftProgressHUD.shared().showText("已加入购物车")
+            
+        }
+    }
+    
+}
+
+extension ProductDetailHotSellTableViewCell: UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
+    func numberOfSections(in collectionView: UICollectionView) -> Int {
+        
+//        return productModels?.isEmpty ?? true ? 0 : 1
+        return 1
+
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+//        return productModels?.isEmpty ?? true ? 0 : productModels?.count ?? 0
+        return 10
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = ProductDetailHotSellCollectionViewCell.cellWith(collectionView: collectionView, indexPath: indexPath)
+//        cell.productModel = productModels?[indexPath.row]
+//        cell.plusClosure = {
+//            [weak self] (productModel,indexPath) in
+//            self?.addCart(productModel: productModel!, indexPath: indexPath!)
+//        }
+        return cell
+        
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
+        return CGSize(width:120, height: 153)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
+        return UIEdgeInsets(top: 10, left: 14, bottom: 10, right: 14)
+    }
+    
+}

+ 91 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailParameter/ProductDetailParameterTableViewCell.swift

@@ -0,0 +1,91 @@
+//
+//  ProductDetailParameterTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailParameterTableViewCell: UITableViewCell {
+
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> UITableViewCell {
+        let ID = "ProductDetailParameterTableViewCell"
+        tableView.register(ProductDetailParameterTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailParameterTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailParameterTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            if indexPath?.row == 4 {
+                lookTestReportButton.isHidden = false
+            }else {
+                lookTestReportButton.isHidden = true
+            }
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(titleLabel)
+        addSubview(contentLabel)
+        addSubview(lookTestReportButton)
+    }
+    
+    private func setupLayouts() {
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(6)
+            make.left.equalTo(14)
+            make.bottom.equalTo(-6)
+        }
+        contentLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(6)
+            make.bottom.equalTo(-6)
+            make.left.equalTo(titleLabel.snp.right).offset(11)
+        }
+        lookTestReportButton.snp.makeConstraints { (make) in
+            make.centerY.equalTo(contentLabel)
+            make.left.equalTo(contentLabel.snp.right).offset(11)
+        }
+    }
+    
+    private lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "产品名称"
+        titleLabel.textColor = k999999Color
+        titleLabel.font = kRegularFont13
+        return titleLabel
+    }()
+    
+    private lazy var contentLabel: UILabel = {
+        let contentLabel = UILabel()
+        contentLabel.text = "彩虹星球山东章姬大草莓"
+        contentLabel.textColor = k333333Color
+        contentLabel.font = kRegularFont13
+        contentLabel.numberOfLines = 0
+        return contentLabel
+    }()
+    
+    private lazy var lookTestReportButton: UIButton = {
+        let lookTestReportButton = UIButton()
+        lookTestReportButton.setTitle("查看检测报告>>", for: UIControl.State.normal)
+        lookTestReportButton.setTitleColor(kFFA42FColor, for: UIControl.State.normal)
+        lookTestReportButton.titleLabel?.font = kMediumFont13
+        lookTestReportButton.isHidden = true
+        return lookTestReportButton
+    }()
+
+}

+ 218 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductInfo/ProductDetailProductInfoTableViewCell.swift

@@ -0,0 +1,218 @@
+//
+//  ProductDetailProductInfoTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/11.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import RxSwift
+
+class ProductDetailProductInfoTableViewCell: UITableViewCell {
+    
+    let disposeBag = DisposeBag()
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ProductDetailProductInfoTableViewCell {
+        let ID = "ProductDetailProductInfoTableViewCell"
+        tableView.register(ProductDetailProductInfoTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailProductInfoTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailProductInfoTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(topBgView)
+        addSubview(bottomBgView)
+        topBgView.addSubview(sellPriceLabel)
+        topBgView.addSubview(markPriceLabel)
+        topBgView.addSubview(soldNumberLabel)
+        topBgView.addSubview(stockLabel)
+        bottomBgView.addSubview(titleLabel)
+        bottomBgView.addSubview(timeLabel)
+        bottomBgView.addSubview(detailTitleLabel)
+        bottomBgView.addSubview(shareButton)
+    }
+    
+    private func setupLayouts() {
+        
+        topBgView.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.height.equalTo(44)
+        }
+        sellPriceLabel.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.left.equalTo(9)
+            make.height.equalTo(19)
+        }
+        
+        markPriceLabel.snp.makeConstraints { (make) in
+            make.bottom.equalTo(sellPriceLabel)
+            make.left.equalTo(sellPriceLabel.snp.right).offset(6)
+            make.height.equalTo(13)
+        }
+        
+        stockLabel.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.right.equalTo(-14)
+        }
+        
+        soldNumberLabel.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.right.equalTo(stockLabel.snp.left).offset(-12)
+        }
+        
+        bottomBgView.snp.makeConstraints { (make) in
+            make.bottom.left.right.equalToSuperview()
+            make.top.equalTo(topBgView.snp.bottom)
+        }
+        
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(20)
+            make.left.equalTo(14)
+            make.right.equalTo(70)
+        }
+        
+        timeLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(titleLabel.snp.bottom).offset(10)
+            make.left.equalTo(titleLabel)
+        }
+        
+        detailTitleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(timeLabel.snp.bottom).offset(10)
+            make.bottom.equalTo(-20)
+            make.left.equalTo(titleLabel)
+            make.right.equalTo(-14)
+        }
+        shareButton.snp.makeConstraints { (make) in
+            make.top.equalTo(20)
+            make.width.equalTo(66)
+            make.height.equalTo(24)
+            make.right.equalTo(0)
+        }
+        
+    }
+    
+    private lazy var topBgView: UIView = {
+        let topBgView = UIView()
+        topBgView.backgroundColor = kFFA42FColor
+        return topBgView
+    }()
+    
+    private lazy var sellPriceLabel : UILabel = {
+        let sellPriceLabel = UILabel()
+        sellPriceLabel.textColor = UIColor.white
+        sellPriceLabel.font = kMediumFont24
+        return sellPriceLabel
+    }()
+    
+    private lazy var markPriceLabel : UILabel = {
+        let markPriceLabel = UILabel()
+        markPriceLabel.textColor = UIColor.white
+        markPriceLabel.font = kRegularFont13
+        return markPriceLabel
+    }()
+    
+    private lazy var soldNumberLabel : UILabel = {
+        let soldNumberLabel = UILabel()
+        soldNumberLabel.textColor = UIColor.white
+        soldNumberLabel.font = kRegularFont12
+        return soldNumberLabel
+    }()
+    
+    private lazy var stockLabel : UILabel = {
+        let markPrice = UILabel()
+        markPrice.textColor = UIColor.white
+        markPrice.font = kRegularFont12
+        return markPrice
+    }()
+    
+    private lazy var bottomBgView: UIView = {
+        let bottomBgView = UIView()
+        bottomBgView.backgroundColor = UIColor.white
+        return bottomBgView
+    }()
+    
+    private lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kMediumFont17
+        titleLabel.numberOfLines = 0
+        return titleLabel
+    }()
+    
+    private lazy var timeLabel: UILabel = {
+        let timeLabel = UILabel()
+        timeLabel.backgroundColor = kFFF1EBColor
+        timeLabel.textColor = kFE5706Color
+        timeLabel.font = kRegularFont13
+        timeLabel.cornerRadius = 20/2
+        timeLabel.masksToBounds = true
+        return timeLabel
+    }()
+    
+    private lazy var detailTitleLabel: UILabel = {
+        let detailTitleLabel = UILabel()
+        detailTitleLabel.textColor = k999999Color
+        detailTitleLabel.font = kRegularFont13
+        detailTitleLabel.numberOfLines = 0
+        return detailTitleLabel
+    }()
+    
+    private lazy var shareButton: UIButton = {
+        let shareButton = UIButton(type: UIButton.ButtonType.custom)
+        shareButton.backgroundColor = kf5f5f5Color
+        shareButton.setTitle("分享", for: UIControl.State.normal)
+        shareButton.setTitleColor(k999999Color, for: UIControl.State.normal)
+        shareButton.setImage(kImage(name: ""), for: UIControl.State.normal)
+        shareButton.titleLabel?.font = kRegularFont13
+        let maskPath = UIBezierPath.init(roundedRect: CGRect(x: 0, y: 0, width: kScreenWidth, height: 24), byRoundingCorners: [.topLeft,.bottomLeft], cornerRadii: CGSize(width: 12, height: 12))
+        let maskLayer = CAShapeLayer.init()
+        maskLayer.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: 24)
+        maskLayer.path = maskPath.cgPath
+        shareButton.layer.mask = maskLayer
+        shareButton.rx.tap.subscribe(onNext: { (data) in
+            AlertSheetView.sheetShareView()
+        }).disposed(by: disposeBag)
+        return shareButton
+    }()
+    
+    var productDetailModel : ProductDetailModel? {
+        didSet {
+            if !(productDetailModel?.sku?.isEmpty ?? true) {
+                for sku in (productDetailModel?.sku)! {
+                    if (sku.isMain != nil && sku.isMain == 1 ) {
+                        sellPriceLabel.text = "¥\(sku.price ?? 0)"
+                        let attributeString = NSMutableAttributedString(string:"¥\( sku.originPrice ?? 0)")
+                        attributeString.changeStrikethrough(atAllStyle: NSUnderlineStyle(rawValue: NSUnderlineStyle.single.rawValue), color: UIColor.white)
+                        markPriceLabel.attributedText = attributeString
+                        soldNumberLabel.text = "已售\(sku.originPrice ?? 0)"
+                        stockLabel.text = "仅剩\(sku.stock ?? 0)"
+                    }
+                }
+            }
+            titleLabel.text = productDetailModel?.name
+            timeLabel.text = "  次日达  "
+            detailTitleLabel.text = productDetailModel?.subtitle
+            
+        }
+    }
+
+}

+ 66 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuIconCollectionViewCell.swift

@@ -0,0 +1,66 @@
+//
+//  ProductDetailProductSkuIconCollectionViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailProductSkuIconCollectionViewCell: UICollectionViewCell {
+    class func cellWith(collectionView:UICollectionView,indexPath:IndexPath) -> ProductDetailProductSkuIconCollectionViewCell {
+        let ID = "ProductDetailProductSkuIconCollectionViewCell"
+        collectionView.register(ProductDetailProductSkuIconCollectionViewCell.self, forCellWithReuseIdentifier: ID)
+        let cell : ProductDetailProductSkuIconCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: ID, for: indexPath) as! ProductDetailProductSkuIconCollectionViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    //MARK: - indexPath
+    var indexPath: IndexPath?{
+        didSet {
+            
+        }
+    }
+    //MARK: - 初始化
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    //MARK: - 设置view
+    private func setupViews() {
+        addSubview(iconImageView)
+        addSubview(titleLabel)
+    }
+    
+    private func setupLayouts() {
+        iconImageView.snp.makeConstraints { (make) in
+            make.top.centerX.equalToSuperview()
+            make.size.equalTo(32 * kScaleWidth)
+        }
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(iconImageView.snp.bottom).offset(5)
+            make.centerX.equalToSuperview()
+            make.bottom.equalToSuperview()
+        }
+    }
+    lazy var iconImageView : UIImageView = {
+        let iconImageView = UIImageView()
+        iconImageView.image = kImage(name: "pic_preload")
+        return iconImageView
+    }()
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "海外严选"
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kRegularFont13
+        return titleLabel
+    }()
+}

+ 58 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuLabelCollectionViewCell.swift

@@ -0,0 +1,58 @@
+//
+//  ProductDetailProductSkuLabelCollectionViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailProductSkuLabelCollectionViewCell: UICollectionViewCell {
+    class func cellWith(collectionView:UICollectionView,indexPath:IndexPath) -> ProductDetailProductSkuLabelCollectionViewCell {
+        let ID = "ProductDetailProductSkuLabelCollectionViewCell"
+        collectionView.register(ProductDetailProductSkuLabelCollectionViewCell.self, forCellWithReuseIdentifier: ID)
+        let cell : ProductDetailProductSkuLabelCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: ID, for: indexPath) as! ProductDetailProductSkuLabelCollectionViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    //MARK: - indexPath
+    var indexPath: IndexPath?{
+        didSet {
+            
+        }
+    }
+    //MARK: - 初始化
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    //MARK: - 设置view
+    private func setupViews() {
+        backgroundColor = kf5f5f5Color
+        layer.cornerRadius = 4
+        layer.masksToBounds = true
+        addSubview(titleLabel)
+    }
+    
+    private func setupLayouts() {
+        titleLabel.snp.makeConstraints { (make) in
+            make.left.top.equalTo(6)
+            make.right.bottom.equalTo(-6)
+        }
+    }
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "蔬菜400g"
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kRegularFont13
+        return titleLabel
+    }()
+}

+ 209 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailProductSku/ProductDetailProductSkuTableViewCell.swift

@@ -0,0 +1,209 @@
+//
+//  ProductDetailProductSkuTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailProductSkuTableViewCell: UITableViewCell {
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ProductDetailProductSkuTableViewCell {
+        let ID = "ProductDetailProductSkuTableViewCell"
+        tableView.register(ProductDetailProductSkuTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailProductSkuTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailProductSkuTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(topBgView)
+        topBgView.addSubview(selectedLabel)
+        topBgView.addSubview(skuCollectionView)
+        addSubview(iconCollectionView)
+    }
+    
+    private func setupLayouts() {
+        topBgView.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.bottom.equalTo(skuCollectionView)
+        }
+        skuCollectionView.snp.makeConstraints { (make) in
+            make.top.right.equalToSuperview()
+            make.width.equalTo(kScreenWidth - 54)
+            make.height.equalTo(44)
+        }
+        selectedLabel.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.left.equalTo(14)
+        }
+        iconCollectionView.snp.makeConstraints { (make) in
+            make.top.equalTo(skuCollectionView.snp.bottom)
+            make.height.equalTo(75)
+            make.left.right.equalTo(0)
+        }
+        
+    }
+    
+    private lazy var skuCollectionView: UICollectionView = {
+        let skuCollectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: skuCollectionViewLayout)
+        skuCollectionView.backgroundColor = UIColor.white
+        skuCollectionView.delegate = self;
+        skuCollectionView.dataSource = self;
+        skuCollectionView.showsVerticalScrollIndicator = false
+        skuCollectionView.showsHorizontalScrollIndicator = false
+        skuCollectionView.cornerRadius = 4
+        skuCollectionView.masksToBounds = true
+        return skuCollectionView
+    }()
+    
+    private lazy var skuCollectionViewLayout: UICollectionViewFlowLayout = {
+        let skuCollectionViewLayout = UICollectionViewFlowLayout.init()
+        skuCollectionViewLayout.minimumLineSpacing = 0
+        skuCollectionViewLayout.minimumInteritemSpacing = 0
+        skuCollectionViewLayout.estimatedItemSize = CGSize(width: 72, height: 25)
+        skuCollectionViewLayout.scrollDirection = .vertical
+
+        return skuCollectionViewLayout
+    }()
+    
+    private lazy var iconCollectionView: UICollectionView = {
+        let iconCollectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: iconCollectionViewLayout)
+        iconCollectionView.backgroundColor = UIColor.white
+        iconCollectionView.delegate = self;
+        iconCollectionView.dataSource = self;
+        iconCollectionView.showsVerticalScrollIndicator = false
+        iconCollectionView.showsHorizontalScrollIndicator = false
+        iconCollectionView.cornerRadius = 4
+        iconCollectionView.masksToBounds = true
+        return iconCollectionView
+    }()
+    
+    private lazy var iconCollectionViewLayout: UICollectionViewFlowLayout = {
+        let iconCollectionViewLayout = UICollectionViewFlowLayout.init()
+        iconCollectionViewLayout.minimumLineSpacing = 0
+        iconCollectionViewLayout.minimumInteritemSpacing = 0
+        iconCollectionViewLayout.estimatedItemSize = CGSize(width: kScreenWidth/5, height: kScaleWidth * 55)
+        return iconCollectionViewLayout
+    }()
+    
+    private lazy var topBgView: UIView = {
+        let topBgView = UIView()
+        return topBgView
+    }()
+    private lazy var selectedLabel : UILabel = {
+        let selectedLabel = UILabel()
+        selectedLabel.text = "已选"
+        selectedLabel.textColor = k999999Color
+        selectedLabel.font = kScaleRegularFont13
+        return selectedLabel
+    }()
+    
+    //加载数据
+    func reloadData() {
+        
+        //collectionView重新加载数据
+        self.skuCollectionView.reloadData()
+        //更新collectionView的高度约束
+        let contentSize = self.skuCollectionView.collectionViewLayout.collectionViewContentSize
+        skuCollectionView.snp.remakeConstraints { (make) in
+            make.top.right.equalToSuperview()
+            make.width.equalTo(kScreenWidth - 74)
+            make.height.equalTo(contentSize.height)
+        }
+        self.skuCollectionView.collectionViewLayout.invalidateLayout()
+        
+        //collectionView重新加载数据
+        self.iconCollectionView.reloadData()
+        //更新collectionView的高度约束
+        let contentSize1 = self.iconCollectionView.collectionViewLayout.collectionViewContentSize
+        iconCollectionView.snp.remakeConstraints { (make) in
+            make.top.equalTo(skuCollectionView.snp.bottom)
+            make.height.equalTo(contentSize1.height)
+            make.left.right.equalTo(0)
+            make.bottom.equalToSuperview()
+        }
+        self.iconCollectionView.collectionViewLayout.invalidateLayout()
+    }
+
+}
+
+extension ProductDetailProductSkuTableViewCell: UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
+    func numberOfSections(in collectionView: UICollectionView) -> Int {
+        return 1
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        
+        if collectionView == skuCollectionView {
+            return 10
+        }else {
+            return 5
+        }
+        
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        
+        if collectionView == skuCollectionView {
+            let cell = ProductDetailProductSkuLabelCollectionViewCell.cellWith(collectionView: collectionView, indexPath: indexPath)
+            return cell
+        }else {
+            let cell = ProductDetailProductSkuIconCollectionViewCell.cellWith(collectionView: collectionView, indexPath: indexPath)
+            return cell
+        }
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+//        let productModels = productModelsArrays![indexPath.section]
+//        let productModel = productModels[indexPath.row]
+//        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ProductDetailVC"), object: productModel)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
+        
+        if collectionView == skuCollectionView {
+            return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 10)
+        }else {
+           return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
+        }
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+        if collectionView == skuCollectionView {
+            return 5
+        }else {
+            return 0
+        }
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
+        if collectionView == skuCollectionView {
+            return 5
+        }else {
+            return 0
+        }
+    }
+    
+    
+    
+}

+ 101 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/Cell/ProductDetailShop/ProductDetailShopTableViewCell.swift

@@ -0,0 +1,101 @@
+//
+//  ProductDetailShopTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import RxSwift
+
+class ProductDetailShopTableViewCell: UITableViewCell {
+    
+    let disposeBag = DisposeBag()
+    
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> UITableViewCell {
+        let ID = "ProductDetailShopTableViewCell"
+        tableView.register(ProductDetailShopTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ProductDetailShopTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailShopTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(shopImageView)
+        addSubview(shopNameLabel)
+        addSubview(comeInButton)
+    }
+    
+    private func setupLayouts() {
+        shopImageView.snp.makeConstraints { (make) in
+            make.top.equalTo(12)
+            make.left.equalTo(14)
+            make.size.equalTo(60)
+            make.bottom.lessThanOrEqualTo(-12)
+        }
+        shopNameLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(shopImageView.snp.right).offset(10)
+            make.centerY.equalToSuperview()
+            make.right.equalTo(comeInButton.snp.left).offset(10)
+        }
+        comeInButton.snp.makeConstraints { (make) in
+            make.right.equalTo(-14)
+            make.height.equalTo(24)
+            make.width.equalTo(63)
+            make.centerY.equalToSuperview()
+        }
+        
+    }
+    
+    private lazy var shopImageView: UIImageView = {
+        let shopImageView = UIImageView()
+        shopImageView.image = kImage(name: "pic_preload")
+        shopImageView.cornerRadius = 60/2
+        shopImageView.masksToBounds = true
+        shopImageView.layer.borderColor = kf9f9f9Color.cgColor
+        shopImageView.layer.borderWidth = 0.5
+        return shopImageView
+    }()
+    
+    private lazy var shopNameLabel : UILabel = {
+        let shopNameLabel = UILabel()
+        shopNameLabel.text = "彩虹星球专营店"
+        shopNameLabel.textColor = k333333Color
+        shopNameLabel.font = kMediumFont15
+        return shopNameLabel
+    }()
+    
+    private lazy var comeInButton: UIButton = {
+        let comeInButton = UIButton(type: UIButton.ButtonType.custom)
+        comeInButton.setTitle("进入", for: UIControl.State.normal)
+        comeInButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
+        comeInButton.titleLabel?.font = kRegularFont14
+        comeInButton.cornerRadius = 12
+        comeInButton.masksToBounds = true
+        comeInButton.backgroundColor = kFFA42FColor
+        comeInButton.rx.tap.subscribe(onNext: { (data) in
+            getCurrentVC().navigationController?.pushViewController(ShopViewController(), animated: true)
+        }).disposed(by: disposeBag)
+        return comeInButton
+    }()
+
+}

RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailFSPagerViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailFSPagerViewCell.swift


+ 94 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailSectionHeader.swift

@@ -0,0 +1,94 @@
+//
+//  ProductDetailSectionHeader.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ProductDetailSectionHeader: BaseView {
+
+    override func setupViews() {
+        backgroundColor = UIColor.white
+        addSubview(vlineLabel)
+        addSubview(hlineLabel)
+        addSubview(titleLabel)
+        addSubview(goButton)
+    }
+    
+    override func setupLayouts() {
+
+        hlineLabel.snp.makeConstraints { (make) in
+            make.bottom.equalTo(1)
+            make.top.equalTo(42)
+            make.left.equalTo(14)
+            make.right.equalToSuperview()
+        }
+        vlineLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(14)
+            make.centerY.equalToSuperview()
+            make.height.equalTo(15)
+            make.width.equalTo(4)
+        }
+        titleLabel.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.left.equalTo(vlineLabel.snp.right).offset(10)
+        }
+        goButton.snp.makeConstraints { (make) in
+            make.centerY.equalToSuperview()
+            make.right.equalTo(-14)
+        }
+        goButton.layoutButton(edgeInsetsStyle: ButtonEdgeInsetsStyle.right, imageTitleSpace: 4)
+    }
+    
+    lazy var vlineLabel: UILabel = {
+        let vlineLabel = UILabel()
+        vlineLabel.backgroundColor = kFFA42FColor
+        vlineLabel.cornerRadius = 2
+        vlineLabel.clipsToBounds = true
+        return vlineLabel
+    }()
+    
+    lazy var hlineLabel: UILabel = {
+        let hlineLabel = UILabel()
+        hlineLabel.backgroundColor = kf5f5f5Color
+        return hlineLabel
+    }()
+    
+    private lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kMediumFont15
+        return titleLabel
+    }()
+    
+    private lazy var goButton: UIButton = {
+        let goButton = UIButton(type: UIButton.ButtonType.custom)
+        goButton.setTitle("查看全部评价", for: UIControl.State.normal)
+        goButton.setTitleColor(k999999Color, for: UIControl.State.normal)
+        goButton.titleLabel?.font = kRegularFont13
+        goButton.setImage(kImage(name: "my_arrows_unfold"), for:
+            UIControl.State.normal)
+        goButton.isHidden = false
+        return goButton
+    }()
+    
+    var section : Int? {
+        didSet {
+            if section == 2 {
+                goButton.isHidden = false
+            }else {
+               goButton.isHidden = true
+            }
+        }
+    }
+    
+    var titles : [String]? {
+        didSet {
+            titleLabel.text = (titles?[section!])!
+        }
+    }
+    
+}

RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailTableViewHeaderView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailHeader/ProductDetailTableViewHeaderView.swift


+ 0 - 85
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailProductInfoTableViewCell.swift

@@ -1,85 +0,0 @@
-//
-//  ProductDetailProductInfoTableViewCell.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/5/11.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import UIKit
-
-class ProductDetailProductInfoTableViewCell: UITableViewCell {
-    
-    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ProductDetailProductInfoTableViewCell {
-        let ID = "ProductDetailProductInfoTableViewCell"
-        tableView.register(ProductDetailProductInfoTableViewCell.self, forCellReuseIdentifier: ID)
-        let cell : ProductDetailProductInfoTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ProductDetailProductInfoTableViewCell
-        cell.indexPath = indexPath
-        return cell
-    }
-    
-    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
-        super.init(style: style, reuseIdentifier: reuseIdentifier)
-        setupViews()
-        setupLayouts()
-    }
-    
-    required init?(coder aDecoder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-    
-    var indexPath: IndexPath? {
-        didSet {
-            
-        }
-    }
-    //MRAK: - 设置View
-    private func setupViews() {
-        self.selectionStyle = .none
-    }
-    
-    private func setupLayouts() {
-        
-    }
-    
-    private lazy var topBgView: UIView = {
-        let topBgView = UIView()
-        topBgView.backgroundColor = kFFA42FColor
-        return topBgView
-    }()
-    
-    private lazy var sellPriceLabel : UILabel = {
-        let sellPriceLabel = UILabel()
-        sellPriceLabel.textColor = UIColor.white
-        sellPriceLabel.font = kMediumFont24
-        return sellPriceLabel
-    }()
-    
-    private lazy var markPriceLabel : UILabel = {
-        let markPriceLabel = UILabel()
-        markPriceLabel.textColor = UIColor.white
-        markPriceLabel.font = kRegularFont13
-        return markPriceLabel
-    }()
-    
-    private lazy var soldNumberLabel : UILabel = {
-        let soldNumberLabel = UILabel()
-        soldNumberLabel.textColor = UIColor.white
-        soldNumberLabel.font = kRegularFont13
-        return soldNumberLabel
-    }()
-    
-    private lazy var stockLabel : UILabel = {
-        let markPrice = UILabel()
-        markPrice.textColor = UIColor.white
-        markPrice.font = kRegularFont13
-        return markPrice
-    }()
-    
-    private lazy var bottomBgView: UIView = {
-        let bottomBgView = UIView()
-        bottomBgView.backgroundColor = UIColor.white
-        return bottomBgView
-    }()
-
-}

+ 152 - 7
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductDetail/View/ProductDetailView.swift

@@ -7,6 +7,7 @@
 //
 
 import UIKit
+import PPBadgeViewSwift
 
 class ProductDetailView: BaseView {
     
@@ -25,8 +26,16 @@ class ProductDetailView: BaseView {
         }
     }
     
+    let titles = ["","","商品评价(2300)","","热销排行","商品参数","商品详情"]
+    
     override func setupViews() {
+        addSubview(bottomBgView)
+        bottomBgView.addSubview(cartButton)
+        cartButton.addSubview(cartImageView)
+        bottomBgView.addSubview(addCartButton)
+        bottomBgView.addSubview(buyButton)
         addSubview(tableView)
+        addSubview(topButton)
         if #available(iOS 11.0, *) {
             tableView.contentInsetAdjustmentBehavior = .never
         }
@@ -36,8 +45,36 @@ class ProductDetailView: BaseView {
     }
     
     override func setupLayouts() {
+        bottomBgView.snp.makeConstraints { (make) in
+            make.left.bottom.right.equalToSuperview()
+            make.height.equalTo(50 + kSafeTabBarHeight)
+        }
+        cartButton.snp.makeConstraints { (make) in
+            make.top.left.equalToSuperview()
+            make.width.equalTo(71 * kScaleWidth)
+            make.bottom.equalTo(-kSafeTabBarHeight)
+        }
+        cartImageView.snp.makeConstraints { (make) in
+            make.center.equalToSuperview()
+        }
+        addCartButton.snp.makeConstraints { (make) in
+            make.left.equalTo(cartButton.snp.right)
+            make.top.bottom.equalTo(cartButton)
+            make.width.equalTo(152 * kScaleWidth)
+        }
+        buyButton.snp.makeConstraints { (make) in
+            make.left.equalTo(addCartButton.snp.right)
+            make.top.bottom.equalTo(cartButton)
+            make.width.equalTo(152 * kScaleWidth)
+        }
         tableView.snp.makeConstraints { (make) in
-            make.edges.equalToSuperview()
+            make.top.left.right.equalToSuperview()
+            make.bottom.equalTo(bottomBgView.snp.top)
+        }
+        topButton.snp.makeConstraints { (make) in
+            make.right.equalTo(-10)
+            make.size.equalTo(44)
+            make.bottom.equalTo(-70-kSafeTabBarHeight)
         }
     }
     
@@ -58,34 +95,142 @@ class ProductDetailView: BaseView {
         return productDetailTableViewHeaderView
     }()
     
+    private lazy var bottomBgView: UIView = {
+        let bottomBgView = UIView()
+        return bottomBgView
+    }()
+    
+    private lazy var cartButton : UIButton = {
+        let cartButton = UIButton()
+        return cartButton
+    }()
+    
+    private lazy var cartImageView: UIImageView = {
+        let cartImageView = UIImageView()
+        cartImageView.image = kImage(name: "tabbar_shopping")
+        cartImageView.pp.addBadge(number: 2)
+        //        shoppingCarButton.pp.setBadge(height: 14)
+        //        shoppingCarButton.pp.badgeView.font = kRegularFont10
+        cartImageView.pp.badgeView.backgroundColor = kfe352bColor
+        cartImageView.pp.moveBadge(x: -2, y: 2)
+        return cartImageView
+    }()
+    
+    private lazy var addCartButton : UIButton = {
+        let addCartButton = UIButton(type: UIButton.ButtonType.custom)
+        addCartButton.setTitle("加入购物车", for: UIControl.State.normal)
+        addCartButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
+        addCartButton.backgroundColor = k404040Color
+        addCartButton.titleLabel?.font = kRegularFont16
+        return addCartButton
+    }()
+    
+    private lazy var buyButton : UIButton = {
+        let buyButton = UIButton(type: UIButton.ButtonType.custom)
+        buyButton.setTitle("立即购买", for: UIControl.State.normal)
+        buyButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
+        buyButton.backgroundColor = kFFA42FColor
+        buyButton.titleLabel?.font = kRegularFont16
+        return buyButton
+    }()
+    
+    private lazy var topButton : UIButton = {
+        let topButton = UIButton(type: UIButton.ButtonType.custom)
+        topButton.setImage(kImage(name: "product_detail_top"), for: UIControl.State.normal)
+        return topButton
+    }()
+    
 }
 
 extension ProductDetailView : UITableViewDelegate, UITableViewDataSource {
     func numberOfSections(in tableView: UITableView) -> Int {
+        if productDetailModel != nil {
+            return 7
+        }
         return 0
     }
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return 1
+        switch section {
+        case 5:
+            return 5
+        default:
+            return 1
+        }
     }
     
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        return UITableViewCell()
+       
+        
+        switch indexPath.section {
+        case 0:
+            let cell = ProductDetailProductInfoTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            cell.productDetailModel = productDetailModel
+            return cell
+        case 1:
+            let cell = ProductDetailProductSkuTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            cell.frame = tableView.bounds
+            cell.layoutIfNeeded()
+            cell.reloadData()
+            return cell
+        case 2:
+            let cell = ProductDetailEvaluationTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            return cell
+        case 3:
+            let cell = ProductDetailShopTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            return cell
+        case 4:
+            let cell = ProductDetailHotSellTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            return cell
+        case 5:
+            let cell = ProductDetailParameterTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            return cell
+        case 6:
+            let cell = ProductDetailDescriptionTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            return cell
+            
+        default:
+           
+            return UITableViewCell()
+        }
+        
     }
+    
+    
     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
-        return 0
+        switch indexPath.section {
+        case 4:
+            return 173
+        default:
+            return UITableView.automaticDimension
+        }
+        
     }
     
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
-        return 10
+        switch section {
+        case 2,4,5,6:
+            return UITableView.automaticDimension
+        default:
+            return 0
+        }
+        
     }
     
     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
-        return nil
+        switch section {
+        case 2,4,5,6:
+            let view = ProductDetailSectionHeader(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 44))
+            view.section = section
+            view.titles = titles
+            return view
+        default:
+            return nil
+        }
     }
     
     func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
-        return 0.000001
+        return 10
     }
     
     func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

+ 161 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductDetailHotSell/ProductDetailHotSellCollectionViewCell.swift

@@ -0,0 +1,161 @@
+//
+//  ProductDetailHotSellCollectionViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+import RxSwift
+
+class ProductDetailHotSellCollectionViewCell: UICollectionViewCell {
+    let disposeBag = DisposeBag()
+    
+    typealias PlusClosure = (_ productModel: ProductModel?,_ indexPath:IndexPath?) -> Void
+    var plusClosure : PlusClosure?
+    
+    class func cellWith(collectionView:UICollectionView,indexPath:IndexPath) -> ProductDetailHotSellCollectionViewCell {
+        let ID = "ProductDetailHotSellCollectionViewCell"
+        collectionView.register(ProductDetailHotSellCollectionViewCell.self, forCellWithReuseIdentifier: ID)
+        let cell : ProductDetailHotSellCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: ID, for: indexPath) as! ProductDetailHotSellCollectionViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    //MARK: - indexPath
+    var indexPath: IndexPath?{
+        didSet {
+            
+        }
+    }
+    //MARK: - 初始化
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        backgroundColor = UIColor.white
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    //MRAK: - 设置View
+    private func setupViews() {
+        addSubview(iconImagView)
+        addSubview(titleLabel)
+        addSubview(detailTitleLabel)
+        addSubview(sellPriceLabel)
+        addSubview(markPriceLabel)
+        addSubview(plusButton)
+    }
+    
+    private func setupLayouts() {
+        iconImagView.snp.makeConstraints { (make) in
+            make.top.equalTo(5)
+            make.centerX.equalToSuperview()
+            make.height.equalTo(80)
+        }
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(iconImagView.snp.bottom).offset(5)
+            make.left.equalTo(5)
+            make.right.equalTo(-5)
+            make.height.equalTo(21)
+        }
+        detailTitleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(titleLabel.snp.bottom).offset(2)
+            make.right.left.equalTo(titleLabel)
+            make.height.equalTo(17)
+        }
+        sellPriceLabel.snp.remakeConstraints { (make) in
+            make.left.equalTo(titleLabel)
+            make.bottom.equalTo(-6)
+            make.height.equalTo(14)
+
+        }
+        markPriceLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(sellPriceLabel.snp.right).offset(3)
+            make.bottom.equalTo(sellPriceLabel)
+            make.height.equalTo(11)
+        }
+        plusButton.snp.makeConstraints { (make) in
+            make.bottom.equalTo(-6)
+            make.right.equalTo(-6)
+            make.size.equalTo(22)
+        }
+        
+    }
+    
+    private lazy var iconImagView: UIImageView = {
+        let iconImagView = UIImageView()
+        iconImagView.image = kImage(name: "pic_preload")
+        return iconImagView
+    }()
+    
+    private lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "海南冰糖心木瓜 1个装"
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kMediumFont15
+        titleLabel.textAlignment = .left
+        titleLabel.numberOfLines = 1
+        return titleLabel
+    }()
+    
+    private lazy var detailTitleLabel: UILabel = {
+        let detailTitleLabel = UILabel()
+        detailTitleLabel.text = "酸甜可口营养无限"
+        detailTitleLabel.textColor = k999999Color
+        detailTitleLabel.font = kRegularFont12
+        detailTitleLabel.textAlignment = .left
+        return detailTitleLabel
+    }()
+    
+    private lazy var sellPriceLabel: UILabel = {
+        let sellPriceLabel = UILabel()
+        sellPriceLabel.text = "¥11.8"
+        sellPriceLabel.textColor = kfe352bColor
+        sellPriceLabel.font = kBoldFont14
+        sellPriceLabel.textAlignment = .left
+        return sellPriceLabel
+    }()
+    
+    private lazy var markPriceLabel: UILabel = {
+        let markPriceLabel = UILabel()
+        markPriceLabel.text = "¥24.4"
+        markPriceLabel.textColor = kbbbbbbColor
+        markPriceLabel.font = kRegularFont11
+        markPriceLabel.textAlignment = .left
+        let attrString = NSMutableAttributedString(string: "¥24.4")
+        attrString.changeStrikethrough(atAllStyle: NSUnderlineStyle.single, color: kbbbbbbColor)
+        markPriceLabel.attributedText = attrString
+        markPriceLabel.adjustsFontSizeToFitWidth = true
+        return markPriceLabel
+    }()
+    
+    private lazy var plusButton: UIButton = {
+        let plusButton = UIButton(type: UIButton.ButtonType.custom)
+        plusButton.setImage(kImage(name: "shopping_mall_plus"), for: UIControl.State.normal)
+        plusButton.rx.tap.subscribe(onNext: {
+            [weak self] (data) in
+            if let plusClosure = self?.plusClosure {
+                plusClosure(self?.productModel, self?.indexPath)
+            }
+        }).disposed(by: disposeBag)
+        return plusButton
+    }()
+    
+    var productModel : ProductModel? {
+        didSet {
+            iconImagView.kf.setImage(with: kURLImage(name: productModel?.img ?? "pic_preload"), placeholder: kImage(name: "pic_preload"))
+            titleLabel.text = productModel?.saleName
+            detailTitleLabel.text = productModel?.saleName
+            sellPriceLabel.text = "¥\(productModel?.price ?? 0)"
+            let attributeString = NSMutableAttributedString(string:"¥\(productModel?.originPrice ?? 0)")
+            attributeString.changeStrikethrough(atAllStyle: NSUnderlineStyle.single, color: kbbbbbbColor)
+            markPriceLabel.attributedText = attributeString
+        }
+    }
+    
+}

RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/CollectionViewCell/ProductMallBarChart/ProductMallBarChartCollectionViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallBarChart/ProductMallBarChartCollectionViewCell.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/CollectionViewCell/ProductMallRightSideleftPicture/ProductRightSideleftPictureCollectionViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallRightSideleftPicture/ProductRightSideleftPictureCollectionViewCell.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/CollectionViewCell/ProductMallSlidingLeftRight/ProductSlidingLeftRightCollectionViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductMallSlidingLeftRight/ProductSlidingLeftRightCollectionViewCell.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/CollectionViewCell/ProductSlidingTopBottom/ProductSlidingTopBottomCollectionViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/CollectionViewCell/ProductSlidingTopBottom/ProductSlidingTopBottomCollectionViewCell.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorBannerView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorBannerView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorCenterHeaderCollectionReusableView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorCenterHeaderCollectionReusableView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorCenterTitleView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorCenterTitleView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorFullLeftHeaderCollectionReusableView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorFullLeftHeaderCollectionReusableView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorLeftHeaderCollectionReusableView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorLeftHeaderCollectionReusableView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/ProductCollectionReusableView/ProductFloorTitleView.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/ProductCollectionReusableView/ProductFloorTitleView.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/TableViewCell/ProductHBigTableViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/TableViewCell/ProductHBigTableViewCell.swift


RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Product/TableViewCell/ProductHSmallTableViewCell.swift → RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/ProductView/TableViewCell/ProductHSmallTableViewCell.swift


+ 48 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopSectionHeaderView.swift

@@ -0,0 +1,48 @@
+//
+//  ShopSectionHeaderView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShopSectionHeaderView: BaseView {
+    
+    override func setupViews() {
+        backgroundColor = UIColor.white
+        addSubview(priceButton)
+        addSubview(salesVolumeButton)
+    }
+    
+    override func setupLayouts() {
+        priceButton.snp.makeConstraints { (make) in
+            make.top.bottom.left.equalToSuperview()
+            make.width.equalToSuperview().dividedBy(2)
+        }
+        salesVolumeButton.snp.makeConstraints { (make) in
+            make.top.bottom.right.equalToSuperview()
+            make.width.equalToSuperview().dividedBy(2)
+        }
+    }
+    
+    lazy var priceButton: UIButton = {
+        let priceButton = UIButton(type: UIButton.ButtonType.custom)
+        priceButton.setTitle("价格", for: UIControl.State.normal)
+        priceButton.setTitleColor(k333333Color, for: UIControl.State.normal)
+        priceButton.titleLabel?.font = kRegularFont14
+        priceButton.setImage(kImage(name: ""), for: UIControl.State.normal)
+        return priceButton
+    }()
+    
+    lazy var salesVolumeButton: UIButton = {
+        let salesVolumeButton = UIButton(type: UIButton.ButtonType.custom)
+        salesVolumeButton.setTitle("销量", for: UIControl.State.normal)
+        salesVolumeButton.setTitleColor(k333333Color, for: UIControl.State.normal)
+        salesVolumeButton.titleLabel?.font = kRegularFont14
+        salesVolumeButton.setImage(kImage(name: ""), for: UIControl.State.normal)
+        return salesVolumeButton
+    }()
+
+}

+ 106 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopView.swift

@@ -0,0 +1,106 @@
+//
+//  ShopView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShopView: BaseView {
+
+
+    override func setupViews() {
+        addSubview(tableView)
+    }
+    
+    override func setupLayouts() {
+        tableView.snp.makeConstraints { (make) in
+            make.edges.equalToSuperview()
+        }
+    }
+    
+    lazy var tableView: UITableView = {
+        let tableView = UITableView(frame: CGRect.zero, style: UITableView.Style.plain)
+        tableView.separatorStyle = .none
+        tableView.backgroundColor = kf7f8faColor
+        tableView.dataSource = self
+        tableView.delegate = self
+        tableView.estimatedRowHeight = 0.000001
+        tableView.estimatedSectionFooterHeight = 0.000001
+        tableView.estimatedSectionHeaderHeight = 0.000001
+        return tableView
+    }()
+    
+}
+
+extension ShopView : UITableViewDelegate, UITableViewDataSource {
+    func numberOfSections(in tableView: UITableView) -> Int {
+        return 2
+    }
+    
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+            return 1
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        switch indexPath.section {
+        case 0:
+            let cell = ShopViewShopInfoTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+
+            return cell
+        case 1:
+            let cell = ShopViewTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
+            cell.frame = tableView.bounds
+            cell.layoutIfNeeded()
+            cell.reloadData()
+            return cell
+        default:
+            return UITableViewCell()
+        }
+       
+        
+    }
+    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+            return UITableView.automaticDimension
+    }
+    
+    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
+        switch section {
+        case 0:
+            return 0.000001
+        case 1:
+            return 44
+        default:
+            return 0
+        }
+        
+    }
+    
+    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+        switch section {
+        case 0:
+            return nil
+        case 1:
+            let view = ShopSectionHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 44))
+            return view
+        default:
+            return nil
+        }
+        
+    }
+    
+    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
+        return 0.000001
+    }
+    
+    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
+        return nil
+    }
+    
+}
+
+
+
+

+ 105 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopViewShopInfoTableViewCell.swift

@@ -0,0 +1,105 @@
+//
+//  ShopViewShopInfoTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShopViewShopInfoTableViewCell: UITableViewCell {
+    
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> UITableViewCell {
+        let ID = "ShopViewShopInfoTableViewCell"
+        tableView.register(ShopViewShopInfoTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ShopViewShopInfoTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ShopViewShopInfoTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    func setupViews() {
+        self.selectionStyle = .none
+        backgroundColor = kFFA42FColor
+        addSubview(shopIconImageView)
+        addSubview(shopNameLabel)
+        addSubview(productNumberLabel)
+        addSubview(descriptionLabel)
+    }
+    
+    func setupLayouts() {
+        shopIconImageView.snp.makeConstraints { (make) in
+            make.top.equalTo(12)
+            make.left.equalTo(14)
+            make.size.equalTo(60)
+        }
+        shopNameLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(shopIconImageView.snp.right).offset(10)
+            make.right.equalTo(-14)
+            make.height.equalTo(14)
+            make.top.equalTo(shopIconImageView).offset(11)
+        }
+        productNumberLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(shopIconImageView.snp.right).offset(10)
+            make.right.equalTo(-14)
+            make.height.equalTo(14)
+            make.bottom.equalTo(shopIconImageView).offset(-11)
+        }
+        descriptionLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(shopIconImageView.snp.bottom).offset(10)
+            make.left.equalTo(14)
+            make.right.equalTo(-14)
+            make.bottom.equalTo(-20)
+        }
+    }
+    
+    lazy var shopIconImageView: UIImageView = {
+        let shopIconImageView = UIImageView()
+        shopIconImageView.image = kImage(name: "pic_preload")
+        return shopIconImageView
+    }()
+    
+    lazy var shopNameLabel: UILabel = {
+        let shopNameLabel = UILabel()
+        shopNameLabel.text = "彩虹星球专营店"
+        shopNameLabel.textColor = UIColor.white
+        shopNameLabel.font = kMediumFont15
+        return shopNameLabel
+    }()
+    
+    lazy var productNumberLabel: UILabel = {
+        let productNumberLabel = UILabel()
+        productNumberLabel.text = "全部商品:200"
+        productNumberLabel.textColor = UIColor.white
+        productNumberLabel.font = kRegularFont14
+        return productNumberLabel
+    }()
+    
+    lazy var descriptionLabel: UILabel = {
+        let descriptionLabel = UILabel()
+        descriptionLabel.textColor = UIColor.white
+        descriptionLabel.font = kRegularFont14
+        descriptionLabel.numberOfLines = 0
+        let str = "彩虹星球专营店主营生鲜蔬菜肉类生禽彩虹星球专营店主营生鲜蔬菜、肉类生禽彩虹彩虹星球专营店主营生鲜蔬菜肉类生禽彩虹星球专营店主营生鲜蔬菜、肉类生禽彩虹彩虹星球专营店主营生鲜蔬菜肉类生禽彩虹星球专营店主营生鲜蔬菜、肉类生禽彩虹…"
+        let attributeString = NSMutableAttributedString(string:str)
+        attributeString.changeAllLineSpacing(2)
+        descriptionLabel.attributedText = attributeString
+        return descriptionLabel
+    }()
+}

+ 103 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/View/ShopViewTableViewCell.swift

@@ -0,0 +1,103 @@
+//
+//  ShopViewTableViewCell.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShopViewTableViewCell: UITableViewCell {
+
+    class func cellWith(tableView:UITableView,indexPath:IndexPath) -> ShopViewTableViewCell {
+        let ID = "ShopViewTableViewCell"
+        tableView.register(ShopViewTableViewCell.self, forCellReuseIdentifier: ID)
+        let cell : ShopViewTableViewCell = tableView.dequeueReusableCell(withIdentifier: ID, for: indexPath) as! ShopViewTableViewCell
+        cell.indexPath = indexPath
+        return cell
+    }
+    
+    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
+        super.init(style: style, reuseIdentifier: reuseIdentifier)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    var indexPath: IndexPath? {
+        didSet {
+            
+        }
+    }
+    //MRAK: - 设置View
+    private func setupViews() {
+        self.selectionStyle = .none
+        addSubview(collectionView)
+    }
+    
+    private func setupLayouts() {
+        collectionView.snp.makeConstraints { (make) in
+            make.edges.equalToSuperview()
+        }
+    }
+    
+    private lazy var collectionView: UICollectionView = {
+        let collectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: collectionViewLayout)
+        collectionView.backgroundColor = kf7f8faColor
+        collectionView.delegate = self;
+        collectionView.dataSource = self;
+        collectionView.showsVerticalScrollIndicator = false
+        collectionView.showsHorizontalScrollIndicator = false
+        return collectionView
+    }()
+    
+    private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
+        let collectionViewLayout = UICollectionViewFlowLayout.init()
+        collectionViewLayout.minimumLineSpacing = 7 * kScaleWidth
+        collectionViewLayout.minimumInteritemSpacing = 7 * kScaleWidth
+        return collectionViewLayout
+    }()
+    
+    //加载数据
+    func reloadData() {
+        //collectionView重新加载数据
+        self.collectionView.reloadData()
+        //更新collectionView的高度约束
+        let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize
+        collectionView.snp.remakeConstraints { (make) in
+            make.edges.equalToSuperview()
+            make.height.equalTo(contentSize.height)
+        }
+        self.collectionView.collectionViewLayout.invalidateLayout()
+    }
+
+}
+
+extension ShopViewTableViewCell: UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
+    func numberOfSections(in collectionView: UICollectionView) -> Int {
+        return 1
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return 5
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = ProductSlidingTopBottomCollectionViewCell.cellWith(collectionView: collectionView, indexPath: indexPath)
+        return cell
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
+        return CGSize(width:170 * kScaleWidth, height: 170 * kScaleWidth + 80)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
+        return UIEdgeInsets(top: 10, left: 14 * kScaleWidth, bottom: 10, right: 14 * kScaleWidth)
+    }
+    
+}
+

+ 43 - 0
RainbowPlanet/RainbowPlanet/Modules/ShoppingMallModule/Shop/ViewController/ShopViewController.swift

@@ -0,0 +1,43 @@
+//
+//  ShopViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/5/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class ShopViewController: BaseViewController {
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupViews()
+        setupLayouts()
+    }
+    
+    override func setupViews() {
+        navigationBar.barBackgroundColor = kFFA42FColor
+        navigationBar.title = "彩虹星球专营店"
+        navigationBar.titleLabelColor = UIColor.white
+        navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
+        navigationBar.wr_setRightButton(image: kImage(name: "navbar_shopping_white")!)
+        navigationBar.onClickRightButton = {
+            [weak self] in
+            self?.tabBarController?.selectedIndex = 1
+        }
+        view.addSubview(shopView)
+    }
+    
+    override func setupLayouts() {
+        shopView.snp.makeConstraints { (make) in
+            make.top.equalTo(kNavBarTotalHeight)
+            make.left.right.bottom.equalToSuperview()
+        }
+    }
+    lazy var shopView: ShopView = {
+        let shopView = ShopView()
+        return shopView
+    }()
+
+}

+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_link.imageset/common_share_link@3x.png


+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_moments.imageset/common_share_moments@3x.png


+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qq.imageset/common_share_qq@3x.png


+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_qzone.imageset/common_share_qzone@3x.png


+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/common_share_wechat.imageset/common_share_wechat@3x.png


RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/pic_preload.imageset/Contents.json → RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/Contents.json


RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/pic_preload.imageset/pic_preload.png → RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload.png


RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/pic_preload.imageset/pic_preload@2x.png → RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload@2x.png


RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/CommonIcon/pic_preload.imageset/pic_preload@3x.png → RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/DefaultPage/pic_preload.imageset/pic_preload@3x.png


+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_back_white.imageset/navbar_back_white@3x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Assets.xcassets/NavigationBarIcons/navbar_shopping_white.imageset/navbar_shopping_white@3x.png


+ 6 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/Contents.json

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

+ 23 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/Contents.json

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

BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top@2x.png


BIN=BIN
RainbowPlanet/RainbowPlanet/Supporting Files/Product.xcassets/product_detail_top.imageset/product_detail_top@3x.png


+ 33 - 0
RainbowPlanet/RainbowPlanet/Tools/AlertSheetView/AlertSheetView.swift

@@ -111,4 +111,37 @@ class AlertSheetView: NSObject {
 //        }
     }
     
+    /// 分享
+    class func sheetShareView() {
+        let view = ShareView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: kSafeTabBarHeight + 250))
+        
+        let vProperty = FWPopupViewProperty()
+        vProperty.popupCustomAlignment = .bottomCenter
+        vProperty.popupAnimationType = .frame
+        vProperty.maskViewColor = UIColor(white: 0, alpha: 0.5)
+        vProperty.touchWildToHide = "1"
+        vProperty.popupViewEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+        vProperty.animationDuration = 0.2
+        view.vProperty = vProperty
+        view.show()
+    }
+    
+    
+    /// 单个选择器
+    func sheetPickViewOneComponentsView(titles:[String],title:String,height:CGFloat,sureClosure:((_ row: Int,_ value:String) -> Void)?) {
+        let view = PickViewOneComponentsView(titles: titles,title: title)
+        view.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: height * kScaleWidth + kSafeTabBarHeight)
+        let vProperty = FWPopupViewProperty()
+        vProperty.popupCustomAlignment = .bottomCenter
+        vProperty.popupAnimationType = .frame
+        vProperty.maskViewColor = UIColor(white: 0, alpha: 0.5)
+        vProperty.touchWildToHide = "1"
+        view.vProperty = vProperty
+        view.sureClosure = { (row,value) in
+            sureClosure!(row!,value!)
+            view.hide()
+        }
+        view.show()
+    }
+    
 }

+ 26 - 1
RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+NSMutableAttributedString.swift

@@ -55,6 +55,17 @@ extension NSMutableAttributedString {
         style.lineSpacing = spacing
         addAttribute(.paragraphStyle, value: style, range: range)
     }
+    
+    
+    // MARK: 改变全部的行距
+    func changeAllLineSpacing(_ spacing: CGFloat) {
+        let range = NSRange(location: 0, length: length)
+        let style = NSMutableParagraphStyle()
+        // 行距
+        style.lineSpacing = spacing
+        addAttribute(.paragraphStyle, value: style, range: range)
+    }
+    
 
     // MARK: 改变某位置的段落距离
     public func changeParagraphSpacing(_ spacing: CGFloat, from loc: Int, length: Int) {
@@ -178,6 +189,20 @@ extension NSMutableAttributedString {
         let attributedString = NSMutableAttributedString(string: string)
         return attributedString
     }
-
+    
+    
+    /// 加载富文本
+    ///
+    /// - Parameter str: 富文本字符串
+    /// - Returns: 属性string
+    func html(str:String) -> NSMutableAttributedString?  {
+        let htmlData = NSString(string: str).data(using: String.Encoding.unicode.rawValue)
+        let options = [NSAttributedString.DocumentReadingOptionKey.documentType:
+            NSAttributedString.DocumentType.html]
+        let attributedString = try? NSMutableAttributedString(data: htmlData ?? Data(),options: options,documentAttributes: nil)
+        return attributedString
+    }
+    
+    
 
 }