Commit f827fea1ce0e93dff2696bac5c5b11b2e88bf923

Authored by “张旭”
1 parent 4dee6c1d

no message

Showing 27 changed files with 4108 additions and 39 deletions

Too many changes to show.

To preserve performance only 27 of 159 files are displayed.

... ... @@ -36,7 +36,9 @@ target 'metaCode' do
36 36 #七牛
37 37 pod 'Qiniu'
38 38 #支付组件
39   - pod 'CNLivePayCostModule'
  39 +# pod 'CNLivePayCostModule'
  40 + pod 'CNLivePayCostModule','0.1.8'
  41 +# pod 'AlipaySDK-iOS', '~> 15.8.30'
40 42 #加载GIF
41 43 pod 'SwiftGifOrigin', '~> 1.7.0'
42 44 #数据库存储
... ...
metaCode.xcodeproj/project.pbxproj
... ... @@ -7,6 +7,10 @@
7 7 objects = {
8 8  
9 9 /* Begin PBXBuildFile section */
  10 + 19023DB52D801EF700872398 /* CNLiveHomeLanmuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19023DB42D801EF700872398 /* CNLiveHomeLanmuController.swift */; };
  11 + 19023DB72D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19023DB62D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift */; };
  12 + 19023DBB2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19023DBA2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift */; };
  13 + 19023DBD2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19023DBC2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift */; };
10 14 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */; };
11 15 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */; };
12 16 1909DC9B2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */; };
... ... @@ -101,6 +105,10 @@
101 105 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */; };
102 106 192ED48A2C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */; };
103 107 192ED48C2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED48B2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift */; };
  108 + 192FDB002D8BEEB300F8723D /* CNLiveVodCellBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192FDAFF2D8BEEB300F8723D /* CNLiveVodCellBottomView.swift */; };
  109 + 192FDB022D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192FDB012D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift */; };
  110 + 192FDB042D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192FDB032D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift */; };
  111 + 192FDB062D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192FDB052D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift */; };
104 112 1938BD172B3D6C7F00390A34 /* CNLiveAuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */; };
105 113 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */; };
106 114 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */; };
... ... @@ -137,8 +145,31 @@
137 145 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */; };
138 146 194134982C292199004FC047 /* CNLiveIdentityRepositoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */; };
139 147 1941349A2C294A78004FC047 /* CNLiveIdentityResTableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134992C294A78004FC047 /* CNLiveIdentityResTableCell.swift */; };
  148 + 19416F822D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19416F812D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift */; };
140 149 194455A12B6B3310006C5A2A /* CNWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194455A02B6B3310006C5A2A /* CNWebView.swift */; };
  150 + 1947297B2D6D8EF500E55857 /* CNLivePlayerTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1947297A2D6D8EF500E55857 /* CNLivePlayerTool.swift */; };
141 151 195226792C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195226782C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift */; };
  152 + 195650B52D7047C500818FC8 /* CNLiveZFPlayerControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650B42D7047C500818FC8 /* CNLiveZFPlayerControlView.swift */; };
  153 + 195650BB2D71B12B00818FC8 /* CNLiveVodPlayModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650BA2D71B12B00818FC8 /* CNLiveVodPlayModel.swift */; };
  154 + 195650BD2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650BC2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift */; };
  155 + 195650BF2D73000900818FC8 /* CNLiveVodAlbumListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650BE2D73000900818FC8 /* CNLiveVodAlbumListModel.swift */; };
  156 + 195650C32D7543A500818FC8 /* CNLiveVodIntroductionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650C22D7543A500818FC8 /* CNLiveVodIntroductionCell.swift */; };
  157 + 195650C72D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650C62D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift */; };
  158 + 195650C92D769CEA00818FC8 /* CNLiveVodTrailersCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650C82D769CEA00818FC8 /* CNLiveVodTrailersCell.swift */; };
  159 + 195650CB2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650CA2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift */; };
  160 + 195650CD2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650CC2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift */; };
  161 + 195650CF2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650CE2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift */; };
  162 + 195650D12D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650D02D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift */; };
  163 + 195650D32D79804400818FC8 /* CNLiveHomeTwoShopCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650D22D79804400818FC8 /* CNLiveHomeTwoShopCell.swift */; };
  164 + 195650D62D7A9B5700818FC8 /* CNLiveHomeSearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650D52D7A9B5700818FC8 /* CNLiveHomeSearchController.swift */; };
  165 + 195650D82D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650D72D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift */; };
  166 + 195650DA2D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650D92D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift */; };
  167 + 195650DD2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650DC2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift */; };
  168 + 195650DF2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650DE2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift */; };
  169 + 195650E12D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650E02D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift */; };
  170 + 195650E32D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650E22D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift */; };
  171 + 195650E52D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650E42D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift */; };
  172 + 195650E72D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195650E62D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift */; };
142 173 19565EC02AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */; };
143 174 19565EC22AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */; };
144 175 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */; };
... ... @@ -148,6 +179,18 @@
148 179 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */; };
149 180 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */; };
150 181 19565ED42AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ED32AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift */; };
  182 + 1958B4142D83D2BA00F37E35 /* CNLiveHomeMoreController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B4132D83D2BA00F37E35 /* CNLiveHomeMoreController.swift */; };
  183 + 1958B4162D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B4152D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift */; };
  184 + 1958B4182D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B4172D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift */; };
  185 + 1958B41A2D8572C100F37E35 /* CNLiveMineMineOrderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B4192D8572C100F37E35 /* CNLiveMineMineOrderCell.swift */; };
  186 + 1958B41C2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B41B2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift */; };
  187 + 1958B41E2D8A98CB00F37E35 /* CNLiveVodPlayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1958B41D2D8A98CA00F37E35 /* CNLiveVodPlayViewModel.swift */; };
  188 + 196211DF2D64869A001925EC /* CNLiveHomeYingshiBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211DE2D648699001925EC /* CNLiveHomeYingshiBannerCell.swift */; };
  189 + 196211E12D66BCDE001925EC /* CNLiveHomeLanmuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211E02D66BCDE001925EC /* CNLiveHomeLanmuCell.swift */; };
  190 + 196211E32D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211E22D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift */; };
  191 + 196211E52D66F5E6001925EC /* CNLiveHomeADCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211E42D66F5E6001925EC /* CNLiveHomeADCell.swift */; };
  192 + 196211E72D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211E62D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift */; };
  193 + 196211E92D686C03001925EC /* CNLiveHomeFollowCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196211E82D686C03001925EC /* CNLiveHomeFollowCell.swift */; };
151 194 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */; };
152 195 1965FA402AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */; };
153 196 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */; };
... ... @@ -160,6 +203,7 @@
160 203 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */; };
161 204 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */; };
162 205 19864E412BF6090400586E72 /* CNLiveDuanJuDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19864E402BF6090400586E72 /* CNLiveDuanJuDetailCell.swift */; };
  206 + 19A8CD142D62DC3700509BCD /* CNLiveTVHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A8CD132D62DC3700509BCD /* CNLiveTVHomeViewController.swift */; };
163 207 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */; };
164 208 19AD65AA2BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */; };
165 209 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */; };
... ... @@ -169,6 +213,7 @@
169 213 19B153CF2BC540FF0018906C /* CNLivePayOrderInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */; };
170 214 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */; };
171 215 19B153D42BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153D32BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift */; };
  216 + 19B711872D55FE130000872A /* CNLiveDownSlideBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B711862D55FE130000872A /* CNLiveDownSlideBannerCell.swift */; };
172 217 19BAF0342C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */; };
173 218 19BB1FDF2AEA3A450094D962 /* CNSlideBaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */; };
174 219 19BB1FE12AEB5C220094D962 /* CNLiveShopConsoleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */; };
... ... @@ -361,6 +406,10 @@
361 406  
362 407 /* Begin PBXFileReference section */
363 408 170BC5D0622EA2969D110A3B /* Pods-metaCode.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode.release.xcconfig"; path = "Target Support Files/Pods-metaCode/Pods-metaCode.release.xcconfig"; sourceTree = "<group>"; };
  409 + 19023DB42D801EF700872398 /* CNLiveHomeLanmuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeLanmuController.swift; sourceTree = "<group>"; };
  410 + 19023DB62D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeLanmuThreeImgCell.swift; sourceTree = "<group>"; };
  411 + 19023DBA2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeShopCategoryCell.swift; sourceTree = "<group>"; };
  412 + 19023DBC2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeShopCategoryModel.swift; sourceTree = "<group>"; };
364 413 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreViewController.swift; sourceTree = "<group>"; };
365 414 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalThreeCell.swift; sourceTree = "<group>"; };
366 415 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNLiveDigitalThreeCerCollectCell .swift"; sourceTree = "<group>"; };
... ... @@ -455,6 +504,10 @@
455 504 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkFirCell.swift; sourceTree = "<group>"; };
456 505 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkSecCell.swift; sourceTree = "<group>"; };
457 506 192ED48B2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkThreeCell.swift; sourceTree = "<group>"; };
  507 + 192FDAFF2D8BEEB300F8723D /* CNLiveVodCellBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodCellBottomView.swift; sourceTree = "<group>"; };
  508 + 192FDB012D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodTrailerExpandCell.swift; sourceTree = "<group>"; };
  509 + 192FDB032D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodShopExpandCell.swift; sourceTree = "<group>"; };
  510 + 192FDB052D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodShopBottomView.swift; sourceTree = "<group>"; };
458 511 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAuthViewController.swift; sourceTree = "<group>"; };
459 512 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageController.swift; sourceTree = "<group>"; };
460 513 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageCell.swift; sourceTree = "<group>"; };
... ... @@ -491,8 +544,31 @@
491 544 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveRealManageCell.swift; sourceTree = "<group>"; };
492 545 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityRepositoryController.swift; sourceTree = "<group>"; };
493 546 194134992C294A78004FC047 /* CNLiveIdentityResTableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityResTableCell.swift; sourceTree = "<group>"; };
  547 + 19416F812D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveTVPlayerViewController.swift; sourceTree = "<group>"; };
494 548 194455A02B6B3310006C5A2A /* CNWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNWebView.swift; sourceTree = "<group>"; };
  549 + 1947297A2D6D8EF500E55857 /* CNLivePlayerTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayerTool.swift; sourceTree = "<group>"; };
495 550 195226782C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityResThreeCollectCell.swift; sourceTree = "<group>"; };
  551 + 195650B42D7047C500818FC8 /* CNLiveZFPlayerControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveZFPlayerControlView.swift; sourceTree = "<group>"; };
  552 + 195650BA2D71B12B00818FC8 /* CNLiveVodPlayModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodPlayModel.swift; sourceTree = "<group>"; };
  553 + 195650BC2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodAlbumMsgModel.swift; sourceTree = "<group>"; };
  554 + 195650BE2D73000900818FC8 /* CNLiveVodAlbumListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodAlbumListModel.swift; sourceTree = "<group>"; };
  555 + 195650C22D7543A500818FC8 /* CNLiveVodIntroductionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodIntroductionCell.swift; sourceTree = "<group>"; };
  556 + 195650C62D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodAlbumListCell.swift; sourceTree = "<group>"; };
  557 + 195650C82D769CEA00818FC8 /* CNLiveVodTrailersCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodTrailersCell.swift; sourceTree = "<group>"; };
  558 + 195650CA2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodPlayShopCell.swift; sourceTree = "<group>"; };
  559 + 195650CC2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodAlbumListCollectionCell.swift; sourceTree = "<group>"; };
  560 + 195650CE2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodTrailersCollectionCell.swift; sourceTree = "<group>"; };
  561 + 195650D02D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodPlayShopCollectionCell.swift; sourceTree = "<group>"; };
  562 + 195650D22D79804400818FC8 /* CNLiveHomeTwoShopCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeTwoShopCell.swift; sourceTree = "<group>"; };
  563 + 195650D52D7A9B5700818FC8 /* CNLiveHomeSearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchController.swift; sourceTree = "<group>"; };
  564 + 195650D72D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchHistoryCell.swift; sourceTree = "<group>"; };
  565 + 195650D92D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchHotCell.swift; sourceTree = "<group>"; };
  566 + 195650DC2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchViewModel.swift; sourceTree = "<group>"; };
  567 + 195650DE2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchHotModel.swift; sourceTree = "<group>"; };
  568 + 195650E02D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchHistoryModel.swift; sourceTree = "<group>"; };
  569 + 195650E22D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveSearchHistoryFloatLayoutView.swift; sourceTree = "<group>"; };
  570 + 195650E42D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchResultJuJiCell.swift; sourceTree = "<group>"; };
  571 + 195650E62D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeSearchResultDuanJuCell.swift; sourceTree = "<group>"; };
496 572 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailBtnsCell.swift; sourceTree = "<group>"; };
497 573 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailOrderAssetCell.swift; sourceTree = "<group>"; };
498 574 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopProductManagerController.swift; sourceTree = "<group>"; };
... ... @@ -502,6 +578,18 @@
502 578 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListClassifyView.swift; sourceTree = "<group>"; };
503 579 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListCell.swift; sourceTree = "<group>"; };
504 580 19565ED32AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddEditGoodsModel.swift; sourceTree = "<group>"; };
  581 + 1958B4132D83D2BA00F37E35 /* CNLiveHomeMoreController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeMoreController.swift; sourceTree = "<group>"; };
  582 + 1958B4152D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeTwoHengTuCell.swift; sourceTree = "<group>"; };
  583 + 1958B4172D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveMinePlayHistoryCell.swift; sourceTree = "<group>"; };
  584 + 1958B4192D8572C100F37E35 /* CNLiveMineMineOrderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveMineMineOrderCell.swift; sourceTree = "<group>"; };
  585 + 1958B41B2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveMinePlayHistoryCollectionCell.swift; sourceTree = "<group>"; };
  586 + 1958B41D2D8A98CA00F37E35 /* CNLiveVodPlayViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVodPlayViewModel.swift; sourceTree = "<group>"; };
  587 + 196211DE2D648699001925EC /* CNLiveHomeYingshiBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeYingshiBannerCell.swift; sourceTree = "<group>"; };
  588 + 196211E02D66BCDE001925EC /* CNLiveHomeLanmuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeLanmuCell.swift; sourceTree = "<group>"; };
  589 + 196211E22D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeOneBigTwoSmallCell.swift; sourceTree = "<group>"; };
  590 + 196211E42D66F5E6001925EC /* CNLiveHomeADCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeADCell.swift; sourceTree = "<group>"; };
  591 + 196211E62D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeTwoDuanjuCell.swift; sourceTree = "<group>"; };
  592 + 196211E82D686C03001925EC /* CNLiveHomeFollowCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveHomeFollowCell.swift; sourceTree = "<group>"; };
505 593 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddGoodsSingleView.swift; sourceTree = "<group>"; };
506 594 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAddGoodsSelectUploadImageView.swift; sourceTree = "<group>"; };
507 595 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsCategoryController.swift; sourceTree = "<group>"; };
... ... @@ -514,6 +602,7 @@
514 602 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroNetworkImageProvider.swift; sourceTree = "<group>"; };
515 603 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideRealHotListCell.swift; sourceTree = "<group>"; };
516 604 19864E402BF6090400586E72 /* CNLiveDuanJuDetailCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDuanJuDetailCell.swift; sourceTree = "<group>"; };
  605 + 19A8CD132D62DC3700509BCD /* CNLiveTVHomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveTVHomeViewController.swift; sourceTree = "<group>"; };
517 606 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownslideOperationManager.swift; sourceTree = "<group>"; };
518 607 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsDetailsTableViewCell.swift; sourceTree = "<group>"; };
519 608 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopCommentRequestShareModel.swift; sourceTree = "<group>"; };
... ... @@ -523,6 +612,7 @@
523 612 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePayOrderInfoModel.swift; sourceTree = "<group>"; };
524 613 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopPayNeedPaymentCell.swift; sourceTree = "<group>"; };
525 614 19B153D32BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopPayWeChatAlipayCell.swift; sourceTree = "<group>"; };
  615 + 19B711862D55FE130000872A /* CNLiveDownSlideBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideBannerCell.swift; sourceTree = "<group>"; };
526 616 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreviewFourWorkAwardCell.swift; sourceTree = "<group>"; };
527 617 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNSlideBaseNavigationController.swift; sourceTree = "<group>"; };
528 618 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleController.swift; sourceTree = "<group>"; };
... ... @@ -737,6 +827,30 @@
737 827 /* End PBXFrameworksBuildPhase section */
738 828  
739 829 /* Begin PBXGroup section */
  830 + 19023DB82D8123F700872398 /* Lanmu */ = {
  831 + isa = PBXGroup;
  832 + children = (
  833 + 19023DB62D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift */,
  834 + );
  835 + path = Lanmu;
  836 + sourceTree = "<group>";
  837 + };
  838 + 19023DB92D81240C00872398 /* Home */ = {
  839 + isa = PBXGroup;
  840 + children = (
  841 + 196211DE2D648699001925EC /* CNLiveHomeYingshiBannerCell.swift */,
  842 + 196211E02D66BCDE001925EC /* CNLiveHomeLanmuCell.swift */,
  843 + 196211E82D686C03001925EC /* CNLiveHomeFollowCell.swift */,
  844 + 196211E22D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift */,
  845 + 196211E42D66F5E6001925EC /* CNLiveHomeADCell.swift */,
  846 + 196211E62D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift */,
  847 + 195650D22D79804400818FC8 /* CNLiveHomeTwoShopCell.swift */,
  848 + 19023DBA2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift */,
  849 + 1958B4152D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift */,
  850 + );
  851 + path = Home;
  852 + sourceTree = "<group>";
  853 + };
