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,7 +36,9 @@ target 'metaCode' do
36 #七牛 36 #七牛
37 pod 'Qiniu' 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 #加载GIF 42 #加载GIF
41 pod 'SwiftGifOrigin', '~> 1.7.0' 43 pod 'SwiftGifOrigin', '~> 1.7.0'
42 #数据库存储 44 #数据库存储
metaCode.xcodeproj/project.pbxproj
@@ -7,6 +7,10 @@ @@ -7,6 +7,10 @@
7 objects = { 7 objects = {
8 8
9 /* Begin PBXBuildFile section */ 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 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */; }; 14 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */; };
11 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */; }; 15 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */; };
12 1909DC9B2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */; }; 16 1909DC9B2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift in Sources */ = {isa = PBXBuildFile; fileRef = 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */; };
@@ -101,6 +105,10 @@ @@ -101,6 +105,10 @@
101 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */; }; 105 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */; };
102 192ED48A2C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */; }; 106 192ED48A2C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */; };
103 192ED48C2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192ED48B2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift */; }; 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 1938BD172B3D6C7F00390A34 /* CNLiveAuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */; }; 112 1938BD172B3D6C7F00390A34 /* CNLiveAuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */; };
105 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */; }; 113 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */; };
106 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */; }; 114 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */; };
@@ -137,8 +145,31 @@ @@ -137,8 +145,31 @@
137 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */; }; 145 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */; };
138 194134982C292199004FC047 /* CNLiveIdentityRepositoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */; }; 146 194134982C292199004FC047 /* CNLiveIdentityRepositoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */; };
139 1941349A2C294A78004FC047 /* CNLiveIdentityResTableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194134992C294A78004FC047 /* CNLiveIdentityResTableCell.swift */; }; 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 194455A12B6B3310006C5A2A /* CNWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194455A02B6B3310006C5A2A /* CNWebView.swift */; }; 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 195226792C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195226782C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift */; }; 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 19565EC02AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */; }; 173 19565EC02AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */; };
143 19565EC22AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */; }; 174 19565EC22AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */; };
144 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */; }; 175 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */; };
@@ -148,6 +179,18 @@ @@ -148,6 +179,18 @@
148 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */; }; 179 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */; };
149 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */; }; 180 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */; };
150 19565ED42AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19565ED32AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift */; }; 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 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */; }; 194 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */; };
152 1965FA402AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */; }; 195 1965FA402AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */; };
153 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */; }; 196 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */; };
@@ -160,6 +203,7 @@ @@ -160,6 +203,7 @@
160 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */; }; 203 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */; };
161 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */; }; 204 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */; };
162 19864E412BF6090400586E72 /* CNLiveDuanJuDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19864E402BF6090400586E72 /* CNLiveDuanJuDetailCell.swift */; }; 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 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */; }; 207 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */; };
164 19AD65AA2BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */; }; 208 19AD65AA2BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */; };
165 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */; }; 209 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */; };
@@ -169,6 +213,7 @@ @@ -169,6 +213,7 @@
169 19B153CF2BC540FF0018906C /* CNLivePayOrderInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */; }; 213 19B153CF2BC540FF0018906C /* CNLivePayOrderInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */; };
170 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */; }; 214 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */; };
171 19B153D42BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B153D32BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift */; }; 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 19BAF0342C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */; }; 217 19BAF0342C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */; };
173 19BB1FDF2AEA3A450094D962 /* CNSlideBaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */; }; 218 19BB1FDF2AEA3A450094D962 /* CNSlideBaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */; };
174 19BB1FE12AEB5C220094D962 /* CNLiveShopConsoleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */; }; 219 19BB1FE12AEB5C220094D962 /* CNLiveShopConsoleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */; };
@@ -361,6 +406,10 @@ @@ -361,6 +406,10 @@
361 406
362 /* Begin PBXFileReference section */ 407 /* Begin PBXFileReference section */
363 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>"; }; 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 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreViewController.swift; sourceTree = "<group>"; }; 413 1909DC952C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreViewController.swift; sourceTree = "<group>"; };
365 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalThreeCell.swift; sourceTree = "<group>"; }; 414 1909DC972C6342C3001E7986 /* CNLiveDigitalThreeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalThreeCell.swift; sourceTree = "<group>"; };
366 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNLiveDigitalThreeCerCollectCell .swift"; sourceTree = "<group>"; }; 415 1909DC9A2C634D6F001E7986 /* CNLiveDigitalThreeCerCollectCell .swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNLiveDigitalThreeCerCollectCell .swift"; sourceTree = "<group>"; };
@@ -455,6 +504,10 @@ @@ -455,6 +504,10 @@
455 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkFirCell.swift; sourceTree = "<group>"; }; 504 192ED4862C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkFirCell.swift; sourceTree = "<group>"; };
456 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkSecCell.swift; sourceTree = "<group>"; }; 505 192ED4892C5771930057244C /* CNLiveVitaeAddWorkSecCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkSecCell.swift; sourceTree = "<group>"; };
457 192ED48B2C57719F0057244C /* CNLiveVitaeAddWorkThreeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveVitaeAddWorkThreeCell.swift; sourceTree = "<group>"; }; 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 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAuthViewController.swift; sourceTree = "<group>"; }; 511 1938BD162B3D6C7F00390A34 /* CNLiveAuthViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAuthViewController.swift; sourceTree = "<group>"; };
459 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageController.swift; sourceTree = "<group>"; }; 512 1938BD1F2B46799A00390A34 /* CNLivePlayletHomePageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageController.swift; sourceTree = "<group>"; };
460 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageCell.swift; sourceTree = "<group>"; }; 513 1938BD212B467C1700390A34 /* CNLivePlayletHomePageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePlayletHomePageCell.swift; sourceTree = "<group>"; };
@@ -491,8 +544,31 @@ @@ -491,8 +544,31 @@
491 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveRealManageCell.swift; sourceTree = "<group>"; }; 544 194134952C2412C7004FC047 /* CNLiveRealManageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveRealManageCell.swift; sourceTree = "<group>"; };
492 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityRepositoryController.swift; sourceTree = "<group>"; }; 545 194134972C292199004FC047 /* CNLiveIdentityRepositoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityRepositoryController.swift; sourceTree = "<group>"; };
493 194134992C294A78004FC047 /* CNLiveIdentityResTableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityResTableCell.swift; sourceTree = "<group>"; }; 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 194455A02B6B3310006C5A2A /* CNWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNWebView.swift; sourceTree = "<group>"; }; 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 195226782C294C8E00CB0707 /* CNLiveIdentityResThreeCollectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveIdentityResThreeCollectCell.swift; sourceTree = "<group>"; }; 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 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailBtnsCell.swift; sourceTree = "<group>"; }; 572 19565EBF2AF4DE0E007D6727 /* CNLiveShopDetailBtnsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailBtnsCell.swift; sourceTree = "<group>"; };
497 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailOrderAssetCell.swift; sourceTree = "<group>"; }; 573 19565EC12AF616CA007D6727 /* CNLiveShopDetailOrderAssetCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailOrderAssetCell.swift; sourceTree = "<group>"; };
498 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopProductManagerController.swift; sourceTree = "<group>"; }; 574 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopProductManagerController.swift; sourceTree = "<group>"; };
@@ -502,6 +578,18 @@ @@ -502,6 +578,18 @@
502 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListClassifyView.swift; sourceTree = "<group>"; }; 578 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListClassifyView.swift; sourceTree = "<group>"; };
503 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListCell.swift; sourceTree = "<group>"; }; 579 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsListCell.swift; sourceTree = "<group>"; };
504 19565ED32AF9FEB4007D6727 /* CNLiveShopAddEditGoodsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddEditGoodsModel.swift; sourceTree = "<group>"; }; 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 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddGoodsSingleView.swift; sourceTree = "<group>"; }; 593 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddGoodsSingleView.swift; sourceTree = "<group>"; };
506 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAddGoodsSelectUploadImageView.swift; sourceTree = "<group>"; }; 594 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAddGoodsSelectUploadImageView.swift; sourceTree = "<group>"; };
507 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsCategoryController.swift; sourceTree = "<group>"; }; 595 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsCategoryController.swift; sourceTree = "<group>"; };
@@ -514,6 +602,7 @@ @@ -514,6 +602,7 @@
514 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroNetworkImageProvider.swift; sourceTree = "<group>"; }; 602 197563762C5C80D9004E0F42 /* HeroNetworkImageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroNetworkImageProvider.swift; sourceTree = "<group>"; };
515 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideRealHotListCell.swift; sourceTree = "<group>"; }; 603 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideRealHotListCell.swift; sourceTree = "<group>"; };
516 19864E402BF6090400586E72 /* CNLiveDuanJuDetailCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDuanJuDetailCell.swift; sourceTree = "<group>"; }; 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 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownslideOperationManager.swift; sourceTree = "<group>"; }; 606 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownslideOperationManager.swift; sourceTree = "<group>"; };
518 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsDetailsTableViewCell.swift; sourceTree = "<group>"; }; 607 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsDetailsTableViewCell.swift; sourceTree = "<group>"; };
519 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopCommentRequestShareModel.swift; sourceTree = "<group>"; }; 608 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopCommentRequestShareModel.swift; sourceTree = "<group>"; };
@@ -523,6 +612,7 @@ @@ -523,6 +612,7 @@
523 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePayOrderInfoModel.swift; sourceTree = "<group>"; }; 612 19B153CE2BC540FF0018906C /* CNLivePayOrderInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLivePayOrderInfoModel.swift; sourceTree = "<group>"; };
524 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopPayNeedPaymentCell.swift; sourceTree = "<group>"; }; 613 19B153D12BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopPayNeedPaymentCell.swift; sourceTree = "<group>"; };
525 19B153D32BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopPayWeChatAlipayCell.swift; sourceTree = "<group>"; }; 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 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreviewFourWorkAwardCell.swift; sourceTree = "<group>"; }; 616 19BAF0332C7831DB00BD7CC0 /* CNLiveDigitalResumePreviewFourWorkAwardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDigitalResumePreviewFourWorkAwardCell.swift; sourceTree = "<group>"; };
527 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNSlideBaseNavigationController.swift; sourceTree = "<group>"; }; 617 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNSlideBaseNavigationController.swift; sourceTree = "<group>"; };
528 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleController.swift; sourceTree = "<group>"; }; 618 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleController.swift; sourceTree = "<group>"; };
@@ -737,6 +827,30 @@ @@ -737,6 +827,30 @@
737 /* End PBXFrameworksBuildPhase section */ 827 /* End PBXFrameworksBuildPhase section */
738 828
739 /* Begin PBXGroup section */ 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 1909DC922C6308FA001E7986 /* 数字简历相关页面 */ = { 854 1909DC922C6308FA001E7986 /* 数字简历相关页面 */ = {
741 isa = PBXGroup; 855 isa = PBXGroup;
742 children = ( 856 children = (
@@ -990,8 +1104,8 @@ @@ -990,8 +1104,8 @@
990 1938BD152B3D6C6000390A34 /* Controller */ = { 1104 1938BD152B3D6C6000390A34 /* Controller */ = {
991 isa = PBXGroup; 1105 isa = PBXGroup;
992 children = ( 1106 children = (
993 - 19C735BF2BFDCECD00CACF4E /* CNLiveTotalHotListController */,  
994 1938BD272B48009600390A34 /* HomeController */, 1107 1938BD272B48009600390A34 /* HomeController */,
  1108 + 19C735BF2BFDCECD00CACF4E /* CNLiveTotalHotListController */,
995 1938BD1D2B46791400390A34 /* PlayletHomePage */, 1109 1938BD1D2B46791400390A34 /* PlayletHomePage */,
996 ); 1110 );
997 path = Controller; 1111 path = Controller;
@@ -1107,6 +1221,7 @@ @@ -1107,6 +1221,7 @@
1107 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */, 1221 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */,
1108 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */, 1222 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */,
1109 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */, 1223 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */,
  1224 + 19B711862D55FE130000872A /* CNLiveDownSlideBannerCell.swift */,
1110 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */, 1225 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */,
1111 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */, 1226 19864E3E2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift */,
1112 19C735C22BFED49700CACF4E /* CNLiveRealHotListDetailCell.swift */, 1227 19C735C22BFED49700CACF4E /* CNLiveRealHotListDetailCell.swift */,
@@ -1198,6 +1313,111 @@ @@ -1198,6 +1313,111 @@
1198 path = DigitalAuth; 1313 path = DigitalAuth;
1199 sourceTree = "<group>"; 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 19565EC32AF8ACC2007D6727 /* GoodsManager */ = { 1421 19565EC32AF8ACC2007D6727 /* GoodsManager */ = {
1202 isa = PBXGroup; 1422 isa = PBXGroup;
1203 children = ( 1423 children = (
@@ -1368,7 +1588,6 @@ @@ -1368,7 +1588,6 @@
1368 194134812C181A7E004FC047 /* DigitalAuth */, 1588 194134812C181A7E004FC047 /* DigitalAuth */,
1369 1917330B2B109691007BCC04 /* CNLivePlayer */, 1589 1917330B2B109691007BCC04 /* CNLivePlayer */,
1370 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */, 1590 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */,
1371 - 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */,  
1372 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */, 1591 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */,
1373 191733302B170537007BCC04 /* CNLiveCommonManager.swift */, 1592 191733302B170537007BCC04 /* CNLiveCommonManager.swift */,
1374 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */, 1593 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */,
@@ -1638,6 +1857,7 @@ @@ -1638,6 +1857,7 @@
1638 796398902A260C0100D045EB /* Main */ = { 1857 796398902A260C0100D045EB /* Main */ = {
1639 isa = PBXGroup; 1858 isa = PBXGroup;
1640 children = ( 1859 children = (
  1860 + 195650B62D71B00200818FC8 /* HuBiLieHomePage */,
1641 7939B06D2B47EB46005AE981 /* VideoPage */, 1861 7939B06D2B47EB46005AE981 /* VideoPage */,
1642 1938BD112B3D6C0C00390A34 /* HomePages */, 1862 1938BD112B3D6C0C00390A34 /* HomePages */,
1643 7991722C2AF08CF100DC01A8 /* ShopPage */, 1863 7991722C2AF08CF100DC01A8 /* ShopPage */,
@@ -1703,6 +1923,9 @@ @@ -1703,6 +1923,9 @@
1703 79F4B11B2A33036E00993C03 /* CNLiveMineInfoAlertView.swift */, 1923 79F4B11B2A33036E00993C03 /* CNLiveMineInfoAlertView.swift */,
1704 79803E282AD6991200F05F68 /* CNLiveMineInputMessageView.swift */, 1924 79803E282AD6991200F05F68 /* CNLiveMineInputMessageView.swift */,
1705 19C0F76C2BDB48750097CC8F /* CNBindingManageCell.swift */, 1925 19C0F76C2BDB48750097CC8F /* CNBindingManageCell.swift */,
  1926 + 1958B4172D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift */,
  1927 + 1958B41B2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift */,
  1928 + 1958B4192D8572C100F37E35 /* CNLiveMineMineOrderCell.swift */,
1706 ); 1929 );
1707 path = View; 1930 path = View;
1708 sourceTree = "<group>"; 1931 sourceTree = "<group>";
@@ -2138,6 +2361,7 @@ @@ -2138,6 +2361,7 @@
2138 1917334C2B2BE9CA007BCC04 /* CNLiveCreateCouponTypeMoneyView.swift in Sources */, 2361 1917334C2B2BE9CA007BCC04 /* CNLiveCreateCouponTypeMoneyView.swift in Sources */,
2139 191733002B0B58E5007BCC04 /* CNLiveSelectUploadImageModel.swift in Sources */, 2362 191733002B0B58E5007BCC04 /* CNLiveSelectUploadImageModel.swift in Sources */,
2140 1909DCA72C637378001E7986 /* CNLiveDigitalResumePreviewFiveCell.swift in Sources */, 2363 1909DCA72C637378001E7986 /* CNLiveDigitalResumePreviewFiveCell.swift in Sources */,
  2364 + 19B711872D55FE130000872A /* CNLiveDownSlideBannerCell.swift in Sources */,
2141 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */, 2365 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */,
2142 19C0F7692BD9F9F70097CC8F /* CNThreeLoginViewController.swift in Sources */, 2366 19C0F7692BD9F9F70097CC8F /* CNThreeLoginViewController.swift in Sources */,
2143 191732F32B084DBC007BCC04 /* CNLiveShopClassifySwitchTableViewCell.swift in Sources */, 2367 191732F32B084DBC007BCC04 /* CNLiveShopClassifySwitchTableViewCell.swift in Sources */,
@@ -2146,6 +2370,7 @@ @@ -2146,6 +2370,7 @@
2146 1938BD2E2B48021E00390A34 /* CNHomePageBaseNavigationController.swift in Sources */, 2370 1938BD2E2B48021E00390A34 /* CNHomePageBaseNavigationController.swift in Sources */,
2147 1917332F2B16C7C9007BCC04 /* CNLiveTimer.swift in Sources */, 2371 1917332F2B16C7C9007BCC04 /* CNLiveTimer.swift in Sources */,
2148 194134942C240583004FC047 /* CNLiveDigitalRealManageController.swift in Sources */, 2372 194134942C240583004FC047 /* CNLiveDigitalRealManageController.swift in Sources */,
  2373 + 195650DA2D7BD72E00818FC8 /* CNLiveHomeSearchHotCell.swift in Sources */,
2149 7CD675292A270F6A008354C1 /* WJColorChange.m in Sources */, 2374 7CD675292A270F6A008354C1 /* WJColorChange.m in Sources */,
2150 192ED4782C5339D50057244C /* CNLiveCertificateCollectionCell.swift in Sources */, 2375 192ED4782C5339D50057244C /* CNLiveCertificateCollectionCell.swift in Sources */,
2151 194134862C196F59004FC047 /* CNLiveAuthTool.swift in Sources */, 2376 194134862C196F59004FC047 /* CNLiveAuthTool.swift in Sources */,
@@ -2153,7 +2378,9 @@ @@ -2153,7 +2378,9 @@
2153 19864E412BF6090400586E72 /* CNLiveDuanJuDetailCell.swift in Sources */, 2378 19864E412BF6090400586E72 /* CNLiveDuanJuDetailCell.swift in Sources */,
2154 79F4B11C2A33036E00993C03 /* CNLiveMineInfoAlertView.swift in Sources */, 2379 79F4B11C2A33036E00993C03 /* CNLiveMineInfoAlertView.swift in Sources */,
2155 192ED47C2C538C970057244C /* CNLiveVitaeCertificateAddPhotoCell.swift in Sources */, 2380 192ED47C2C538C970057244C /* CNLiveVitaeCertificateAddPhotoCell.swift in Sources */,
  2381 + 196211E92D686C03001925EC /* CNLiveHomeFollowCell.swift in Sources */,
2156 79BB96A82AF223FB00AEA4AC /* CNLiveConfigAlertManager.swift in Sources */, 2382 79BB96A82AF223FB00AEA4AC /* CNLiveConfigAlertManager.swift in Sources */,
  2383 + 1958B41A2D8572C100F37E35 /* CNLiveMineMineOrderCell.swift in Sources */,
2157 19BB1FF02AF0E5B30094D962 /* CNLiveShopDetailModel.swift in Sources */, 2384 19BB1FF02AF0E5B30094D962 /* CNLiveShopDetailModel.swift in Sources */,
2158 1938BD382B4BDC2500390A34 /* CNLiveAlbumImageCell.swift in Sources */, 2385 1938BD382B4BDC2500390A34 /* CNLiveAlbumImageCell.swift in Sources */,
2159 796398942A260C0100D045EB /* AppDelegate.swift in Sources */, 2386 796398942A260C0100D045EB /* AppDelegate.swift in Sources */,
@@ -2167,6 +2394,7 @@ @@ -2167,6 +2394,7 @@
2167 19C0F76B2BDB432A0097CC8F /* CNLiveMineBindingManagerController.swift in Sources */, 2394 19C0F76B2BDB432A0097CC8F /* CNLiveMineBindingManagerController.swift in Sources */,
2168 792B53282AFCD7640009AB49 /* CNLiveShopOrderExpressDetailViewController.swift in Sources */, 2395 792B53282AFCD7640009AB49 /* CNLiveShopOrderExpressDetailViewController.swift in Sources */,
2169 79396EF12A31C21B0053E1AF /* CNLiveInfoShowViewController.swift in Sources */, 2396 79396EF12A31C21B0053E1AF /* CNLiveInfoShowViewController.swift in Sources */,
  2397 + 196211E32D66D36A001925EC /* CNLiveHomeOneBigTwoSmallCell.swift in Sources */,
2170 191733422B284D5E007BCC04 /* CNLiveShopCouponCreateBottomView.swift in Sources */, 2398 191733422B284D5E007BCC04 /* CNLiveShopCouponCreateBottomView.swift in Sources */,
2171 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */, 2399 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */,
2172 19565ECB2AF8C59C007D6727 /* CNLiveShopGoodsListModel.swift in Sources */, 2400 19565ECB2AF8C59C007D6727 /* CNLiveShopGoodsListModel.swift in Sources */,
@@ -2194,6 +2422,7 @@ @@ -2194,6 +2422,7 @@
2194 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */, 2422 19565ECD2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift in Sources */,
2195 19E302672BC8FEBC00F6B8BD /* CNLliveShopDetailCloseCell.swift in Sources */, 2423 19E302672BC8FEBC00F6B8BD /* CNLliveShopDetailCloseCell.swift in Sources */,
2196 1938BD322B4B8F0400390A34 /* CNLiveHomePageModel.swift in Sources */, 2424 1938BD322B4B8F0400390A34 /* CNLiveHomePageModel.swift in Sources */,
  2425 + 195650E52D7E8C9400818FC8 /* CNLiveHomeSearchResultJuJiCell.swift in Sources */,
2197 191732EF2B075C3A007BCC04 /* CNLiveCreateShopClassifyViewController.swift in Sources */, 2426 191732EF2B075C3A007BCC04 /* CNLiveCreateShopClassifyViewController.swift in Sources */,
2198 1938BD302B4B8A3500390A34 /* CNLiveHomePageViewModel.swift in Sources */, 2427 1938BD302B4B8A3500390A34 /* CNLiveHomePageViewModel.swift in Sources */,
2199 19C735CC2C11A1F400CACF4E /* CNLiveDigitalThreeCollectCell.swift in Sources */, 2428 19C735CC2C11A1F400CACF4E /* CNLiveDigitalThreeCollectCell.swift in Sources */,
@@ -2219,9 +2448,11 @@ @@ -2219,9 +2448,11 @@
2219 1941348C2C20261C004FC047 /* CNLiveDigitalSecCell.swift in Sources */, 2448 1941348C2C20261C004FC047 /* CNLiveDigitalSecCell.swift in Sources */,
2220 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */, 2449 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */,
2221 191733642B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift in Sources */, 2450 191733642B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift in Sources */,
  2451 + 195650B52D7047C500818FC8 /* CNLiveZFPlayerControlView.swift in Sources */,
2222 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */, 2452 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */,
2223 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, 2453 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
2224 192ED4692C4F77370057244C /* CNLiveHangYeFirCell.swift in Sources */, 2454 192ED4692C4F77370057244C /* CNLiveHangYeFirCell.swift in Sources */,
  2455 + 196211E12D66BCDE001925EC /* CNLiveHomeLanmuCell.swift in Sources */,
2225 19C735C12BFDCEE900CACF4E /* CNLiveTotalHotListController.swift in Sources */, 2456 19C735C12BFDCEE900CACF4E /* CNLiveTotalHotListController.swift in Sources */,
2226 7939B0732B47F12F005AE981 /* CNLiveShortVideoViewController.swift in Sources */, 2457 7939B0732B47F12F005AE981 /* CNLiveShortVideoViewController.swift in Sources */,
2227 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */, 2458 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */,
@@ -2229,9 +2460,11 @@ @@ -2229,9 +2460,11 @@
2229 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */, 2460 1938BD202B46799A00390A34 /* CNLivePlayletHomePageController.swift in Sources */,
2230 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */, 2461 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */,
2231 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, 2462 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
  2463 + 196211E52D66F5E6001925EC /* CNLiveHomeADCell.swift in Sources */,
2232 192ED4742C521F4D0057244C /* CNLiveVocationalCertifiteCollectionViewLayout.swift in Sources */, 2464 192ED4742C521F4D0057244C /* CNLiveVocationalCertifiteCollectionViewLayout.swift in Sources */,
2233 191732F82B08AB9D007BCC04 /* CNLiveShopClassilyViewModel.swift in Sources */, 2465 191732F82B08AB9D007BCC04 /* CNLiveShopClassilyViewModel.swift in Sources */,
2234 79BB1C162B05C62900C5720C /* CNLiveShopBodyCouponView.swift in Sources */, 2466 79BB1C162B05C62900C5720C /* CNLiveShopBodyCouponView.swift in Sources */,
  2467 + 195650D62D7A9B5700818FC8 /* CNLiveHomeSearchController.swift in Sources */,
2235 798916E92B04532D00D08302 /* CNLiveSavePointDB.swift in Sources */, 2468 798916E92B04532D00D08302 /* CNLiveSavePointDB.swift in Sources */,
2236 1938BD242B468AC900390A34 /* CNLivePlayletHomePageHeaderCell.swift in Sources */, 2469 1938BD242B468AC900390A34 /* CNLivePlayletHomePageHeaderCell.swift in Sources */,
2237 19B153D42BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift in Sources */, 2470 19B153D42BC623BE0018906C /* CNLiveShopPayWeChatAlipayCell.swift in Sources */,
@@ -2268,6 +2501,8 @@ @@ -2268,6 +2501,8 @@
2268 19565EC72AF8AD38007D6727 /* CNLiveShopNewProductController.swift in Sources */, 2501 19565EC72AF8AD38007D6727 /* CNLiveShopNewProductController.swift in Sources */,
2269 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */, 2502 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */,
2270 7CD6753D2A2740B0008354C1 /* CNMainView.swift in Sources */, 2503 7CD6753D2A2740B0008354C1 /* CNMainView.swift in Sources */,
  2504 + 192FDB002D8BEEB300F8723D /* CNLiveVodCellBottomView.swift in Sources */,
  2505 + 195650CB2D76A36300818FC8 /* CNLiveVodPlayShopCell.swift in Sources */,
2271 19B153CB2BC3E1870018906C /* CNLiveShopPayController.swift in Sources */, 2506 19B153CB2BC3E1870018906C /* CNLiveShopPayController.swift in Sources */,
2272 191733662B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift in Sources */, 2507 191733662B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift in Sources */,
2273 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */, 2508 1909DC982C6342C4001E7986 /* CNLiveDigitalThreeCell.swift in Sources */,
@@ -2290,12 +2525,17 @@ @@ -2290,12 +2525,17 @@
2290 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */, 2525 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
2291 19BB1FE32AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift in Sources */, 2526 19BB1FE32AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift in Sources */,
2292 1938BD2A2B48014E00390A34 /* CNHomepageDetailViewController.swift in Sources */, 2527 1938BD2A2B48014E00390A34 /* CNHomepageDetailViewController.swift in Sources */,
  2528 + 19023DB52D801EF700872398 /* CNLiveHomeLanmuController.swift in Sources */,
2293 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */, 2529 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */,
  2530 + 195650D12D77E33E00818FC8 /* CNLiveVodPlayShopCollectionCell.swift in Sources */,
2294 792E57D92A3AA2F2005834DB /* CNLiveCommonBaseModel.swift in Sources */, 2531 792E57D92A3AA2F2005834DB /* CNLiveCommonBaseModel.swift in Sources */,
2295 1941349A2C294A78004FC047 /* CNLiveIdentityResTableCell.swift in Sources */, 2532 1941349A2C294A78004FC047 /* CNLiveIdentityResTableCell.swift in Sources */,
  2533 + 195650E32D7C201600818FC8 /* CNLiveSearchHistoryFloatLayoutView.swift in Sources */,
2296 791C1C862AFB2EB4003E6362 /* CNLiveShopOrderExpressViewController.swift in Sources */, 2534 791C1C862AFB2EB4003E6362 /* CNLiveShopOrderExpressViewController.swift in Sources */,
2297 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */, 2535 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */,
  2536 + 19023DB72D80339800872398 /* CNLiveHomeLanmuThreeImgCell.swift in Sources */,
2298 191733312B170537007BCC04 /* CNLiveCommonManager.swift in Sources */, 2537 191733312B170537007BCC04 /* CNLiveCommonManager.swift in Sources */,
  2538 + 196211E72D66F828001925EC /* CNLiveHomeTwoDuanjuCell.swift in Sources */,
2299 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */, 2539 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
2300 191732F52B085BAE007BCC04 /* CNLiveShopClassilyIconTableViewCell.swift in Sources */, 2540 191732F52B085BAE007BCC04 /* CNLiveShopClassilyIconTableViewCell.swift in Sources */,
2301 192ED4842C5742510057244C /* CNLiveVitaeAddWorkController.swift in Sources */, 2541 192ED4842C5742510057244C /* CNLiveVitaeAddWorkController.swift in Sources */,
@@ -2319,25 +2559,33 @@ @@ -2319,25 +2559,33 @@
2319 191733212B143F3A007BCC04 /* CNLiveGradientView.swift in Sources */, 2559 191733212B143F3A007BCC04 /* CNLiveGradientView.swift in Sources */,
2320 19AD65AE2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift in Sources */, 2560 19AD65AE2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift in Sources */,
2321 192ED46B2C4F77450057244C /* CNLiveHangYeSecCell.swift in Sources */, 2561 192ED46B2C4F77450057244C /* CNLiveHangYeSecCell.swift in Sources */,
  2562 + 1958B41C2D87BD3E00F37E35 /* CNLiveMinePlayHistoryCollectionCell.swift in Sources */,
2322 19BB1FE62AEB93B80094D962 /* CNLiveShopUserInfoModel.swift in Sources */, 2563 19BB1FE62AEB93B80094D962 /* CNLiveShopUserInfoModel.swift in Sources */,
  2564 + 19023DBB2D8270DA00872398 /* CNLiveHomeShopCategoryCell.swift in Sources */,
2323 1909DCAB2C649C10001E7986 /* CNLiveDigitalResumePreViewSecCollectionCell.swift in Sources */, 2565 1909DCAB2C649C10001E7986 /* CNLiveDigitalResumePreViewSecCollectionCell.swift in Sources */,
  2566 + 195650C32D7543A500818FC8 /* CNLiveVodIntroductionCell.swift in Sources */,
  2567 + 195650BD2D7298E800818FC8 /* CNLiveVodAlbumMsgModel.swift in Sources */,
2324 19DFE64D2C4792C500E428AE /* CNLiveDigitalResumeInfoController.swift in Sources */, 2568 19DFE64D2C4792C500E428AE /* CNLiveDigitalResumeInfoController.swift in Sources */,
2325 7CD675472A274167008354C1 /* NewPagedFlowView.m in Sources */, 2569 7CD675472A274167008354C1 /* NewPagedFlowView.m in Sources */,
2326 191732ED2B073C52007BCC04 /* CNLiveShopClassifyListModel.swift in Sources */, 2570 191732ED2B073C52007BCC04 /* CNLiveShopClassifyListModel.swift in Sources */,
2327 191733482B2855E8007BCC04 /* CNLiveShopCouponViewModel.swift in Sources */, 2571 191733482B2855E8007BCC04 /* CNLiveShopCouponViewModel.swift in Sources */,
2328 79F4B11A2A32F21400993C03 /* CNLiveMineNickViewController.swift in Sources */, 2572 79F4B11A2A32F21400993C03 /* CNLiveMineNickViewController.swift in Sources */,
2329 191733542B2C4D58007BCC04 /* CNLivePickerToolsView.swift in Sources */, 2573 191733542B2C4D58007BCC04 /* CNLivePickerToolsView.swift in Sources */,
  2574 + 192FDB042D8D0B6000F8723D /* CNLiveVodShopExpandCell.swift in Sources */,
2330 191733112B109EDC007BCC04 /* CNLivePlayerControlView.swift in Sources */, 2575 191733112B109EDC007BCC04 /* CNLivePlayerControlView.swift in Sources */,
2331 1917331F2B10A1BE007BCC04 /* CNLivePlayerEnum.swift in Sources */, 2576 1917331F2B10A1BE007BCC04 /* CNLivePlayerEnum.swift in Sources */,
  2577 + 195650E12D7C098900818FC8 /* CNLiveHomeSearchHistoryModel.swift in Sources */,
2332 191733382B27FD66007BCC04 /* CNLiveShopClassifySectionHeaderView.swift in Sources */, 2578 191733382B27FD66007BCC04 /* CNLiveShopClassifySectionHeaderView.swift in Sources */,
2333 19CB631F2C69ADF500D889F8 /* CNLiveDigitalResumePreViewSelectRenzhengCerController.swift in Sources */, 2579 19CB631F2C69ADF500D889F8 /* CNLiveDigitalResumePreViewSelectRenzhengCerController.swift in Sources */,
2334 194134782C17F83B004FC047 /* CNLiveFaceAuthController.swift in Sources */, 2580 194134782C17F83B004FC047 /* CNLiveFaceAuthController.swift in Sources */,
  2581 + 19023DBD2D8282DE00872398 /* CNLiveHomeShopCategoryModel.swift in Sources */,
2335 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */, 2582 1938BD222B467C1700390A34 /* CNLivePlayletHomePageCell.swift in Sources */,
2336 1938BD3F2B4BE7C500390A34 /* CNLiveAlbumMsgModel.swift in Sources */, 2583 1938BD3F2B4BE7C500390A34 /* CNLiveAlbumMsgModel.swift in Sources */,
2337 798A44FF2A30A0A800815935 /* CNLiveInputFeedBackViewController.swift in Sources */, 2584 798A44FF2A30A0A800815935 /* CNLiveInputFeedBackViewController.swift in Sources */,
2338 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */, 2585 19B153D22BC623980018906C /* CNLiveShopPayNeedPaymentCell.swift in Sources */,
2339 19DFE6492C44BEAE00E428AE /* CNLiveDigitalResumeCell.swift in Sources */, 2586 19DFE6492C44BEAE00E428AE /* CNLiveDigitalResumeCell.swift in Sources */,
2340 79282A442A2F1C1E00B5F8CF /* CNLiveLoginAuthView.swift in Sources */, 2587 79282A442A2F1C1E00B5F8CF /* CNLiveLoginAuthView.swift in Sources */,
  2588 + 1958B4142D83D2BA00F37E35 /* CNLiveHomeMoreController.swift in Sources */,
2341 19B153CD2BC3EB690018906C /* CNLiveShoph5ViewModel.swift in Sources */, 2589 19B153CD2BC3EB690018906C /* CNLiveShoph5ViewModel.swift in Sources */,
2342 79BB96A62AF21E2800AEA4AC /* CNLiveShopOrderDetailViewController.swift in Sources */, 2590 79BB96A62AF21E2800AEA4AC /* CNLiveShopOrderDetailViewController.swift in Sources */,
2343 194455A12B6B3310006C5A2A /* CNWebView.swift in Sources */, 2591 194455A12B6B3310006C5A2A /* CNWebView.swift in Sources */,
@@ -2348,11 +2596,13 @@ @@ -2348,11 +2596,13 @@
2348 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */, 2596 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */,
2349 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */, 2597 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */,
2350 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */, 2598 194134962C2412C7004FC047 /* CNLiveRealManageCell.swift in Sources */,
  2599 + 196211DF2D64869A001925EC /* CNLiveHomeYingshiBannerCell.swift in Sources */,
2351 1941347A2C18001A004FC047 /* CGImage+FaceCrop.swift in Sources */, 2600 1941347A2C18001A004FC047 /* CGImage+FaceCrop.swift in Sources */,
2352 7939B0752B47F1B9005AE981 /* CNLiveShortVideoListTableViewCell.swift in Sources */, 2601 7939B0752B47F1B9005AE981 /* CNLiveShortVideoListTableViewCell.swift in Sources */,
2353 794294A72B4D18EC008AAFA0 /* CNLiveShortVideoContentListView.swift in Sources */, 2602 794294A72B4D18EC008AAFA0 /* CNLiveShortVideoContentListView.swift in Sources */,
2354 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */, 2603 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */,
2355 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */, 2604 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */,
  2605 + 195650D82D7BD6E500818FC8 /* CNLiveHomeSearchHistoryCell.swift in Sources */,
2356 796308732B4B8EB80090D22A /* CNLiveShortVideoViewModel.swift in Sources */, 2606 796308732B4B8EB80090D22A /* CNLiveShortVideoViewModel.swift in Sources */,
2357 19E9D1602B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift in Sources */, 2607 19E9D1602B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift in Sources */,
2358 191732CE2B04AACD007BCC04 /* CNLiveShopTextView.swift in Sources */, 2608 191732CE2B04AACD007BCC04 /* CNLiveShopTextView.swift in Sources */,
@@ -2361,6 +2611,7 @@ @@ -2361,6 +2611,7 @@
2361 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */, 2611 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */,
2362 798A44EA2A30135D00815935 /* CNLiveMineBodyListView.swift in Sources */, 2612 798A44EA2A30135D00815935 /* CNLiveMineBodyListView.swift in Sources */,
2363 1917335A2B3283A1007BCC04 /* CNLiveCouponGoodsSearchView.swift in Sources */, 2613 1917335A2B3283A1007BCC04 /* CNLiveCouponGoodsSearchView.swift in Sources */,
  2614 + 195650C92D769CEA00818FC8 /* CNLiveVodTrailersCell.swift in Sources */,
2364 191733362B27EFD4007BCC04 /* CNLiveShopClassilyManageViewController.swift in Sources */, 2615 191733362B27EFD4007BCC04 /* CNLiveShopClassilyManageViewController.swift in Sources */,
2365 799172322AF08D1B00DC01A8 /* CNLiveShopOrderViewController.swift in Sources */, 2616 799172322AF08D1B00DC01A8 /* CNLiveShopOrderViewController.swift in Sources */,
2366 1917332D2B15DB20007BCC04 /* CNLivePlayerKVOModel.swift in Sources */, 2617 1917332D2B15DB20007BCC04 /* CNLivePlayerKVOModel.swift in Sources */,
@@ -2371,12 +2622,15 @@ @@ -2371,12 +2622,15 @@
2371 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */, 2622 1909DC962C6309EC001E7986 /* CNLiveDigitalResumePreViewController.swift in Sources */,
2372 79DC67642B5FB60900261A94 /* CNLiveMineAuthFormViewController.swift in Sources */, 2623 79DC67642B5FB60900261A94 /* CNLiveMineAuthFormViewController.swift in Sources */,
2373 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */, 2624 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
  2625 + 1958B4162D83F45200F37E35 /* CNLiveHomeTwoHengTuCell.swift in Sources */,
2374 19C0F7672BD8DC4D0097CC8F /* CNThreeLoginModel.swift in Sources */, 2626 19C0F7672BD8DC4D0097CC8F /* CNThreeLoginModel.swift in Sources */,
  2627 + 19416F822D3F9B3000ACD0A7 /* CNLiveTVPlayerViewController.swift in Sources */,
2375 794FF1092B02131300385E85 /* CNLiveSaveSearchDB.swift in Sources */, 2628 794FF1092B02131300385E85 /* CNLiveSaveSearchDB.swift in Sources */,
2376 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */, 2629 19864E3F2BEF6A3300586E72 /* CNLiveDownSlideRealHotListCell.swift in Sources */,
2377 79396EED2A319F220053E1AF /* NSObject+CNLiveExtensions.swift in Sources */, 2630 79396EED2A319F220053E1AF /* NSObject+CNLiveExtensions.swift in Sources */,
2378 1917331B2B10A0EF007BCC04 /* CNLivePlayerLoadingView.swift in Sources */, 2631 1917331B2B10A0EF007BCC04 /* CNLivePlayerLoadingView.swift in Sources */,
2379 19FA201B2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift in Sources */, 2632 19FA201B2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift in Sources */,
  2633 + 192FDB022D8BF38500F8723D /* CNLiveVodTrailerExpandCell.swift in Sources */,
2380 1909DCA22C637353001E7986 /* CNLiveDigitalResumePreviewThreeCell.swift in Sources */, 2634 1909DCA22C637353001E7986 /* CNLiveDigitalResumePreviewThreeCell.swift in Sources */,
2381 192ED47E2C538CA30057244C /* CNLiveVitaeCertificateAddInfoCell.swift in Sources */, 2635 192ED47E2C538CA30057244C /* CNLiveVitaeCertificateAddInfoCell.swift in Sources */,
2382 7C4931312A2F142F000E44B4 /* CNHomePageBackgroupView.swift in Sources */, 2636 7C4931312A2F142F000E44B4 /* CNHomePageBackgroupView.swift in Sources */,
@@ -2386,6 +2640,7 @@ @@ -2386,6 +2640,7 @@
2386 19DFE6432C41039600E428AE /* CNLiveVitaeViewModel.swift in Sources */, 2640 19DFE6432C41039600E428AE /* CNLiveVitaeViewModel.swift in Sources */,
2387 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */, 2641 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */,
2388 19C735D02C12F5F600CACF4E /* CNLiveRealNameCell.swift in Sources */, 2642 19C735D02C12F5F600CACF4E /* CNLiveRealNameCell.swift in Sources */,
  2643 + 195650BF2D73000900818FC8 /* CNLiveVodAlbumListModel.swift in Sources */,
2389 7999415C2B4E8E8E0014C721 /* CNLiveRefresh.swift in Sources */, 2644 7999415C2B4E8E8E0014C721 /* CNLiveRefresh.swift in Sources */,
2390 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */, 2645 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */,
2391 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */, 2646 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */,
@@ -2396,9 +2651,12 @@ @@ -2396,9 +2651,12 @@
2396 191733152B109FD7007BCC04 /* CNLivePlayerTopNaviView.swift in Sources */, 2651 191733152B109FD7007BCC04 /* CNLivePlayerTopNaviView.swift in Sources */,
2397 794FF1052B01FC8800385E85 /* CNLiveShopOrderSearchViewController.swift in Sources */, 2652 794FF1052B01FC8800385E85 /* CNLiveShopOrderSearchViewController.swift in Sources */,
2398 798A44EC2A302DBE00815935 /* CNLiveMineAddInfoViewController.swift in Sources */, 2653 798A44EC2A302DBE00815935 /* CNLiveMineAddInfoViewController.swift in Sources */,
  2654 + 195650E72D7E8CF300818FC8 /* CNLiveHomeSearchResultDuanJuCell.swift in Sources */,
2399 791C1C882AFB6FD7003E6362 /* CNLiveShopOrderExpressFirmViewController.swift in Sources */, 2655 791C1C882AFB6FD7003E6362 /* CNLiveShopOrderExpressFirmViewController.swift in Sources */,
  2656 + 195650DF2D7BE18200818FC8 /* CNLiveHomeSearchHotModel.swift in Sources */,
2400 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */, 2657 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */,
2401 794BC1652AF9E70D00A68C74 /* CNLiveShopOrderSendViewController.swift in Sources */, 2658 794BC1652AF9E70D00A68C74 /* CNLiveShopOrderSendViewController.swift in Sources */,
  2659 + 195650CF2D77023A00818FC8 /* CNLiveVodTrailersCollectionCell.swift in Sources */,
2402 79BB96AA2AF2330900AEA4AC /* CNLiveShopBodyDetailView.swift in Sources */, 2660 79BB96AA2AF2330900AEA4AC /* CNLiveShopBodyDetailView.swift in Sources */,
2403 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */, 2661 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */,
2404 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */, 2662 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
@@ -2409,6 +2667,8 @@ @@ -2409,6 +2667,8 @@
2409 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */, 2667 197563772C5C80D9004E0F42 /* HeroNetworkImageProvider.swift in Sources */,
2410 794294AA2B4D4381008AAFA0 /* CNLiveShortVideoCommentListView.swift in Sources */, 2668 794294AA2B4D4381008AAFA0 /* CNLiveShortVideoCommentListView.swift in Sources */,
2411 1909DC9E2C637339001E7986 /* CNLiveDigitalResumePreViewFirCell.swift in Sources */, 2669 1909DC9E2C637339001E7986 /* CNLiveDigitalResumePreViewFirCell.swift in Sources */,
  2670 + 195650C72D769B2A00818FC8 /* CNLiveVodAlbumListCell.swift in Sources */,
  2671 + 195650BB2D71B12B00818FC8 /* CNLiveVodPlayModel.swift in Sources */,
2412 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */, 2672 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */,
2413 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */, 2673 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */,
2414 19CB63222C69B3B600D889F8 /* CNLiveDigitalResumeGuanfangRenzhengCell.swift in Sources */, 2674 19CB63222C69B3B600D889F8 /* CNLiveDigitalResumeGuanfangRenzhengCell.swift in Sources */,
@@ -2419,6 +2679,8 @@ @@ -2419,6 +2679,8 @@
2419 1938BD412B4BEC6900390A34 /* CNLiveAlbumListModel.swift in Sources */, 2679 1938BD412B4BEC6900390A34 /* CNLiveAlbumListModel.swift in Sources */,
2420 1941347E2C1815E7004FC047 /* AVExtensions.swift in Sources */, 2680 1941347E2C1815E7004FC047 /* AVExtensions.swift in Sources */,
2421 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */, 2681 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */,
  2682 + 1958B4182D8572A200F37E35 /* CNLiveMinePlayHistoryCell.swift in Sources */,
  2683 + 195650DD2D7BDA9F00818FC8 /* CNLiveHomeSearchViewModel.swift in Sources */,
2422 191733292B148BF7007BCC04 /* CNLivePlayerVolumeBrightnessView.swift in Sources */, 2684 191733292B148BF7007BCC04 /* CNLivePlayerVolumeBrightnessView.swift in Sources */,
2423 7C4931292A2D8BA8000E44B4 /* CNLiveBaseTabBarViewController.swift in Sources */, 2685 7C4931292A2D8BA8000E44B4 /* CNLiveBaseTabBarViewController.swift in Sources */,
2424 79F4B1162A32B96B00993C03 /* CNLiveMineInfoViewController.swift in Sources */, 2686 79F4B1162A32B96B00993C03 /* CNLiveMineInfoViewController.swift in Sources */,
@@ -2426,10 +2688,12 @@ @@ -2426,10 +2688,12 @@
2426 194134882C1FE4E7004FC047 /* CNLiveDigitalAssetsController.swift in Sources */, 2688 194134882C1FE4E7004FC047 /* CNLiveDigitalAssetsController.swift in Sources */,
2427 7CD6753F2A2740B0008354C1 /* CNDownSlideViewRemindView.swift in Sources */, 2689 7CD6753F2A2740B0008354C1 /* CNDownSlideViewRemindView.swift in Sources */,
2428 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */, 2690 19565ECF2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift in Sources */,
  2691 + 1947297B2D6D8EF500E55857 /* CNLivePlayerTool.swift in Sources */,
2429 192ED4632C4A642F0057244C /* CNLiveAddrAreaModel.swift in Sources */, 2692 192ED4632C4A642F0057244C /* CNLiveAddrAreaModel.swift in Sources */,
2430 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */, 2693 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */,
2431 7CD6753C2A2740B0008354C1 /* CNUpSlideViewRemindView.swift in Sources */, 2694 7CD6753C2A2740B0008354C1 /* CNUpSlideViewRemindView.swift in Sources */,
2432 7939B0772B47F88A005AE981 /* CNLiveShortVideoControlView.swift in Sources */, 2695 7939B0772B47F88A005AE981 /* CNLiveShortVideoControlView.swift in Sources */,
  2696 + 1958B41E2D8A98CB00F37E35 /* CNLiveVodPlayViewModel.swift in Sources */,
2433 191733602B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift in Sources */, 2697 191733602B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift in Sources */,
2434 79BB1C142B05C51900C5720C /* CNLiveShopCouponViewController.swift in Sources */, 2698 79BB1C142B05C51900C5720C /* CNLiveShopCouponViewController.swift in Sources */,
2435 1941348A2C200E4E004FC047 /* CNLiveDigitalFirstCell.swift in Sources */, 2699 1941348A2C200E4E004FC047 /* CNLiveDigitalFirstCell.swift in Sources */,
@@ -2447,6 +2711,7 @@ @@ -2447,6 +2711,7 @@
2447 79A267832AF8D7BC0088D9F6 /* CNLiveShopBodyCustomView.swift in Sources */, 2711 79A267832AF8D7BC0088D9F6 /* CNLiveShopBodyCustomView.swift in Sources */,
2448 1917335E2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift in Sources */, 2712 1917335E2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift in Sources */,
2449 791C1C8C2AFB85F8003E6362 /* CNLiveShopBodyExpressView.swift in Sources */, 2713 791C1C8C2AFB85F8003E6362 /* CNLiveShopBodyExpressView.swift in Sources */,
  2714 + 195650CD2D76C45400818FC8 /* CNLiveVodAlbumListCollectionCell.swift in Sources */,
2450 79868B192B874294008E0F5C /* CNLiveSaveAuthStateDB.swift in Sources */, 2715 79868B192B874294008E0F5C /* CNLiveSaveAuthStateDB.swift in Sources */,
2451 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */, 2716 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */,
2452 191733192B10A05D007BCC04 /* CNLivePlayerProgressView.swift in Sources */, 2717 191733192B10A05D007BCC04 /* CNLivePlayerProgressView.swift in Sources */,
@@ -2458,8 +2723,11 @@ @@ -2458,8 +2723,11 @@
2458 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */, 2723 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */,
2459 7991723A2AF091E100DC01A8 /* CNLiveShopOrderListViewController.swift in Sources */, 2724 7991723A2AF091E100DC01A8 /* CNLiveShopOrderListViewController.swift in Sources */,
2460 798A44F02A305BC200815935 /* UIButton+CNLiveExtensions.swift in Sources */, 2725 798A44F02A305BC200815935 /* UIButton+CNLiveExtensions.swift in Sources */,
  2726 + 195650D32D79804400818FC8 /* CNLiveHomeTwoShopCell.swift in Sources */,
  2727 + 19A8CD142D62DC3700509BCD /* CNLiveTVHomeViewController.swift in Sources */,
2461 1969E1AD2C92E98700E4185E /* CNHomeWebViewController.swift in Sources */, 2728 1969E1AD2C92E98700E4185E /* CNHomeWebViewController.swift in Sources */,
2462 1938BD342B4B968300390A34 /* CNLiveHomePageDuanJuCell.swift in Sources */, 2729 1938BD342B4B968300390A34 /* CNLiveHomePageDuanJuCell.swift in Sources */,
  2730 + 192FDB062D8D0B7E00F8723D /* CNLiveVodShopBottomView.swift in Sources */,
2463 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */, 2731 192ED4872C575EC90057244C /* CNLiveVitaeAddWorkFirCell.swift in Sources */,
2464 191733522B2C4CEA007BCC04 /* CNLivePickerSelectDateTools.swift in Sources */, 2732 191733522B2C4CEA007BCC04 /* CNLivePickerSelectDateTools.swift in Sources */,
2465 1917333A2B27FDF3007BCC04 /* CNLiveShopClassilyManageTableViewCell.swift in Sources */, 2733 1917333A2B27FDF3007BCC04 /* CNLiveShopClassilyManageTableViewCell.swift in Sources */,
@@ -2640,7 +2908,7 @@ @@ -2640,7 +2908,7 @@
2640 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements; 2908 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements;
2641 CODE_SIGN_IDENTITY = "Apple Development"; 2909 CODE_SIGN_IDENTITY = "Apple Development";
2642 CODE_SIGN_STYLE = Automatic; 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 DEBUG_INFORMATION_FORMAT = dwarf; 2912 DEBUG_INFORMATION_FORMAT = dwarf;
2645 DEVELOPMENT_TEAM = 94X49GG3ZW; 2913 DEVELOPMENT_TEAM = 94X49GG3ZW;
2646 ENABLE_BITCODE = NO; 2914 ENABLE_BITCODE = NO;
@@ -2708,7 +2976,7 @@ @@ -2708,7 +2976,7 @@
2708 INFOPLIST_KEY_UIMainStoryboardFile = Main; 2976 INFOPLIST_KEY_UIMainStoryboardFile = Main;
2709 INFOPLIST_KEY_UIStatusBarStyle = ""; 2977 INFOPLIST_KEY_UIStatusBarStyle = "";
2710 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; 2978 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
2711 - IPHONEOS_DEPLOYMENT_TARGET = 11.0; 2979 + IPHONEOS_DEPLOYMENT_TARGET = 13.0;
2712 LD_RUNPATH_SEARCH_PATHS = ( 2980 LD_RUNPATH_SEARCH_PATHS = (
2713 "$(inherited)", 2981 "$(inherited)",
2714 "@executable_path/Frameworks", 2982 "@executable_path/Frameworks",
@@ -2896,7 +3164,7 @@ @@ -2896,7 +3164,7 @@
2896 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements; 3164 CODE_SIGN_ENTITLEMENTS = metaCode/metaCode.entitlements;
2897 CODE_SIGN_IDENTITY = "Apple Development"; 3165 CODE_SIGN_IDENTITY = "Apple Development";
2898 CODE_SIGN_STYLE = Automatic; 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 DEVELOPMENT_TEAM = 94X49GG3ZW; 3168 DEVELOPMENT_TEAM = 94X49GG3ZW;
2901 ENABLE_BITCODE = NO; 3169 ENABLE_BITCODE = NO;
2902 ENABLE_MODULE_VERIFIER = NO; 3170 ENABLE_MODULE_VERIFIER = NO;
@@ -2963,7 +3231,7 @@ @@ -2963,7 +3231,7 @@
2963 INFOPLIST_KEY_UIMainStoryboardFile = Main; 3231 INFOPLIST_KEY_UIMainStoryboardFile = Main;
2964 INFOPLIST_KEY_UIStatusBarStyle = ""; 3232 INFOPLIST_KEY_UIStatusBarStyle = "";
2965 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; 3233 INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
2966 - IPHONEOS_DEPLOYMENT_TARGET = 11.0; 3234 + IPHONEOS_DEPLOYMENT_TARGET = 13.0;
2967 LD_RUNPATH_SEARCH_PATHS = ( 3235 LD_RUNPATH_SEARCH_PATHS = (
2968 "$(inherited)", 3236 "$(inherited)",
2969 "@executable_path/Frameworks", 3237 "@executable_path/Frameworks",
metaCode/Classes/Common/Base/CNLiveBaseTabBarViewController.swift
@@ -52,21 +52,25 @@ class CNLiveBaseTabBarViewController: UITabBarController @@ -52,21 +52,25 @@ class CNLiveBaseTabBarViewController: UITabBarController
52 // MARK: - 控制器的信息 52 // MARK: - 控制器的信息
53 func setUpTabBar() { 53 func setUpTabBar() {
54 54
  55 +
  56 +//// let homeVC = CNLiveNewAuthViewController.init()
  57 + ///忽必烈
  58 + let homeVC = CNLiveTVHomeViewController.init()
55 // let homeVC = CNLiveAuthViewController.init() 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 let mineVC = CNLiveMineViewController.init() 63 let mineVC = CNLiveMineViewController.init()
60 - 64 +
61 creatTabbarView(viewController: homeVC, image: "tabbar_hoem_icon_default", selectImage: "tabbar_hoem_icon_selected", title: "首页") 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 creatTabbarView(viewController: mineVC, image: "tabbar_mine_icon_default", selectImage: "tabbar_mine_icon_selected", title: "我的") 67 creatTabbarView(viewController: mineVC, image: "tabbar_mine_icon_default", selectImage: "tabbar_mine_icon_selected", title: "我的")
64 68
65 self.tabBar.tintColor = UIColor("#0066FE") 69 self.tabBar.tintColor = UIColor("#0066FE")
66 self.tabBar.isTranslucent = false 70 self.tabBar.isTranslucent = false
67 self.viewControllers = [ 71 self.viewControllers = [
68 CNLiveBaseNavigationController(rootViewController: homeVC), 72 CNLiveBaseNavigationController(rootViewController: homeVC),
69 - CNLiveBaseNavigationController(rootViewController: authVC), 73 + //CNLiveBaseNavigationController(rootViewController: authVC),
70 CNLiveBaseNavigationController(rootViewController: mineVC) 74 CNLiveBaseNavigationController(rootViewController: mineVC)
71 ] 75 ]
72 // self.selectedIndex = 1 76 // self.selectedIndex = 1
metaCode/Classes/Common/Base/CNLiveBaseViewController.swift
@@ -252,5 +252,58 @@ class CNLiveBaseViewController: UIViewController { @@ -252,5 +252,58 @@ class CNLiveBaseViewController: UIViewController {
252 @objc func topNavViewTap() { 252 @objc func topNavViewTap() {
253 UIApplication.shared.keyWindow?.endEditing(true) 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,7 +66,9 @@ class UserInfoModel: BaseModel {
66 } 66 }
67 67
68 class UserInfoManager: NSObject { 68 class UserInfoManager: NSObject {
69 - 69 + static let mataCodeUserInfo = "mateCode_userInfo"
  70 + static let CNLiveUserInfo = "CNUserInfo"
  71 +
70 static let shared = UserInfoManager() 72 static let shared = UserInfoManager()
71 73
72 fileprivate var _userInfo : UserInfoModel? 74 fileprivate var _userInfo : UserInfoModel?
@@ -92,7 +94,9 @@ class UserInfoManager: NSObject { @@ -92,7 +94,9 @@ class UserInfoManager: NSObject {
92 UserInfoManager.clearUserInfo() 94 UserInfoManager.clearUserInfo()
93 UserInfoManager.shared._userInfo = userInfo 95 UserInfoManager.shared._userInfo = userInfo
94 //JsonUtil.modelToJson(userInfo) 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 if UserDefaults.standard.synchronize() { 100 if UserDefaults.standard.synchronize() {
97 print("用户信息存储成功") 101 print("用户信息存储成功")
98 } 102 }
@@ -101,7 +105,8 @@ class UserInfoManager: NSObject { @@ -101,7 +105,8 @@ class UserInfoManager: NSObject {
101 /// 读取用户数据 105 /// 读取用户数据
102 /// - Returns: 用户数据 106 /// - Returns: 用户数据
103 static public func readUserInfo() -> UserInfoModel { 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 if user_info == nil { 110 if user_info == nil {
106 print("获取用户信息失败") 111 print("获取用户信息失败")
107 return UserInfoModel() 112 return UserInfoModel()
@@ -116,7 +121,9 @@ class UserInfoManager: NSObject { @@ -116,7 +121,9 @@ class UserInfoManager: NSObject {
116 } 121 }
117 122
118 static public func clearUserInfo() { 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 UserInfoManager.shared._userInfo = nil 127 UserInfoManager.shared._userInfo = nil
121 StandSortManager.removeStandSort() 128 StandSortManager.removeStandSort()
122 if UserDefaults.standard.synchronize() { 129 if UserDefaults.standard.synchronize() {
metaCode/Classes/Config/CNLiveConfigstant.swift
@@ -17,7 +17,10 @@ let KStatusBarHeight:CGFloat = UIApplication.shared.statusBarFrame.height; @@ -17,7 +17,10 @@ let KStatusBarHeight:CGFloat = UIApplication.shared.statusBarFrame.height;
17 ///导航栏高度 17 ///导航栏高度
18 let KNavigationHeight:CGFloat = (KStatusBarHeight + 44) 18 let KNavigationHeight:CGFloat = (KStatusBarHeight + 44)
19 ///tabbar高度 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 获取系统tabbarUI高度 25 获取系统tabbarUI高度
23 */ 26 */
metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNUpSlideViewController.swift
@@ -12,12 +12,31 @@ import UIKit @@ -12,12 +12,31 @@ import UIKit
12 let kCNDownSlideBackgroundColorHex: String = "#F7F8FA" 12 let kCNDownSlideBackgroundColorHex: String = "#F7F8FA"
13 13
14 ///CNliveDownSlideModel Type 14 ///CNliveDownSlideModel Type
  15 +let SlideModelTypeRecommend1: String = "1"//1大图banner
15 let SlideModelTypeRecommend4: String = "4"//4一排两个 推荐课程&推荐活动 16 let SlideModelTypeRecommend4: String = "4"//4一排两个 推荐课程&推荐活动
16 let SlideModelTypeTodayRecommend74: String = "74"//74今日推荐 17 let SlideModelTypeTodayRecommend74: String = "74"//74今日推荐
17 let SlideModelTypeAllCourse12: String = "12"//12列表全部课程 18 let SlideModelTypeAllCourse12: String = "12"//12列表全部课程
18 let SlideModelTypeOneCourse75: String = "75"//75单课程大图 19 let SlideModelTypeOneCourse75: String = "75"//75单课程大图
19 -let SlideModelTypeTwoDuanJu5: String = "5"//5竖版短剧 一排两个  
20 let SlideModelTypeRealHotList7: String = "7"//7实时热榜 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 class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITableViewDataSource{ 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,10 +109,11 @@ class CNHomeWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
109 make.top.equalTo(get_system_nav_height()) 109 make.top.equalTo(get_system_nav_height())
110 make.left.right.bottom.equalToSuperview() 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 func h5StopVideoPlayer(){ 119 func h5StopVideoPlayer(){
metaCode/Classes/Main/HomePage/Controller/WebController/CNWebView.swift
@@ -27,12 +27,13 @@ typealias cnWebControllerUpdateNavEditBlock = (_ isShowEdit:Bool)-&gt;Void @@ -27,12 +27,13 @@ typealias cnWebControllerUpdateNavEditBlock = (_ isShowEdit:Bool)-&gt;Void
27 //更新Web控制器 currentUrl 27 //更新Web控制器 currentUrl
28 typealias cnWebControllerUpdateCurrentUrlBlock = (_ currentUrl:String)->Void 28 typealias cnWebControllerUpdateCurrentUrlBlock = (_ currentUrl:String)->Void
29 29
30 -class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{ 30 +class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler,WKUIDelegate{
31 31
32 var configuration:WKWebViewConfiguration? 32 var configuration:WKWebViewConfiguration?
33 33
34 lazy var cnWebView :WKWebView = { 34 lazy var cnWebView :WKWebView = {
35 let cnWebView = WKWebView(frame: self.bounds, configuration: self.configuration!) 35 let cnWebView = WKWebView(frame: self.bounds, configuration: self.configuration!)
  36 + cnWebView.uiDelegate = self
36 return cnWebView 37 return cnWebView
37 }() 38 }()
38 39
@@ -379,9 +380,33 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{ @@ -379,9 +380,33 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{
379 self.bridge?.registerHandler("ymAiGetAutoPlayAudioState", handler: { data, responseCallback in 380 self.bridge?.registerHandler("ymAiGetAutoPlayAudioState", handler: { data, responseCallback in
380 print("js call oc\(data)") 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 // MARK: - 检查url 412 // MARK: - 检查url
@@ -478,7 +503,31 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{ @@ -478,7 +503,31 @@ class CNWebView:UIView,WKNavigationDelegate, WKScriptMessageHandler{
478 } 503 }
479 return str 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 // MARK: - WKWebViewDelegate 531 // MARK: - WKWebViewDelegate
483 // 页面开始加载时调用 532 // 页面开始加载时调用
484 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { 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,6 +20,7 @@ let ManagemallshopH5 = &quot;managemall.cnlive.com&quot;
20 20
21 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ 21 class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
22 22
  23 + var isHiddenNavigationBar = false
23 var bridge:WKWebViewJavascriptBridge? 24 var bridge:WKWebViewJavascriptBridge?
24 var currentUrl:String = ""//当前网页的url 25 var currentUrl:String = ""//当前网页的url
25 26
@@ -32,7 +33,8 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -32,7 +33,8 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
32 configuration.preferences.minimumFontSize = 0.0 33 configuration.preferences.minimumFontSize = 0.0
33 configuration.preferences = preferences 34 configuration.preferences = preferences
34 configuration.userContentController = WKUserContentController() 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 webView.cnWebView.scrollView.showsVerticalScrollIndicator = false 38 webView.cnWebView.scrollView.showsVerticalScrollIndicator = false
37 webView.cnWebView.scrollView.showsHorizontalScrollIndicator = false 39 webView.cnWebView.scrollView.showsHorizontalScrollIndicator = false
38 webView.isCNWebController = true 40 webView.isCNWebController = true
@@ -89,7 +91,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -89,7 +91,7 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
89 91
90 override func viewDidLoad() { 92 override func viewDidLoad() {
91 super.viewDidLoad() 93 super.viewDidLoad()
92 - navigationBarHidden = false 94 + navigationBarHidden = self.isHiddenNavigationBar
93 self.view.addSubview(self.webView) 95 self.view.addSubview(self.webView)
94 96
95 self.webView.webControllerUpdateNavSoundBlock = { isSound in 97 self.webView.webControllerUpdateNavSoundBlock = { isSound in
@@ -124,8 +126,9 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -124,8 +126,9 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
124 self.webView.webControllerUpdateCurrentUrlBlock = { [weak self] currentUrlStr in 126 self.webView.webControllerUpdateCurrentUrlBlock = { [weak self] currentUrlStr in
125 self!.currentUrl = currentUrlStr 127 self!.currentUrl = currentUrlStr
126 } 128 }
  129 + let navH = self.isHiddenNavigationBar ? 0 : KNavigationHeight
127 self.webView.snp.makeConstraints { make in 130 self.webView.snp.makeConstraints { make in
128 - make.top.equalTo(get_system_nav_height()) 131 + make.top.equalTo(navH)
129 make.left.right.bottom.equalToSuperview() 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,6 +516,7 @@ class CNDownSlideSingleCourseCell: UITableViewCell, UICollectionViewDelegate, UI
516 } 516 }
517 //MARK: - 事件 517 //MARK: - 事件
518 @objc func enterBtnAction(_ sender: UIButton){ 518 @objc func enterBtnAction(_ sender: UIButton){
  519 +
519 let tag = sender.tag 520 let tag = sender.tag
520 if self.myCurriculum?.list.count ?? 0 > 0{ 521 if self.myCurriculum?.list.count ?? 0 > 0{
521 let albumMdl = self.myCurriculum?.list[tag] 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,6 +13,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
13 let kCNLiveDownSlideRecommendCellIdentifier = "kCNLiveDownSlideRecommendCellIdentifier" 13 let kCNLiveDownSlideRecommendCellIdentifier = "kCNLiveDownSlideRecommendCellIdentifier"
14 let kCNLiveDownSlideTodayRecommendCellIdentifier = "kCNLiveDownSlideTodayRecommendCellIdentifier" 14 let kCNLiveDownSlideTodayRecommendCellIdentifier = "kCNLiveDownSlideTodayRecommendCellIdentifier"
15 let kCNLiveDownSlideSingleCourseCellIdentifier = "kCNLiveDownSlideSingleCourseCellIdentifier" 15 let kCNLiveDownSlideSingleCourseCellIdentifier = "kCNLiveDownSlideSingleCourseCellIdentifier"
  16 + let kCNLiveDownSlideBannerCellIdentifier = "kCNLiveDownSlideBannerCellIdentifier"
16 let kCNLiveHomePageDuanJuCellIdentifier = "kCNLiveHomePageDuanJuCellIdentifier" 17 let kCNLiveHomePageDuanJuCellIdentifier = "kCNLiveHomePageDuanJuCellIdentifier"
17 let kCNLiveDownSlideTwoDuanJuCellIdentifier = "kCNLiveDownSlideTwoDuanJuCellIdentifier" 18 let kCNLiveDownSlideTwoDuanJuCellIdentifier = "kCNLiveDownSlideTwoDuanJuCellIdentifier"
18 let kCNLiveDownSlideRealHotListCellIdentifier = "kCNLiveDownSlideRealHotListCellIdentifier" 19 let kCNLiveDownSlideRealHotListCellIdentifier = "kCNLiveDownSlideRealHotListCellIdentifier"
@@ -72,7 +73,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -72,7 +73,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
72 tableView.delegate = self 73 tableView.delegate = self
73 tableView.separatorStyle = .none 74 tableView.separatorStyle = .none
74 tableView.register(CNLiveHomePageDuanJuCell.self, forCellReuseIdentifier: kCNLiveHomePageDuanJuCellIdentifier) 75 tableView.register(CNLiveHomePageDuanJuCell.self, forCellReuseIdentifier: kCNLiveHomePageDuanJuCellIdentifier)
75 - 76 + tableView.register(CNLiveDownSlideBannerCell.self, forCellReuseIdentifier: kCNLiveDownSlideBannerCellIdentifier)
76 tableView.register(CNLiveDownSlideRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideRecommendCellIdentifier) 77 tableView.register(CNLiveDownSlideRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideRecommendCellIdentifier)
77 tableView.register(CNLiveDownSlideTodayRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier) 78 tableView.register(CNLiveDownSlideTodayRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier)
78 tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier: kCNLiveDownSlideAllCourseCellIdentifier) 79 tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier: kCNLiveDownSlideAllCourseCellIdentifier)
@@ -116,7 +117,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -116,7 +117,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
116 //除了短剧的model 117 //除了短剧的model
117 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel 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 if slideModel.type == SlideModelTypeRecommend4{ 121 if slideModel.type == SlideModelTypeRecommend4{
121 guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideRecommendCellIdentifier) as? CNLiveDownSlideRecommendCell 122 guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideRecommendCellIdentifier) as? CNLiveDownSlideRecommendCell
122 else { 123 else {
@@ -164,6 +165,14 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -164,6 +165,14 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
164 } 165 }
165 cell.slideModel = slideModel 166 cell.slideModel = slideModel
166 return cell 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 }else{ 176 }else{
168 return UITableViewCell() 177 return UITableViewCell()
169 } 178 }
metaCode/Classes/Main/HomePages/Model/CNLiveAlbumListModel.swift
@@ -31,31 +31,54 @@ class CNLiveAlbumListBaseModel:BaseModel{ @@ -31,31 +31,54 @@ class CNLiveAlbumListBaseModel:BaseModel{
31 } 31 }
32 class CNLiveAlbumListModel:BaseModel{ 32 class CNLiveAlbumListModel:BaseModel{
33 var title = "" 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 var shortTitle = "" 64 var shortTitle = ""
35 var subTitle = "" 65 var subTitle = ""
36 - var product:CNLiveAlbumProductModel?  
37 - var poster = ""  
38 var model = "" 66 var model = ""
39 var thirdUrl = "" 67 var thirdUrl = ""
40 var colours = "" 68 var colours = ""
41 var address = "" 69 var address = ""
42 - var contentId = ""  
43 var source = "" 70 var source = ""
44 var sourceName = "" 71 var sourceName = ""
45 var pid = "" 72 var pid = ""
46 var witnessId = "" 73 var witnessId = ""
47 var videoUrl = "" 74 var videoUrl = ""
48 - var duration = ""  
49 var number = "" 75 var number = ""
50 var goods = "" 76 var goods = ""
51 var icon : CNLiveAlbumListIconModel? 77 var icon : CNLiveAlbumListIconModel?
52 - var time = ""  
53 var tagId = "" 78 var tagId = ""
54 var tagName = "" 79 var tagName = ""
55 - var tool :CNLiveAlbumListToolModel?  
56 var activityEndTime = "" 80 var activityEndTime = ""
57 var h5Url = "" 81 var h5Url = ""
58 - var shareUrl = ""  
59 var album:CNLiveAlbumListAlbumModel? 82 var album:CNLiveAlbumListAlbumModel?
60 var block = "" 83 var block = ""
61 var isHorizontalScreen = "" 84 var isHorizontalScreen = ""
metaCode/Classes/Main/HomePages/Model/CNLiveHomePageModel.swift
@@ -7,6 +7,168 @@ @@ -7,6 +7,168 @@
7 7
8 import Foundation 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 class CNLiveHomePageModel:BaseModel{ 172 class CNLiveHomePageModel:BaseModel{
11 var endRow = 0 173 var endRow = 0
12 var firstPage = 0 174 var firstPage = 0
metaCode/Classes/Main/HomePages/View/HomepageDetail/CNLiveAlbumCell.swift
@@ -143,6 +143,7 @@ class CNLiveAlbumCell:UITableViewCell{ @@ -143,6 +143,7 @@ class CNLiveAlbumCell:UITableViewCell{
143 } 143 }
144 144
145 @objc func playBtnAction(){ 145 @objc func playBtnAction(){
  146 +
146 var aid = "" 147 var aid = ""
147 if self.albumModel != nil{ 148 if self.albumModel != nil{
148 aid = self.albumModel!.contentId 149 aid = self.albumModel!.contentId
metaCode/Classes/Main/HomePages/ViewModel/CNLiveHomePageViewModel.swift
@@ -7,8 +7,408 @@ @@ -7,8 +7,408 @@
7 7
8 import Foundation 8 import Foundation
9 import CNLiveRequestBastKit 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 static func requestGetHomePageConfigList( resultBlock: @escaping downSlideResultBlock) { 414 static func requestGetHomePageConfigList( resultBlock: @escaping downSlideResultBlock) {
@@ -165,6 +565,8 @@ class CNLiveHomePageViewModel:NSObject{ @@ -165,6 +565,8 @@ class CNLiveHomePageViewModel:NSObject{
165 static func getAlbumList(aid:String, page:NSInteger,resultBlock: @escaping downSlideResultBlock) { 565 static func getAlbumList(aid:String, page:NSInteger,resultBlock: @escaping downSlideResultBlock) {
166 let param = NSMutableDictionary() 566 let param = NSMutableDictionary()
167 param.setValue(aid, forKey: "aid") 567 param.setValue(aid, forKey: "aid")
  568 + param.setValue("mc_app", forKey: "app_channel_id")
  569 +
168 param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid") 570 param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid")
169 param.setValue("\(page)", forKey: "page") 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 +}