740 854 1909DC922C6308FA001E7986 /* 数字简历相关页面 */ = {
741 855 isa = PBXGroup;
742 856 children = (
... ... @@ -990,8 +1104,8 @@
990 1104 1938BD152B3D6C6000390A34 /* Controller */ = {
991 1105 isa = PBXGroup;
992 1106 children = (
993   - 19C735BF2BFDCECD00CACF4E /* CNLiveTotalHotListController */,
994 1107 1938BD272B48009600390A34 /* HomeController */,
  1108 + 19C735BF2BFDCECD00CACF4E /* CNLiveTotalHotListController */,
995 1109 1938BD1D2B46791400390A34 /* PlayletHomePage */,
996 1110 );
997 1111 path = Controller;
... ... @@ -1107,6 +1221,7 @@
1107 1221 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */,
1108 1222 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */,
1109 1223 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */,
  1224 + 19B711862D55FE130000872A /* CNLiveDownSlideBannerCell.swift */,
1110 1225 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */,
1111 1226 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */,
1112 1227 19C735C22BFED49700CACF4E /* CNLiveRealHotListDetailCell.swift */,
... ... @@ -1198,6 +1313,111 @@
1198 1313 path = DigitalAuth;
1199 1314 sourceTree = "<group>";
1200 1315 };
  1316 + 194729792D6D8EB300E55857 /* Util */ = {
  1317 + isa = PBXGroup;
  1318 + children = (
  1319 + 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */,
  1320 + 1947297A2D6D8EF500E55857 /* CNLivePlayerTool.swift */,
  1321 + );
  1322 + path = Util;
  1323 + sourceTree = "<group>";
  1324 + };
  1325 + 195650B62D71B00200818FC8 /* HuBiLieHomePage */ = {
  1326 + isa = PBXGroup;
  1327 + children = (
  1328 + 195650DB2D7BDA4C00818FC8 /* ViewModel */,
  1329 + 194729792D6D8EB300E55857 /* Util */,
  1330 + 195650B92D71B03600818FC8 /* Model */,
  1331 + 195650B82D71B02F00818FC8 /* View */,
  1332 + 195650B72D71B02200818FC8 /* Controller */,
  1333 + );
  1334 + path = HuBiLieHomePage;
  1335 + sourceTree = "<group>";
  1336 + };
  1337 + 195650B72D71B02200818FC8 /* Controller */ = {
  1338 + isa = PBXGroup;
  1339 + children = (
  1340 + 19A8CD132D62DC3700509BCD /* CNLiveTVHomeViewController.swift */,
  1341 + 195650D52D7A9B5700818FC8 /* CNLiveHomeSearchController.swift */,
  1342 + 19023DB42D801EF700872398 /* CNLiveHomeLanmuController.swift */,
  1343 + 1958B4132D83D2BA00F37E35 /* CNLiveHomeMoreController.swift */,
  1344 + 19416F812D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift */,
  1345 + );
  1346 + path = Controller;
  1347 + sourceTree = "<group>";
  1348 + };
  1349 + 195650B82D71B02F00818FC8 /* View */ = {
  1350 + isa = PBXGroup;
  1351 + children = (
  1352 + 195650C12D75435700818FC8 /* VodDetail */,
  1353 + 195650C02D75433B00818FC8 /* Home */,
  1354 + );
  1355 + path = View;
  1356 + sourceTree = "<group>";
  1357 + };
  1358 + 195650B92D71B03600818FC8 /* Model */ = {
  1359 + isa = PBXGroup;
  1360 + children = (
  1361 + 195650BA2D71B12B00818FC8 /* CNLiveVodPlayModel.swift */,
  1362 + 195650BC2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift */,
  1363 + 195650BE2D73000900818FC8 /* CNLiveVodAlbumListModel.swift */,
  1364 + 195650DE2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift */,
  1365 + 195650E02D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift */,
  1366 + 19023DBC2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift */,
  1367 + );
  1368 + path = Model;
  1369 + sourceTree = "<group>";
  1370 + };
  1371 + 195650C02D75433B00818FC8 /* Home */ = {
  1372 + isa = PBXGroup;
  1373 + children = (
  1374 + 19023DB92D81240C00872398 /* Home */,
  1375 + 19023DB82D8123F700872398 /* Lanmu */,
  1376 + 195650D42D7A9A4F00818FC8 /* Search */,
  1377 + );
  1378 + path = Home;
  1379 + sourceTree = "<group>";
  1380 + };
  1381 + 195650C12D75435700818FC8 /* VodDetail */ = {
  1382 + isa = PBXGroup;
  1383 + children = (
  1384 + 195650B42D7047C500818FC8 /* CNLiveZFPlayerControlView.swift */,
  1385 + 195650C22D7543A500818FC8 /* CNLiveVodIntroductionCell.swift */,
  1386 + 195650C62D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift */,
  1387 + 195650CC2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift */,
  1388 + 195650C82D769CEA00818FC8 /* CNLiveVodTrailersCell.swift */,
  1389 + 195650CE2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift */,
  1390 + 195650CA2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift */,
  1391 + 195650D02D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift */,
  1392 + 192FDAFF2D8BEEB300F8723D /* CNLiveVodCellBottomView.swift */,
  1393 + 192FDB012D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift */,
  1394 + 192FDB052D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift */,
  1395 + 192FDB032D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift */,
  1396 + );
  1397 + path = VodDetail;
  1398 + sourceTree = "<group>";
  1399 + };
  1400 + 195650D42D7A9A4F00818FC8 /* Search */ = {
  1401 + isa = PBXGroup;
  1402 + children = (
  1403 + 195650D72D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift */,
  1404 + 195650E22D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift */,
  1405 + 195650D92D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift */,
  1406 + 195650E42D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift */,
  1407 + 195650E62D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift */,
  1408 + );
  1409 + path = Search;
  1410 + sourceTree = "<group>";
  1411 + };
  1412 + 195650DB2D7BDA4C00818FC8 /* ViewModel */ = {
  1413 + isa = PBXGroup;
  1414 + children = (
  1415 + 195650DC2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift */,
  1416 + 1958B41D2D8A98CA00F37E35 /* CNLiveVodPlayViewModel.swift */,
  1417 + );
  1418 + path = ViewModel;
  1419 + sourceTree = "<group>";
  1420 + };
1201 1421 19565EC32AF8ACC2007D6727 /* GoodsManager */ = {
1202 1422 isa = PBXGroup;
1203 1423 children = (
... ... @@ -1368,7 +1588,6 @@
1368 1588 194134812C181A7E004FC047 /* DigitalAuth */,
1369 1589 1917330B2B109691007BCC04 /* CNLivePlayer */,
1370 1590 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */,
1371   - 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */,
1372 1591 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */,
1373 1592 191733302B170537007BCC04 /* CNLiveCommonManager.swift */,
1374 1593 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */,
... ... @@ -1638,6 +1857,7 @@
1638 1857 796398902A260C0100D045EB /* Main */ = {
1639 1858 isa = PBXGroup;
1640 1859 children = (
  1860 + 195650B62D71B00200818FC8 /* HuBiLieHomePage */,
1641 1861 7939B06D2B47EB46005AE981 /* VideoPage */,
1642 1862 1938BD112B3D6C0C00390A34 /* HomePages */,
1643 1863 7991722C2AF08CF100DC01A8 /* ShopPage */,
... ... @@ -1703,6 +1923,9 @@
1703 1923 79F4B11B2A33036E00993C03 /* CNLiveMineInfoAlertView.swift */,
1704 1924 79803E282AD6991200F05F68 /* CNLiveMineInputMessageView.swift */,
1705 1925 19C0F76C2BDB48750097CC8F /* CNBindingManageCell.swift */,
  1926 + 1958B4172D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift */,
  1927 + 1958B41B2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift */,
  1928 + 1958B4192D8572C100F37E35 /* CNLiveMineMineOrderCell.swift */,
1706 1929 );
1707 1930 path = View;
1708 1931 sourceTree = "<group>";
... ... @@ -2138,6 +2361,7 @@
2138 2361 1917334C2B2BE9CA007BCC04 /* CNLiveCreateCouponTypeMoneyView.swift in Sources */,
2139 2362 191733002B0B58E5007BCC04 /* CNLiveSelectUploadImageModel.swift in Sources */,
2140 2363 1909DCA72C637378001E7986 /* CNLiveDigitalResumePreviewFiveCell.swift in Sources */,
  2364 + 19B711872D55FE130000872A /* CNLiveDownSlideBannerCell.swift in Sources */,
2141 2365 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */,
2142 2366 19C0F7692BD9F9F70097CC8F /* CNThreeLoginViewController.swift in Sources */,
2143 2367 191732F32B084DBC007BCC04 /* CNLiveShopClassifySwitchTableViewCell.swift in Sources */,
... ... @@ -2146,6 +2370,7 @@
2146 2370 1938BD2E2B48021E00390A34 /* CNHomePageBaseNavigationController.swift in Sources */,
2147 2371 1917332F2B16C7C9007BCC04 /* CNLiveTimer.swift in Sources */,
2148 2372 194134942C240583004FC047 /* CNLiveDigitalRealManageController.swift in Sources */,
  2373 + 195650DA2D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift in Sources */,
2149 2374 7CD675292A270F6A008354C1 /* WJColorChange.m in Sources */,
2150 2375 192ED4782C5339D50057244C /* CNLiveCertificateCollectionCell.swift in Sources */,
2151 2376 194134862C196F59004FC047 /* CNLiveAuthTool.swift in Sources */,
... ... @@ -2153,7 +2378,9 @@
2153 2378 19864E412BF6090400586E72 /* CNLiveDuanJuDetailCell.swift in Sources */,
2154 2379 79F4B11C2A33036E00993C03 /* CNLiveMineInfoAlertView.swift in Sources */,
2155 2380 192ED47C2C538C970057244C /* CNLiveVitaeCertificateAddPhotoCell.swift in Sources */,
  2381 + 196211E92D686C03001925EC /* CNLiveHomeFollowCell.swift in Sources */,
2156 2382 79BB96A82AF223FB00AEA4AC /* CNLiveConfigAlertManager.swift in Sources */,
  2383 + 1958B41A2D8572C100F37E35 /* CNLiveMineMineOrderCell.swift in Sources */,
2157 2384 19BB1FF02AF0E5B30094D962 /* CNLiveShopDetailModel.swift in Sources */,
2158 2385 1938BD382B4BDC2500390A34 /* CNLiveAlbumImageCell.swift in Sources */,
2159 2386 796398942A260C0100D045EB /* AppDelegate.swift in Sources */,
... ... @@ -2167,6 +2394,7 @@
2167 2394 19C0F76B2BDB432A0097CC8F /* CNLiveMineBindingManagerController.swift in Sources */,
2168 2395 792B53282AFCD7640009AB49 /* CNLiveShopOrderExpressDetailViewController.swift in Sources */,
2169 2396 79396EF12A31C21B0053E1AF /* CNLiveInfoShowViewController.swift in Sources */,
  2397 + 196211E32D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift in Sources */,
2170 2398 191733422B284D5E007BCC04 /* CNLiveShopCouponCreateBottomView.swift in Sources */,
2171 2399 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */,
2172 2400 19565ECB2AF8C59C007D6727 /* CNLiveShopGoodsListModel.swift in Sources */,
... ... @@ -2194,6 +2422,7 @@
2194 2422 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */,
2195 2423 19E302672BC8FEBC00F6B8BD /* CNLliveShopDetailCloseCell.swift in Sources */,
2196 2424 1938BD322B4B8F0400390A34 /* CNLiveHomePageModel.swift in Sources */,
  2425 + 195650E52D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift in Sources */,
2197 2426 191732EF2B075C3A007BCC04 /* CNLiveCreateShopClassifyViewController.swift in Sources */,
2198 2427 1938BD302B4B8A3500390A34 /* CNLiveHomePageViewModel.swift in Sources */,
2199 2428 19C735CC2C11A1F400CACF4E /* CNLiveDigitalThreeCollectCell.swift in Sources */,
... ... @@ -2219,9 +2448,11 @@
2219 2448 1941348C2C20261C004FC047 /* CNLiveDigitalSecCell.swift in Sources */,
2220 2449 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */,
2221 2450 191733642B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift in Sources */,
  2451 + 195650B52D7047C500818FC8 /* CNLiveZFPlayerControlView.swift in Sources */,
2222 2452 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */,
2223 2453 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
2224 2454 192ED4692C4F77370057244C /* CNLiveHangYeFirCell.swift in Sources */,
  2455 + 196211E12D66BCDE001925EC /* CNLiveHomeLanmuCell.swift in Sources */,
2225 2456 19C735C12BFDCEE900CACF4E /* CNLiveTotalHotListController.swift in Sources */,
2226 2457 7939B0732B47F12F005AE981 /* CNLiveShortVideoViewController.swift in Sources */,
2227 2458 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */,
... ... @@ -2229,9 +2460,11 @@
2229 2460 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */,
2230 2461 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */,
2231 2462 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
  2463 + 196211E52D66F5E6001925EC /* CNLiveHomeADCell.swift in Sources */,
2232 2464 192ED4742C521F4D0057244C /* CNLiveVocationalCertifiteCollectionViewLayout.swift in Sources */,
2233 2465 191732F82B08AB9D007BCC04 /* CNLiveShopClassilyViewModel.swift in Sources */,
2234 2466 79BB1C162B05C62900C5720C /* CNLiveShopBodyCouponView.swift in Sources */,
  2467 + 195650D62D7A9B5700818FC8 /* CNLiveHomeSearchController.swift in Sources */,
2235 2468 798916E92B04532D00D08302 /* CNLiveSavePointDB.swift in Sources */,
2236 2469 1938BD242B468AC900390A34 /* CNLivePlayletHomePageHeaderCell.swift in Sources */,
2237 2470 19B153D42BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift in Sources */,
... ... @@ -2268,6 +2501,8 @@
2268 2501 19565EC72AF8AD38007D6727 /* CNLiveShopNewProductController.swift in Sources */,
2269 2502 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */,
2270 2503 7CD6753D2A2740B0008354C1 /* CNMainView.swift in Sources */,
  2504 + 192FDB002D8BEEB300F8723D /* CNLiveVodCellBottomView.swift in Sources */,
  2505 + 195650CB2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift in Sources */,
2271 2506 19B153CB2BC3E1870018906C /* CNLiveShopPayController.swift in Sources */,
2272 2507 191733662B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift in Sources */,
2273 2508 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */,
... ... @@ -2290,12 +2525,17 @@
2290 2525 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
2291 2526 19BB1FE32AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift in Sources */,
2292 2527 1938BD2A2B48014E00390A34 /* CNHomepageDetailViewController.swift in Sources */,
  2528 + 19023DB52D801EF700872398 /* CNLiveHomeLanmuController.swift in Sources */,
2293 2529 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */,
  2530 + 195650D12D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift in Sources */,
2294 2531 792E57D92A3AA2F2005834DB /* CNLiveCommonBaseModel.swift in Sources */,
2295 2532 1941349A2C294A78004FC047 /* CNLiveIdentityResTableCell.swift in Sources */,
  2533 + 195650E32D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift in Sources */,
2296 2534 791C1C862AFB2EB4003E6362 /* CNLiveShopOrderExpressViewController.swift in Sources */,
2297 2535 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */,
  2536 + 19023DB72D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift in Sources */,
2298 2537 191733312B170537007BCC04 /* CNLiveCommonManager.swift in Sources */,
  2538 + 196211E72D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift in Sources */,
2299 2539 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
2300 2540 191732F52B085BAE007BCC04 /* CNLiveShopClassilyIconTableViewCell.swift in Sources */,
2301 2541 192ED4842C5742510057244C /* CNLiveVitaeAddWorkController.swift in Sources */,
... ... @@ -2319,25 +2559,33 @@
2319 2559 191733212B143F3A007BCC04 /* CNLiveGradientView.swift in Sources */,
2320 2560 19AD65AE2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift in Sources */,
2321 2561 192ED46B2C4F77450057244C /* CNLiveHangYeSecCell.swift in Sources */,
  2562 + 1958B41C2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift in Sources */,
2322 2563 19BB1FE62AEB93B80094D962 /* CNLiveShopUserInfoModel.swift in Sources */,
  2564 + 19023DBB2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift in Sources */,
2323 2565 1909DCAB2C649C10001E7986 /* CNLiveDigitalResumePreViewSecCollectionCell.swift in Sources */,
  2566 + 195650C32D7543A500818FC8 /* CNLiveVodIntroductionCell.swift in Sources */,
  2567 + 195650BD2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift in Sources */,
2324 2568 19DFE64D2C4792C500E428AE /* CNLiveDigitalResumeInfoController.swift in Sources */,
2325 2569 7CD675472A274167008354C1 /* NewPagedFlowView.m in Sources */,
2326 2570 191732ED2B073C52007BCC04 /* CNLiveShopClassifyListModel.swift in Sources */,
2327 2571 191733482B2855E8007BCC04 /* CNLiveShopCouponViewModel.swift in Sources */,
2328 2572 79F4B11A2A32F21400993C03 /* CNLiveMineNickViewController.swift in Sources */,
2329 2573 191733542B2C4D58007BCC04 /* CNLivePickerToolsView.swift in Sources */,
  2574 + 192FDB042D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift in Sources */,
2330 2575 191733112B109EDC007BCC04 /* CNLivePlayerControlView.swift in Sources */,
2331 2576 1917331F2B10A1BE007BCC04 /* CNLivePlayerEnum.swift in Sources */,
  2577 + 195650E12D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift in Sources */,
2332 2578 191733382B27FD66007BCC04 /* CNLiveShopClassifySectionHeaderView.swift in Sources */,
2333 2579 19CB631F2C69ADF500D889F8 /* CNLiveDigitalResumePreViewSelectRenzhengCerController.swift in Sources */,
2334 2580 194134782C17F83B004FC047 /* CNLiveFaceAuthController.swift in Sources */,
  2581 + 19023DBD2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift in Sources */,
2335 2582 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */,
2336 2583 1938BD3F2B4BE7C500390A34 /* CNLiveAlbumMsgModel.swift in Sources */,
2337 2584 798A44FF2A30A0A800815935 /* CNLiveInputFeedBackViewController.swift in Sources */,
2338 2585 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */,
2339 2586 19DFE6492C44BEAE00E428AE /* CNLiveDigitalResumeCell.swift in Sources */,
2340 2587 79282A442A2F1C1E00B5F8CF /* CNLiveLoginAuthView.swift in Sources */,
  2588 + 1958B4142D83D2BA00F37E35 /* CNLiveHomeMoreController.swift in Sources */,
2341 2589 19B153CD2BC3EB690018906C /* CNLiveShoph5ViewModel.swift in Sources */,
2342 2590 79BB96A62AF21E2800AEA4AC /* CNLiveShopOrderDetailViewController.swift in Sources */,
2343 2591 194455A12B6B3310006C5A2A /* CNWebView.swift in Sources */,
... ... @@ -2348,11 +2596,13 @@
2348 2596 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */,
2349 2597 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */,
2350 2598 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */,
  2599 + 196211DF2D64869A001925EC /* CNLiveHomeYingshiBannerCell.swift in Sources */,
2351 2600 1941347A2C18001A004FC047 /* CGImage+FaceCrop.swift in Sources */,
2352 2601 7939B0752B47F1B9005AE981 /* CNLiveShortVideoListTableViewCell.swift in Sources */,
2353 2602 794294A72B4D18EC008AAFA0 /* CNLiveShortVideoContentListView.swift in Sources */,
2354 2603 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */,
2355 2604 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */,
  2605 + 195650D82D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift in Sources */,
2356 2606 796308732B4B8EB80090D22A /* CNLiveShortVideoViewModel.swift in Sources */,
2357 2607 19E9D1602B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift in Sources */,
2358 2608 191732CE2B04AACD007BCC04 /* CNLiveShopTextView.swift in Sources */,
... ... @@ -2361,6 +2611,7 @@
2361 2611 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */,
2362 2612 798A44EA2A30135D00815935 /* CNLiveMineBodyListView.swift in Sources */,
2363 2613 1917335A2B3283A1007BCC04 /* CNLiveCouponGoodsSearchView.swift in Sources */,
  2614 + 195650C92D769CEA00818FC8 /* CNLiveVodTrailersCell.swift in Sources */,
2364 2615 191733362B27EFD4007BCC04 /* CNLiveShopClassilyManageViewController.swift in Sources */,
2365 2616 799172322AF08D1B00DC01A8 /* CNLiveShopOrderViewController.swift in Sources */,
2366 2617 1917332D2B15DB20007BCC04 /* CNLivePlayerKVOModel.swift in Sources */,
... ... @@ -2371,12 +2622,15 @@
2371 2622 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */,
2372 2623 79DC67642B5FB60900261A94 /* CNLiveMineAuthFormViewController.swift in Sources */,
2373 2624 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
  2625 + 1958B4162D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift in Sources */,
2374 2626 19C0F7672BD8DC4D0097CC8F /* CNThreeLoginModel.swift in Sources */,
  2627 + 19416F822D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift in Sources */,
2375 2628 794FF1092B02131300385E85 /* CNLiveSaveSearchDB.swift in Sources */,
2376 2629 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */,
2377 2630 79396EED2A319F220053E1AF /* NSObject+CNLiveExtensions.swift in Sources */,
2378 2631 1917331B2B10A0EF007BCC04 /* CNLivePlayerLoadingView.swift in Sources */,
2379 2632 19FA201B2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift in Sources */,
  2633 + 192FDB022D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift in Sources */,
2380 2634 1909DCA22C637353001E7986 /* CNLiveDigitalResumePreviewThreeCell.swift in Sources */,
2381 2635 192ED47E2C538CA30057244C /* CNLiveVitaeCertificateAddInfoCell.swift in Sources */,
2382 2636 7C4931312A2F142F000E44B4 /* CNHomePageBackgroupView.swift in Sources */,
... ... @@ -2386,6 +2640,7 @@
2386 2640 19DFE6432C41039600E428AE /* CNLiveVitaeViewModel.swift in Sources */,
2387 2641 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */,
2388 2642 19C735D02C12F5F600CACF4E /* CNLiveRealNameCell.swift in Sources */,
  2643 + 195650BF2D73000900818FC8 /* CNLiveVodAlbumListModel.swift in Sources */,
2389 2644 7999415C2B4E8E8E0014C721 /* CNLiveRefresh.swift in Sources */,
2390 2645 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */,
2391 2646 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */,
... ... @@ -2396,9 +2651,12 @@
2396 2651 191733152B109FD7007BCC04 /* CNLivePlayerTopNaviView.swift in Sources */,
2397 2652 794FF1052B01FC8800385E85 /* CNLiveShopOrderSearchViewController.swift in Sources */,
2398 2653 798A44EC2A302DBE00815935 /* CNLiveMineAddInfoViewController.swift in Sources */,
  2654 + 195650E72D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift in Sources */,
2399 2655 791C1C882AFB6FD7003E6362 /* CNLiveShopOrderExpressFirmViewController.swift in Sources */,
  2656 + 195650DF2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift in Sources */,
2400 2657 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */,
2401 2658 794BC1652AF9E70D00A68C74 /* CNLiveShopOrderSendViewController.swift in Sources */,
  2659 + 195650CF2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift in Sources */,
2402 2660 79BB96AA2AF2330900AEA4AC /* CNLiveShopBodyDetailView.swift in Sources */,
2403 2661 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */,
2404 2662 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
... ... @@ -2409,6 +2667,8 @@
2409 2667 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */,
2410 2668 794294AA2B4D4381008AAFA0 /* CNLiveShortVideoCommentListView.swift in Sources */,
2411 2669 1909DC9E2C637339001E7986 /* CNLiveDigitalResumePreViewFirCell.swift in Sources */,
  2670 + 195650C72D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift in Sources */,
  2671 + 195650BB2D71B12B00818FC8 /* CNLiveVodPlayModel.swift in Sources */,
2412 2672 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */,
2413 2673 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */,
2414 2674 19CB63222C69B3B600D889F8 /* CNLiveDigitalResumeGuanfangRenzhengCell.swift in Sources */,
... ... @@ -2419,6 +2679,8 @@
2419 2679 1938BD412B4BEC6900390A34 /* CNLiveAlbumListModel.swift in Sources */,
2420 2680 1941347E2C1815E7004FC047 /* AVExtensions.swift in Sources */,
2421 2681 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */,
  2682 + 1958B4182D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift in Sources */,
  2683 + 195650DD2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift in Sources */,
2422 2684 191733292B148BF7007BCC04 /* CNLivePlayerVolumeBrightnessView.swift in Sources */,
2423 2685 7C4931292A2D8BA8000E44B4 /* CNLiveBaseTabBarViewController.swift in Sources */,
2424 2686 79F4B1162A32B96B00993C03 /* CNLiveMineInfoViewController.swift in Sources */,
... ... @@ -2426,10 +2688,12 @@
2426 2688 194134882C1FE4E7004FC047 /* CNLiveDigitalAssetsController.swift in Sources */,
2427 2689 7CD6753F2A2740B0008354C1 /* CNDownSlideViewRemindView.swift in Sources */,
2428 2690 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */,
  2691 + 1947297B2D6D8EF500E55857 /* CNLivePlayerTool.swift in Sources */,
2429 2692 192ED4632C4A642F0057244C /* CNLiveAddrAreaModel.swift in Sources */,
2430 2693 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */,
2431 2694 7CD6753C2A2740B0008354C1 /* CNUpSlideViewRemindView.swift in Sources */,
2432 2695 7939B0772B47F88A005AE981 /* CNLiveShortVideoControlView.swift in Sources */,
  2696 + 1958B41E2D8A98CB00F37E35 /* CNLiveVodPlayViewModel.swift in Sources */,
2433 2697 191733602B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift in Sources */,
2434 2698 79BB1C142B05C51900C5720C /* CNLiveShopCouponViewController.swift in Sources */,
2435 2699 1941348A2C200E4E004FC047 /* CNLiveDigitalFirstCell.swift in Sources */,
... ... @@ -2447,6 +2711,7 @@
2447 2711 79A267832AF8D7BC0088D9F6 /* CNLiveShopBodyCustomView.swift in Sources */,
2448 2712 1917335E2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift in Sources */,
2449 2713 791C1C8C2AFB85F8003E6362 /* CNLiveShopBodyExpressView.swift in Sources */,
  2714 + 195650CD2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift in Sources */,
2450 2715 79868B192B874294008E0F5C /* CNLiveSaveAuthStateDB.swift in Sources */,
2451 2716 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */,
2452 2717 191733192B10A05D007BCC04 /* CNLivePlayerProgressView.swift in Sources */,
... ... @@ -2458,8 +2723,11 @@
2458 2723 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */,
2459 2724 7991723A2AF091E100DC01A8 /* CNLiveShopOrderListViewController.swift in Sources */,
2460 2725 798A44F02A305BC200815935 /* UIButton+CNLiveExtensions.swift in Sources */,
  2726 + 195650D32D79804400818FC8 /* CNLiveHomeTwoShopCell.swift in Sources */,
  2727 + 19A8CD142D62DC3700509BCD /* CNLiveTVHomeViewController.swift in Sources */,
2461 2728 1969E1AD2C92E98700E4185E /* CNHomeWebViewController.swift in Sources */,
2462 2729 1938BD342B4B968300390A34 /* CNLiveHomePageDuanJuCell.swift in Sources */,
  2730 + 192FDB062D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift in Sources */,
2463 2731 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */,
2464 2732 191733522B2C4CEA007BCC04 /* CNLivePickerSelectDateTools.swift in Sources */,
2465 2733 1917333A2B27FDF3007BCC04 /* CNLiveShopClassilyManageTableViewCell.swift in Sources */,
... ... @@ -2640,7 +2908,7 @@
2640 2908 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements;
2641 2909 CODE_SIGN_IDENTITY = "Apple Development";
2642 2910 CODE_SIGN_STYLE = Automatic;
2643   - CURRENT_PROJECT_VERSION = 1.1.4.24.09.14.12;
  2911 + CURRENT_PROJECT_VERSION = 1.1.4.25.02.09.11;
2644 2912 DEBUG_INFORMATION_FORMAT = dwarf;
2645 2913 DEVELOPMENT_TEAM = 94X49GG3ZW;
2646 2914 ENABLE_BITCODE = NO;
... ... @@ -2708,7 +2976,7 @@
2708 2976 INFOPLIST_KEY_UIMainStoryboardFile = Main;
2709 2977 INFOPLIST_KEY_UIStatusBarStyle = "";
2710 2978 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
2711   - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  2979 + IPHONEOS_DEPLOYMENT_TARGET = 13.0;
2712 2980 LD_RUNPATH_SEARCH_PATHS = (
2713 2981 "$(inherited)",
2714 2982 "@executable_path/Frameworks",
... ... @@ -2896,7 +3164,7 @@
2896 3164 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements;
2897 3165 CODE_SIGN_IDENTITY = "Apple Development";
2898 3166 CODE_SIGN_STYLE = Automatic;
2899   - CURRENT_PROJECT_VERSION = 1.1.4.24.09.14.12;
  3167 + CURRENT_PROJECT_VERSION = 1.1.4.25.02.09.11;
2900 3168 DEVELOPMENT_TEAM = 94X49GG3ZW;
2901 3169 ENABLE_BITCODE = NO;
2902 3170 ENABLE_MODULE_VERIFIER = NO;
... ... @@ -2963,7 +3231,7 @@
2963 3231 INFOPLIST_KEY_UIMainStoryboardFile = Main;
2964 3232 INFOPLIST_KEY_UIStatusBarStyle = "";
2965 3233 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
2966   - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  3234 + IPHONEOS_DEPLOYMENT_TARGET = 13.0;
2967 3235 LD_RUNPATH_SEARCH_PATHS = (
2968 3236 "$(inherited)",
2969 3237 "@executable_path/Frameworks",
... ...
metaCode/Classes/Common/Base/CNLiveBaseTabBarViewController.swift
... ... @@ -52,21 +52,25 @@ class CNLiveBaseTabBarViewController: UITabBarController
52 52 // MARK: - 控制器的信息
53 53 func setUpTabBar() {
54 54  
  55 +
  56 +//// let homeVC = CNLiveNewAuthViewController.init()
  57 + ///忽必烈
  58 + let homeVC = CNLiveTVHomeViewController.init()
55 59 // let homeVC = CNLiveAuthViewController.init()
56   - let homeVC = CNHomeWebViewController()
57   - homeVC.url = URL(string: "https://wjjh5.cnlive.com/chatgpt/#/")
58   - let authVC = CNMetaCodeHomePageController.init()
  60 +// let homeVC = CNHomeWebViewController()
  61 +// homeVC.url = URL(string: "https://wjjh5.cnlive.com/chatgpt/#/")
  62 +// let authVC = CNMetaCodeHomePageController.init()
59 63 let mineVC = CNLiveMineViewController.init()
60   -
  64 +
61 65 creatTabbarView(viewController: homeVC, image: "tabbar_hoem_icon_default", selectImage: "tabbar_hoem_icon_selected", title: "首页")
62   - creatTabbarView(viewController: authVC, image: "tabbar_authentication_unSelect", selectImage: "tabbar_authentication", title: "认证")
  66 +// creatTabbarView(viewController: authVC, image: "tabbar_authentication_unSelect", selectImage: "tabbar_authentication", title: "认证")
63 67 creatTabbarView(viewController: mineVC, image: "tabbar_mine_icon_default", selectImage: "tabbar_mine_icon_selected", title: "我的")
64 68  
65 69 self.tabBar.tintColor = UIColor("#0066FE")
66 70 self.tabBar.isTranslucent = false
67 71 self.viewControllers = [
68 72 CNLiveBaseNavigationController(rootViewController: homeVC),
69   - CNLiveBaseNavigationController(rootViewController: authVC),
  73 + //CNLiveBaseNavigationController(rootViewController: authVC),
70 74 CNLiveBaseNavigationController(rootViewController: mineVC)
71 75 ]
72 76 // self.selectedIndex = 1
... ...
metaCode/Classes/Common/Base/CNLiveBaseViewController.swift
... ... @@ -252,5 +252,58 @@ class CNLiveBaseViewController: UIViewController {
252 252 @objc func topNavViewTap() {
253 253 UIApplication.shared.keyWindow?.endEditing(true)
254 254 }
  255 +
  256 +
  257 +
  258 + override var shouldAutorotate: Bool {
  259 + return false
  260 + }
  261 +
  262 + override var preferredStatusBarStyle: UIStatusBarStyle {
  263 + return .lightContent
  264 + }
  265 +
  266 + override var prefersStatusBarHidden: Bool {
  267 + return false
  268 + }
  269 +
  270 + override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  271 + return .portrait
  272 + }
  273 +
255 274 }
256 275  
  276 +
  277 +//extension UIDeviceOrientation {
  278 +// /// 获取当前屏幕方向
  279 +// var interfaceOrientation: UIInterfaceOrientation {
  280 +// switch self {
  281 +// case .portrait:
  282 +// return .portrait
  283 +// case .portraitUpsideDown:
  284 +// return .portraitUpsideDown
  285 +// case .landscapeLeft:
  286 +// return .landscapeRight // 注意:设备的左旋是界面的右旋
  287 +// case .landscapeRight:
  288 +// return .landscapeLeft // 注意:设备的右旋是界面的左旋
  289 +// case .faceUp, .faceDown, .unknown:
  290 +// return .unknown
  291 +// @unknown default:
  292 +// return .unknown
  293 +// }
  294 +// }
  295 +//
  296 +// /// 判断当前屏幕是否是竖屏
  297 +// func isCurrentScreenPortrait() -> Bool {
  298 +// let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first ?? UIWindow()
  299 +// let orientation = window.windowScene?.interfaceOrientation
  300 +// switch orientation {
  301 +// case .portrait, .portraitUpsideDown:
  302 +// return true
  303 +// case .landscapeLeft, .landscapeRight:
  304 +// return false
  305 +// default:
  306 +// return true
  307 +// }
  308 +// }
  309 +//}
... ...
metaCode/Classes/Config/CNLiveConfigUserInfo.swift
... ... @@ -66,7 +66,9 @@ class UserInfoModel: BaseModel {
66 66 }
67 67  
68 68 class UserInfoManager: NSObject {
69   -
  69 + static let mataCodeUserInfo = "mateCode_userInfo"
  70 + static let CNLiveUserInfo = "CNUserInfo"
  71 +
70 72 static let shared = UserInfoManager()
71 73  
72 74 fileprivate var _userInfo : UserInfoModel?
... ... @@ -92,7 +94,9 @@ class UserInfoManager: NSObject {
92 94 UserInfoManager.clearUserInfo()
93 95 UserInfoManager.shared._userInfo = userInfo
94 96 //JsonUtil.modelToJson(userInfo)
95   - UserDefaults.standard.set(userInfo.toJSONString(), forKey: "mateCode_userInfo")
  97 + UserDefaults.standard.set(userInfo.toJSONString(), forKey: mataCodeUserInfo)
  98 + UserDefaults.standard.set(userInfo.toJSONString(), forKey: CNLiveUserInfo)
  99 +
96 100 if UserDefaults.standard.synchronize() {
97 101 print("用户信息存储成功")
98 102 }
... ... @@ -101,7 +105,8 @@ class UserInfoManager: NSObject {
101 105 /// 读取用户数据
102 106 /// - Returns: 用户数据
103 107 static public func readUserInfo() -> UserInfoModel {
104   - let user_info = UserDefaults.standard.object(forKey: "mateCode_userInfo")
  108 + let user_info = UserDefaults.standard.object(forKey: mataCodeUserInfo)
  109 +
105 110 if user_info == nil {
106 111 print("获取用户信息失败")
107 112 return UserInfoModel()
... ... @@ -116,7 +121,9 @@ class UserInfoManager: NSObject {
116 121 }
117 122  
118 123 static public func clearUserInfo() {
119   - UserDefaults.standard.removeObject(forKey: "mateCode_userInfo")
  124 + UserDefaults.standard.removeObject(forKey: mataCodeUserInfo)
  125 + UserDefaults.standard.removeObject(forKey: CNLiveUserInfo)
  126 +
120 127 UserInfoManager.shared._userInfo = nil
121 128 StandSortManager.removeStandSort()
122 129 if UserDefaults.standard.synchronize() {
... ...
metaCode/Classes/Config/CNLiveConfigstant.swift
... ... @@ -17,7 +17,10 @@ let KStatusBarHeight:CGFloat = UIApplication.shared.statusBarFrame.height;
17 17 ///导航栏高度
18 18 let KNavigationHeight:CGFloat = (KStatusBarHeight + 44)
19 19 ///tabbar高度
20   -let KTabBarHeight:CGFloat = (KStatusBarHeight == 44 ? 83 : 49)
  20 +let KTabBarHeight:CGFloat = (isiPhoneXSeries ? 83 : 49)
  21 +///tabbarSafe高度
  22 +let KTabBarSafeHeight:CGFloat = (isiPhoneXSeries ? 34 : 0)
  23 +
21 24 /**
22 25 获取系统tabbarUI高度
23 26 */
... ...
metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNUpSlideViewController.swift
... ... @@ -12,12 +12,31 @@ import UIKit
12 12 let kCNDownSlideBackgroundColorHex: String = "#F7F8FA"
13 13  
14 14 ///CNliveDownSlideModel Type
  15 +let SlideModelTypeRecommend1: String = "1"//1大图banner
15 16 let SlideModelTypeRecommend4: String = "4"//4一排两个 推荐课程&推荐活动
16 17 let SlideModelTypeTodayRecommend74: String = "74"//74今日推荐
17 18 let SlideModelTypeAllCourse12: String = "12"//12列表全部课程
18 19 let SlideModelTypeOneCourse75: String = "75"//75单课程大图
19   -let SlideModelTypeTwoDuanJu5: String = "5"//5竖版短剧 一排两个
20 20 let SlideModelTypeRealHotList7: String = "7"//7实时热榜
  21 +let SlideModelTypeBanner1: String = "1"//1Banner
  22 +
  23 +//忽必烈
  24 +let SlideModelTypeLanmu22: String = "22"//22首页栏目 电影 电视剧 纪录片
  25 +let SlideModelTypeFollow77: String = "77"//正在追 接口type77
  26 +let SlideModelTypeTVOneBigTwoSmall2: String = "2"//2 一大图两小图
  27 +let SlideModelTypeAD31: String = "31"//31横幅广告
  28 +let SlideModelTypeTwoDuanJu5: String = "5"//5竖版短剧 一排两个
  29 +let SlideModelTypeOngHangThree3: String = "3"//3竖版 一排三个
  30 +
  31 +let SlideModelTypeShop29: String = "29"//29 官方周边
  32 +let SlideModelTypeShopCategory78: String = "78"//78电商分类
  33 +
  34 +//let SlideModelTypeThreeDuanJu5: String = "5"//忽必烈版5一排三个 旧版5竖版短剧 一排两个
  35 +
  36 +
  37 +
  38 +
  39 +
21 40  
22 41 class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITableViewDataSource{
23 42  
... ...
metaCode/Classes/Main/HomePage/Controller/WebController/CNHomeWebViewController.swift
... ... @@ -109,10 +109,11 @@ class CNHomeWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
109 109 make.top.equalTo(get_system_nav_height())
110 110 make.left.right.bottom.equalToSuperview()
111 111 }
  112 +
112 113  
113   - let webVC = CNWebViewController()
114   - webVC.url = URL(string: "https://wjjh5.cnlive.com/chatgpt/#/pages/index/index?id=1836691195091464194")
115   - navigationViewController().pushViewController(webVC, animated: true)
  114 +// let webVC = CNWebViewController()
  115 +// webVC.url = URL(string: "https://wjjh5.cnlive.com/chatgpt/#/pages/index/index?id=1836691195091464194")
  116 +// navigationViewController().pushViewController(webVC, animated: true)
116 117 }
117 118  
118 119 func h5StopVideoPlayer(){
... ...
metaCode/Classes/Main/HomePage/Controller/WebController/CNWebView.swift
... ... @@ -27,12 +27,13 @@ typealias cnWebControllerUpdateNavEditBlock = (_ isShowEdit:Bool)-&gt;Void
27 27 //更新Web控制器 currentUrl
28 28 typealias cnWebControllerUpdateCurrentUrlBlock = (_ currentUrl:String)->Void
29 29  
30   -class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{
  30 +class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler,WKUIDelegate{
31 31  
32 32 var configuration:WKWebViewConfiguration?
33 33  
34 34 lazy var cnWebView :WKWebView = {
35 35 let cnWebView = WKWebView(frame: self.bounds, configuration: self.configuration!)
  36 + cnWebView.uiDelegate = self
36 37 return cnWebView
37 38 }()
38 39  
... ... @@ -379,9 +380,33 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{
379 380 self.bridge?.registerHandler("ymAiGetAutoPlayAudioState", handler: { data, responseCallback in
380 381 print("js call oc\(data)")
381 382  
382   -
383   -
384 383 })
  384 + //h5拉起原生 跳转ugc播放页面
  385 + self.bridge?.registerHandler("wjjJumpUGCAlbum", handler: { data, responseCallback in
  386 + print("js call oc\(data)")
  387 + let dic = data as! Dictionary<String, Any>
  388 + if let albumIdStr = dic["albumId"] as? String{
  389 + //短剧-跳转短剧播放页
  390 + navigationViewController().visibleViewController?.navigationController?.pushViewController(CNLiveShortVideoViewController(aid: albumIdStr), animated: pushAnimated)
  391 +
  392 + }
  393 + })
  394 +
  395 + //h5拉起原生跳视频专辑
  396 + self.bridge?.registerHandler("video://album", handler: { data, responseCallback in
  397 + print("js call oc\(data)")
  398 + let dataDic = data as! Dictionary<String, Any>
  399 + print("拉起视频专辑")
  400 +
  401 + })
  402 + //h5拉起原生跳视频单集
  403 + self.bridge?.registerHandler("video://vod", handler: { data, responseCallback in
  404 + print("js call oc\(data)")
  405 + let dataDic = data as! Dictionary<String, Any>
  406 + print("拉起视频单集")
  407 +
  408 + })
  409 +
385 410 }
386 411  
387 412 // MARK: - 检查url
... ... @@ -478,7 +503,31 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{
478 503 }
479 504 return str
480 505 }
481   -
  506 + // MARK: - WKUIDelegate
  507 + func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
  508 + if prompt.contains("video://vod"){
  509 + //视频单集
  510 + let tempDic = NSString.getURLParameters(prompt)
  511 + if let dic = tempDic{
  512 + if let contentId = dic.object(forKey: "contentId") as? String{
  513 + CNLiveDownSlideTool.pushVodController(contentId: contentId, navigationVC: navigationViewController(), isAblumVideo: false)
  514 + }
  515 + }
  516 + }else if prompt.contains("video://album"){
  517 + //视频专辑
  518 + let tempDic = NSString.getURLParameters(prompt)
  519 + if let dic = tempDic{
  520 + if let aidStr = dic.object(forKey: "aid") as? String{
  521 + //跳转点播专辑
  522 + CNLiveDownSlideTool.pushVodController(contentId: aidStr, navigationVC: navigationViewController(), isAblumVideo: true)
  523 + }
  524 + }
  525 +
  526 +
  527 + }
  528 + completionHandler("http")
  529 + }
  530 +
482 531 // MARK: - WKWebViewDelegate
483 532 // 页面开始加载时调用
484 533 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
... ...
metaCode/Classes/Main/HomePage/Controller/WebController/CNWebViewController.swift
... ... @@ -20,6 +20,7 @@ let ManagemallshopH5 = &quot;managemall.cnlive.com&quot;
20 20  
21 21 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
22 22  
  23 + var isHiddenNavigationBar = false
23 24 var bridge:WKWebViewJavascriptBridge?
24 25 var currentUrl:String = ""//当前网页的url
25 26  
... ... @@ -32,7 +33,8 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
32 33 configuration.preferences.minimumFontSize = 0.0
33 34 configuration.preferences = preferences
34 35 configuration.userContentController = WKUserContentController()
35   - let webView = CNWebView(frame: CGRectMake(0, KNavigationHeight, Width, Height-KNavigationHeight), configuration: configuration, url: _url)
  36 + let navH = self.isHiddenNavigationBar ? 0 : KNavigationHeight
  37 + let webView = CNWebView(frame: CGRectMake(0, navH, Width, Height-navH), configuration: configuration, url: _url)
36 38 webView.cnWebView.scrollView.showsVerticalScrollIndicator = false
37 39 webView.cnWebView.scrollView.showsHorizontalScrollIndicator = false
38 40 webView.isCNWebController = true
... ... @@ -89,7 +91,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
89 91  
90 92 override func viewDidLoad() {
91 93 super.viewDidLoad()
92   - navigationBarHidden = false
  94 + navigationBarHidden = self.isHiddenNavigationBar
93 95 self.view.addSubview(self.webView)
94 96  
95 97 self.webView.webControllerUpdateNavSoundBlock = { isSound in
... ... @@ -124,8 +126,9 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
124 126 self.webView.webControllerUpdateCurrentUrlBlock = { [weak self] currentUrlStr in
125 127 self!.currentUrl = currentUrlStr
126 128 }
  129 + let navH = self.isHiddenNavigationBar ? 0 : KNavigationHeight
127 130 self.webView.snp.makeConstraints { make in
128   - make.top.equalTo(get_system_nav_height())
  131 + make.top.equalTo(navH)
129 132 make.left.right.bottom.equalToSuperview()
130 133 }
131 134 }
... ...
metaCode/Classes/Main/HomePage/View/VerticalViews/DownSlide/CNDownSlideSingleCourseCell.swift
... ... @@ -516,6 +516,7 @@ class CNDownSlideSingleCourseCell: UITableViewCell, UICollectionViewDelegate, UI
516 516 }
517 517 //MARK: - 事件
518 518 @objc func enterBtnAction(_ sender: UIButton){
  519 +
519 520 let tag = sender.tag
520 521 if self.myCurriculum?.list.count ?? 0 > 0{
521 522 let albumMdl = self.myCurriculum?.list[tag]
... ...
metaCode/Classes/Main/HomePage/View/VerticalViews/DownSlide/CNLiveDownSlideBannerCell.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideBannerCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/2/7.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +///banner高度
  11 +let DownSlideBannerH: CGFloat = DownSlideBannerW*195/345
  12 +///banner宽度
  13 +let DownSlideBannerW: CGFloat = KSreenWidth-DownSlideRecommendLeftGap*2
  14 +
  15 +class CNLiveDownSlideBannerCell: UITableViewCell {
  16 + //slideModel
  17 + var _slideModel : CNLiveDownSlideModel?
  18 + var slideModel : CNLiveDownSlideModel? {
  19 + get{
  20 + _slideModel
  21 + }
  22 + set{
  23 + _slideModel = newValue!
  24 +
  25 + for obj in contentView.subviews{
  26 + obj.removeFromSuperview()
  27 + }
  28 + self.setupNewUI(model: _slideModel!)
  29 + }
  30 + }
  31 + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  32 + super.init(style: style, reuseIdentifier: reuseIdentifier)
  33 + self.selectionStyle = .none
  34 + contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  35 + contentView.clipsToBounds = true
  36 + }
  37 +
  38 + required init?(coder: NSCoder) {
  39 + fatalError("init(coder:) has not been implemented")
  40 + }
  41 +
  42 + func setupNewUI(model:CNLiveDownSlideModel){
  43 + //总块数
  44 + let contentsNum = model.contents.count
  45 + //model行数
  46 + let row = model.rowNum
  47 + //总显示块数
  48 + var totalNum = (contentsNum >= row) ? row : contentsNum
  49 + if row == 0{//row为0 , contents全部显示
  50 + totalNum = contentsNum
  51 + }
  52 + for i in 0..<totalNum{//i是第几行
  53 + let contentMdl = model.contents[i]
  54 + let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, CGFloat(i)*(DownSlideBannerH+DownSlideRecommendLeftGap), CGFloat(DownSlideBannerW), CGFloat(DownSlideBannerH)))
  55 + imageView.kf.setImage(with: URL(string:contentMdl.poster ))
  56 + imageView.tag = i
  57 + imageView.layer.cornerRadius = 12
  58 + imageView.clipsToBounds = true
  59 + imageView.isUserInteractionEnabled = true
  60 + imageView.contentMode = .scaleAspectFill
  61 + imageView.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(pushWebAction)))
  62 + contentView.addSubview(imageView)
  63 + }
  64 + }
  65 +
  66 + @objc func pushWebAction(ges: UITapGestureRecognizer){
  67 + let imageView = ges.view as! UIImageView
  68 + let i = imageView.tag
  69 + let contentMdl = self.slideModel?.contents[i]
  70 + CNLiveDownSlideTool.pushWebVCWithContentsMdl(model: contentMdl?.model ?? "", contentId: contentMdl?.contentId ?? "", pid: contentMdl?.pid ?? "", shareUrl: contentMdl?.shareUrl ?? "", thirdUrl: contentMdl?.thirdUrl ?? "", title: contentMdl?.title ?? "", s_to: contentMdl?.s_to ?? "",trailerId: contentMdl?.trailerId ?? "", controller: nil, slideModel: nil)
  71 + }
  72 +}
... ...
metaCode/Classes/Main/HomePages/Controller/HomeController/CNLiveAuthViewController.swift
... ... @@ -13,6 +13,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
13 13 let kCNLiveDownSlideRecommendCellIdentifier = "kCNLiveDownSlideRecommendCellIdentifier"
14 14 let kCNLiveDownSlideTodayRecommendCellIdentifier = "kCNLiveDownSlideTodayRecommendCellIdentifier"
15 15 let kCNLiveDownSlideSingleCourseCellIdentifier = "kCNLiveDownSlideSingleCourseCellIdentifier"
  16 + let kCNLiveDownSlideBannerCellIdentifier = "kCNLiveDownSlideBannerCellIdentifier"
16 17 let kCNLiveHomePageDuanJuCellIdentifier = "kCNLiveHomePageDuanJuCellIdentifier"
17 18 let kCNLiveDownSlideTwoDuanJuCellIdentifier = "kCNLiveDownSlideTwoDuanJuCellIdentifier"
18 19 let kCNLiveDownSlideRealHotListCellIdentifier = "kCNLiveDownSlideRealHotListCellIdentifier"
... ... @@ -72,7 +73,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
72 73 tableView.delegate = self
73 74 tableView.separatorStyle = .none
74 75 tableView.register(CNLiveHomePageDuanJuCell.self, forCellReuseIdentifier: kCNLiveHomePageDuanJuCellIdentifier)
75   -
  76 + tableView.register(CNLiveDownSlideBannerCell.self, forCellReuseIdentifier: kCNLiveDownSlideBannerCellIdentifier)
76 77 tableView.register(CNLiveDownSlideRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideRecommendCellIdentifier)
77 78 tableView.register(CNLiveDownSlideTodayRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier)
78 79 tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier: kCNLiveDownSlideAllCourseCellIdentifier)
... ... @@ -116,7 +117,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
116 117 //除了短剧的model
117 118 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
118 119  
119   - //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
  120 + //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图 1大图banner
120 121 if slideModel.type == SlideModelTypeRecommend4{
121 122 guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideRecommendCellIdentifier) as? CNLiveDownSlideRecommendCell
122 123 else {
... ... @@ -164,6 +165,14 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
164 165 }
165 166 cell.slideModel = slideModel
166 167 return cell
  168 + }else if slideModel.type == SlideModelTypeRecommend1{
  169 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideBannerCellIdentifier) as? CNLiveDownSlideBannerCell
  170 + else {
  171 + let cell = CNLiveDownSlideBannerCell()
  172 + return cell
  173 + }
  174 + cell.slideModel = slideModel
  175 + return cell
167 176 }else{
168 177 return UITableViewCell()
169 178 }
... ...
metaCode/Classes/Main/HomePages/Model/CNLiveAlbumListModel.swift
... ... @@ -31,31 +31,54 @@ class CNLiveAlbumListBaseModel:BaseModel{
31 31 }
32 32 class CNLiveAlbumListModel:BaseModel{
33 33 var title = ""
  34 + var albumId = ""
  35 + var albumName = ""
  36 + var actor = ""
  37 + var spId = ""
  38 + var spName = ""
  39 + var modelId = ""
  40 + var time = ""
  41 + var img = ""
  42 + var poster = ""
  43 + var counts = ""
  44 + var description = ""
  45 + var viewCounts = ""
  46 + var schedule = ""
  47 + var liveType = ""
  48 + var downloadType = ""
  49 + var activityId = ""
  50 + var comments = ""
  51 + var chapterId = ""
  52 + var contentId = ""
  53 + var duration = ""
  54 + var shareUrl = ""
  55 + var fileSize = ""
  56 + var cmccActiveId = ""
  57 + var productId = ""
  58 + var productType = ""
  59 + var isStudy = ""
  60 + var playTime = ""
  61 + var tool :CNLiveAlbumListToolModel?
  62 + var product:CNLiveAlbumProductModel?
  63 +
34 64 var shortTitle = ""
35 65 var subTitle = ""
36   - var product:CNLiveAlbumProductModel?
37   - var poster = ""
38 66 var model = ""
39 67 var thirdUrl = ""
40 68 var colours = ""
41 69 var address = ""
42   - var contentId = ""
43 70 var source = ""
44 71 var sourceName = ""
45 72 var pid = ""
46 73 var witnessId = ""
47 74 var videoUrl = ""
48   - var duration = ""
49 75 var number = ""
50 76 var goods = ""
51 77 var icon : CNLiveAlbumListIconModel?
52   - var time = ""
53 78 var tagId = ""
54 79 var tagName = ""
55   - var tool :CNLiveAlbumListToolModel?
56 80 var activityEndTime = ""
57 81 var h5Url = ""
58   - var shareUrl = ""
59 82 var album:CNLiveAlbumListAlbumModel?
60 83 var block = ""
61 84 var isHorizontalScreen = ""
... ...
metaCode/Classes/Main/HomePages/Model/CNLiveHomePageModel.swift
... ... @@ -7,6 +7,168 @@
7 7  
8 8 import Foundation
9 9  
  10 +////// 忽必烈首页频道model
  11 +class CNLiveHomePageHuBiLieModel:BaseModel{
  12 + var id = ""
  13 + var name = ""
  14 + var showName = ""
  15 + var type = ""
  16 + var typeName = ""
  17 + var thirdUrl = ""
  18 + var textColor = ""
  19 + var textColorSelected = ""
  20 + var pageType = ""
  21 + var navigation = ""
  22 + var siteId = ""
  23 + var pageId = ""
  24 + var backgroundColor = ""
  25 + var backgroundImg = ""
  26 + var backgroundImgH5 = ""
  27 + var statusBarColor = ""
  28 + var module = ""
  29 + var defaultPage = ""
  30 + var img = ""
  31 + var icon = ""
  32 + var width = ""
  33 + var height = ""
  34 + var version = ""
  35 + var endVersion = ""
  36 + var parentId = ""
  37 + var channelId = ""
  38 + var sort = ""
  39 + var enable = ""
  40 + var channelVer = ""
  41 + var pageStyleList = [CNLiveHomePageStyleListModel]()
  42 +
  43 +}
  44 +
  45 +//播放记录
  46 +class CNLiveHomeFollowListBaseModel:BaseModel{
  47 + var endRow = 0
  48 + var firstPage = 0
  49 + var hasNextPage = false
  50 + var nextPage = 0
  51 + var hasPreviousPage = false
  52 + var isFirstPage = true
  53 + var isLastPage = true
  54 + var lastPage = 0
  55 + var list = [CNLiveHomeFollowModel]()
  56 + var navigateFirstPage = 0
  57 + var navigateLastPage = 0
  58 + var navigatePages = 0
  59 + var navigatepageNums:Array<Any> = []
  60 + var pageNum = 0
  61 + var pageSize = 0
  62 + var pages = 0
  63 + var prePage = 0
  64 + var size = 0
  65 + var startRow = 0
  66 + var total = 0
  67 +
  68 +}
  69 +
  70 +//正在追剧集
  71 +class CNLiveHomeFollowModel:BaseModel{
  72 + var id = ""
  73 + var contentId = ""
  74 + var activeId = ""
  75 + var title = ""
  76 + var time = ""
  77 + var counts = ""
  78 + var actor = ""
  79 + var sid = ""
  80 + var albumId = ""
  81 + var albumImg = ""
  82 + var albumName = ""//专辑名称
  83 + var channelName = ""
  84 + var schedule = ""
  85 + var recent = ""
  86 + var siteId = ""
  87 + var modelId = ""
  88 + var poster = ""
  89 + var description = ""
  90 + var shareUrl = ""
  91 + var cmccActiveId = ""
  92 +
  93 + var product:CNLiveAlbumProductModel?
  94 + var aproduct:CNLiveAlbumProductModel?
  95 +
  96 +}
  97 +
  98 +//收藏记录
  99 +class CNLiveCollectionListBaseModel:BaseModel{
  100 + var endRow = 0
  101 + var firstPage = 0
  102 + var hasNextPage = false
  103 + var nextPage = 0
  104 + var hasPreviousPage = false
  105 + var isFirstPage = true
  106 + var isLastPage = true
  107 + var lastPage = 0
  108 + var list = [CNLiveCollectionListModel]()
  109 + var navigateFirstPage = 0
  110 + var navigateLastPage = 0
  111 + var navigatePages = 0
  112 + var navigatepageNums:Array<Any> = []
  113 + var pageNum = 0
  114 + var pageSize = 0
  115 + var pages = 0
  116 + var prePage = 0
  117 + var size = 0
  118 + var startRow = 0
  119 + var total = 0
  120 +
  121 +}
  122 +class CNLiveCollectionListModel:BaseModel{
  123 + var title = ""
  124 + var subTitle = ""
  125 + var poster = ""
  126 + var contentId = ""
  127 + var albumId = ""
  128 + var pid = ""
  129 + var model = ""
  130 + var collectionTime = ""
  131 +}
  132 +
  133 +
  134 +
  135 +//影视剧 音乐 电商
  136 +class CNLiveHomePageStyleListModel:BaseModel{
  137 + var id = ""
  138 + var name = ""
  139 + var showName = ""
  140 + var type = ""
  141 + var typeName = ""
  142 + var thirdUrl = ""
  143 + var textColor = ""
  144 + var textColorSelected = ""
  145 + var pageType = ""
  146 + var navigation = ""
  147 + var siteId = ""
  148 + var pageId = ""
  149 + var backgroundColor = ""
  150 + var backgroundImg = ""
  151 + var backgroundImgH5 = ""
  152 + var statusBarColor = ""
  153 + var module = ""
  154 + var defaultPage = ""
  155 + var img = ""
  156 + var icon = ""
  157 + var width = ""
  158 + var height = ""
  159 + var version = ""
  160 + var endVersion = ""
  161 + var parentId = ""
  162 + var channelId = ""
  163 + var sort = ""
  164 + var enable = ""
  165 + var channelVer = ""
  166 + var pageStyleList = ""
  167 +}
  168 +
  169 +
  170 +
  171 +///////// 短剧首页
10 172 class CNLiveHomePageModel:BaseModel{
11 173 var endRow = 0
12 174 var firstPage = 0
... ...
metaCode/Classes/Main/HomePages/View/HomepageDetail/CNLiveAlbumCell.swift
... ... @@ -143,6 +143,7 @@ class CNLiveAlbumCell:UITableViewCell{
143 143 }
144 144  
145 145 @objc func playBtnAction(){
  146 +
146 147 var aid = ""
147 148 if self.albumModel != nil{
148 149 aid = self.albumModel!.contentId
... ...
metaCode/Classes/Main/HomePages/ViewModel/CNLiveHomePageViewModel.swift
... ... @@ -7,8 +7,408 @@
7 7  
8 8 import Foundation
9 9 import CNLiveRequestBastKit
  10 +import CNLiveBusinessTools
  11 +class CNLiveHomePageViewModel:NSObject,URLSessionTaskDelegate{
  12 + static let shared = CNLiveHomePageViewModel()
  13 +
  14 + ///id获取播放地址url
  15 + func getVodVideoURL(contentId:String,resultBlock: @escaping downSlideResultBlock){
  16 +
  17 + // 获取当前时间戳(自1970年以来的秒数)
  18 + let timeInterval = Date().timeIntervalSince1970
  19 + // 将时间戳转换为字符串
  20 + // let timeString = String(format: "%ld", Int64(timeInterval))
  21 + // 或者更简洁地使用String的初始化方法
  22 + let timeString = "\(Int64(timeInterval))"
  23 +
  24 + let bundleIdentifier = Bundle.main.bundleIdentifier
  25 +
  26 + let uuid = CNLiveBusinessTools.getUidForStat(Date())
  27 +
  28 + let shortVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
  29 +
  30 +
  31 + let param = NSMutableDictionary()
  32 + param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  33 + param.setValue(contentId, forKey: "vId")
  34 + param.setValue(timeString, forKey: "timestamp")
  35 + param.setValue("0", forKey: "isHLS")
  36 + param.setValue("i", forKey: "plat")
  37 + param.setValue("v", forKey: "playType")
  38 + param.setValue(bundleIdentifier, forKey: "platform_id")
  39 + param.setValue("", forKey: "channelName")
  40 + param.setValue("", forKey: "tag")
  41 + param.setValue("", forKey: "from")
  42 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid")
  43 + // param.setValue(uuid, forKey: "uid")
  44 + param.setValue(shortVersion, forKey: "ver")
  45 +
  46 + param.setValue("1", forKey: "appType")
  47 + param.setValue("i", forKey: "clientPlat")
  48 + param.setValue(shortVersion, forKey: "version")
  49 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "uid")
  50 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "loginSid")
  51 + param.setValue("release", forKey: "app_channel_id")
  52 + param.setValue("2", forKey: "rate")
  53 + param.setValue("release", forKey: "app_channel_id")
  54 + param.setValue("0", forKey: "retry")
  55 +
  56 +
  57 + let signStr = CNLiveBusinessTools.signvalue(param as! [AnyHashable : Any])
  58 + let string1 = "\(signStr)&key=\(CNLiveMCEnvironmentManager.shared.appKey)"
  59 + let signString1 = CNLiveBusinessTools.sha1(string1).uppercased()
  60 + let liveUrl = APPLoginHost+"/open/api2/vod_ips/vodplayByAPP"
  61 +
  62 + let videourl = "\(liveUrl)?\(signStr)&sign=\(signString1)"
  63 + print("111111URL:\(videourl)")
  64 +
  65 + // 创建一个可变URL请求
  66 + let urlRequest = NSMutableURLRequest(url: URL(string: videourl)!)
  67 + urlRequest.httpMethod = "GET"
  68 + urlRequest.timeoutInterval = 30
  69 +
  70 + let config = URLSessionConfiguration.default
  71 + config.requestCachePolicy = .reloadIgnoringLocalCacheData
  72 + let urlSession = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.current)
  73 + let task = urlSession.dataTask(with: urlRequest as URLRequest) { data, response, error in
  74 + if let urlResponse = response as? HTTPURLResponse, urlResponse.statusCode == 301 || urlResponse.statusCode == 302 {
  75 + // do something ...
  76 + print("重定向地址 == \(urlResponse.allHeaderFields["Location"] as? String ?? "无重定向地址")")
  77 + resultBlock(urlResponse.allHeaderFields["Location"] as? String ?? "",.success)
  78 +
  79 + }
  80 + }
  81 +
  82 + task.resume()
  83 + }
  84 + func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
  85 + print("\(response.statusCode)") // 302
  86 + print("\(response.allHeaderFields["Location"] as? String ?? "无重定向地址")") // 重定向地址URL
  87 +
  88 + // 根据业务需求决定是否使用新的请求继续任务
  89 + // completionHandler(request) // 使用新的请求继续任务
  90 + // completionHandler(nil) // 不使用新的请求,取消重定向
  91 +
  92 + // 在这个例子中,我们简单地取消重定向(即不使用新的请求)
  93 + completionHandler(nil)
  94 + }
  95 +
  96 + //点播详情
  97 + static func requestGetVodPlayApi( contentId:String,sid:String,resultBlock: @escaping downSlideResultBlock) {
  98 + let param = NSMutableDictionary()
  99 + param.setValue(contentId, forKey: "contentId")
  100 + param.setValue(sid, forKey: "sid")
  101 + param.setValue("", forKey: "channelName")
  102 + param.setValue("1", forKey: "model")
  103 + param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  104 + param.setValue("1", forKey: "type")
  105 + param.setValue("", forKey: "app_channel_id")
  106 +
  107 +
  108 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  109 + CNLiveNetworking.setupShowDataResult(false)
  110 + let custom_param = NSMutableDictionary()
  111 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  112 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey, forKey: "appKey")
  113 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  114 +//https://cmsapi.cnlive.com/playApi/play?contentId=1350760&sid=&channelName=&model=1&appId=769_li40lrkt53&type=1&app_channel_id=
  115 + CNLiveNetworking.requestNetwork(with: .GET, urlString: "https://cmsapi.cnlive.com/playApi/play", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  116 + hiddenLoading()
  117 + if (error == nil) {
  118 + let resp = result as! NSDictionary
  119 + let errorCode = "\(resp["errorCode"] ?? "0")"
  120 + if (errorCode == "0") {
  121 +
  122 + if let dataDic = resp["data"] as? Dictionary<String, Any>{
  123 + let dataMdl = newDictionaryToModel(dataDic , CNLiveVodPlayModel.self)
  124 + resultBlock(dataMdl,.success)
  125 + }else
  126 + {
  127 + resultBlock(NSNull(),.failed)
  128 + }
  129 + }
  130 + else{
  131 + resultBlock(NSNull(),.failed)
  132 + }
  133 + }
  134 + }
  135 + }
  136 + /// 获取专辑信息接口
  137 + /// - Parameters:
  138 + /// - aid: 专辑名称
  139 + /// - resultBlock: 返回
  140 + static func requstWithVodAlbumMsgVideo(aid: String,resultBlock: @escaping downSlideResultBlock) {
  141 + let param = NSMutableDictionary()
  142 + param.setValue(aid, forKey: "aid")
  143 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid")
  144 + param.setValue("mc_app", forKey: "app_channel_id")
  145 +
  146 + let custom_param = NSMutableDictionary()
  147 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId_wjj, forKey: "appId")
  148 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey_wjj, forKey: "appKey")
  149 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  150 + CNLiveNetworking.setupShowDataResult(false)
  151 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  152 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/contentApi/getAlbumMsg", param: param as! [String : Any], cacheType: .networkOnly) { task, result, error in
  153 + hiddenLoading()
  154 + if (error == nil) {
  155 + let resp = result as! NSDictionary
  156 + let errorCode = "\(resp["errorCode"] ?? "0")"
  157 + if (errorCode == "0") {
  158 + if resp["data"] is NSNull {
  159 + resultBlock(NSNull(), .failed)
  160 + } else {
  161 + let listModel = dictionaryToModel(resp["data"] as! [String : Any], CNLiveVodAlbumMsgModel.self,"") as! CNLiveVodAlbumMsgModel
  162 + resultBlock(listModel, .success)
  163 + }
  164 + } else {
  165 + showMessage(message: resp["errorMessage"] as! String)
  166 + resultBlock(NSNull(),.failed)
  167 + }
  168 + } else {
  169 + if CNLiveNetworking.isNetworking() {
  170 + showMessage(message: "请求失败")
  171 + resultBlock(NSNull(),.failed)
  172 + } else {
  173 + showMessage(message: "似乎与网络断开链接")
  174 + resultBlock(NSNull(),.noNetwork)
  175 + }
  176 + }
  177 + }
  178 + }
  179 + //专辑列表
  180 + static func requstWithVodAlbumVideoList(aid: String,resultBlock: @escaping downSlideResultBlock) {
  181 + let param = NSMutableDictionary()
  182 + param.setValue(aid, forKey: "aid")
  183 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid")
  184 + param.setValue("mc_app", forKey: "app_channel_id")
  185 + param.setValue("1", forKey: "page")
  186 + param.setValue("200", forKey: "pageSize")
  187 +
  188 + let custom_param = NSMutableDictionary()
  189 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId_wjj, forKey: "appId")
  190 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey_wjj, forKey: "appKey")
  191 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  192 + CNLiveNetworking.setupShowDataResult(false)
  193 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  194 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/contentApi/albumVideoList", param: param as! [String : Any], cacheType: .networkOnly) { task, result, error in
  195 + hiddenLoading()
  196 + if (error == nil) {
  197 + let resp = result as! NSDictionary
  198 + let errorCode = "\(resp["errorCode"] ?? "0")"
  199 + if (errorCode == "0") {
  200 + if resp["data"] is NSNull {
  201 + resultBlock(NSNull(), .failed)
  202 + } else {
  203 + let listModel = dictionaryToModel(resp["data"] as! [String : Any], CNLiveVodAlbumListBaseModel.self,"") as! CNLiveVodAlbumListBaseModel
  204 + resultBlock(listModel, .success)
  205 + }
  206 + } else {
  207 + showMessage(message: resp["errorMessage"] as! String)
  208 + resultBlock(NSNull(),.failed)
  209 + }
  210 + } else {
  211 + if CNLiveNetworking.isNetworking() {
  212 + showMessage(message: "请求失败")
  213 + resultBlock(NSNull(),.failed)
  214 + } else {
  215 + showMessage(message: "似乎与网络断开链接")
  216 + resultBlock(NSNull(),.noNetwork)
  217 + }
  218 + }
  219 + }
  220 + }
  221 +
  222 +
  223 +
  224 + /// 忽必烈 获取首页原生页面顶部频道数据
  225 + static func requestGetHomePageTopConfigList( resultBlock: @escaping downSlideResultBlock) {
  226 + let param = NSMutableDictionary()
  227 + param.setValue("3310", forKey: "siteStyleId")
  228 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  229 + CNLiveNetworking.setupShowDataResult(false)
  230 + let custom_param = NSMutableDictionary()
  231 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  232 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey, forKey: "appKey")
  233 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  234 +// http://cms.cnlive.com/api/contentApi/otherChannelList?siteStyleId=3310
  235 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/contentApi/otherChannelList", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  236 + hiddenLoading()
  237 + if (error == nil) {
  238 + let resp = result as! NSDictionary
  239 + let errorCode = "\(resp["errorCode"] ?? "0")"
  240 + if (errorCode == "0") {
  241 +
  242 + let dataArr = resp["data"] as! Array<Any>
  243 + var resArr = []
  244 + if dataArr.count > 0{
  245 + //有在追短剧
  246 + for dataDic in dataArr {
  247 + let dataMdl = newDictionaryToModel(dataDic as! [String : Any], CNLiveHomePageHuBiLieModel.self)
  248 + resArr.append(dataMdl)
  249 + }
  250 + }else{
  251 + //没有在追短剧
  252 + }
  253 +
  254 + resultBlock(resArr,.success)
  255 + }
  256 + else{
  257 + resultBlock(NSNull(),.failed)
  258 + }
  259 + }
  260 + }
  261 + }
  262 + //电商分类
  263 + static func requestGetHomePageShopCategoryApi(shop_id:String,resultBlock: @escaping downSlideResultBlock) {
  264 + let param = NSMutableDictionary()
  265 + param.setValue(shop_id, forKey: "shop_id")
  266 +
  267 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  268 + CNLiveNetworking.setupShowDataResult(false)
  269 + CNLiveNetworking.setupDSRequest(true)
  270 + let custom_param = NSMutableDictionary()
  271 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId_wjj_b, forKey: "appId")
  272 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId_wjj_b, forKey: "appKey")
  273 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  274 + CNLiveNetworking.requestNetwork(with: .POST, urlString: APPBaseWjjShopUrl+"/Api/Index3/sellerCategory", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  275 + hiddenLoading()
  276 + if (error == nil) {
  277 + let resp = result as! NSDictionary
  278 + if let errCode = resp["code"] as? String{
  279 + if errCode == "200" || errCode == "0"{
  280 + let dataDic = resp["data"] as! NSDictionary
  281 + let shopCategoryModel = newDictionaryToModel(dataDic as! [String : Any], CNLiveHomeShopCategoryModel.self)
  282 + resultBlock(shopCategoryModel,.success)
  283 + }else{
  284 + resultBlock(NSNull(),.failed)
  285 + }
  286 + }
  287 + }
  288 + resultBlock(NSNull(),.failed)
  289 + }
  290 + }
  291 +
  292 + static func requestGetHomePageFollow( sid:String,resultBlock: @escaping downSlideResultBlock) {
  293 + let param = NSMutableDictionary()
  294 + param.setValue("yszg", forKey: "channelName")
  295 +
  296 +// param.setValue("1342671", forKey: "sid")
  297 +
  298 + param.setValue(sid, forKey: "sid")
  299 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  300 + CNLiveNetworking.setupShowDataResult(false)
  301 + let custom_param = NSMutableDictionary()
  302 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  303 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey, forKey: "appKey")
  304 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  305 +// http://cms.cnlive.com/api/recordApi/getRecords?sid=10506285&channelName=yszg
  306 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/recordApi/getRecords", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  307 + hiddenLoading()
  308 + if (error == nil) {
  309 + let resp = result as! NSDictionary
  310 + let errorCode = "\(resp["errorCode"] ?? "0")"
  311 + if (errorCode == "0") {
  312 +
  313 + let dataDic = resp["data"] as! Dictionary<String, Any>
  314 + var resArr = dataDic["list"] as! Array<Any>
  315 + if resArr.count > 0{
  316 + //有在追
  317 + let followDic = resArr.first as! Dictionary<String, Any>
  318 + let dataMdl = newDictionaryToModel(followDic as! [String : Any], CNLiveHomeFollowModel.self)
  319 + resultBlock(dataMdl,.success)
  320 + }else{
  321 + //没有在追短剧
  322 + resultBlock(NSNull(),.failed)
  323 + }
  324 +
  325 + }
  326 + else{
  327 + resultBlock(NSNull(),.failed)
  328 + }
  329 + }
  330 + }
  331 + }
  332 +
  333 + static func requestGetMinePlayHistory( sid:String,page:NSInteger,resultBlock: @escaping downSlideResultBlock) {
  334 + let param = NSMutableDictionary()
  335 + param.setValue("yszg", forKey: "channelName")
  336 + param.setValue("\(page)", forKey: "page")
  337 +
  338 +// param.setValue("1342671", forKey: "sid")
  339 +
  340 + param.setValue(sid, forKey: "sid")
  341 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  342 + CNLiveNetworking.setupShowDataResult(false)
  343 + let custom_param = NSMutableDictionary()
  344 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  345 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey, forKey: "appKey")
  346 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  347 +// http://cms.cnlive.com/api/recordApi/getRecords?sid=10506285&channelName=yszg
  348 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/recordApi/getRecords", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  349 + hiddenLoading()
  350 + if (error == nil) {
  351 + let resp = result as! NSDictionary
  352 + let errorCode = "\(resp["errorCode"] ?? "0")"
  353 + if (errorCode == "0") {
  354 + if resp["data"] is NSNull {
  355 + resultBlock(NSNull(), .failed)
  356 + } else {
  357 + let listModel = dictionaryToModel(resp["data"] as! [String : Any], CNLiveHomeFollowListBaseModel.self,"") as! CNLiveHomeFollowListBaseModel
  358 + resultBlock(listModel, .success)
  359 + }
  360 + } else {
  361 + showMessage(message: resp["errorMessage"] as! String)
  362 + resultBlock(NSNull(),.failed)
  363 + }
  364 + } else {
  365 + if CNLiveNetworking.isNetworking() {
  366 + showMessage(message: "请求失败")
  367 + resultBlock(NSNull(),.failed)
  368 + } else {
  369 + showMessage(message: "似乎与网络断开链接")
  370 + resultBlock(NSNull(),.noNetwork)
  371 + }
  372 + }
  373 +
  374 + }
  375 + }
  376 + //收藏列表:contentApi/getCollectionList 参数:sid、source=yszg、page、pageSize
  377 + static func getCollectionListApi(sid:String,page:String,pageSize:String,resultBlock: @escaping downSlideResultBlock) {
  378 + let param = NSMutableDictionary()
  379 + param.setValue(sid, forKey: "sid")
  380 + param.setValue("yszg", forKey: "source")
  381 + param.setValue(page, forKey: "page")
  382 + param.setValue(pageSize, forKey: "pageSize")
  383 +
  384 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  385 + CNLiveNetworking.setupShowDataResult(false)
  386 + let custom_param = NSMutableDictionary()
  387 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appId, forKey: "appId")
  388 + custom_param.setValue(CNLiveMCEnvironmentManager.shared.appKey, forKey: "appKey")
  389 + CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
  390 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/contentApi/getCollectionList", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  391 + hiddenLoading()
  392 + if (error == nil) {
  393 + let resp = result as! NSDictionary
  394 + let errorCode = "\(resp["errorCode"] ?? "0")"
  395 + if (errorCode == "0") {
  396 + if resp["data"] is NSNull {
  397 + resultBlock(NSNull(), .failed)
  398 + } else {
  399 + let listModel = dictionaryToModel(resp["data"] as! [String : Any], CNLiveCollectionListBaseModel.self,"") as! CNLiveCollectionListBaseModel
  400 + resultBlock(listModel, .success)
  401 + }
  402 + } else {
  403 + showMessage(message: resp["errorMessage"] as! String)
  404 + resultBlock(NSNull(),.failed)
  405 + }
  406 + }else{
  407 + resultBlock(NSNull(),.failed)
  408 + }
  409 + }
  410 + }
10 411  
11   -class CNLiveHomePageViewModel:NSObject{
12 412  
13 413 /// 获取首页原生页面数据
14 414 static func requestGetHomePageConfigList( resultBlock: @escaping downSlideResultBlock) {
... ... @@ -165,6 +565,8 @@ class CNLiveHomePageViewModel:NSObject{
165 565 static func getAlbumList(aid:String, page:NSInteger,resultBlock: @escaping downSlideResultBlock) {
166 566 let param = NSMutableDictionary()
167 567 param.setValue(aid, forKey: "aid")
  568 + param.setValue("mc_app", forKey: "app_channel_id")
  569 +
168 570 param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid")
169 571 param.setValue("\(page)", forKey: "page")
170 572  
... ...
metaCode/Classes/Main/HuBiLieHomePage/Controller/CNLiveHomeLanmuController.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeLanmuController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/11.
  6 +//
  7 +
  8 +import Foundation
  9 +import MJRefresh
  10 +class CNLiveHomeLanmuController:CNLiveBaseViewController, UITableViewDataSource, UITableViewDelegate{
  11 +
  12 + var _slideContentModel : CNLiveDownSlideContentsModel?
  13 + var slideContentModel : CNLiveDownSlideContentsModel? {
  14 + get{
  15 + _slideContentModel
  16 + }
  17 + set{
  18 + _slideContentModel = newValue!
  19 +
  20 + }
  21 + }
  22 +
  23 + ///数据源
  24 + lazy var dataArray: NSMutableArray = {
  25 + var dataArray = NSMutableArray()
  26 + return dataArray
  27 + }()
  28 + lazy var headerDataArray: NSMutableArray = {
  29 + var dataArray = NSMutableArray()
  30 + return dataArray
  31 + }()
  32 +
  33 + let kCNLiveHomeLanmuThreeImgCellIdentifier = "kCNLiveHomeLanmuThreeImgCellIdentifier"
  34 +
  35 + lazy var tableView : UITableView = {
  36 + let tableView = UITableView(frame: .zero, style: .plain)
  37 + tableView.dataSource = self
  38 + tableView.delegate = self
  39 + tableView.separatorStyle = .none
  40 + tableView.register(CNLiveHomeLanmuThreeImgCell.self, forCellReuseIdentifier: kCNLiveHomeLanmuThreeImgCellIdentifier)
  41 + tableView.backgroundColor = .white
  42 + return tableView
  43 + }()
  44 +
  45 + var pageId = ""
  46 + var currentHeaderBtnIndex = 0
  47 + var resultHeaderView:UIView?
  48 + var footerRefreshView: MJRefreshAutoNormalFooter!
  49 + var page = 1//当前页数
  50 +
  51 + override func viewDidLoad() {
  52 + super.viewDidLoad()
  53 + self.navigationBarHidden = false
  54 + titleName = self.slideContentModel?.title ?? ""
  55 +
  56 + view.addSubview(tableView)
  57 + tableView.snp.makeConstraints { make in
  58 + make.left.equalToSuperview()
  59 + make.top.equalTo(KNavigationHeight)
  60 + make.bottom.equalToSuperview()
  61 + make.right.equalToSuperview()
  62 + }
  63 + self.addRefreshView()
  64 + self.setUpResultHeaderView()
  65 +
  66 + self.getPageApi(pageID: self.pageId)
  67 + }
  68 + func addRefreshView() {
  69 + tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  70 + guard let self = self else { return }
  71 + self.page = 1
  72 + self.getBlockContents(page: 1)
  73 + })
  74 + tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
  75 + guard let self = self else { return }
  76 + self.page = self.page + 1
  77 + self.getBlockContents(page: self.page)
  78 + })
  79 + }
  80 +
  81 + func setUpResultHeaderView(){
  82 + resultHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 52))
  83 + resultHeaderView?.backgroundColor = .white
  84 +
  85 + tableView.tableHeaderView = resultHeaderView
  86 + }
  87 +
  88 + // MARK: - BtnAction
  89 + @objc func headerBtnAction(btn:UIButton){
  90 + let index = btn.tag - 1000
  91 + self.currentHeaderBtnIndex = index
  92 + for objBtn in self.resultHeaderView!.subviews{
  93 + if let obj = objBtn as? UIButton{
  94 + if obj.tag == btn.tag{
  95 + //选中
  96 + obj.backgroundColor = HexColor("#D3E4FF")
  97 + obj.setTitleColor(HexColor("#2076FF"), for: .normal)
  98 + }else{
  99 + //未选中
  100 + obj.backgroundColor = .clear
  101 + obj.setTitleColor(HexColor("#919191"), for: .normal)
  102 + }
  103 +
  104 + }
  105 + }
  106 + //刷新接口
  107 + self.getBlockContents(page: 1)
  108 + }
  109 +
  110 + // MARK: - UITableViewDelegate
  111 + func numberOfSections(in tableView: UITableView) -> Int {
  112 + return 1
  113 + }
  114 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  115 + return self.dataArray.count
  116 + }
  117 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  118 +
  119 + if let slideModel = self.dataArray[indexPath.row] as? [CNLiveAlbumModel]{
  120 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeLanmuThreeImgCellIdentifier) as? CNLiveHomeLanmuThreeImgCell
  121 + else {
  122 + let cell = CNLiveHomeLanmuThreeImgCell()
  123 + return cell
  124 + }
  125 + cell.slideModel = slideModel
  126 + return cell
  127 + }
  128 + return UITableViewCell()
  129 + }
  130 +
  131 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  132 + let imgW:CGFloat = (KSreenWidth-60.0)/3.0
  133 + let imgH:CGFloat = imgW*140.0/105.0
  134 + return imgH+55.0
  135 + }
  136 +
  137 + deinit {
  138 + }
  139 + //MARK: - 网络请求获取区块详情页
  140 + func getPageApi(pageID:String)
  141 + {
  142 + showLoading(message: "")
  143 + CNLiveDownSlideViewModel.requestGetPage(pageId: pageID as NSString) {[weak self] result, status in
  144 + hiddenLoading()
  145 + guard let self = self else { return }
  146 + if status == .success{
  147 + self.headerDataArray.removeAllObjects()
  148 + let array = result as! [Any]
  149 + let newDataArray = NSMutableArray()
  150 + for (idx,slideModel) in array.enumerated() {
  151 + if let model = slideModel as? CNLiveDownSlideModel{
  152 +
  153 + newDataArray.addObjects(from: [model])
  154 + //创建区块btn
  155 + let width = 60.0
  156 + let height = 32.0
  157 + let x = 15.0+CGFloat(idx)*width
  158 + let y = 10.0
  159 +
  160 + let expandBtn = UIButton.init(type: .custom)
  161 +// expandBtn.backgroundColor = HexColor("#D3E4FF")
  162 +// expandBtn.setTitleColor(HexColor("#2076FF"), for: .normal)
  163 + if idx == self.currentHeaderBtnIndex{
  164 + //选中
  165 + expandBtn.backgroundColor = HexColor("#D3E4FF")
  166 + expandBtn.setTitleColor(HexColor("#2076FF"), for: .normal)
  167 + }else{
  168 + //未选中
  169 + expandBtn.backgroundColor = .clear
  170 + expandBtn.setTitleColor(HexColor("#919191"), for: .normal)
  171 + }
  172 +
  173 + expandBtn.setTitle(model.blockName, for: .normal)
  174 + expandBtn.layer.cornerRadius = 16
  175 + expandBtn.clipsToBounds = true
  176 + expandBtn.titleLabel?.font = BoldFont_13
  177 + expandBtn.frame = CGRect(x: x, y: y, width: width, height: height)
  178 + expandBtn.tag = 1000+idx
  179 + expandBtn.addTarget(self, action: #selector(headerBtnAction), for: .touchUpInside)
  180 + resultHeaderView?.addSubview(expandBtn)
  181 + }
  182 + }
  183 + self.headerDataArray.addObjects(from: newDataArray as! [Any])
  184 + self.getBlockContents(page: 1)
  185 +
  186 + }else if (status == .failed){
  187 + // self.NetApiStatus = .apiError
  188 + }else if (status == .noNetwork){
  189 +
  190 + // self.NetApiStatus = .notNetwork
  191 + }
  192 + }
  193 + //
  194 + }
  195 +
  196 + func chunkArray<T>(array: [T], chunkSize: Int) -> [[T]] {
  197 + var result = [[T]]()
  198 + var currentIndex = 0
  199 +
  200 + while currentIndex < array.count {
  201 + let endIndex = min(currentIndex + chunkSize, array.count)
  202 + let chunk = Array(array[currentIndex..<endIndex])
  203 + result.append(chunk)
  204 + currentIndex += chunkSize
  205 + }
  206 +
  207 + return result
  208 + }
  209 +
  210 +
  211 + // MARK: - 获取内容
  212 + func getBlockContents(page:NSInteger){
  213 + showLoading(message: "")
  214 + if let slideModel = self.headerDataArray[self.currentHeaderBtnIndex] as? CNLiveDownSlideModel{
  215 + let blockId = slideModel.blockId
  216 + print("blockId:\(blockId)")
  217 + CNLiveHomePageViewModel.getBlockContents(blockId: blockId, page: page) {[weak self] result, status in
  218 + hiddenLoading()
  219 + guard let self = self else { return }
  220 + if status == .success{
  221 + let albumBaseModel = result as! CNLiveAlbumBaseModel
  222 + if self.page > 1 && albumBaseModel.list.count > 0 {
  223 + var tempArr = Array<Any>()
  224 + for obj in self.dataArray {
  225 + if let objArr = obj as? Array<Any>{
  226 + for tempObj in objArr{
  227 + if let tempMdl = tempObj as? CNLiveAlbumModel{
  228 + tempArr.append(tempMdl)
  229 + }
  230 + }
  231 + }else{
  232 + if let tempMdl = obj as? CNLiveAlbumModel{
  233 + tempArr.append(tempMdl)
  234 + }
  235 + }
  236 + }
  237 +
  238 + self.dataArray = NSMutableArray(array: tempArr)
  239 + self.dataArray.addObjects(from: albumBaseModel.list)
  240 + }
  241 + if self.page == 1 {
  242 + self.dataArray.removeAllObjects()
  243 + self.dataArray.addObjects(from: albumBaseModel.list)
  244 + if self.dataArray.count > 0 && self.tableView.mj_header == nil && self.tableView.mj_footer == nil {
  245 + self.addRefreshView()
  246 + }
  247 + }
  248 +
  249 + self.tableView.mj_header?.endRefreshing()
  250 +
  251 + //分成3个一组
  252 + let chunkedArray = self.chunkArray(array: self.dataArray as! Array<Any>, chunkSize: 3)
  253 + self.dataArray = NSMutableArray(array: chunkedArray)
  254 + self.tableView.reloadData()
  255 + if albumBaseModel.hasNextPage{
  256 + self.tableView.mj_footer?.endRefreshing()
  257 + }else{
  258 + self.tableView.mj_footer?.endRefreshingWithNoMoreData()
  259 + }
  260 +
  261 + }else if (status == .noNetwork) {
  262 +// self.network_type = .noNetwork
  263 +// self.tableView.reloadEmptyDataSet()
  264 + } else {
  265 +// self.network_type = .failed
  266 +// self.tableView.reloadEmptyDataSet()
  267 + }
  268 + }
  269 +
  270 + }else{
  271 +
  272 + }
  273 + }
  274 +
  275 +}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Controller/CNLiveHomeMoreController.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeMoreController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/14.
  6 +//
  7 +
  8 +import Foundation
  9 +import MJRefresh
  10 +class CNLiveHomeMoreController:CNLiveBaseViewController, UITableViewDataSource, UITableViewDelegate{
  11 +
  12 + //我的播放记录
  13 + var _followModels : [CNLiveHomeFollowModel]?
  14 + var followModels : [CNLiveHomeFollowModel]? {
  15 + get{
  16 + _followModels
  17 + }
  18 + set{
  19 + _followModels = newValue!
  20 + }
  21 + }
  22 +
  23 + //1行2横图 1行3竖图
  24 + var _slideModel : CNLiveDownSlideModel?
  25 + var slideModel : CNLiveDownSlideModel? {
  26 + get{
  27 + _slideModel
  28 + }
  29 + set{
  30 + _slideModel = newValue!
  31 + }
  32 + }
  33 +
  34 + ///数据源
  35 + lazy var dataArray: NSMutableArray = {
  36 + var dataArray = NSMutableArray()
  37 + return dataArray
  38 + }()
  39 +
  40 + let kCNLiveHomeLanmuThreeImgCellIdentifier = "kCNLiveHomeLanmuThreeImgCellIdentifier"
  41 + let kCNLiveHomeTwoHengTuCellIdentifier = "kCNLiveHomeTwoHengTuCellIdentifier"
  42 +
  43 + lazy var tableView : UITableView = {
  44 + let tableView = UITableView(frame: .zero, style: .plain)
  45 + tableView.dataSource = self
  46 + tableView.delegate = self
  47 + tableView.separatorStyle = .none
  48 + tableView.register(CNLiveHomeLanmuThreeImgCell.self, forCellReuseIdentifier: kCNLiveHomeLanmuThreeImgCellIdentifier)
  49 + tableView.register(CNLiveHomeTwoHengTuCell.self, forCellReuseIdentifier: kCNLiveHomeTwoHengTuCellIdentifier)
  50 + tableView.backgroundColor = .white
  51 + return tableView
  52 + }()
  53 +
  54 + var footerRefreshView: MJRefreshAutoNormalFooter!
  55 + var page = 1//当前页数
  56 +
  57 + override func viewDidLoad() {
  58 + super.viewDidLoad()
  59 + self.navigationBarHidden = false
  60 +
  61 + view.addSubview(tableView)
  62 + tableView.snp.makeConstraints { make in
  63 + make.left.equalToSuperview()
  64 + make.top.equalTo(KNavigationHeight)
  65 + make.bottom.equalToSuperview()
  66 + make.right.equalToSuperview()
  67 + }
  68 + self.addRefreshView()
  69 + self.page = 1
  70 + if self.slideModel != nil{
  71 + titleName = self.slideModel?.blockName ?? ""
  72 + self.getBlockContents(page: self.page)
  73 + }else if self.followModels != nil{
  74 + self.getHomePageFollowApi(sid: UserInfoManager.shared.userInfo.uid)
  75 + titleName = "播放记录"
  76 + }else{
  77 + //我的收藏
  78 + titleName = "我的收藏"
  79 + self.getCollectionListApi()
  80 + }
  81 + }
  82 + func addRefreshView() {
  83 + tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  84 + guard let self = self else { return }
  85 + self.page = 1
  86 + if self.slideModel != nil{
  87 + self.getBlockContents(page: 1)
  88 + }else if self.followModels != nil{
  89 + self.getHomePageFollowApi(sid: UserInfoManager.shared.userInfo.uid)
  90 + }else{
  91 + self.getCollectionListApi()
  92 + }
  93 + })
  94 + tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
  95 + guard let self = self else { return }
  96 + self.page = self.page + 1
  97 + if self.slideModel != nil{
  98 + self.getBlockContents(page: self.page)
  99 + }else if self.followModels != nil{
  100 + self.getHomePageFollowApi(sid: UserInfoManager.shared.userInfo.uid)
  101 + }else{
  102 + self.getCollectionListApi()
  103 + }
  104 + })
  105 + }
  106 +
  107 + // MARK: - UITableViewDelegate
  108 + func numberOfSections(in tableView: UITableView) -> Int {
  109 + return 1
  110 + }
  111 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  112 + return self.dataArray.count
  113 + }
  114 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  115 +
  116 + if let slideModel = self.dataArray[indexPath.row] as? [CNLiveAlbumModel]{
  117 + if self.slideModel?.type == SlideModelTypeTVOneBigTwoSmall2{
  118 + //一行2个横图
  119 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeTwoHengTuCellIdentifier) as? CNLiveHomeTwoHengTuCell
  120 + else {
  121 + let cell = CNLiveHomeTwoHengTuCell()
  122 + return cell
  123 + }
  124 + cell.slideModel = slideModel
  125 + return cell
  126 +
  127 + }else if self.slideModel?.type == SlideModelTypeTwoDuanJu5{
  128 + //一行3个竖图
  129 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeLanmuThreeImgCellIdentifier) as? CNLiveHomeLanmuThreeImgCell
  130 + else {
  131 + let cell = CNLiveHomeLanmuThreeImgCell()
  132 + return cell
  133 + }
  134 + cell.slideModel = slideModel
  135 + return cell
  136 + }else{
  137 + //
  138 + }
  139 +
  140 + }else if let followModel = self.dataArray[indexPath.row] as? [CNLiveHomeFollowModel]{
  141 + //一行2个横图
  142 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeTwoHengTuCellIdentifier) as? CNLiveHomeTwoHengTuCell
  143 + else {
  144 + let cell = CNLiveHomeTwoHengTuCell()
  145 + return cell
  146 + }
  147 + cell.followModel = followModel
  148 + return cell
  149 + }else if let collectionModel = self.dataArray[indexPath.row] as? [CNLiveCollectionListModel]{
  150 + //一行2个横图
  151 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeTwoHengTuCellIdentifier) as? CNLiveHomeTwoHengTuCell
  152 + else {
  153 + let cell = CNLiveHomeTwoHengTuCell()
  154 + return cell
  155 + }
  156 + cell.collectionModel = collectionModel
  157 + return cell
  158 + }
  159 + return UITableViewCell()
  160 + }
  161 +
  162 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  163 + if let slideModel = self.dataArray[indexPath.row] as? [CNLiveAlbumModel]{
  164 + if self.slideModel?.type == SlideModelTypeTVOneBigTwoSmall2{
  165 + //一行2个横图
  166 + let imgW:CGFloat = (KSreenWidth-45.0)/2.0
  167 + let imgH:CGFloat = imgW*93.0/165.0
  168 + return imgH+76.0
  169 + }else if self.slideModel?.type == SlideModelTypeTwoDuanJu5{
  170 + //一行3个竖图
  171 + let imgW:CGFloat = (KSreenWidth-60.0)/3.0
  172 + let imgH:CGFloat = imgW*140.0/105.0
  173 + return imgH+55.0
  174 + }else{
  175 + }
  176 + }else if let followModel = self.dataArray[indexPath.row] as? [CNLiveHomeFollowModel]{
  177 + //一行2个横图
  178 + let imgW:CGFloat = (KSreenWidth-45.0)/2.0
  179 + let imgH:CGFloat = imgW*93.0/165.0
  180 + return imgH+76.0
  181 + }else if let followModel = self.dataArray[indexPath.row] as? [CNLiveCollectionListModel]{
  182 + //一行2个横图
  183 + let imgW:CGFloat = (KSreenWidth-45.0)/2.0
  184 + let imgH:CGFloat = imgW*93.0/165.0
  185 + return imgH+76.0
  186 + }
  187 + return 60
  188 + }
  189 +
  190 + deinit {
  191 + }
  192 +
  193 + func chunkArray<T>(array: [T], chunkSize: Int) -> [[T]] {
  194 + var result = [[T]]()
  195 + var currentIndex = 0
  196 +
  197 + while currentIndex < array.count {
  198 + let endIndex = min(currentIndex + chunkSize, array.count)
  199 + let chunk = Array(array[currentIndex..<endIndex])
  200 + result.append(chunk)
  201 + currentIndex += chunkSize
  202 + }
  203 +
  204 + return result
  205 + }
  206 +
  207 + // MARK: - 获取内容
  208 + //我的-播放记录
  209 + func getHomePageFollowApi(sid:String){
  210 + CNLiveHomePageViewModel.requestGetMinePlayHistory(sid: sid, page: self.page){[weak self] result, status in
  211 + guard let self = self else { return }
  212 + hiddenLoading()
  213 + if status == .success{
  214 + let albumBaseModel = result as! CNLiveHomeFollowListBaseModel
  215 +
  216 + if self.page > 1 && albumBaseModel.list.count > 0 {
  217 + var tempArr = Array<Any>()
  218 + for obj in self.dataArray {
  219 + if let objArr = obj as? Array<Any>{
  220 + for tempObj in objArr{
  221 + if let tempMdl = tempObj as? CNLiveHomeFollowModel{
  222 + tempArr.append(tempMdl)
  223 + }
  224 + }
  225 + }else{
  226 + if let tempMdl = obj as? CNLiveHomeFollowModel{
  227 + tempArr.append(tempMdl)
  228 + }
  229 + }
  230 + }
  231 +
  232 + self.dataArray = NSMutableArray(array: tempArr)
  233 + self.dataArray.addObjects(from: albumBaseModel.list)
  234 + }
  235 + if self.page == 1 {
  236 + self.dataArray.removeAllObjects()
  237 + self.dataArray.addObjects(from: albumBaseModel.list)
  238 + if self.dataArray.count > 0 && self.tableView.mj_header == nil && self.tableView.mj_footer == nil {
  239 + self.addRefreshView()
  240 + }
  241 + }
  242 +
  243 + self.tableView.mj_header?.endRefreshing()
  244 +
  245 + //分成2个一组
  246 + let chunkedArray = self.chunkArray(array: self.dataArray as! Array<Any>, chunkSize: 2)
  247 + self.dataArray = NSMutableArray(array: chunkedArray)
  248 + self.tableView.reloadData()
  249 + if albumBaseModel.hasNextPage{
  250 + self.tableView.mj_footer?.endRefreshing()
  251 + }else{
  252 + self.tableView.mj_footer?.endRefreshingWithNoMoreData()
  253 + }
  254 +
  255 + }else{
  256 + //没有
  257 + }
  258 + }
  259 + }
  260 +
  261 + //我的-收藏记录
  262 + func getCollectionListApi(){
  263 + CNLiveHomePageViewModel.getCollectionListApi(sid: UserInfoManager.shared.userInfo.uid, page: "\(self.page)", pageSize: "10") {[weak self] result, status in
  264 + guard let self = self else { return }
  265 + hiddenLoading()//UserInfoManager.shared.userInfo.uid //"10506286"
  266 + if status == .success{
  267 + let albumBaseModel = result as! CNLiveCollectionListBaseModel
  268 +
  269 + if self.page > 1 && albumBaseModel.list.count > 0 {
  270 + var tempArr = Array<Any>()
  271 + for obj in self.dataArray {
  272 + if let objArr = obj as? Array<Any>{
  273 + for tempObj in objArr{
  274 + if let tempMdl = tempObj as? CNLiveCollectionListModel{
  275 + tempArr.append(tempMdl)
  276 + }
  277 + }
  278 + }else{
  279 + if let tempMdl = obj as? CNLiveCollectionListModel{
  280 + tempArr.append(tempMdl)
  281 + }
  282 + }
  283 + }
  284 +
  285 + self.dataArray = NSMutableArray(array: tempArr)
  286 + self.dataArray.addObjects(from: albumBaseModel.list)
  287 + }
  288 + if self.page == 1 {
  289 + self.dataArray.removeAllObjects()
  290 + self.dataArray.addObjects(from: albumBaseModel.list)
  291 + if self.dataArray.count > 0 && self.tableView.mj_header == nil && self.tableView.mj_footer == nil {
  292 + self.addRefreshView()
  293 + }
  294 + }
  295 +
  296 + self.tableView.mj_header?.endRefreshing()
  297 +
  298 + //分成2个一组
  299 + let chunkedArray = self.chunkArray(array: self.dataArray as! Array<Any>, chunkSize: 2)
  300 + self.dataArray = NSMutableArray(array: chunkedArray)
  301 + self.tableView.reloadData()
  302 + if albumBaseModel.hasNextPage{
  303 + self.tableView.mj_footer?.endRefreshing()
  304 + }else{
  305 + self.tableView.mj_footer?.endRefreshingWithNoMoreData()
  306 + }
  307 +
  308 + }else{
  309 + //没有
  310 + }
  311 + }
  312 + }
  313 +
  314 + func getBlockContents(page:NSInteger){
  315 + showLoading(message: "")
  316 + if let blockId = self.slideModel?.blockId{
  317 + print("blockId:\(blockId)")
  318 + CNLiveHomePageViewModel.getBlockContents(blockId: blockId, page: page) {[weak self] result, status in
  319 + hiddenLoading()
  320 + guard let self = self else { return }
  321 + if status == .success{
  322 + let albumBaseModel = result as! CNLiveAlbumBaseModel
  323 + if self.page > 1 && albumBaseModel.list.count > 0 {
  324 + var tempArr = Array<Any>()
  325 + for obj in self.dataArray {
  326 + if let objArr = obj as? Array<Any>{
  327 + for tempObj in objArr{
  328 + if let tempMdl = tempObj as? CNLiveAlbumModel{
  329 + tempArr.append(tempMdl)
  330 + }
  331 + }
  332 + }else{
  333 + if let tempMdl = obj as? CNLiveAlbumModel{
  334 + tempArr.append(tempMdl)
  335 + }
  336 + }
  337 + }
  338 +
  339 + self.dataArray = NSMutableArray(array: tempArr)
  340 + self.dataArray.addObjects(from: albumBaseModel.list)
  341 + }
  342 + if self.page == 1 {
  343 + self.dataArray.removeAllObjects()
  344 + self.dataArray.addObjects(from: albumBaseModel.list)
  345 + if self.dataArray.count > 0 && self.tableView.mj_header == nil && self.tableView.mj_footer == nil {
  346 + self.addRefreshView()
  347 + }
  348 + }
  349 +
  350 + self.tableView.mj_header?.endRefreshing()
  351 +
  352 + //分成3个一组
  353 + let chunkedArray = self.chunkArray(array: self.dataArray as! Array<Any>, chunkSize: 3)
  354 + self.dataArray = NSMutableArray(array: chunkedArray)
  355 + self.tableView.reloadData()
  356 + if albumBaseModel.hasNextPage{
  357 + self.tableView.mj_footer?.endRefreshing()
  358 + }else{
  359 + self.tableView.mj_footer?.endRefreshingWithNoMoreData()
  360 + }
  361 +
  362 + }else if (status == .noNetwork) {
  363 +// self.network_type = .noNetwork
  364 +// self.tableView.reloadEmptyDataSet()
  365 + } else {
  366 +// self.network_type = .failed
  367 +// self.tableView.reloadEmptyDataSet()
  368 + }
  369 + }
  370 +
  371 + }
  372 +
  373 + }
  374 +
  375 +}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Controller/CNLiveHomeSearchController.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeSearchController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/7.
  6 +//
  7 +//
  8 +import Foundation
  9 +import QMUIKit
  10 +import MJRefresh
  11 +
  12 +class CNLiveHomeSearchController:CNLiveBaseViewController,UISearchBarDelegate, UITableViewDataSource, UITableViewDelegate{
  13 +
  14 + let CNLiveHomeSearchHistoryKey = "CNLiveHomeSearchHistoryKey"
  15 + lazy var searBarView :QMUISearchBar = {
  16 + let iconImgView = QMUISearchBar(frame: CGRect(x: 15, y: KStatusBarHeight, width: KSreenWidth-50-15, height: 32))
  17 + iconImgView.backgroundColor = .white//.clear
  18 + iconImgView.searchTextField.backgroundColor = .white
  19 + iconImgView.searchTextField.clearButtonMode = .whileEditing
  20 + iconImgView.searchTextField.font = Font_13
  21 + iconImgView.searchTextField.textColor = HexColor("#333333")
  22 + iconImgView.clipsToBounds = true
  23 + iconImgView.layer.cornerRadius = 16
  24 + iconImgView.backgroundImage = UIImage(named: "home_searchBg")
  25 + iconImgView.scopeBarBackgroundImage = UIImage(named: "home_searchBg")
  26 + iconImgView.contentMode = .scaleAspectFill
  27 + iconImgView.backgroundColor = .clear
  28 + iconImgView.searchTextField.backgroundColor = .clear
  29 + iconImgView.inputView?.backgroundColor = .clear
  30 + iconImgView.delegate = self
  31 + return iconImgView
  32 + }()
  33 + lazy var searchBgImgView :UIImageView = {
  34 + let iconImgView = UIImageView()
  35 + iconImgView.image = UIImage(named: "home_searchBg")
  36 + iconImgView.contentMode = .scaleAspectFill
  37 + return iconImgView
  38 + }()
  39 +
  40 + lazy var cancelBtn: QMUIButton = {
  41 + let playBtn = QMUIButton.init(type: .custom)
  42 + playBtn.setTitle("取消", for: .normal)
  43 + playBtn.setTitleColor(HexColor("#999999"), for: .normal)
  44 + playBtn.titleLabel?.font = Font_15
  45 + playBtn.addTarget(self, action: #selector(cancelBtnAction), for: .touchUpInside)
  46 + return playBtn
  47 + }()
  48 + ///数据源
  49 + lazy var dataArray: NSMutableArray = {
  50 + var dataArray = NSMutableArray()
  51 + return dataArray
  52 + }()
  53 + let kCNLiveHomeSearchHotCellIdentifier = "kCNLiveHomeSearchHotCellIdentifier"
  54 + let kCNLiveHomeSearchHistoryCellIdentifier = "kCNLiveHomeSearchHistoryCellIdentifier"
  55 + lazy var tableView : UITableView = {
  56 + let tableView = UITableView(frame: .zero, style: .plain)
  57 + tableView.dataSource = self
  58 + tableView.delegate = self
  59 + tableView.separatorStyle = .none
  60 + tableView.register(CNLiveHomeSearchHistoryCell.self, forCellReuseIdentifier: kCNLiveHomeSearchHistoryCellIdentifier)
  61 + tableView.register(CNLiveHomeSearchHotCell.self, forCellReuseIdentifier: kCNLiveHomeSearchHotCellIdentifier)
  62 +
  63 + tableView.backgroundColor = .white
  64 + return tableView
  65 + }()
  66 +
  67 + var searchText = ""//搜索内容
  68 + var hisArr = [String]()//搜索本地历史
  69 + var page = 1//当前页数
  70 + var historyHeight:CGFloat = 176//默认高度
  71 +
  72 + // MARK: - 搜索结果
  73 + //搜索结果数组
  74 + lazy var resultListArray: NSMutableArray = {
  75 + var dataArray = NSMutableArray()
  76 + return dataArray
  77 + }()
  78 + let kCNLiveHomeSearchResultJuJiCellIdentifier = "kCNLiveHomeSearchResultJuJiCellIdentifier"
  79 +// let kCNLiveHomeSearchResultDuanJuCellIdentifier = "kCNLiveHomeSearchResultDuanJuCellIdentifier"
  80 + lazy var resultTableView : UITableView = {
  81 + let tableView = UITableView(frame: .zero, style: .plain)
  82 + tableView.dataSource = self
  83 + tableView.delegate = self
  84 + tableView.separatorStyle = .none
  85 + tableView.register(CNLiveHomeSearchResultJuJiCell.self, forCellReuseIdentifier: kCNLiveHomeSearchResultJuJiCellIdentifier)
  86 +// tableView.register(CNLiveHomeSearchResultDuanJuCell.self, forCellReuseIdentifier: kCNLiveHomeSearchResultDuanJuCellIdentifier)
  87 +
  88 + tableView.backgroundColor = .white
  89 + return tableView
  90 + }()
  91 + var resultHeaderView:UIView?
  92 +
  93 + var footerRefreshView: MJRefreshAutoNormalFooter!
  94 + var isJujiModel:Bool = false//搜索结果 默认单集
  95 +
  96 + override func viewDidLoad() {
  97 + super.viewDidLoad()
  98 + self.view.backgroundColor = .white
  99 +
  100 + view.addSubview(searBarView)
  101 + searBarView.snp.makeConstraints { make in
  102 + make.left.equalToSuperview().offset(15)
  103 + make.top.equalToSuperview().offset(KStatusBarHeight)
  104 + make.width.equalTo((KSreenWidth-50-15 > 310) ? 310 : KSreenWidth-50-15 )
  105 + make.height.equalTo(32)
  106 + }
  107 +// view.addSubview(searchBgImgView)
  108 +// searchBgImgView.snp.makeConstraints { make in
  109 +// make.left.equalToSuperview().offset(15)
  110 +// make.top.equalToSuperview().offset(KStatusBarHeight)
  111 +// make.width.equalTo(KSreenWidth-50-15)
  112 +// make.height.equalTo(32)
  113 +// }
  114 +
  115 + view.addSubview(cancelBtn)
  116 + cancelBtn.snp.makeConstraints { make in
  117 + make.left.equalTo(self.searBarView.snp.right)
  118 + make.top.equalTo(self.searBarView.snp.top)
  119 + make.bottom.equalTo(self.searBarView.snp.bottom)
  120 + make.right.equalToSuperview()
  121 + }
  122 + view.addSubview(tableView)
  123 + tableView.snp.makeConstraints { make in
  124 + make.left.equalToSuperview()
  125 + make.top.equalTo(self.searBarView.snp.bottom)
  126 + make.bottom.equalToSuperview()
  127 + make.right.equalToSuperview()
  128 + }
  129 + self.recordSearchHistory()
  130 + self.getSearchHotListApi()
  131 +
  132 + view.addSubview(resultTableView)
  133 + resultTableView.isHidden = true
  134 + resultTableView.snp.makeConstraints { make in
  135 + make.left.equalToSuperview()
  136 + make.top.equalTo(self.searBarView.snp.bottom)
  137 + make.bottom.equalToSuperview()
  138 + make.right.equalToSuperview()
  139 + }
  140 + self.setUpResultHeaderView()
  141 + self.addRefreshView()
  142 + }
  143 +
  144 + lazy var headerJuJiBtn: UIButton = {
  145 + let expandBtn = UIButton.init(type: .custom)
  146 + expandBtn.backgroundColor = .clear
  147 + expandBtn.setTitleColor(HexColor("#919191"), for: .normal)
  148 +
  149 + expandBtn.titleLabel?.font = BoldFont_13
  150 + expandBtn.setTitle("剧集", for: .normal)
  151 + expandBtn.layer.cornerRadius = 16
  152 + expandBtn.clipsToBounds = true
  153 + expandBtn.frame = CGRect(x: 0, y: 0, width: 60, height: 32)
  154 + expandBtn.addTarget(self, action: #selector(headerJuJiBtnAction), for: .touchUpInside)
  155 + return expandBtn
  156 + }()
  157 + lazy var headerDuanJuBtn: UIButton = {
  158 + let expandBtn = UIButton.init(type: .custom)
  159 + expandBtn.backgroundColor = HexColor("#D3E4FF")
  160 + expandBtn.setTitleColor(HexColor("#2076FF"), for: .normal)
  161 +
  162 + expandBtn.setTitle("视频", for: .normal)
  163 + expandBtn.layer.cornerRadius = 16
  164 + expandBtn.clipsToBounds = true
  165 + expandBtn.titleLabel?.font = BoldFont_13
  166 + expandBtn.frame = CGRect(x: 0, y: 0, width: 60, height: 32)
  167 + expandBtn.addTarget(self, action: #selector(headerDuanJuBtnAction), for: .touchUpInside)
  168 + return expandBtn
  169 + }()
  170 +
  171 + func addRefreshView() {
  172 + resultTableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  173 + guard let self = self else { return }
  174 + self.page = 1
  175 + self.getSearchResultWithSearchText(searchText: self.searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "1")
  176 + })
  177 + resultTableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
  178 + guard let self = self else { return }
  179 + //"album"剧集 1单集
  180 + self.page = self.page + 1
  181 + self.getSearchResultWithSearchText(searchText: searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: false, page: "\(self.page)")
  182 + })
  183 +
  184 + }
  185 +
  186 + func setUpResultHeaderView(){
  187 + resultHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 60))
  188 + resultHeaderView?.backgroundColor = .white
  189 +
  190 + resultHeaderView!.addSubview(headerDuanJuBtn)
  191 + headerDuanJuBtn.snp.makeConstraints { make in
  192 + make.left.equalTo(15)
  193 + make.width.equalTo(60)
  194 + make.centerY.equalToSuperview()
  195 + make.height.equalTo(32)
  196 + }
  197 + resultHeaderView!.addSubview(headerJuJiBtn)
  198 + headerJuJiBtn.snp.makeConstraints { make in
  199 + make.left.equalTo(self.headerDuanJuBtn.snp.right)
  200 + make.width.equalTo(60)
  201 + make.centerY.equalToSuperview()
  202 + make.height.equalTo(32)
  203 + }
  204 + resultTableView.tableHeaderView = resultHeaderView
  205 + self.isJujiModel = false
  206 + }
  207 +
  208 + func changeResult(){
  209 + self.page = 1
  210 + self.getSearchResultWithSearchText(searchText: self.searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "1")
  211 + }
  212 + // MARK: - BtnAction
  213 + @objc func headerDuanJuBtnAction(){
  214 + if self.searBarView.isFirstResponder{
  215 + self.view.endEditing(true)
  216 + }
  217 + isJujiModel = false
  218 + headerJuJiBtn.backgroundColor = .clear
  219 + headerJuJiBtn.setTitleColor(HexColor("#919191"), for: .normal)
  220 +
  221 + headerDuanJuBtn.backgroundColor = HexColor("#D3E4FF")
  222 + headerDuanJuBtn.setTitleColor(HexColor("#2076FF"), for: .normal)
  223 +
  224 + changeResult()
  225 + }
  226 + @objc func headerJuJiBtnAction(){
  227 + if self.searBarView.isFirstResponder{
  228 + self.view.endEditing(true)
  229 + }
  230 + isJujiModel = true
  231 + headerJuJiBtn.backgroundColor = HexColor("#D3E4FF")
  232 + headerJuJiBtn.setTitleColor(HexColor("#2076FF"), for: .normal)
  233 +
  234 + headerDuanJuBtn.backgroundColor = .clear
  235 + headerDuanJuBtn.setTitleColor(HexColor("#919191"), for: .normal)
  236 +
  237 + changeResult()
  238 + }
  239 +
  240 + @objc func cancelBtnAction(){
  241 + self.isJujiModel = false
  242 + if self.resultTableView.isHidden{
  243 + self.navigationController?.popViewController(animated: false)
  244 + }else{
  245 + self.resultTableView.isHidden = true
  246 + }
  247 + }
  248 +
  249 + // MARK: - UISearchBarDelegate
  250 + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
  251 + if let text = searchBar.text{
  252 + let trimStr = text.qmui_trim
  253 + if trimStr.qmui_trimAllWhiteSpace.count == 0{
  254 + QMUITips.showError("搜索内容不能为空", in: self.view, hideAfterDelay: 1.5)
  255 + return
  256 + }
  257 + self.tableView.tableFooterView = nil
  258 + self.tableView.mj_footer = nil
  259 + self.searchText = text
  260 + self.page = 1
  261 + self.view.endEditing(true)
  262 + showLoading(message: "")
  263 + self.getSearchResultWithSearchText(searchText: searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "1")
  264 + self.recordSearchHistory()
  265 + self.getSearchHotListApi()
  266 + }
  267 +
  268 + }
  269 + func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
  270 + if searchText.count == 0{
  271 + self.tableView.tableFooterView = nil
  272 +// self.tableView.removeFromSuperview()
  273 + }
  274 +
  275 + }
  276 + func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  277 + if text == "" || text == "\n"{
  278 + //删
  279 + return true
  280 + }
  281 + if (text.count+(searchBar.text?.count ?? 0)) > 30{
  282 + //输入字符超过最大限制
  283 + QMUITips.showError("输入字符超过最大限制", in: self.view, hideAfterDelay: 1.5)
  284 + return false
  285 + }
  286 + return true
  287 +
  288 + }
  289 +
  290 + // MARK: - UITableViewDelegate
  291 + func numberOfSections(in tableView: UITableView) -> Int {
  292 + return 1
  293 + }
  294 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  295 + if tableView == self.tableView{
  296 + return self.dataArray.count
  297 + }else{
  298 + //搜索结果
  299 + return self.resultListArray.count
  300 + }
  301 + }
  302 + // MARK: - UITableViewDelegate
  303 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  304 + if tableView == self.tableView{
  305 + if let historyModel = self.dataArray[indexPath.row] as? CNLiveHomeSearchHistoryModel{
  306 + //搜索历史
  307 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeSearchHistoryCellIdentifier) as? CNLiveHomeSearchHistoryCell
  308 + else {
  309 + let cell = CNLiveHomeSearchHistoryCell()
  310 + return cell
  311 + }
  312 + cell.historyModel = historyModel
  313 + cell.searchHistoryClickBlock = { searchText in
  314 + self.searchText = searchText
  315 + self.view.endEditing(true)
  316 + self.getSearchResultWithSearchText(searchText: searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "1")
  317 + }
  318 + cell.newHeight = { height in
  319 + self.historyHeight = height
  320 + }
  321 + return cell
  322 +
  323 + }else if let hotModel = self.dataArray[indexPath.row] as? CNLiveHomeSearchHotModel{
  324 + //热词
  325 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeSearchHotCellIdentifier) as? CNLiveHomeSearchHotCell
  326 + else {
  327 + let cell = CNLiveHomeSearchHotCell()
  328 + return cell
  329 + }
  330 + cell.hotModel = hotModel
  331 + return cell
  332 + }else{
  333 +
  334 + }
  335 + }else{
  336 + //搜索结果
  337 + if let resModel = self.resultListArray[indexPath.row] as? CNLiveHomeSearchResultListModel{
  338 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeSearchResultJuJiCellIdentifier) as? CNLiveHomeSearchResultJuJiCell
  339 + else {
  340 + let cell = CNLiveHomeSearchResultJuJiCell()
  341 + return cell
  342 + }
  343 + cell.resModel = resModel
  344 + return cell
  345 +// else if resModel.model == kCNDownSlideContentsModelModel1{//点播
  346 +// guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeSearchResultDuanJuCellIdentifier) as? CNLiveHomeSearchResultDuanJuCell
  347 +// else {
  348 +// let cell = CNLiveHomeSearchResultDuanJuCell()
  349 +// return cell
  350 +// }
  351 +// cell.resModel = resModel
  352 +// return cell
  353 +// }
  354 + }
  355 + }
  356 + return UITableViewCell()
  357 + }
  358 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  359 + if tableView == self.tableView{
  360 + if let slideModel = self.dataArray[indexPath.row] as? CNLiveHomeSearchHotModel{
  361 + //热词列表
  362 + self.searchText = slideModel.value.count > 0 ? slideModel.value : ""
  363 + self.searBarView.text = self.searchText
  364 + self.recordSearchHistory()
  365 + self.getSearchHotListApi()
  366 + self.getSearchResultWithSearchText(searchText: self.searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "1")
  367 + }
  368 + }else{
  369 + //搜索结果
  370 + if let resModel = self.resultListArray[indexPath.row] as? CNLiveHomeSearchResultListModel{
  371 +
  372 + var contentId = ""
  373 + var pid = ""
  374 + var title = ""
  375 +
  376 + if resModel.model == kCNDownSlideContentsModelModelAlbum_video{//专辑
  377 + contentId = resModel.albumId
  378 + pid = resModel.pid
  379 + title = resModel.name
  380 + }else if resModel.model == kCNDownSlideContentsModelModel1{//点播
  381 + contentId = resModel.contentId
  382 + pid = resModel.pid
  383 + title = resModel.title
  384 + }
  385 + //跳转到点播详情页-专辑/点播
  386 + CNLiveDownSlideTool.pushWebAndVodVCWithContentsMdl(model: resModel.model, contentId: contentId, pid: pid, shareUrl: "", thirdUrl: "", title: title, s_to: "", trailerId: "", controller: navigationViewController().visibleViewController, slideModel: nil)
  387 + }else{
  388 +
  389 + }
  390 + }
  391 + }
  392 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  393 + if tableView == self.tableView{
  394 + if let slideModel = self.dataArray[indexPath.row] as? CNLiveHomeSearchHotModel{
  395 + //热词列表
  396 + // let slideModel = self.dataArray[indexPath.row] as! CNLiveHomeSearchHotModel
  397 + return 40
  398 + }else if let slideModel = self.dataArray[indexPath.row] as? CNLiveHomeSearchHistoryModel{
  399 + //搜索历史
  400 + let slideModel = self.dataArray[indexPath.row] as! CNLiveHomeSearchHistoryModel
  401 + return self.historyHeight//176//145
  402 + // return CGFloat(slideModel.cellH)
  403 + }else{
  404 + return 170
  405 + }
  406 + }else{
  407 + //搜索结果
  408 + //albnum剧集90
  409 + //1点播 imgH+55 (imgH+55)i -10
  410 + return 90
  411 +// if let resModel = self.resultListArray[indexPath.row] as? CNLiveHomeSearchResultListModel{
  412 +// return 90
  413 +// if resModel.model == kCNDownSlideContentsModelModelAlbum_video{//专辑
  414 +// return 90
  415 +// }else if resModel.model == kCNDownSlideContentsModelModel1{//点播
  416 +// let imgW = (KSreenWidth-4*15.0)/3.0
  417 +// let imgH = imgW*140.0/105.0
  418 +// return imgH+55
  419 +// }else{
  420 +//
  421 +// }
  422 +// }else{//专辑或单集
  423 +// return 60
  424 +// }
  425 +// return 60
  426 + }
  427 + }
  428 +
  429 + func recordSearchHistory(){
  430 + if var hisArr = UserDefaults.standard.array(forKey: CNLiveHomeSearchHistoryKey) as? Array<String>{
  431 + var hisArrM = hisArr
  432 + if self.searchText.count > 0{
  433 + if hisArrM.contains(self.searchText){
  434 + hisArrM.remove(self.searchText)
  435 + hisArrM.append(self.searchText)
  436 + }else{
  437 + if hisArrM.count >= 10{
  438 + hisArrM.remove(at: 0)
  439 + }
  440 + hisArrM.append(self.searchText)
  441 + }
  442 + UserDefaults.standard.setValue(hisArrM, forKey: CNLiveHomeSearchHistoryKey)
  443 + UserDefaults.standard.synchronize()
  444 + }
  445 + self.hisArr.removeAll()
  446 + for his in hisArrM {
  447 + self.hisArr.append(his)
  448 + }
  449 + let hisModel = CNLiveHomeSearchHistoryModel()
  450 + hisModel.history = self.hisArr
  451 + hisModel.cellH = 140//计算高度
  452 + self.dataArray.removeAllObjects()
  453 + self.dataArray.add(hisModel)
  454 + }else{
  455 + let tempArr = [String]()
  456 + UserDefaults.standard.setValue(tempArr, forKey: CNLiveHomeSearchHistoryKey)
  457 + UserDefaults.standard.synchronize()
  458 + self.hisArr = [String]()
  459 + let hisModel = CNLiveHomeSearchHistoryModel()
  460 + hisModel.history = self.hisArr
  461 + hisModel.cellH = 140//计算高度
  462 + self.dataArray.removeAllObjects()
  463 + self.dataArray.add(hisModel)
  464 + }
  465 + self.tableView.reloadData()
  466 + }
  467 + func getSearchHotListApi(){
  468 + CNLiveHomeSearchViewModel.getSearchHotListApi {[weak self] result, status in
  469 + guard let self = self else { return }
  470 + if status == .success{
  471 + if let hotArr = result as? [CNLiveHomeSearchHotModel]{
  472 + //热词
  473 + let titleMdl = CNLiveHomeSearchHotModel()
  474 + titleMdl.sort = 0
  475 + titleMdl.value = "热点榜"
  476 + self.dataArray.add(titleMdl)
  477 + for (idx,mdl) in hotArr.enumerated() {
  478 + mdl.sort = idx+1
  479 + self.dataArray.add(mdl)
  480 + }
  481 + self.tableView.mj_header?.endRefreshing()
  482 + self.tableView.reloadData()
  483 + }
  484 + }else{
  485 +
  486 + }
  487 + }
  488 + }
  489 + //获取搜索结果
  490 + func getSearchResultWithSearchText(searchText:String,modelId:String,isFirst:Bool,page:String){
  491 + self.searBarView.text = searchText
  492 + CNLiveHomeSearchViewModel.getSearchResultApi(modelId: modelId, keyword: searchText, page: page, pageSize: "10") { [weak self] result, status in
  493 + guard let self = self else { return }
  494 + self.resultTableView.isHidden = false
  495 + if status == .success{
  496 + if let resultBaseModel = result as? CNLiveHomeSearchResultListBaseModel{
  497 + if self.page > 1 {
  498 + for mdl in resultBaseModel.list{
  499 + self.resultListArray.add(mdl)
  500 + }
  501 + }
  502 + if self.page == 1 {
  503 + self.resultListArray.removeAllObjects()
  504 + for mdl in resultBaseModel.list{
  505 + self.resultListArray.add(mdl)
  506 + }
  507 + if self.resultListArray.count > 0 && self.resultTableView.mj_header == nil && self.resultTableView.mj_footer == nil {
  508 + self.addRefreshView()
  509 + self.page = self.page + 1
  510 + self.getSearchResultWithSearchText(searchText: searchText, modelId: self.isJujiModel ? "album" : "1", isFirst: true, page: "\(self.page)")
  511 +
  512 + }
  513 + }
  514 +
  515 + self.resultTableView.mj_header?.endRefreshing()
  516 + self.resultTableView.mj_footer?.endRefreshing()
  517 + self.resultTableView.reloadData()
  518 + if resultBaseModel.list.count == 0 {
  519 + self.resultTableView.mj_footer?.endRefreshingWithNoMoreData()
  520 + self.resultTableView.reloadData()
  521 + }
  522 + if resultBaseModel.hasNextPage == false{
  523 + self.resultTableView.mj_footer?.endRefreshingWithNoMoreData()
  524 + self.resultTableView.reloadData()
  525 + }
  526 +
  527 +
  528 + }
  529 + }else{
  530 +
  531 + }
  532 + }
  533 + }
  534 +
  535 + deinit {
  536 +
  537 + }
  538 +}
  539 +
  540 +
  541 +//import UIKit
  542 +//import MJRefresh
  543 +//import QMUIKit
  544 +//import SnapKit // 假设你使用 SnapKit 进行布局
  545 +//
  546 +//class CNClassifySearchController: BaseViewController {
  547 +//
  548 +// // 声明属性
  549 +// var refreshView: MJRefreshAutoNormalFooter!
  550 +// var listArrM = ‌:ml-search[Any]
  551 +// var hasNextPage: String?
  552 +// var page = 1
  553 +// var hideSearchKB = false
  554 +//
  555 +// // 搜索历史相关
  556 +// var titleLab: UILabel!
  557 +// var labelLineView: UIView!
  558 +// var scrollView: UIScrollView!
  559 +// var historyItemView: CNCategoryFloatLayoutView! // 假设这是一个自定义的 UIView 子类
  560 +// var clearButton: UIButton!
  561 +//
  562 +// // 其他必要的属性...
  563 +//
  564 +// override func viewDidLoad() {
  565 +// super.viewDidLoad()
  566 +//
  567 +// // 初始化列表和页面
  568 +// listArrM = []
  569 +// page = 1
  570 +//
  571 +// // 设置刷新控件
  572 +// refreshView = MJRefreshAutoNormalFooter { [weak self] in
  573 +// guard let self = self else { return }
  574 +// let pageStr = String(self.page)
  575 +// self.getClassifySearchResult(withSearchText: self.searchText, isFirst: false, page: pageStr)
  576 +// }
  577 +//
  578 +// // 设置头部刷新控件(假设这是自定义的)
  579 +// // tableView.mj_header = ...
  580 +//
  581 +// // 如果不是从全搜索来的,则设置 UI
  582 +// if !fromAllSearch {
  583 +// setupUI()
  584 +// }
  585 +//
  586 +// // 监听键盘隐藏通知
  587 +// NotificationCenter.default.addObserver(self, selector: #selector(keyBoardHidden), name: UIKeyboardDidHideNotification, object: nil)
  588 +// }
  589 +//
  590 +// // MARK: - 视图生命周期方法
  591 +//
  592 +// override func viewWillAppear(_ animated: Bool) {
  593 +// super.viewWillAppear(animated)
  594 +// navigationController?.navigationBar.isHidden = true
  595 +// }
  596 +//
  597 +// override func viewDidAppear(_ animated: Bool) {
  598 +// super.viewDidAppear(animated)
  599 +// navigationController?.navigationBar.isHidden = true
  600 +// if hideSearchKB {
  601 +// hideKB()
  602 +// }
  603 +// hideSearchKB = true
  604 +// searchBar.becomeFirstResponder()
  605 +// }
  606 +//
  607 +// override func viewWillDisappear(_ animated: Bool) {
  608 +// super.viewWillDisappear(animated)
  609 +// if !fromAllSearch {
  610 +// navigationController?.navigationBar.isHidden = false
  611 +// }
  612 +// view.endEditing(true)
  613 +// }
  614 +//
  615 +// override func viewDidDisappear(_ animated: Bool) {
  616 +// super.viewDidDisappear(animated)
  617 +// if !fromAllSearch {
  618 +// navigationController?.navigationBar.isHidden = false
  619 +// }
  620 +// }
  621 +//
  622 +// // MARK: - 搜索功能
  623 +//
  624 +// @objc func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
  625 +// let searchText = searchBar.text?.trimmingCharacters(in: .whitespacesAndNewlines)
  626 +// if searchText?.isEmpty ?? true {
  627 +// QMUITips.showError(in: view, message: "搜索内容不能为空", hideAfterDelay: 1.5)
  628 +// return
  629 +// }
  630 +//
  631 +// tableView.mj_footer = nil
  632 +// tableView.tableFooterView = nil
  633 +// self.searchText = searchText
  634 +// page = 1
  635 +// QMUITips.showLoading(in: view)
  636 +// getClassifySearchResult(withSearchText: searchText!, isFirst: true, page: "1")
  637 +//
  638 +// recordHistory()
  639 +// }
  640 +//
  641 +// // 其他搜索相关的方法...
  642 +//
  643 +// // MARK: - 清除搜索历史
  644 +//
  645 +// @objc func clearBtnClick(_ sender: UIButton) {
  646 +// tableView.mj_footer = nil
  647 +// tableView.tableFooterView = nil
  648 +// listArrM.removeAll()
  649 +// tableView.reloadData()
  650 +// // 可能需要移除 tableView
  651 +// }
  652 +//
  653 +// // MARK: - 获取搜索结果
  654 +//
  655 +// func getClassifySearchResult(withSearchText searchText: String, isFirst: Bool, page: String) {
  656 +// if isFirst && tableView.superview == nil {
  657 +// view.addSubview(tableView)
  658 +// }
  659 +//
  660 +// let param: [String: Any] = [
  661 +// "page": page.isEmpty ? "1" : page,
  662 +// "pageSize": "10",
  663 +// "keyword": searchText.urlEncoded // 假设这是一个自定义的扩展方法
  664 +// ]
  665 +//
  666 +// // 发起网络请求(这里使用假设的网络请求方法)
  667 +// // networkRequest(param) { response in
  668 +// // // 处理响应
  669 +// // }
  670 +//
  671 +// // 假设网络请求已经完成,并返回了结果
  672 +// // let responseObject = ...
  673 +//
  674 +// // 更新 UI(这里仅展示逻辑,实际代码需根据响应对象调整)
  675 +// tableView.mj_footer?.endRefreshing()
  676 +// tableView.mj_header?.endRefreshing()
  677 +// QMUITips.hideAllTips(in: view)
  678 +//
  679 +// if let dataDic = responseObject?["data"] as? [String: Any],
  680 +// let hasNextPageStr = dataDic["hasNextPage"] as? String,
  681 +// hasNextPageStr == "1" {
  682 +// page += 1
  683 +// } else {
  684 +// tableView.mj_footer?.endRefreshingWithNoMoreData()
  685 +// }
  686 +//
  687 +// // 根据不同类型更新 listArrM 和 tableView
  688 +// // ...
  689 +//
  690 +// if isFirst {
  691 +// tableView.reloadData()
  692 +// if listArrM.count > 0, hasNextPageStr == "1" {
  693 +// tableView.mj_footer = refreshView
  694 +// }
  695 +// tableView.scrollToTop(animated: true)
  696 +// }
  697 +// }
  698 +//
  699 +// // MARK: - 记录搜索历史
  700 +//
  701 +// func recordHistory() {
  702 +// // 假设 CNUserShareModel 是一个单例或全局对象
  703 +// let historyKey = "CNWjjCategorySearchHistoryKey_\(CNUserShareModel.shared.uid)"
  704 +// if let userDefaults = UserDefaults.standard,
  705 +// let historyArray = userDefaults.array(forKey: historyKey) as? [String] {
  706 +// var historyArrayM = historyArray.mutableCopy() as! [String]
  707 +// if let searchText = searchText, !historyArrayM.contains(searchText) {
  708 +// if historyArrayM.count >= 10 {
  709 +// historyArrayM.removeFirst()
  710 +// }
  711 +// historyArrayM.append(searchText)
  712 +// }
  713 +// userDefaults.set(historyArrayM, forKey: historyKey)
  714 +// userDefaults.synchronize()
  715 +//
  716 +// historyItemView.subviews.forEach { $0.removeFromSuperview() }
  717 +// historyArrayM.reversed().forEach { str in
  718 +// let button = QMUIGhostButton()
  719 +// button.ghostColor = .black
  720 +// button.layer.borderColor = UIColor(rgb: 0xD4D5DA).cgColor
  721 +// button.setTitle(str, for: .normal)
  722 +// button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
  723 +// button.contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
  724 +// button.addTarget(self, action: #selector(historyButtonAction(_:)), for: .touchUpInside)
  725 +// historyItemView.addSubview(button)
  726 +// }
  727 +//
  728 +// historyItemView.snp.remakeConstraints { make in
  729 +// make.top.equalTo(scrollView)
  730 +// make.left.equalTo(view).offset(10)
  731 +// make.right.equalTo(view).offset(-10)
  732 +// make.height.equalTo(historyItemView.sizeThatFits(CGSize(width: view.bounds.width - 20, height: CGFloat.greatestFiniteMagnitude)).height)
  733 +// }
  734 +//
  735 +// let offHeight = historyItemView.snp.frame.height + 10 + 45 + 10 + UIApplication.shared.statusBarFrame.height + 109 - view.bounds.height
  736 +// if offHeight > 0 {
  737 +// scrollView.contentSize = CGSize(width: view.bounds.width, height: view.bounds.height - UIApplication.shared.statusBarFrame.height - 108 + offHeight)
  738 +// }
  739 +//
  740 +// clearButton.isHidden = historyArrayM.isEmpty
  741 +// }
  742 +// }
  743 +//
  744 +// // MARK: - 显示无内容页
  745 +//
  746 +// func showEmptyView() {
  747 +// tableView.mj_footer = nil
... ...
metaCode/Classes/Main/HuBiLieHomePage/Controller/CNLiveTVHomeViewController.swift 0 → 100644
  1 +//
  2 +// CNLiveTVHomeViewController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/2/17.
  6 +// 忽必烈电视剧改版首页
  7 +
  8 +import Foundation
  9 +import QMUIKit
  10 +import MJRefresh
  11 +
  12 +class CNLiveTVHomeViewController:CNLiveBaseViewController, UITableViewDataSource, UITableViewDelegate{
  13 +
  14 + let kCNLiveHomeYingshiBannerCellIdentifier = "kCNLiveHomeYingshiBannerCellIdentifier"
  15 + let kCNLiveHomeLanmuCellIdentifier = "kCNLiveHomeLanmuCellIdentifier"
  16 + let kCNLiveHomeOneBigTwoSmallCellIdentifier = "kCNLiveHomeOneBigTwoSmallCellIdentifier"
  17 + let kCNLiveHomeADCellIdentifier = "kCNLiveHomeADCellIdentifier"
  18 + let kCNLiveHomeTwoDuanjuCellIdentifier = "kCNLiveHomeTwoDuanjuCellIdentifier"
  19 + let kCNLiveHomeFollowCellIdentifier = "kCNLiveHomeFollowCellIdentifier"
  20 + let kCNLiveHomeTwoShopCellIdentifier = "kCNLiveHomeTwoShopCellIdentifier"
  21 + let kCNLiveHomeShopCategoryCellIdentifier = "kCNLiveHomeShopCategoryCellIdentifier"
  22 +
  23 + let group = DispatchGroup()
  24 + let queue = DispatchQueue.global(qos: .default)
  25 + var homePageStyleListMdls:[CNLiveHomePageStyleListModel] = [CNLiveHomePageStyleListModel]()//频道mdls
  26 +
  27 + lazy var tableView : UITableView = {
  28 + let tableView = UITableView(frame: .zero, style: .plain)
  29 + tableView.dataSource = self
  30 + tableView.delegate = self
  31 + tableView.separatorStyle = .none
  32 + tableView.register(CNLiveHomeYingshiBannerCell.self, forCellReuseIdentifier: kCNLiveHomeYingshiBannerCellIdentifier)
  33 + tableView.register(CNLiveHomeLanmuCell.self, forCellReuseIdentifier: kCNLiveHomeLanmuCellIdentifier)
  34 + tableView.register(CNLiveHomeFollowCell.self, forCellReuseIdentifier: kCNLiveHomeFollowCellIdentifier)
  35 + tableView.register(CNLiveHomeOneBigTwoSmallCell.self, forCellReuseIdentifier: kCNLiveHomeOneBigTwoSmallCellIdentifier)
  36 + tableView.register(CNLiveHomeADCell.self, forCellReuseIdentifier: kCNLiveHomeADCellIdentifier)
  37 + tableView.register(CNLiveHomeTwoDuanjuCell.self, forCellReuseIdentifier: kCNLiveHomeTwoDuanjuCellIdentifier)
  38 + tableView.register(CNLiveHomeTwoShopCell.self, forCellReuseIdentifier: kCNLiveHomeTwoShopCellIdentifier)
  39 + tableView.register(CNLiveHomeShopCategoryCell.self, forCellReuseIdentifier: kCNLiveHomeShopCategoryCellIdentifier)
  40 +
  41 + tableView.backgroundColor = .white
  42 + return tableView
  43 + }()
  44 +
  45 +
  46 + lazy var iconBgImgView :UIImageView = {
  47 + let iconImgView = UIImageView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 295*KSreenWidth/375))
  48 + iconImgView.image = UIImage(named: "yingshibg.jpg")
  49 + iconImgView.contentMode = .scaleAspectFill
  50 + return iconImgView
  51 + }()
  52 +
  53 + lazy var iconImgView :UIImageView = {
  54 + let iconImgView = UIImageView(frame: CGRect(x: 15, y: KStatusBarHeight+10, width: 74, height: 32))
  55 + iconImgView.image = UIImage(named: "yingshiicon")
  56 + iconImgView.contentMode = .scaleAspectFill
  57 + return iconImgView
  58 + }()
  59 +
  60 + lazy var searBarView :QMUISearchBar = {
  61 + let iconImgView = QMUISearchBar(frame: CGRect(x: iconImgView.right+10, y: KStatusBarHeight+10, width: KSreenWidth-iconImgView.right-10-15, height: 32))
  62 + iconImgView.backgroundColor = .white
  63 + iconImgView.searchTextField.backgroundColor = .white
  64 + iconImgView.searchTextField.clearButtonMode = .always
  65 + iconImgView.searchTextField.font = Font_13
  66 + iconImgView.searchTextField.textColor = HexColor("#333333")
  67 + iconImgView.clipsToBounds = true
  68 + iconImgView.layer.cornerRadius = 16
  69 + return iconImgView
  70 + }()
  71 + lazy var searchBtn: QMUIButton = {
  72 + let playBtn = QMUIButton.init(type: .custom)
  73 + playBtn.frame = self.searBarView.bounds
  74 + playBtn.clipsToBounds = true
  75 + playBtn.layer.cornerRadius = 16
  76 + playBtn.addTarget(self, action: #selector(searBarViewAction), for: .touchUpInside)
  77 + return playBtn
  78 + }()
  79 +
  80 +
  81 + lazy var pageStyleBtn1: QMUIButton = {
  82 + let playBtn = QMUIButton.init(type: .custom)
  83 + playBtn.frame = CGRect(x: 10, y: self.searBarView.bottom+20, width: 80, height: 25)
  84 + playBtn.setTitle("影视剧", for: .normal)
  85 + playBtn.setTitleColor(HexColor("#000102"), for: .normal)
  86 + playBtn.titleLabel?.font = BoldFont_18
  87 + playBtn.addTarget(self, action: #selector(pageStyleBtn1Action), for: .touchUpInside)
  88 + return playBtn
  89 + }()
  90 + lazy var pageStyleBtn2: QMUIButton = {
  91 + let playBtn = QMUIButton.init(type: .custom)
  92 + playBtn.frame = CGRect(x: pageStyleBtn1.right+10, y: self.searBarView.bottom+20, width: 80, height: 25)
  93 + playBtn.setTitle("影视剧", for: .normal)
  94 + playBtn.setTitleColor(HexColor("#919191"), for: .normal)
  95 + playBtn.titleLabel?.font = Font_14
  96 + playBtn.addTarget(self, action: #selector(pageStyleBtn2Action), for: .touchUpInside)
  97 + playBtn.isHidden = true
  98 + return playBtn
  99 + }()
  100 + lazy var pageStyleBtn3: QMUIButton = {
  101 + let playBtn = QMUIButton.init(type: .custom)
  102 + playBtn.frame = CGRect(x: pageStyleBtn2.right+10, y: self.searBarView.bottom+20, width: 80, height: 25)
  103 + playBtn.setTitle("影视剧", for: .normal)
  104 + playBtn.setTitleColor(HexColor("#919191"), for: .normal)
  105 + playBtn.titleLabel?.font = Font_14
  106 + playBtn.addTarget(self, action: #selector(pageStyleBtn3Action), for: .touchUpInside)
  107 + playBtn.isHidden = true
  108 + return playBtn
  109 + }()
  110 + lazy var pageStyleBtn4: QMUIButton = {
  111 + let playBtn = QMUIButton.init(type: .custom)
  112 + playBtn.frame = CGRect(x: pageStyleBtn3.right+10, y: self.searBarView.bottom+20, width: 80, height: 25)
  113 + playBtn.setTitle("影视剧", for: .normal)
  114 + playBtn.setTitleColor(HexColor("#919191"), for: .normal)
  115 + playBtn.titleLabel?.font = Font_14
  116 + playBtn.addTarget(self, action: #selector(pageStyleBtn4Action), for: .touchUpInside)
  117 + playBtn.isHidden = true
  118 + return playBtn
  119 + }()
  120 +
  121 + ///数据源
  122 + lazy var dataArray: NSMutableArray = {
  123 + var dataArray = NSMutableArray()
  124 + return dataArray
  125 + }()
  126 + var currStyleIndex = 0
  127 +
  128 + override func viewDidLoad() {
  129 + super.viewDidLoad()
  130 + self.view.backgroundColor = .white
  131 +
  132 + view.addSubview(iconBgImgView)
  133 + view.addSubview(iconImgView)
  134 + iconImgView.snp.makeConstraints { make in
  135 + make.left.equalTo(15)
  136 + make.top.equalTo(KStatusBarHeight+10)
  137 + make.width.equalTo(74)
  138 + make.height.equalTo(32)
  139 + }
  140 + view.addSubview(searBarView)
  141 + searBarView.snp.makeConstraints { make in
  142 + make.left.equalTo(self.iconImgView.snp.right).offset(10)
  143 + make.top.equalTo(self.iconImgView.snp.top)
  144 + make.right.equalToSuperview().offset(-15)
  145 + make.height.equalTo(32)
  146 + }
  147 + searBarView.addSubview(searchBtn)
  148 + searchBtn.snp.makeConstraints { make in
  149 + make.top.left.right.bottom.equalToSuperview()
  150 + }
  151 +
  152 + view.addSubview(pageStyleBtn1)
  153 + view.addSubview(pageStyleBtn2)
  154 + view.addSubview(pageStyleBtn3)
  155 + view.addSubview(pageStyleBtn4)
  156 +
  157 + view.addSubview(tableView)
  158 + tableView.frame = CGRect(x: 0, y: self.pageStyleBtn1.bottom+10, width: KSreenWidth, height: KSreenHeight-KTabBarHeight-self.pageStyleBtn1.bottom-10)
  159 + self.getHomePageTopConfigListApi()
  160 + self.addRefreshView()
  161 + }
  162 +
  163 + deinit {
  164 +
  165 + }
  166 +
  167 + ////
  168 + @objc func searBarViewAction(){
  169 + let homePageStyleListMdl = self.homePageStyleListMdls[self.currStyleIndex]
  170 +
  171 + if homePageStyleListMdl.id == "3337"{
  172 + //电商搜索页面
  173 + let urlString = "https://managemall.cnlive.com/html/mall/1/#/pages/goods/search/search?uid=\(UserInfoManager.shared.userInfo.uid)&scene=app"
  174 + CNLiveDownSlideTool.pushWebAndVodVCWithContentsMdl(model: kCNDownSlideContentsModelModelProduct , contentId: "" , pid: "" , shareUrl: "" , thirdUrl: urlString , title: "" , s_to: "" ,trailerId: "" , controller: nil, slideModel: nil)
  175 +
  176 + }else {
  177 + //跳转原生搜索页面
  178 + currentViewController()?.navigationController?.pushViewController(CNLiveHomeSearchController(), animated: false)
  179 + }
  180 +
  181 + }
  182 +
  183 + @objc func pageStyleBtn1Action(){
  184 + self.changeBtnHighLight(idx: 0)
  185 + }
  186 +
  187 + @objc func pageStyleBtn2Action(){
  188 + self.changeBtnHighLight(idx: 1)
  189 +
  190 + }
  191 +
  192 + @objc func pageStyleBtn3Action(){
  193 + self.changeBtnHighLight(idx: 2)
  194 +
  195 + }
  196 +
  197 + @objc func pageStyleBtn4Action(){
  198 + self.changeBtnHighLight(idx: 3)
  199 +
  200 + }
  201 +
  202 + func changeBtnHighLight(idx:Int){
  203 + if idx == 0{
  204 + self.changeBtn(btn: self.pageStyleBtn1, isHighLight: true)
  205 + self.changeBtn(btn: self.pageStyleBtn2, isHighLight: false)
  206 + self.changeBtn(btn: self.pageStyleBtn3, isHighLight: false)
  207 + self.changeBtn(btn: self.pageStyleBtn4, isHighLight: false)
  208 + }else if idx == 1{
  209 + self.changeBtn(btn: self.pageStyleBtn1, isHighLight: false)
  210 + self.changeBtn(btn: self.pageStyleBtn2, isHighLight: true)
  211 + self.changeBtn(btn: self.pageStyleBtn3, isHighLight: false)
  212 + self.changeBtn(btn: self.pageStyleBtn4, isHighLight: false)
  213 + }else if idx == 2{
  214 + self.changeBtn(btn: self.pageStyleBtn1, isHighLight: false)
  215 + self.changeBtn(btn: self.pageStyleBtn2, isHighLight: false)
  216 + self.changeBtn(btn: self.pageStyleBtn3, isHighLight: true)
  217 + self.changeBtn(btn: self.pageStyleBtn4, isHighLight: false)
  218 + }else if idx == 3{
  219 + self.changeBtn(btn: self.pageStyleBtn1, isHighLight: false)
  220 + self.changeBtn(btn: self.pageStyleBtn2, isHighLight: false)
  221 + self.changeBtn(btn: self.pageStyleBtn3, isHighLight: false)
  222 + self.changeBtn(btn: self.pageStyleBtn4, isHighLight: true)
  223 + }else{
  224 +
  225 + }
  226 + let homePageStyleListMdl = self.homePageStyleListMdls[idx]
  227 +// self.group.enter()
  228 + self.currStyleIndex = idx
  229 + self.dataArray.removeAllObjects()
  230 + self.getPageApi(pageID: homePageStyleListMdl.pageId)
  231 + }
  232 + func changeBtn(btn:QMUIButton,isHighLight:Bool){
  233 + if isHighLight{
  234 + btn.setTitleColor(HexColor("#000102"), for: .normal)
  235 + btn.titleLabel?.font = BoldFont_18
  236 + }else{
  237 + btn.setTitleColor(HexColor("#919191"), for: .normal)
  238 + btn.titleLabel?.font = Font_14
  239 + }
  240 +
  241 + }
  242 +
  243 + // MARK: - UITableViewDelegate
  244 + func numberOfSections(in tableView: UITableView) -> Int {
  245 + return 1
  246 + }
  247 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  248 + return self.dataArray.count
  249 + }
  250 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  251 +
  252 + if let slideModel = self.dataArray[indexPath.row] as? CNLiveDownSlideModel{
  253 + if slideModel.type == SlideModelTypeRecommend1{
  254 + //banner
  255 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeYingshiBannerCellIdentifier) as? CNLiveHomeYingshiBannerCell
  256 + else {
  257 + let cell = CNLiveHomeYingshiBannerCell()
  258 + return cell
  259 + }
  260 + cell.slideModel = slideModel
  261 + return cell
  262 + }else if slideModel.type == SlideModelTypeLanmu22{
  263 + //栏目
  264 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeLanmuCellIdentifier) as? CNLiveHomeLanmuCell
  265 + else {
  266 + let cell = CNLiveHomeLanmuCell()
  267 + return cell
  268 + }
  269 + cell.slideModel = slideModel
  270 + cell.imgClickBlock = { slideContentMdl in
  271 + let urlString = slideContentMdl.thirdUrl
  272 + if let url = URL(string: urlString){
  273 + // 使用 URLComponents 解析 URL
  274 + let components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
  275 + // 获取查询项数组
  276 + let queryItems = components.queryItems
  277 + // 遍历查询项数组,查找 pageId 的值
  278 + var pageId = ""
  279 + for queryItem in queryItems ?? [] {
  280 + if queryItem.name == "pageId" {
  281 + pageId = queryItem.value ?? ""
  282 + break
  283 + }
  284 + }
  285 + if pageId.count > 0{
  286 + let vc = CNLiveHomeLanmuController()
  287 + vc.slideContentModel = slideContentMdl
  288 + vc.pageId = pageId
  289 + currentViewController()?.navigationController?.pushViewController(vc, animated: true)
  290 + }else{
  291 + //跳转webView
  292 + CNLiveDownSlideTool.pushWebAndVodVCWithContentsMdl(model: slideContentMdl.model, contentId: slideContentMdl.contentId, pid: slideContentMdl.pid, shareUrl: slideContentMdl.shareUrl, thirdUrl: slideContentMdl.thirdUrl, title: slideContentMdl.title, s_to: slideContentMdl.s_to, trailerId: slideContentMdl.trailerId, controller: self, slideModel: nil)
  293 + }
  294 + }
  295 +
  296 + }
  297 + return cell
  298 + }else if slideModel.type == SlideModelTypeTVOneBigTwoSmall2{
  299 + //
  300 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeOneBigTwoSmallCellIdentifier) as? CNLiveHomeOneBigTwoSmallCell
  301 + else {
  302 + let cell = CNLiveHomeOneBigTwoSmallCell()
  303 + return cell
  304 + }
  305 + cell.slideModel = slideModel
  306 + return cell
  307 + }else if slideModel.type == SlideModelTypeAD31{
  308 + //广告
  309 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeADCellIdentifier) as? CNLiveHomeADCell
  310 + else {
  311 + let cell = CNLiveHomeADCell()
  312 + return cell
  313 + }
  314 + cell.slideModel = slideModel
  315 + return cell
  316 + }else if slideModel.type == SlideModelTypeTwoDuanJu5{
  317 + //一排3个
  318 + guard let cell = tableView.dequeueReusableCell (withIdentifier: kCNLiveHomeTwoDuanjuCellIdentifier) as? CNLiveHomeTwoDuanjuCell
  319 + else {
  320 + let cell = CNLiveHomeTwoDuanjuCell()
  321 + return cell
  322 + }
  323 + cell.slideModel = slideModel
  324 + return cell
  325 + }else if slideModel.type == SlideModelTypeShop29{
  326 + //官方周边 一排2个
  327 + guard let cell = tableView.dequeueReusableCell (withIdentifier: kCNLiveHomeTwoShopCellIdentifier) as? CNLiveHomeTwoShopCell
  328 + else {
  329 + let cell = CNLiveHomeTwoShopCell()
  330 + return cell
  331 + }
  332 + cell.slideModel = slideModel
  333 + return cell
  334 + }else{
  335 + return UITableViewCell()
  336 + }
  337 + }else if let followModel = self.dataArray[indexPath.row] as? CNLiveHomeFollowModel{
  338 + //正在追
  339 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeFollowCellIdentifier) as? CNLiveHomeFollowCell
  340 + else {
  341 + let cell = CNLiveHomeFollowCell()
  342 + return cell
  343 + }
  344 + cell.followModel = followModel
  345 + return cell
  346 + }else if let categoryModel = self.dataArray[indexPath.row] as? CNLiveHomeShopCategoryModel{
  347 + //电商分类 一排三个
  348 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveHomeShopCategoryCellIdentifier) as? CNLiveHomeShopCategoryCell
  349 + else {
  350 + let cell = CNLiveHomeShopCategoryCell()
  351 + return cell
  352 + }
  353 + cell.slideModel = categoryModel
  354 + return cell
  355 + }else{
  356 + return UITableViewCell()
  357 + }
  358 +
  359 + }
  360 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  361 +
  362 + if let slideModel = self.dataArray[indexPath.row] as? CNLiveDownSlideModel{
  363 + //非短剧
  364 + let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  365 + if slideModel.type == SlideModelTypeFollow77{
  366 + return 0.0//追剧 占位数据
  367 + }
  368 + return CGFloat(slideModel.cellH)
  369 + }else if let slideModel = self.dataArray[indexPath.row] as? CNLiveHomeFollowModel{
  370 + //正在追
  371 + return 50.0+15.0//80
  372 + }else if let slideModel = self.dataArray[indexPath.row] as? CNLiveHomeShopCategoryModel{
  373 + //商品分类 一排三个
  374 + let maxCount = slideModel.group.count > 6 ? 6 : slideModel.group.count
  375 + let hangNum = Int(ceil(Double(maxCount)/3.0))
  376 + let imgW = (KSreenWidth-15*4)/3.0
  377 + let imgH = imgW*32.0/105.0
  378 + let rowH = imgH+15.0
  379 + let height = CGFloat(hangNum)*rowH
  380 + return height
  381 + }else{
  382 + return 60
  383 + }
  384 + }
  385 +
  386 + func addRefreshView() {
  387 + tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  388 + self!.getHomePageTopConfigListApi()
  389 + })
  390 + }
  391 +
  392 + //MARK: - 获取首页配置
  393 + func getHomePageTopConfigListApi(){
  394 + CNLiveHomePageViewModel.requestGetHomePageTopConfigList{[weak self] result, status in
  395 + guard let self = self else { return }
  396 + if status == .success{
  397 +
  398 + let dataModelArr = result as! [CNLiveHomePageHuBiLieModel]
  399 + let dataModel = dataModelArr.first!
  400 +
  401 + let img = dataModel.img
  402 + if img.count > 0{
  403 + self.iconImgView.kf.setImage(with: URL(string: img))
  404 + self.iconImgView.isHidden = false
  405 +
  406 + self.iconImgView.snp.remakeConstraints { make in
  407 + make.left.equalTo(15)
  408 + make.top.equalTo(KStatusBarHeight+10)
  409 + make.width.equalTo(74)
  410 + make.height.equalTo(32)
  411 + }
  412 + self.searBarView.snp.remakeConstraints { make in
  413 + make.left.equalTo(self.iconImgView.snp.right).offset(10)
  414 + make.top.equalTo(self.iconImgView.snp.top)
  415 + make.right.equalToSuperview().offset(-15)
  416 + make.height.equalTo(32)
  417 + }
  418 + }else{
  419 + self.iconImgView.isHidden = true
  420 + self.iconImgView.image = nil
  421 + self.iconImgView.snp.remakeConstraints { make in
  422 + make.left.equalTo(15)
  423 + make.top.equalTo(KStatusBarHeight+10)
  424 + make.width.equalTo(0)
  425 + make.height.equalTo(32)
  426 + }
  427 + self.searBarView.snp.remakeConstraints { make in
  428 + make.left.equalTo(self.iconImgView.snp.right)
  429 + make.top.equalTo(self.iconImgView.snp.top)
  430 + make.right.equalToSuperview().offset(-15)
  431 + make.height.equalTo(32)
  432 + }
  433 +
  434 + }
  435 +
  436 + let homePageListMdls = dataModel.pageStyleList
  437 + self.homePageStyleListMdls = homePageListMdls
  438 + for (idx,mdl) in homePageListMdls.enumerated() {
  439 + if idx == 0{
  440 + self.pageStyleBtn1.setTitle(mdl.name, for: .normal)
  441 + self.changeBtn(btn: self.pageStyleBtn1, isHighLight: true)
  442 + self.pageStyleBtn1.isHidden = false
  443 +// self.group.enter()
  444 + self.getPageApi(pageID: mdl.pageId)
  445 +
  446 + }else if idx == 1{
  447 + self.pageStyleBtn2.setTitle(mdl.name, for: .normal)
  448 + self.changeBtn(btn: self.pageStyleBtn2, isHighLight: false)
  449 + self.pageStyleBtn2.isHidden = false
  450 + }else if idx == 2{
  451 + self.pageStyleBtn3.setTitle(mdl.name, for: .normal)
  452 + self.changeBtn(btn: self.pageStyleBtn3, isHighLight: false)
  453 + self.pageStyleBtn3.isHidden = false
  454 + }else if idx == 3{
  455 + self.pageStyleBtn4.setTitle(mdl.name, for: .normal)
  456 + self.changeBtn(btn: self.pageStyleBtn4, isHighLight: false)
  457 + self.pageStyleBtn4.isHidden = false
  458 + }else{
  459 +
  460 + }
  461 + }
  462 +// self.group.notify(queue: .main) {
  463 +// // 所有网络请求都已完成,在这里执行你的任务
  464 +// self.tableView.mj_header?.endRefreshing()
  465 +// self.tableView.reloadData()
  466 +// }
  467 +
  468 + }else{
  469 + self.getHomePageTopConfigListApi()
  470 + }
  471 + }
  472 + }
  473 +
  474 + func getHomePageShopCategoryApi(shop_id:String){
  475 +
  476 + CNLiveHomePageViewModel.requestGetHomePageShopCategoryApi(shop_id: shop_id){[weak self] result, status in
  477 + guard let self = self else { return }
  478 + if status == .success{
  479 + var cateMdl = result as! CNLiveHomeShopCategoryModel
  480 +
  481 + var followIdx = 0
  482 + for (idx,mdl) in self.dataArray.enumerated(){
  483 + if let lanmuMdl = mdl as? CNLiveDownSlideModel{
  484 + if lanmuMdl.type == SlideModelTypeShopCategory78{
  485 + //商品分类
  486 + followIdx = idx
  487 + }
  488 + }
  489 + }
  490 + if cateMdl.group.count == 0{
  491 + //不显示分类
  492 + self.dataArray.removeObject(at: followIdx)
  493 + }else{
  494 + let model = CNLiveHomeShopCategoryGroupModel()
  495 + model.title = "全部商品"
  496 + cateMdl.group.insert(model, at: 0)
  497 + self.dataArray.replaceObject(at: followIdx, with: cateMdl)
  498 + }
  499 + }else{
  500 +
  501 + }
  502 + self.tableView.mj_header?.endRefreshing()
  503 + self.tableView.reloadData()
  504 + self.tableView.scrollToTop(animated: false)
  505 + }
  506 + }
  507 + func getHomePageFollowApi(sid:String){
  508 + CNLiveHomePageViewModel.requestGetHomePageFollow(sid: sid){[weak self] result, status in
  509 + guard let self = self else { return }
  510 + if status == .success{
  511 + //插入数据到栏目下一位
  512 + let followMdl = result as! CNLiveHomeFollowModel
  513 +// if self.dataArray.count >= 2{
  514 +// self.dataArray.insert(followMdl, at: 2)
  515 +// }
  516 + var followIdx = 0
  517 + for (idx,mdl) in self.dataArray.enumerated(){
  518 + if let lanmuMdl = mdl as? CNLiveDownSlideModel{
  519 + if lanmuMdl.type == SlideModelTypeFollow77{
  520 + //正在追
  521 + followIdx = idx
  522 + }
  523 + }
  524 + }
  525 + self.dataArray.replaceObject(at: followIdx, with: followMdl)
  526 +
  527 +// self.group.leave()
  528 +
  529 + }else{
  530 + //没有在追
  531 +// self.group.leave()
  532 + }
  533 + self.tableView.mj_header?.endRefreshing()
  534 + self.tableView.reloadData()
  535 + self.tableView.scrollToTop(animated: false)
  536 + }
  537 + }
  538 + //MARK: - 网络请求获取区块详情页
  539 + func getPageApi(pageID:String)
  540 + {
  541 + // showLoading(message: "")
  542 + CNLiveDownSlideViewModel.requestGetPage(pageId: pageID as NSString) {[weak self] result, status in
  543 + hiddenLoading()
  544 + guard let self = self else { return }
  545 +
  546 + if status == .success{
  547 + self.dataArray.removeAllObjects()
  548 + let array = result as! [Any]
  549 + let newDataArray = NSMutableArray()
  550 + var isRefreshTable = true
  551 + for slideModel in array {
  552 + if let model = slideModel as? CNLiveDownSlideModel{
  553 +
  554 + let layout = CNLiveDownSlideModelLayout.init(model: model)
  555 + let cellModel = layout.getCellHModel()
  556 + newDataArray.addObjects(from: [cellModel])
  557 + if model.type == SlideModelTypeFollow77{
  558 +// self.group.enter()
  559 + self.getHomePageFollowApi(sid: UserInfoManager.shared.userInfo.uid)
  560 + isRefreshTable = false
  561 + }else if model.type == SlideModelTypeShopCategory78{
  562 + if model.contents.count > 0{
  563 + let shop_id = model.contents[0].contentId
  564 + self.getHomePageShopCategoryApi(shop_id: shop_id)
  565 + isRefreshTable = false
  566 + }
  567 + }else{
  568 + }
  569 + }
  570 + }
  571 + self.dataArray.addObjects(from: newDataArray as! [Any])
  572 + if isRefreshTable{
  573 + //需要刷新table
  574 + self.tableView.mj_header?.endRefreshing()
  575 + self.tableView.reloadData()
  576 + self.tableView.scrollToTop(animated: false)
  577 + }else{
  578 + //后面接口刷新table
  579 + }
  580 + }else if (status == .failed){
  581 +
  582 + // self.NetApiStatus = .apiError
  583 + }else if (status == .noNetwork){
  584 +
  585 + // self.NetApiStatus = .notNetwork
  586 + }
  587 +// self.group.leave()
  588 + }
  589 + //
  590 + }
  591 +
  592 +
  593 +}
  594 +
... ...
metaCode/Classes/Main/HuBiLieHomePage/Controller/CNLiveTVPlayerViewController.swift 0 → 100644
  1 +//
  2 +// CNLivePlayerViewController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/1/21.
  6 +//
  7 +
  8 +import Foundation
  9 +import ZFPlayer
  10 +import MJRefresh
  11 +import HandyJSON
  12 +import CNLiveShareToolKit
  13 +
  14 +class CNLiveTVPlayerViewController:UIViewController, UITableViewDataSource, UITableViewDelegate{
  15 +
  16 + //当前内容id
  17 + var contentId = ""
  18 +
  19 + //CNLiveVodPlayModel 单集model
  20 + var _vodPlayModel : CNLiveVodPlayModel?
  21 + var vodPlayModel : CNLiveVodPlayModel? {
  22 + get{
  23 + _vodPlayModel
  24 + }
  25 + set{
  26 + _vodPlayModel = newValue!
  27 + }
  28 + }
  29 +
  30 + //CNLiveVodPlayModel 专辑列表model
  31 + var _vodAlbumListBaseModel : CNLiveVodAlbumListBaseModel?
  32 + var vodAlbumListBaseModel : CNLiveVodAlbumListBaseModel? {
  33 + get{
  34 + _vodAlbumListBaseModel
  35 + }
  36 + set{
  37 + _vodAlbumListBaseModel = newValue!
  38 + }
  39 + }
  40 +
  41 + //playerUrl
  42 + var _url:URL?
  43 + var url:URL? {
  44 + get{
  45 + return _url
  46 + }
  47 + set{
  48 + _url = newValue!
  49 + }
  50 + }
  51 +
  52 + let kCNLiveVodIntroductionCellIdentifier = "kCNLiveVodIntroductionCellIdentifier"
  53 + let kCNLiveVodAlbumListCellIdentifier = "kCNLiveVodAlbumListCellIdentifier"
  54 + let kCNLiveVodTrailersCellIdentifier = "kCNLiveVodTrailersCellIdentifier"
  55 + let kCNLiveVodPlayShopCellIdentifier = "kCNLiveVodPlayShopCellIdentifier"
  56 +
  57 +
  58 + lazy var tableView : UITableView = {
  59 + let tableView = UITableView(frame: .zero, style: .plain)
  60 + tableView.dataSource = self
  61 + tableView.delegate = self
  62 + tableView.separatorStyle = .none
  63 + tableView.register(CNLiveVodIntroductionCell.self, forCellReuseIdentifier: kCNLiveVodIntroductionCellIdentifier)
  64 + tableView.register(CNLiveVodAlbumListCell.self, forCellReuseIdentifier: kCNLiveVodAlbumListCellIdentifier)
  65 + tableView.register(CNLiveVodTrailersCell.self, forCellReuseIdentifier: kCNLiveVodTrailersCellIdentifier)
  66 + tableView.register(CNLiveVodPlayShopCell.self, forCellReuseIdentifier: kCNLiveVodPlayShopCellIdentifier)
  67 +
  68 + tableView.backgroundColor = .white
  69 + return tableView
  70 + }()
  71 + ///数据源
  72 + lazy var dataArray: NSMutableArray = {
  73 + var dataArray = NSMutableArray()
  74 + return dataArray
  75 + }()
  76 +
  77 + lazy var bottomCommentShowContainView :UIView = {
  78 + let iconImgView = UIView()
  79 + iconImgView.backgroundColor = .clear
  80 + return iconImgView
  81 + }()
  82 + lazy var bottomCommentView :UIView = {
  83 + let iconImgView = UIView(frame: CGRect(x: 0, y: KSreenHeight-60-KTabBarSafeHeight, width: KSreenWidth, height: 60))
  84 + iconImgView.backgroundColor = .white
  85 + iconImgView.isUserInteractionEnabled = true
  86 + iconImgView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(bottomCommentViewTapAction)))
  87 + return iconImgView
  88 + }()
  89 + lazy var bottomCommentTalkView :UIView = {
  90 + let iconImgView = UIView()
  91 + iconImgView.layer.borderColor = HexColor("#979797")?.cgColor
  92 + iconImgView.layer.borderWidth = 0.5
  93 + iconImgView.layer.cornerRadius = 20
  94 + iconImgView.clipsToBounds = true
  95 + return iconImgView
  96 + }()
  97 + lazy var bottomCommentLabel: UILabel = {
  98 + let titleLabel = UILabel()
  99 + titleLabel.text = "我来说几句…"
  100 + titleLabel.textColor = HexColor("#999999")
  101 + titleLabel.textAlignment = .left
  102 + titleLabel.font = Font_14
  103 + return titleLabel
  104 + }()
  105 + lazy var bottomCommentImgView :UIImageView = {
  106 + let iconImgView = UIImageView()
  107 + iconImgView.image = UIImage(named: "home_player_comment")
  108 + return iconImgView
  109 + }()
  110 +
  111 +
  112 + lazy var whitBgView :UIView = {
  113 + let iconImgView = UIView(frame: CGRect(x: 0, y: KStatusBarHeight, width: KSreenWidth, height: KSreenHeight-KStatusBarHeight))
  114 + iconImgView.backgroundColor = .white
  115 + return iconImgView
  116 + }()
  117 + lazy var containerView :UIImageView = {
  118 + let iconImgView = UIImageView(frame: CGRect(x: 0, y: KStatusBarHeight, width: KSreenWidth, height: KSreenWidth*9/16))
  119 + iconImgView.image = UIImage.imageWithColor(color: UIColor.black, size: CGSize(width: 1, height: 1))
  120 + return iconImgView
  121 + }()
  122 + lazy var controlView :CNLiveZFPlayerControlView = {
  123 + let controlView = CNLiveZFPlayerControlView()
  124 + controlView.fastViewAnimated = true
  125 + controlView.autoHiddenTimeInterval = 5
  126 + controlView.autoFadeTimeInterval = 0.5
  127 + controlView.prepareShowLoading = true
  128 + controlView.prepareShowControlView = false
  129 + controlView.showCustomStatusBar = true
  130 + return controlView
  131 + }()
  132 + var player: ZFPlayerController!
  133 + var isAblumVideo = false
  134 + override func viewDidLoad() {
  135 + super.viewDidLoad()
  136 + view.backgroundColor = .black
  137 + self.view.addSubview(self.whitBgView)
  138 + self.view.addSubview(self.containerView)
  139 +
  140 + let backBtn = UIButton.backItem(imageName: ("mine_header_icon_white_back"), target: self, action: #selector(ClickBackBtn))
  141 + backBtn.frame = CGRect(x: 15, y: KStatusBarHeight, width: backBtn.width, height: backBtn.height)
  142 + self.view.addSubview(backBtn)
  143 +// backBtn.backgroundColor = .red
  144 +
  145 + self.setupPlayer()
  146 +
  147 + view.addSubview(tableView)
  148 + tableView.frame = CGRect(x: 0, y: self.containerView.bottom, width: KSreenWidth, height: KSreenHeight-self.containerView.bottom-KTabBarSafeHeight-60)
  149 + view.addSubview(self.bottomCommentView)
  150 + self.bottomCommentView.addSubview(self.bottomCommentTalkView)
  151 + bottomCommentTalkView.snp.makeConstraints { make in
  152 + make.top.left.equalToSuperview().offset(10)
  153 + make.width.equalToSuperview().offset(-75)
  154 + make.height.equalTo(40)
  155 + }
  156 + self.bottomCommentView.addSubview(self.bottomCommentLabel)
  157 + bottomCommentLabel.snp.makeConstraints { make in
  158 + make.left.equalToSuperview().offset(25)
  159 + make.centerY.equalToSuperview()
  160 + make.width.equalTo(100)
  161 + make.height.equalTo(20)
  162 + }
  163 + self.bottomCommentView.addSubview(self.bottomCommentImgView)
  164 + bottomCommentImgView.snp.makeConstraints { make in
  165 + make.right.equalToSuperview().offset(-20)
  166 + make.centerY.equalToSuperview()
  167 + make.width.equalTo(25)
  168 + make.height.equalTo(24)
  169 + }
  170 + self.view.addSubview(self.bottomCommentShowContainView)
  171 + bottomCommentShowContainView.snp.makeConstraints { make in
  172 + make.left.equalToSuperview()
  173 + make.top.equalToSuperview().offset(self.containerView.bottom)
  174 + make.width.equalToSuperview()
  175 + make.height.equalToSuperview().offset(-self.containerView.bottom)
  176 + }
  177 + bottomCommentShowContainView.isHidden = true
  178 +// self.addRefreshView()
  179 + self.configDataArray()
  180 + self.isAblumVideo = false
  181 + if let albumModel = self.vodAlbumListBaseModel{
  182 + //专辑
  183 + self.isAblumVideo = true
  184 + }else{
  185 + //单集
  186 + self.isAblumVideo = false
  187 + }
  188 + }
  189 +
  190 + func configDataArray(){
  191 + //配置数据
  192 + var tempDataArray = NSMutableArray()
  193 + //单集 简介
  194 + if let vodPlayModel = self.vodPlayModel{//单集有值-简介
  195 + for (_,mdl) in vodPlayModel.blockList.enumerated(){
  196 + if mdl.type == "5"{//点播详情数据
  197 + //CNLiveVodPlayBlockListModel
  198 + tempDataArray.add(mdl)
  199 + }
  200 + }
  201 + }
  202 + //专辑-简介
  203 + if let vodAlbumListBaseModel = self.vodAlbumListBaseModel{//专辑有值-专辑列表
  204 + if let mdl = vodAlbumListBaseModel.list.first{
  205 + if let msgModel = mdl.vodAlbumMsgModel{
  206 + let tempArr = NSMutableArray(array: tempDataArray as! [Any])
  207 + if let vodMdl = tempArr.firstObject as? CNLiveVodPlayBlockListModel{
  208 + for firMdl in vodMdl.list{
  209 + firMdl.title = msgModel.albumName
  210 + firMdl.desc = msgModel.desc
  211 + }
  212 + tempDataArray.removeAllObjects()
  213 + tempDataArray.add(vodMdl)
  214 + }
  215 +
  216 + }
  217 + }
  218 + }
  219 + //专辑有值-专辑列表
  220 + if let vodAlbumListBaseModel = self.vodAlbumListBaseModel{//专辑有值-专辑列表
  221 + tempDataArray.add(vodAlbumListBaseModel)
  222 + }
  223 + //看点
  224 + ///**blockList.type 1/2/3/4/5 商品入口/片花资讯/活动推荐/相关推荐/点播详情 */
  225 + if let vodPlayModel = self.vodPlayModel{//单集有值-简介
  226 + for (_,mdl) in vodPlayModel.blockList.enumerated(){
  227 + if mdl.type == "2"{//看点list数据
  228 + //CNLiveVodPlayBlockListModel
  229 + tempDataArray.add(mdl)
  230 + }
  231 + }
  232 + }
  233 + //商品
  234 + if let vodPlayModel = self.vodPlayModel{//单集有值
  235 + if vodPlayModel.goodsJson.count > 0{
  236 + let goodMdls = jsonArrayToModel(vodPlayModel.goodsJson, CNLiveVodPlayShopModel.self)
  237 + if goodMdls.count > 0{//CNLiveVodPlayModel [CNLiveVodPlayShopModel]
  238 + //有商品
  239 + tempDataArray.add(goodMdls)
  240 + }else{
  241 + //没商品
  242 + }
  243 + }
  244 + }
  245 +
  246 + self.dataArray = NSMutableArray(array: tempDataArray)
  247 +
  248 + }
  249 +
  250 + func setupNewUI(model:CNLiveDownSlideContentsModel){
  251 +
  252 + }
  253 + func setupPlayer(){
  254 + let playerManager = ZFAVPlayerManager()
  255 + playerManager.shouldAutoPlay = true
  256 +// playerManager.rate = 2
  257 +
  258 + player = ZFPlayerController(playerManager: playerManager, containerView: containerView)
  259 + player.pauseWhenAppResignActive = false
  260 + player.controlView = controlView
  261 + //不跟随设备旋转
  262 + player.allowOrentitaionRotation = false
  263 +
  264 + // self.player.currentPlayerManager.rate = 0.5 //点击按钮加
  265 +
  266 + self.player.orientationDidChanged = {[weak self] player,isFullScreen in
  267 + guard let self = self else { return }
  268 +
  269 + }
  270 + /// 播放完成
  271 + self.player.playerDidToEnd = {
  272 + [weak self] asset in
  273 + guard let self = self else { return }
  274 +
  275 + // if (!self.player.isLastAssetURL) {
  276 + // [self.player playTheNext];
  277 + // NSString *title = [NSString stringWithFormat:@"视频标题%zd",self.player.currentPlayIndex];
  278 + // [self.controlView showTitle:title coverURLString:kVideoCover fullScreenMode:ZFFullScreenModeLandscape];
  279 + // } else {
  280 + // [self.player stop];
  281 + // }
  282 + }
  283 + var urls = [URL]()
  284 + urls.append(self.url!)
  285 + self.player.assetURLs = urls
  286 + self.player.playTheIndex(0)
  287 + var title = ""
  288 + if self.vodPlayModel?.blockList.count ?? 0 > 0{
  289 + for mdl in self.vodPlayModel!.blockList{
  290 + if mdl.type == "5"{//详情
  291 + if mdl.list.count > 0{
  292 + let vodModel = mdl.list[0]
  293 + title = vodModel.title
  294 + }
  295 + }
  296 + }
  297 + }
  298 + self.controlView.showTitle(title, cover: UIImage.imageWithColor(color: .darkGray, size: CGSize(width: 50, height: 50)), fullScreenMode: .landscape)
  299 +
  300 + }
  301 +
  302 + // MARK: - UITableViewDelegate
  303 + func numberOfSections(in tableView: UITableView) -> Int {
  304 + return 1
  305 + }
  306 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  307 + return self.dataArray.count
  308 + }
  309 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  310 + if let vodPlayBlockListModel = self.dataArray[indexPath.row] as? CNLiveVodPlayBlockListModel{
  311 + if vodPlayBlockListModel.type == "5"{
  312 + //点播详情
  313 + //简介-标题描述,点赞评论分享
  314 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveVodIntroductionCellIdentifier) as? CNLiveVodIntroductionCell
  315 + else {
  316 + let cell = CNLiveVodIntroductionCell()
  317 + return cell
  318 + }
  319 + cell.vodPlayBlockListModel = vodPlayBlockListModel
  320 + cell.updateCellBlock = {[weak self] isExpand,isFavorite,isCollection,type,vodPlayBlockListListModel in
  321 + guard let self = self else { return }
  322 + if type == "1"{
  323 + //点击了详情按钮
  324 + self.introducCellDetailBtnAction(vodPlayBlockListListModel: vodPlayBlockListListModel)
  325 + }else if type == "2"{
  326 + //点击了点赞按钮
  327 + self.vodSupport(vodPlayBlockListListModel: vodPlayBlockListListModel, isLiked: isFavorite)
  328 + }else if type == "3"{
  329 + //点击了收藏按钮
  330 + self.vodCollection(vodPlayBlockListListModel: vodPlayBlockListListModel, isCollectioned: isCollection)
  331 + }else if type == "4"{
  332 + //点击了分享按钮
  333 + self.vodShare(vodPlayBlockListListModel: vodPlayBlockListListModel)
  334 + }
  335 + }
  336 + return cell
  337 +
  338 + }else if vodPlayBlockListModel.type == "2"{//看点
  339 + //看点
  340 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveVodTrailersCellIdentifier) as? CNLiveVodTrailersCell
  341 + else {
  342 + let cell = CNLiveVodTrailersCell()
  343 + return cell
  344 + }
  345 + cell.vodPlayBlockListModel = vodPlayBlockListModel
  346 + cell.expandBlock = { [weak self] model in
  347 + guard let self = self else { return }
  348 + self.trailersCellDetailBtnAction(vodPlayBlockListModel: model)
  349 + }
  350 + cell.selectBlock = { [weak self] model in
  351 + guard let self = self else { return }
  352 + self.contentId = model.contentId
  353 + let isAblumVideo = model.model == "1" ? false : true
  354 + self.refreshVodData(isAblumVideo: isAblumVideo)
  355 + }
  356 + return cell
  357 + }else{
  358 +
  359 + }
  360 + }else if let vodAlbumListBaseModel = self.dataArray[indexPath.row] as? CNLiveVodAlbumListBaseModel{
  361 + //专辑列表
  362 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveVodAlbumListCellIdentifier) as? CNLiveVodAlbumListCell
  363 + else {
  364 + let cell = CNLiveVodAlbumListCell()
  365 + return cell
  366 + }
  367 + cell.vodAlbumListBaseModel = vodAlbumListBaseModel
  368 +
  369 + cell.selectBlock = {[weak self] vodModel, index in
  370 + guard let self = self else { return }
  371 + self.contentId = vodModel.contentId
  372 + self.changeContentApi(vodModel: vodModel)
  373 + }
  374 + return cell
  375 + }else if let vodPlayShopModels = self.dataArray[indexPath.row] as? [CNLiveVodPlayShopModel]{
  376 + //电商
  377 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveVodPlayShopCellIdentifier) as? CNLiveVodPlayShopCell
  378 + else {
  379 + let cell = CNLiveVodPlayShopCell()
  380 + return cell
  381 + }
  382 + cell.vodPlayShopModels = vodPlayShopModels
  383 + cell.expandBlock = {[weak self] vodPlayShopModels in
  384 + guard let self = self else { return }
  385 + self.shopCellDetailBtnAction(vodPlayShopModels: vodPlayShopModels)
  386 + }
  387 + return cell
  388 + }else {
  389 + return UITableViewCell()
  390 + }
  391 + return UITableViewCell()
  392 + }
  393 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  394 + if let vodPlayBlockListModel = self.dataArray[indexPath.row] as? CNLiveVodPlayBlockListModel{
  395 + if vodPlayBlockListModel.type == "5"{
  396 + //点播详情
  397 + //简介-标题描述,点赞评论分享
  398 + return 112
  399 + }else if vodPlayBlockListModel.type == "2"{
  400 + //看点
  401 + return 25+106+76
  402 + }else{
  403 + }
  404 +
  405 + }else if let vodAlbumListBaseModel = self.dataArray[indexPath.row] as? CNLiveVodAlbumListBaseModel{
  406 + //专辑列表
  407 + return 50+15
  408 + }else if let vodPlayShopModels = self.dataArray[indexPath.row] as? [CNLiveVodPlayShopModel]{
  409 + //电商
  410 + return 145.0
  411 + }else {
  412 +
  413 + }
  414 + return 100
  415 + }
  416 +
  417 + func addRefreshView() {
  418 + tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  419 + self!.refreshVodData(isAblumVideo: self!.isAblumVideo)
  420 + })
  421 + }
  422 +
  423 + //更换contentId内容 play接口刷新看点和电商
  424 + func changeContentApi(vodModel:CNLiveVodAlbumListModel){
  425 +
  426 + //刷新url
  427 + CNLiveHomePageViewModel.shared.getVodVideoURL(contentId: vodModel.activityId) {[weak self] result, status in
  428 + guard let self = self else { return }
  429 + if status == .success
  430 + {
  431 + if let url = result as? String{
  432 + self.playWithUrlAndTitle(url: url, title: vodModel.title)
  433 + }
  434 + }else{
  435 +
  436 + }
  437 + }
  438 +
  439 +
  440 + //play接口刷新 看点和电商
  441 + CNLiveDownSlideTool.getVodPlayApi(contentId: vodModel.contentId) {[weak self] result, status in
  442 + guard let self = self else { return }
  443 + if status == .success{
  444 + if let vodPlayModel = result as? CNLiveVodPlayModel{
  445 + self.vodPlayModel = vodPlayModel
  446 + self.configDataArray()
  447 + self.tableView.reloadData()
  448 + }else{
  449 +
  450 + }
  451 + }else{
  452 +
  453 + }
  454 + }
  455 +
  456 + }
  457 +
  458 + //播放url更换title
  459 + func playWithUrlAndTitle(url:String,title:String){
  460 + self.url = URL(string: url)
  461 + var urls = [URL]()
  462 + urls.append(self.url!)
  463 + self.player.assetURLs = urls
  464 + self.player.playTheIndex(0)
  465 + self.controlView.showTitle(title, cover: UIImage.imageWithColor(color: .darkGray, size: CGSize(width: 50, height: 50)), fullScreenMode: .landscape)
  466 + }
  467 +
  468 + override var preferredStatusBarStyle: UIStatusBarStyle{
  469 + return .lightContent
  470 + }
  471 +
  472 + override var prefersStatusBarHidden: Bool{
  473 + return false
  474 + }
  475 +
  476 + override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{
  477 + return .none
  478 + }
  479 +
  480 + override var shouldAutorotate: Bool{
  481 + return false
  482 + }
  483 +
  484 + override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
  485 + return .allButUpsideDown
  486 + }
  487 +
  488 + func shopCellDetailBtnAction(vodPlayShopModels:[CNLiveVodPlayShopModel]) {
  489 + bottomCommentShowContainView.isHidden = false
  490 +
  491 + let detailBgView = CNLiveVodShopBottomView(frame: bottomCommentShowContainView.bounds)
  492 + detailBgView.backgroundColor = .white
  493 + bottomCommentShowContainView.addSubview(detailBgView)
  494 + detailBgView.vodPlayShopModels = vodPlayShopModels
  495 + detailBgView.expandHideBlock = {[weak self] in
  496 + guard let self = self else { return }
  497 + self.bottomCommentShowContainView.removeAllSubviews()
  498 + self.bottomCommentShowContainView.isHidden = true
  499 + }
  500 +
  501 + }
  502 + // MARK: - 看点cell展开
  503 + func trailersCellDetailBtnAction(vodPlayBlockListModel:CNLiveVodPlayBlockListModel) {
  504 + bottomCommentShowContainView.isHidden = false
  505 +
  506 + let detailBgView = CNLiveVodCellBottomView(frame: bottomCommentShowContainView.bounds)
  507 + detailBgView.backgroundColor = .white
  508 + bottomCommentShowContainView.addSubview(detailBgView)
  509 + detailBgView.vodPlayBlockListModel = vodPlayBlockListModel
  510 + detailBgView.expandHideBlock = {[weak self] in
  511 + guard let self = self else { return }
  512 + self.bottomCommentShowContainView.removeAllSubviews()
  513 + self.bottomCommentShowContainView.isHidden = true
  514 + }
  515 + detailBgView.updateBlock = {[weak self] seleIdx,model in
  516 + guard let self = self else { return }
  517 + self.contentId = model.contentId
  518 + var isAblumVideo = false
  519 + if model.model == "1"{
  520 + isAblumVideo = false
  521 + }else{
  522 + isAblumVideo = true
  523 + }
  524 + self.refreshVodData(isAblumVideo: isAblumVideo)
  525 + }
  526 + }
  527 + // MARK: - 简介cell点击事件
  528 + func introducCellDetailBtnAction(vodPlayBlockListListModel:CNLiveVodPlayBlockListListModel) {
  529 + bottomCommentShowContainView.isHidden = false
  530 +
  531 + let detailBgView = UIView(frame: bottomCommentShowContainView.bounds)
  532 + detailBgView.backgroundColor = .white
  533 + bottomCommentShowContainView.addSubview(detailBgView)
  534 +
  535 + let vodMdl = vodPlayBlockListListModel
  536 +
  537 + let titleLbl = UILabel()
  538 + titleLbl.font = BoldFont_15
  539 + titleLbl.textColor = HexColor("#000102")
  540 + titleLbl.text = vodMdl.title
  541 + bottomCommentShowContainView.addSubview(titleLbl)
  542 +
  543 + titleLbl.snp.makeConstraints { make in
  544 + make.left.equalTo(10)
  545 + make.top.equalTo(16)
  546 + make.width.lessThanOrEqualTo(KSreenWidth-50)
  547 + }
  548 +
  549 + let detailLbl = UILabel()
  550 + detailLbl.font = Font_10
  551 + detailLbl.textColor = HexColor("#999999")
  552 + detailLbl.text = "详情"
  553 + bottomCommentShowContainView.addSubview(detailLbl)
  554 + detailLbl.snp.makeConstraints { make in
  555 + make.left.equalTo(titleLbl.snp.right).offset(15)
  556 + make.top.equalTo(20.5)
  557 + make.width.equalTo(20)
  558 + make.height.equalTo(14)
  559 + }
  560 +
  561 + let descLbl = UITextView()
  562 + descLbl.font = Font_13
  563 + descLbl.textColor = HexColor("#999999")
  564 + descLbl.text = vodMdl.desc
  565 + descLbl.width = KSreenWidth-20
  566 + bottomCommentShowContainView.addSubview(descLbl)
  567 +
  568 + descLbl.snp.makeConstraints { make in
  569 + make.left.equalTo(10)
  570 + make.top.equalTo(titleLbl.snp.bottom).offset(10)
  571 + make.right.equalToSuperview().offset(-20)
  572 + make.bottom.equalToSuperview().offset(-15-50-10)
  573 + }
  574 +
  575 + let expandBtn = UIButton.init(type: .custom)
  576 + expandBtn.backgroundColor = .clear
  577 + expandBtn.setImage(UIImage(named: "home_player_unexpand"), for: .normal)
  578 + expandBtn.addTarget(self, action: #selector(expandBtnAction), for: .touchUpInside)
  579 + bottomCommentShowContainView.addSubview(expandBtn)
  580 + expandBtn.snp.makeConstraints { make in
  581 + make.centerX.equalToSuperview()
  582 + make.bottom.equalToSuperview().offset(-15)
  583 + make.width.equalTo(50)
  584 + make.height.equalTo(50)
  585 + }
  586 +
  587 + }
  588 +
  589 + func vodSupport(vodPlayBlockListListModel:CNLiveVodPlayBlockListListModel,isLiked:Bool){
  590 + CNLiveVodPlayViewModel.vodSupport(contentId: vodPlayBlockListListModel.pid, support: isLiked) {[weak self] result, status in
  591 + guard let self = self else { return }
  592 + if status == .success{
  593 +
  594 + }
  595 + }
  596 + }
  597 + func vodCollection(vodPlayBlockListListModel:CNLiveVodPlayBlockListListModel,isCollectioned:Bool){
  598 + let type = isCollectioned ? "1" : "2"
  599 + CNLiveVodPlayViewModel.vodCollection(type: type, vodPlayBlockListListModel: vodPlayBlockListListModel) {[weak self] result, status in
  600 + guard let self = self else { return }
  601 + if status == .success{
  602 + //不改数据了
  603 + }
  604 + }
  605 + }
  606 + func vodShare(vodPlayBlockListListModel:CNLiveVodPlayBlockListListModel){
  607 + //vodPlayBlockListListModel.img
  608 + //vodPlayBlockListListModel.title
  609 + //vodPlayBlockListListModel.subTitle
  610 + //
  611 + //http://wjjh5.cnlive.com/cnYjzg.html?id=2&version=1.0.9&isShowTitle=true&plat=i&wjjFrom=apple&backgroundColor=%234B8AF5&wjjToken=ACGspwyhX6xbuJ27P0flZOejyKjcS70g7VegVKRgAWPUzacEKgXz2JcmlAVoc5oG&appId=769_li40lrkt53&channelName=yjzg&shareSid=352610&isApp=false&ver=1.0.9.24.03.27.14&sid=352610&wjjUUID=B849E3C36DF04D89B0C8DB9322B69B51_1711520943&voteId=AS5FFqIhAAAQAAAAAAAAAA==&isWjjReport=true
  612 + //https://wjjh5.cnlive.com/apkdownloadYuanma.php
  613 + CNLiveShareManager.showShareViewWithParam(forShareTitle: "标题111", shareUrl: "http://wjjh5.cnlive.com/cnYjzg.html?id=2&version=1.0.9&isShowTitle=true&plat=i&wjjFrom=apple&backgroundColor=%234B8AF5&wjjToken=ACGspwyhX6xbuJ27P0flZOejyKjcS70g7VegVKRgAWPUzacEKgXz2JcmlAVoc5oG&appId=769_li40lrkt53&channelName=yjzg&shareSid=352610&isApp=false&ver=1.0.9.24.03.27.14&sid=352610&wjjUUID=B849E3C36DF04D89B0C8DB9322B69B51_1711520943&voteId=AS5FFqIhAAAQAAAAAAAAAA==&isWjjReport=true", shareDesc: "描述111", shareImage: vodPlayBlockListListModel.img, screenFull: false, hiddenWjj: true, hiddenQQ: false, hiddenWB: true, hiddenLifeCircle: true, hiddenWechatCircle: false, hiddenWechat: false, hiddenSafari: false, formVC: currentViewController(), topImage: [], topTitles: [], platformType: .all) { title in
  614 +
  615 + } completerBlock: { resultType, platformType, typeString in
  616 + if resultType == .succ{
  617 +
  618 + }
  619 + }
  620 + }
  621 +
  622 + // MARK: - ButtonAction
  623 +
  624 + @objc func expandBtnAction() {
  625 + //详情 收起
  626 + self.bottomCommentShowContainView.removeAllSubviews()
  627 + self.bottomCommentShowContainView.isHidden = true
  628 + }
  629 + @objc func bottomCommentViewTapAction() {
  630 + bottomCommentShowContainView.isHidden = false
  631 + //评论
  632 + CNLiveShortVideoCommentListView.showVideoCommentListView(pid: self.vodPlayModel?.contentId ?? "", contentSid: UserInfoManager.shared.userInfo.uid,containView:self.bottomCommentShowContainView, result: { commentModel in
  633 + print("\(commentModel)")
  634 + }, close: {
  635 + self.bottomCommentShowContainView.isHidden = true
  636 + })
  637 +
  638 + }
  639 +
  640 + @objc func ClickBackBtn() {
  641 +
  642 + let viewControllers = self.navigationController?.viewControllers
  643 + if viewControllers?.count ?? 0 > 1 {
  644 + if viewControllers?.last == self {
  645 + self.navigationController!.popViewController(animated: true)
  646 + }
  647 + }
  648 + }
  649 +
  650 + func destroyPlayer(){
  651 + self.player.stop()
  652 + }
  653 +
  654 + func refreshVodData(isAblumVideo:Bool){
  655 + CNLiveDownSlideTool.getVodData(contentId: self.contentId, isAblumVideo: isAblumVideo) {[weak self] vodPlayModel, contentId,url, result, status in
  656 + if status == .success{
  657 + self!.vodPlayModel = vodPlayModel
  658 + self!.contentId = contentId
  659 + if let vodAlbumListBaseModel = result{
  660 + self!.vodAlbumListBaseModel = vodAlbumListBaseModel
  661 + }
  662 + self!.url = URL(string: url)
  663 + self!.configDataArray()
  664 + self!.tableView.mj_header?.endRefreshing()
  665 + self!.tableView.reloadData()
  666 + self!.playWithUrlAndTitle(url: url, title: "")
  667 + }else{
  668 +
  669 + }
  670 + }
  671 + }
  672 + // MARK: - 点播play接口
  673 + /*
  674 + func requestGetVodPlayApi(contentId:String){
  675 + CNLiveHomePageViewModel.requestGetVodPlayApi(contentId: contentId, sid: UserInfoManager.shared.userInfo.uid, resultBlock: { result, status in
  676 + if status == .success{
  677 + if let vodPlayMpdel = result as? CNLiveVodPlayModel{
  678 + if let albumMdl = vodPlayMpdel.album{
  679 + //专辑
  680 + self.requestGetVodPlay1Api(contentId: vodPlayMpdel.contentId)
  681 + //记录当前播放集数的ContentId
  682 + self.contentId = vodPlayMpdel.contentId
  683 + self.requestGetAlbumMsgApi(contentId: vodPlayMpdel.contentId)
  684 + }else{
  685 + //单集
  686 +
  687 + }
  688 + }
  689 + }
  690 + })
  691 + }
  692 + //专辑的单集内容
  693 + func requestGetVodPlay1Api(contentId:String){
  694 + CNLiveHomePageViewModel.requestGetVodPlayApi(contentId: contentId, sid: UserInfoManager.shared.userInfo.uid, resultBlock: { result, status in
  695 + if status == .success{
  696 + if let vodPlayMpdel = result as? CNLiveVodPlayModel{
  697 + if let albumMdl = vodPlayMpdel.album{
  698 + //专辑
  699 +
  700 + }else{
  701 + //单集
  702 +
  703 + }
  704 + }
  705 + }
  706 + })
  707 + }
  708 + */
  709 + // MARK: - 专辑内容详情
  710 +// func requestGetAlbumMsgApi(contentId:String){
  711 +// CNLiveHomePageViewModel.requstWithVodAlbumMsgVideo(aid: contentId, resultBlock: { result, status in
  712 +// if status == .success{
  713 +// if let vodPlayMpdel = result as? CNLiveVodPlayModel{
  714 +// //专辑详情
  715 +// }
  716 +// }
  717 +// })
  718 +// }
  719 +
  720 + deinit {
  721 + print("vod deinit")
  722 + }
  723 +}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Model/CNLiveHomeSearchHistoryModel.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeSearchHistoryModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/8.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveHomeSearchHistoryModel:BaseModel{
  11 + var history = [String]()
  12 + ///电商cell高度
  13 + var cellH:CGFloat = 145.0
  14 +
  15 +}
  16 +class CNLiveHomeSearchResultListBaseModel:BaseModel{
  17 + var endRow = 0
  18 + var firstPage = 0
  19 + var hasNextPage = false
  20 + var nextPage = 0
  21 + var hasPreviousPage = false
  22 + var isFirstPage = true
  23 + var isLastPage = true
  24 + var lastPage = 0
  25 + var list = [CNLiveHomeSearchResultListModel]()
  26 + var navigateFirstPage = 0
  27 + var navigateLastPage = 0
  28 + var navigatePages = 0
  29 + var navigatepageNums:Array<Any> = []
  30 + var pageNum = 0
  31 + var pageSize = 0
  32 + var pages = 0
  33 + var prePage = 0
  34 + var size = 0
  35 + var startRow = 0
  36 + var total = 0
  37 +}
  38 +
  39 +class CNLiveHomeSearchResultListModel:BaseModel{
  40 + //专辑 点播
  41 + var albumId = ""//专辑
  42 + var icon = ""//专辑
  43 + var name = ""//专辑
  44 + var model = ""//专辑 //点播
  45 + var product:CNLiveAlbumProductModel?//专辑//点播
  46 + var title = ""//点播
  47 + var subTitle = ""//专辑//点播
  48 + var status = ""//点播
  49 + var poster = ""//点播
  50 + var contentId = ""//点播
  51 + var pid = ""//点播
  52 + var publishTime = ""//点播
  53 +
  54 +}
  55 +
  56 +//class CNLiveHomeSearchHistoryModelLayout:NSObject{
  57 +//
  58 +// ///cell高度
  59 +// var cellH:CGFloat = 0.0
  60 +//
  61 +// //slideModel
  62 +// var _historyModel : CNLiveHomeSearchHistoryModel?
  63 +// var historyModel : CNLiveHomeSearchHistoryModel? {
  64 +// get{
  65 +// _historyModel
  66 +// }
  67 +// set{
  68 +// _historyModel = newValue
  69 +// }
  70 +// }
  71 +//
  72 +// init(model:CNLiveHomeSearchHistoryModel){
  73 +// super.init()
  74 +// self.historyModel = model
  75 +// self.historyModel?.cellH =
  76 +// }
  77 +// func getCellHModel()->CNLiveHomeSearchHistoryModel{
  78 +// return historyModel!
  79 +// }
  80 +//
  81 +//}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Model/CNLiveHomeSearchHotModel.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeSearchHotModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/8.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveHomeSearchHotModel:BaseModel{
  11 + var sort = 1
  12 + var value = ""
  13 +}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Model/CNLiveHomeShopCategoryModel.swift 0 → 100644
  1 +//
  2 +// CNLiveHomeShopCategoryModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/13.
  6 +//
  7 +
  8 +import Foundation
  9 +class CNLiveHomeShopCategoryModel:BaseModel{
  10 + var state = ""
  11 + var group = [CNLiveHomeShopCategoryGroupModel]()
  12 +}
  13 +class CNLiveHomeShopCategoryGroupModel:BaseModel{
  14 + var simg = ""
  15 + var id = ""
  16 + var istop = ""
  17 + var title = ""
  18 + var level = ""
  19 + var pid = ""
  20 + ///二级分类列表
  21 + var child = [CNLiveShopClassifyModel]()
  22 +}
... ...
metaCode/Classes/Main/HuBiLieHomePage/Model/CNLiveVodAlbumListModel.swift 0 → 100644
  1 +//
  2 +// CNLiveVodAlbumListModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/1.
  6 +//
  7 +// 专辑视频列表详情(播放地址 ,点赞数等信息)
  8 +
  9 +import Foundation
  10 +
  11 +class CNLiveVodAlbumListBaseModel:BaseModel{
  12 + var endRow = 0
  13 + var firstPage = 0
  14 + var hasNextPage = false
  15 + var nextPage = 0
  16 + var hasPreviousPage = false
  17 + var isFirstPage = true
  18 + var isLastPage = true
  19 + var lastPage = 0
  20 + var list = [CNLiveVodAlbumListModel]()
  21 + var navigateFirstPage = 0
  22 + var navigateLastPage = 0
  23 + var navigatePages = 0
  24 + var navigatepageNums:Array<Any> = []
  25 + var pageNum = 0
  26 + var pageSize = 0
  27 + var pages = 0
  28 + var prePage = 0
  29 + var size = 0
  30 + var startRow = 0
  31 + var total = 0
  32 +
  33 + //非接口数据
  34 + var cellH:CGFloat = 0.0
  35 + var isExpand = false//是否展开详情简介
  36 +
  37 +}
  38 +class CNLiveVodAlbumListModel:BaseModel{
  39 + var title = ""
  40 + var albumId = ""
  41 + var albumName = ""
  42 + var actor = ""
  43 + var spId = ""
  44 + var spName = ""
  45 + var modelId = ""
  46 + var time = ""
  47 + var img = ""
  48 + var poster = ""
  49 + var counts = ""
  50 + var description = ""
  51 + var viewCounts = ""
  52 + var schedule = ""
  53 + var liveType = ""
  54 + var downloadType = ""
  55 + var activityId = ""
  56 + var isHorizontalScreen = ""
  57 + var comments = ""
  58 + var chapterId = ""
  59 + var contentId = ""
  60 + var duration = ""
  61 + var shareUrl = ""
  62 + var fileSize = ""
  63 + var cmccActiveId = ""
  64 + var productId = ""
  65 + var productType = ""
  66 + var isStudy = ""
  67 + var playTime = ""
  68 + var tool :CNLiveAlbumListToolModel?
  69 + var product:CNLiveAlbumProductModel?
  70 +
  71 + //非接口数据-专辑详情
  72 + var vodAlbumMsgModel:CNLiveVodAlbumMsgModel?
  73 +// var shortTitle = ""
  74 +// var subTitle = ""
  75 +// var model = ""
  76 +// var thirdUrl = ""
  77 +// var colours = ""
  78 +// var address = ""
  79 +// var source = ""
  80 +// var sourceName = ""
  81 +// var pid = ""
  82 +// var witnessId = ""
  83 +// var videoUrl = ""
  84 +// var number = ""
  85 +// var goods = ""
  86 +// var icon : CNLiveAlbumListIconModel?
  87 +// var tagId = ""
  88 +// var tagName = ""
  89 +// var activityEndTime = ""
  90 +// var h5Url = ""
  91 +// var album:CNLiveAlbumListAlbumModel?
  92 +// var block = ""
  93 +// var isHorizontalScreen = ""
  94 +// var videoShowType = ""
  95 +// //非接口数据
  96 +// var albumMsgModel:CNLiveAlbumMsgModel?
  97 +}
  98 +//class CNLiveAlbumListIconModel:BaseModel{
  99 +// var face = ""
  100 +// var id = ""
  101 +// var name = ""
  102 +// var type = ""
  103 +// var desc = ""
  104 +// var focused = false
  105 +// var fansNum = ""
  106 +// var authInfos = ""
  107 +//}
  108 +//class CNLiveAlbumListToolModel:BaseModel{
  109 +// var commentsNum = ""
  110 +// var commentList = ""
  111 +// var collectioned = false
  112 +// var likeList = ""
  113 +// var liked = false
  114 +// var likesNum = ""
  115 +// var voteNum = ""
  116 +// var shareNum = ""
  117 +// var playNum = ""
  118 +// var collectionNum = ""
  119 +// var sort = ""
  120 +// var voted = false
  121 +//}
  122 +//class CNLiveAlbumListAlbumModel:BaseModel{
  123 +// var albumId = ""
  124 +// var icon = ""
  125 +// var name = ""
  126 +// var model = ""
  127 +// var product:CNLiveAlbumProductModel?
  128 +//}
  129 +
... ...
metaCode/Classes/Main/HuBiLieHomePage/Model/CNLiveVodAlbumMsgModel.swift 0 → 100644
  1 +//
  2 +// CNLiveVodAlbumMsgModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2025/3/1.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveVodAlbumMsgModel:BaseModel{
  11 + var albumId = ""
  12 + var albumImg = ""
  13 + var albumName = ""//专辑名称
  14 + var product:CNLiveAlbumProductModel?
  15 + var desc = ""
  16 + var descImg = ""
  17 + var subTitle = ""
  18 + var actor = ""
  19 + var actorName = ""
  20 + var time = ""
  21 + var sp:CNLiveVodPlaySPModel?
  22 + var siteId = ""
  23 + var episodeNow = ""
  24 + var episodeAll = ""
  25 + var subscriptions = ""
  26 + var subscribe = false
  27 + var episodeLast = 1//上次播放集数
  28 + var contentIdLast = ""//上次播放集的id
  29 + var collection = false //是否追剧
  30 + var charity:CNLiveVodPlayCharityModel?
  31 +}
... ...