fix
无故事王国
2024-02-28 4468d9f9b3b8c70597f04e5f1ecb61118c404d2c
fix
29个文件已修改
65个文件已添加
15625 ■■■■■ 已修改文件
WanPai.xcodeproj/project.pbxproj 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/AppDelegate.swift 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Bg/bg_long.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Bg/bg_long.imageset/bg_long@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Bg/bg_long.imageset/bg_long@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/btn_exchange3@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/btn_exchange@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/btn_setting_find@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/btn_setting_find@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_age.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_age.imageset/icon_age@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_age.imageset/icon_age@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/icon_hot_1@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/icon_hot_1@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_reset.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_reset.imageset/icon_reset@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_reset.imageset/icon_reset@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/icon_time_1@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/icon_time_1@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_winner.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_winner.imageset/icon_winner@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/icon_winner.imageset/icon_winner@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_1.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_1.imageset/rank_1@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_1.imageset/rank_1@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_2.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_2.imageset/rank_2@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_2.imageset/rank_2@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_3.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_3.imageset/rank_3@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Assets.xcassets/Icons/rank_3.imageset/rank_3@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Common/VC/CommonWebVC.swift 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Config/Def.swift 429 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Config/Enums.swift 653 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Model/CommonModels.swift 1401 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 2110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift 484 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailVC.swift 196 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityListVC.swift 278 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseListVC.swift 400 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesDataSourceSubListVC.swift 128 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesDataSourceVC.swift 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesListVC.swift 144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Games/VC/GamesSubListVC.swift 136 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/Model/HomeModel.swift 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/Model/WorldCupModel.swift 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/HomeVC.swift 649 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/WorldCupListVC.swift 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/WorldCupListVC.xib 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/View/WorldCupHeadView.swift 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/View/WorldCupHeadView.xib 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Login/VC/LoginVC.swift 446 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/VC/ProfileVC.swift 236 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/CCell/SearchBannerCCell.xib 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/MyQRCodeTCell.swift 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/MyQRCodeTCell.xib 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/StudentInfo_4_TCell.swift 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/StudentInfo_4_TCell.xib 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/WorldCupRankTCell.swift 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/WorldCupRecordTCell.swift 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/WorldCupRecordTCell.xib 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/WorldCupTCell.swift 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/TCell/WorldCupTCell.xib 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/CustomerSubListVC.swift 182 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/MeQRCodeVC.swift 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/MeQRCodeVC.xib 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/SearchVC.swift 356 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/SearchVC.xib 251 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentApplyInputVC.swift 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentApplyInputVC.xib 679 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentApplyVC.swift 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentApplyVC.xib 698 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentDetailVC.swift 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentDetailVC.xib 654 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupContentVC.swift 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupHeaderVC.swift 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupHeaderVC.xib 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupMenuVC.swift 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupRankVC.swift 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupRecordVC.swift 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/WorldCupVC.swift 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/CCell/FindItemCCell.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/CCell/FindItemCCell.xib 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareFreeVC.swift 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareVC.swift 270 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WorldCupIntroVC.swift 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardDetailVC.swift 1066 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/SceneDelegate.swift 170 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai.xcodeproj/project.pbxproj
@@ -33,6 +33,10 @@
        131732BA2A405EF800F722AF /* CalendarDateTimeTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 131732B82A405EF800F722AF /* CalendarDateTimeTCell.swift */; };
        131732BB2A405EF800F722AF /* CalendarDateTimeTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 131732B92A405EF800F722AF /* CalendarDateTimeTCell.xib */; };
        1319386B2AC2EC8300FC63F1 /* WeChatTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1319386A2AC2EC8300FC63F1 /* WeChatTools.swift */; };
        1324D3562B8DE4CA00F168A8 /* WorldCupRecordVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1324D3552B8DE4CA00F168A8 /* WorldCupRecordVC.swift */; };
        1324D3582B8DE50000F168A8 /* WorldCupRankVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1324D3572B8DE50000F168A8 /* WorldCupRankVC.swift */; };
        1324D35B2B8DE5EA00F168A8 /* WorldCupRecordTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1324D3592B8DE5EA00F168A8 /* WorldCupRecordTCell.swift */; };
        1324D35C2B8DE5EA00F168A8 /* WorldCupRecordTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1324D35A2B8DE5EA00F168A8 /* WorldCupRecordTCell.xib */; };
        13272DCB2A40076300AC6481 /* YardBookingTimeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13272DCA2A40076300AC6481 /* YardBookingTimeView.swift */; };
        13272DCD2A40076900AC6481 /* YardBookingTimeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13272DCC2A40076900AC6481 /* YardBookingTimeView.xib */; };
        13272DD02A4034A300AC6481 /* YardDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13272DCE2A4034A300AC6481 /* YardDetailVC.swift */; };
@@ -53,6 +57,13 @@
        133E223C2AFB37020045B544 /* StoresInfo_2_View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E223B2AFB37020045B544 /* StoresInfo_2_View.swift */; };
        133E223E2AFB370D0045B544 /* StoresInfo_2_View.xib in Resources */ = {isa = PBXBuildFile; fileRef = 133E223D2AFB370D0045B544 /* StoresInfo_2_View.xib */; };
        133E22402AFB85330045B544 /* CustomPointAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E223F2AFB85330045B544 /* CustomPointAnnotation.swift */; };
        13426D632B8F0CFE0032338B /* WorldCupRankTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13426D612B8F0CFE0032338B /* WorldCupRankTCell.swift */; };
        13426D672B8F20AB0032338B /* WorldCupContentDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13426D652B8F20AB0032338B /* WorldCupContentDetailVC.swift */; };
        13426D682B8F20AB0032338B /* WorldCupContentDetailVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13426D662B8F20AB0032338B /* WorldCupContentDetailVC.xib */; };
        13477DC22B8C9F28002E69FB /* MeQRCodeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13477DC02B8C9F28002E69FB /* MeQRCodeVC.swift */; };
        13477DC32B8C9F28002E69FB /* MeQRCodeVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13477DC12B8C9F28002E69FB /* MeQRCodeVC.xib */; };
        13477DCA2B8CA1C1002E69FB /* MyQRCodeTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13477DC82B8CA1C1002E69FB /* MyQRCodeTCell.swift */; };
        13477DCB2B8CA1C1002E69FB /* MyQRCodeTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13477DC92B8CA1C1002E69FB /* MyQRCodeTCell.xib */; };
        1347D1BA2AB4457A0052082A /* GamesDataSourceSubListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1347D1B92AB4457A0052082A /* GamesDataSourceSubListVC.swift */; };
        1347D1BC2AB448C20052082A /* CourseUnAssignView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1347D1BB2AB448C20052082A /* CourseUnAssignView.swift */; };
        1347D1BE2AB448CC0052082A /* CourseUnAssignView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1347D1BD2AB448CC0052082A /* CourseUnAssignView.xib */; };
@@ -71,6 +82,8 @@
        1355ABFE2A4C15C7002B25E4 /* RechargeRecordVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1355ABFC2A4C15C7002B25E4 /* RechargeRecordVC.xib */; };
        135772AC2AB1B11400EA3544 /* YardBookingDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135772AA2AB1B11400EA3544 /* YardBookingDetailVC.swift */; };
        135772AD2AB1B11500EA3544 /* YardBookingDetailVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 135772AB2AB1B11400EA3544 /* YardBookingDetailVC.xib */; };
        13675FF72B8CBDD400085A66 /* WorldCupMenuVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13675FF62B8CBDD400085A66 /* WorldCupMenuVC.swift */; };
        13675FF92B8CC05D00085A66 /* WorldCupContentVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13675FF82B8CC05D00085A66 /* WorldCupContentVC.swift */; };
        136B63982A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 136B63962A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.swift */; };
        136B63992A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 136B63972A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.xib */; };
        136E0EE92AB30DD200EDBB8F /* QRPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 136E0EE82AB30DD200EDBB8F /* QRPreview.swift */; };
@@ -108,6 +121,11 @@
        137B866B2AB3F03F00C4D01B /* GamesVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 137B86692AB3F03F00C4D01B /* GamesVC.xib */; };
        137B866F2AB3F87000C4D01B /* GamesPayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137B866E2AB3F87000C4D01B /* GamesPayView.swift */; };
        137B86712AB3F87800C4D01B /* GamesPayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 137B86702AB3F87800C4D01B /* GamesPayView.xib */; };
        137D2C362B8F5B8E001E34BF /* WorldCupContentApplyVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137D2C342B8F5B8E001E34BF /* WorldCupContentApplyVC.swift */; };
        137D2C372B8F5B8E001E34BF /* WorldCupContentApplyVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 137D2C352B8F5B8E001E34BF /* WorldCupContentApplyVC.xib */; };
        137D2C392B8F5F67001E34BF /* WorldCupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137D2C382B8F5F67001E34BF /* WorldCupModel.swift */; };
        137D2C3C2B8F630F001E34BF /* WorldCupContentApplyInputVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137D2C3A2B8F630F001E34BF /* WorldCupContentApplyInputVC.swift */; };
        137D2C3D2B8F630F001E34BF /* WorldCupContentApplyInputVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 137D2C3B2B8F630F001E34BF /* WorldCupContentApplyInputVC.xib */; };
        13801CBE2A4D20D20041454D /* ChooseStoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13801CBD2A4D20D20041454D /* ChooseStoreView.swift */; };
        13801CC02A4D20DB0041454D /* ChooseStoreView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13801CBF2A4D20DB0041454D /* ChooseStoreView.xib */; };
        13801CC42A4D26D90041454D /* CommonSingleTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13801CC22A4D26D90041454D /* CommonSingleTCell.swift */; };
@@ -138,6 +156,8 @@
        138D8B932A4000D2009DCA9E /* YardTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 138D8B912A4000D2009DCA9E /* YardTCell.swift */; };
        138D8B942A4000D2009DCA9E /* YardTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 138D8B922A4000D2009DCA9E /* YardTCell.xib */; };
        138ED7982AF3A5BE0001F2EF /* CustomPointAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 138ED7972AF3A5BE0001F2EF /* CustomPointAnnotationView.swift */; };
        13921C002B8C838700BED781 /* FindItemCCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13921BFE2B8C838700BED781 /* FindItemCCell.swift */; };
        13921C012B8C838700BED781 /* FindItemCCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13921BFF2B8C838700BED781 /* FindItemCCell.xib */; };
        1393B3922A4ACDB200B73072 /* CourseExerciseSubListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1393B3902A4ACDB200B73072 /* CourseExerciseSubListVC.swift */; };
        1393B3932A4ACDB200B73072 /* CourseExerciseSubListVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1393B3912A4ACDB200B73072 /* CourseExerciseSubListVC.xib */; };
        1393B3962A4AD03A00B73072 /* CourseExerciseTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1393B3942A4AD03A00B73072 /* CourseExerciseTCell.swift */; };
@@ -174,6 +194,9 @@
        13B6BB9E2ABAE000006D0C0E /* SignUpCourseVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B6BB9C2ABAE000006D0C0E /* SignUpCourseVC.xib */; };
        13B6BBA12ABAE44E006D0C0E /* CourseSignUpTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B6BB9F2ABAE44E006D0C0E /* CourseSignUpTCell.swift */; };
        13B6BBA22ABAE44E006D0C0E /* CourseSignUpTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B6BBA02ABAE44E006D0C0E /* CourseSignUpTCell.xib */; };
        13BBFBBE2B8CAE440027A17A /* WorldCupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BBFBBD2B8CAE440027A17A /* WorldCupVC.swift */; };
        13BBFBC12B8CB00F0027A17A /* WorldCupHeaderVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BBFBBF2B8CB00F0027A17A /* WorldCupHeaderVC.swift */; };
        13BBFBC22B8CB00F0027A17A /* WorldCupHeaderVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13BBFBC02B8CB00F0027A17A /* WorldCupHeaderVC.xib */; };
        13BEEAE52A4D8DFB00685667 /* WelfareExchangeRecordListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BEEAE42A4D8DFB00685667 /* WelfareExchangeRecordListVC.swift */; };
        13BEEAE72A4D927100685667 /* WelfareExchangeRecordSubListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BEEAE62A4D927100685667 /* WelfareExchangeRecordSubListVC.swift */; };
        13BEEAEA2A4D92A200685667 /* ExchangeRecordTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BEEAE82A4D92A200685667 /* ExchangeRecordTCell.swift */; };
@@ -212,6 +235,15 @@
        13EAF3882AB442A4000A6F07 /* GamesDataSourceTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EAF3862AB442A4000A6F07 /* GamesDataSourceTCell.xib */; };
        13EC6DDC2A493D23009FC09A /* WelfareCoinCCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EC6DDA2A493D23009FC09A /* WelfareCoinCCell.swift */; };
        13EC6DDD2A493D23009FC09A /* WelfareCoinCCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EC6DDB2A493D23009FC09A /* WelfareCoinCCell.xib */; };
        13ECD42E2B8DD82C00187EE9 /* WorldCupTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13ECD42C2B8DD82C00187EE9 /* WorldCupTCell.swift */; };
        13ECD42F2B8DD82C00187EE9 /* WorldCupTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13ECD42D2B8DD82C00187EE9 /* WorldCupTCell.xib */; };
        13F88AFD2B8F29F10055317B /* StudentInfo_4_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F88AFB2B8F29F10055317B /* StudentInfo_4_TCell.swift */; };
        13F88AFE2B8F29F10055317B /* StudentInfo_4_TCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13F88AFC2B8F29F10055317B /* StudentInfo_4_TCell.xib */; };
        13F88B002B8F3DA80055317B /* WorldCupIntroVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F88AFF2B8F3DA80055317B /* WorldCupIntroVC.swift */; };
        13F88B052B8F46EA0055317B /* WorldCupListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F88B032B8F46EA0055317B /* WorldCupListVC.swift */; };
        13F88B062B8F46EA0055317B /* WorldCupListVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13F88B042B8F46EA0055317B /* WorldCupListVC.xib */; };
        13F88B092B8F4A0B0055317B /* WorldCupHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F88B082B8F4A0B0055317B /* WorldCupHeadView.swift */; };
        13F88B0B2B8F4A1A0055317B /* WorldCupHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13F88B0A2B8F4A1A0055317B /* WorldCupHeadView.xib */; };
        13FB93B92A5C028D009F558A /* FinanceTrafer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FB93B82A5C028D009F558A /* FinanceTrafer.swift */; };
        13FBB8D62A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FBB8D42A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.swift */; };
        13FBB8D72A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13FBB8D52A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.xib */; };
@@ -337,6 +369,10 @@
        131732B92A405EF800F722AF /* CalendarDateTimeTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CalendarDateTimeTCell.xib; sourceTree = "<group>"; };
        131938692AC2D9B700FC63F1 /* WanPaiDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WanPaiDebug.entitlements; sourceTree = "<group>"; };
        1319386A2AC2EC8300FC63F1 /* WeChatTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeChatTools.swift; sourceTree = "<group>"; };
        1324D3552B8DE4CA00F168A8 /* WorldCupRecordVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupRecordVC.swift; sourceTree = "<group>"; };
        1324D3572B8DE50000F168A8 /* WorldCupRankVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupRankVC.swift; sourceTree = "<group>"; };
        1324D3592B8DE5EA00F168A8 /* WorldCupRecordTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupRecordTCell.swift; sourceTree = "<group>"; };
        1324D35A2B8DE5EA00F168A8 /* WorldCupRecordTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupRecordTCell.xib; sourceTree = "<group>"; };
        13272DCA2A40076300AC6481 /* YardBookingTimeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YardBookingTimeView.swift; sourceTree = "<group>"; };
        13272DCC2A40076900AC6481 /* YardBookingTimeView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = YardBookingTimeView.xib; sourceTree = "<group>"; };
        13272DCE2A4034A300AC6481 /* YardDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YardDetailVC.swift; sourceTree = "<group>"; };
@@ -357,6 +393,13 @@
        133E223B2AFB37020045B544 /* StoresInfo_2_View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoresInfo_2_View.swift; sourceTree = "<group>"; };
        133E223D2AFB370D0045B544 /* StoresInfo_2_View.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StoresInfo_2_View.xib; sourceTree = "<group>"; };
        133E223F2AFB85330045B544 /* CustomPointAnnotation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPointAnnotation.swift; sourceTree = "<group>"; };
        13426D612B8F0CFE0032338B /* WorldCupRankTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupRankTCell.swift; sourceTree = "<group>"; };
        13426D652B8F20AB0032338B /* WorldCupContentDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupContentDetailVC.swift; sourceTree = "<group>"; };
        13426D662B8F20AB0032338B /* WorldCupContentDetailVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupContentDetailVC.xib; sourceTree = "<group>"; };
        13477DC02B8C9F28002E69FB /* MeQRCodeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeQRCodeVC.swift; sourceTree = "<group>"; };
        13477DC12B8C9F28002E69FB /* MeQRCodeVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeQRCodeVC.xib; sourceTree = "<group>"; };
        13477DC82B8CA1C1002E69FB /* MyQRCodeTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyQRCodeTCell.swift; sourceTree = "<group>"; };
        13477DC92B8CA1C1002E69FB /* MyQRCodeTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyQRCodeTCell.xib; sourceTree = "<group>"; };
        1347D1B92AB4457A0052082A /* GamesDataSourceSubListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GamesDataSourceSubListVC.swift; sourceTree = "<group>"; };
        1347D1BB2AB448C20052082A /* CourseUnAssignView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseUnAssignView.swift; sourceTree = "<group>"; };
        1347D1BD2AB448CC0052082A /* CourseUnAssignView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseUnAssignView.xib; sourceTree = "<group>"; };
@@ -376,6 +419,8 @@
        1355ABFC2A4C15C7002B25E4 /* RechargeRecordVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RechargeRecordVC.xib; sourceTree = "<group>"; };
        135772AA2AB1B11400EA3544 /* YardBookingDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YardBookingDetailVC.swift; sourceTree = "<group>"; };
        135772AB2AB1B11400EA3544 /* YardBookingDetailVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = YardBookingDetailVC.xib; sourceTree = "<group>"; };
        13675FF62B8CBDD400085A66 /* WorldCupMenuVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupMenuVC.swift; sourceTree = "<group>"; };
        13675FF82B8CC05D00085A66 /* WorldCupContentVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupContentVC.swift; sourceTree = "<group>"; };
        136B63962A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStoreDetail_1_TCell.swift; sourceTree = "<group>"; };
        136B63972A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchStoreDetail_1_TCell.xib; sourceTree = "<group>"; };
        136E0EE82AB30DD200EDBB8F /* QRPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRPreview.swift; sourceTree = "<group>"; };
@@ -413,6 +458,11 @@
        137B86692AB3F03F00C4D01B /* GamesVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GamesVC.xib; sourceTree = "<group>"; };
        137B866E2AB3F87000C4D01B /* GamesPayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GamesPayView.swift; sourceTree = "<group>"; };
        137B86702AB3F87800C4D01B /* GamesPayView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GamesPayView.xib; sourceTree = "<group>"; };
        137D2C342B8F5B8E001E34BF /* WorldCupContentApplyVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupContentApplyVC.swift; sourceTree = "<group>"; };
        137D2C352B8F5B8E001E34BF /* WorldCupContentApplyVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupContentApplyVC.xib; sourceTree = "<group>"; };
        137D2C382B8F5F67001E34BF /* WorldCupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupModel.swift; sourceTree = "<group>"; };
        137D2C3A2B8F630F001E34BF /* WorldCupContentApplyInputVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupContentApplyInputVC.swift; sourceTree = "<group>"; };
        137D2C3B2B8F630F001E34BF /* WorldCupContentApplyInputVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupContentApplyInputVC.xib; sourceTree = "<group>"; };
        13801CBD2A4D20D20041454D /* ChooseStoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseStoreView.swift; sourceTree = "<group>"; };
        13801CBF2A4D20DB0041454D /* ChooseStoreView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChooseStoreView.xib; sourceTree = "<group>"; };
        13801CC22A4D26D90041454D /* CommonSingleTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonSingleTCell.swift; sourceTree = "<group>"; };
@@ -443,6 +493,8 @@
        138D8B912A4000D2009DCA9E /* YardTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YardTCell.swift; sourceTree = "<group>"; };
        138D8B922A4000D2009DCA9E /* YardTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = YardTCell.xib; sourceTree = "<group>"; };
        138ED7972AF3A5BE0001F2EF /* CustomPointAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPointAnnotationView.swift; sourceTree = "<group>"; };
        13921BFE2B8C838700BED781 /* FindItemCCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindItemCCell.swift; sourceTree = "<group>"; };
        13921BFF2B8C838700BED781 /* FindItemCCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FindItemCCell.xib; sourceTree = "<group>"; };
        1393B3902A4ACDB200B73072 /* CourseExerciseSubListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseExerciseSubListVC.swift; sourceTree = "<group>"; };
        1393B3912A4ACDB200B73072 /* CourseExerciseSubListVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseExerciseSubListVC.xib; sourceTree = "<group>"; };
        1393B3942A4AD03A00B73072 /* CourseExerciseTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseExerciseTCell.swift; sourceTree = "<group>"; };
@@ -479,6 +531,9 @@
        13B6BB9C2ABAE000006D0C0E /* SignUpCourseVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SignUpCourseVC.xib; sourceTree = "<group>"; };
        13B6BB9F2ABAE44E006D0C0E /* CourseSignUpTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseSignUpTCell.swift; sourceTree = "<group>"; };
        13B6BBA02ABAE44E006D0C0E /* CourseSignUpTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseSignUpTCell.xib; sourceTree = "<group>"; };
        13BBFBBD2B8CAE440027A17A /* WorldCupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupVC.swift; sourceTree = "<group>"; };
        13BBFBBF2B8CB00F0027A17A /* WorldCupHeaderVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupHeaderVC.swift; sourceTree = "<group>"; };
        13BBFBC02B8CB00F0027A17A /* WorldCupHeaderVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupHeaderVC.xib; sourceTree = "<group>"; };
        13BEEAE42A4D8DFB00685667 /* WelfareExchangeRecordListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelfareExchangeRecordListVC.swift; sourceTree = "<group>"; };
        13BEEAE62A4D927100685667 /* WelfareExchangeRecordSubListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelfareExchangeRecordSubListVC.swift; sourceTree = "<group>"; };
        13BEEAE82A4D92A200685667 /* ExchangeRecordTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExchangeRecordTCell.swift; sourceTree = "<group>"; };
@@ -517,6 +572,15 @@
        13EAF3862AB442A4000A6F07 /* GamesDataSourceTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GamesDataSourceTCell.xib; sourceTree = "<group>"; };
        13EC6DDA2A493D23009FC09A /* WelfareCoinCCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelfareCoinCCell.swift; sourceTree = "<group>"; };
        13EC6DDB2A493D23009FC09A /* WelfareCoinCCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WelfareCoinCCell.xib; sourceTree = "<group>"; };
        13ECD42C2B8DD82C00187EE9 /* WorldCupTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupTCell.swift; sourceTree = "<group>"; };
        13ECD42D2B8DD82C00187EE9 /* WorldCupTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupTCell.xib; sourceTree = "<group>"; };
        13F88AFB2B8F29F10055317B /* StudentInfo_4_TCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentInfo_4_TCell.swift; sourceTree = "<group>"; };
        13F88AFC2B8F29F10055317B /* StudentInfo_4_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StudentInfo_4_TCell.xib; sourceTree = "<group>"; };
        13F88AFF2B8F3DA80055317B /* WorldCupIntroVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupIntroVC.swift; sourceTree = "<group>"; };
        13F88B032B8F46EA0055317B /* WorldCupListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupListVC.swift; sourceTree = "<group>"; };
        13F88B042B8F46EA0055317B /* WorldCupListVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupListVC.xib; sourceTree = "<group>"; };
        13F88B082B8F4A0B0055317B /* WorldCupHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCupHeadView.swift; sourceTree = "<group>"; };
        13F88B0A2B8F4A1A0055317B /* WorldCupHeadView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WorldCupHeadView.xib; sourceTree = "<group>"; };
        13FB93B82A5C028D009F558A /* FinanceTrafer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinanceTrafer.swift; sourceTree = "<group>"; };
        13FBB8D42A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStoreDetailFeedbackVC.swift; sourceTree = "<group>"; };
        13FBB8D52A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchStoreDetailFeedbackVC.xib; sourceTree = "<group>"; };
@@ -687,6 +751,15 @@
                13D7D6222A4EBBCF000136BD /* SearchStoreTCell.xib */,
                136B63962A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.swift */,
                136B63972A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.xib */,
                13477DC82B8CA1C1002E69FB /* MyQRCodeTCell.swift */,
                13477DC92B8CA1C1002E69FB /* MyQRCodeTCell.xib */,
                13ECD42C2B8DD82C00187EE9 /* WorldCupTCell.swift */,
                13ECD42D2B8DD82C00187EE9 /* WorldCupTCell.xib */,
                1324D3592B8DE5EA00F168A8 /* WorldCupRecordTCell.swift */,
                1324D35A2B8DE5EA00F168A8 /* WorldCupRecordTCell.xib */,
                13426D612B8F0CFE0032338B /* WorldCupRankTCell.swift */,
                13F88AFB2B8F29F10055317B /* StudentInfo_4_TCell.swift */,
                13F88AFC2B8F29F10055317B /* StudentInfo_4_TCell.xib */,
            );
            path = TCell;
            sourceTree = "<group>";
@@ -733,6 +806,7 @@
            isa = PBXGroup;
            children = (
                1375464A2A581716001FA77A /* HomeModel.swift */,
                137D2C382B8F5F67001E34BF /* WorldCupModel.swift */,
            );
            path = Model;
            sourceTree = "<group>";
@@ -906,8 +980,19 @@
                13EC6DDB2A493D23009FC09A /* WelfareCoinCCell.xib */,
                136FD9AB2A4C2F0500933B7C /* RechargeItemCCell.swift */,
                136FD9AC2A4C2F0500933B7C /* RechargeItemCCell.xib */,
                13921BFE2B8C838700BED781 /* FindItemCCell.swift */,
                13921BFF2B8C838700BED781 /* FindItemCCell.xib */,
            );
            path = CCell;
            sourceTree = "<group>";
        };
        13F88B072B8F49F20055317B /* View */ = {
            isa = PBXGroup;
            children = (
                13F88B082B8F4A0B0055317B /* WorldCupHeadView.swift */,
                13F88B0A2B8F4A1A0055317B /* WorldCupHeadView.xib */,
            );
            path = View;
            sourceTree = "<group>";
        };
        13FB93B72A5C0270009F558A /* Category */ = {
@@ -1261,6 +1346,7 @@
        8DFA9B812A31729000E99281 /* Home */ = {
            isa = PBXGroup;
            children = (
                13F88B072B8F49F20055317B /* View */,
                137546492A58170A001FA77A /* Model */,
                8D4905A62A31A6D400E38513 /* CCell */,
                8DFA9B822A3172A300E99281 /* VC */,
@@ -1275,6 +1361,8 @@
                8DFA9B842A3172BE00E99281 /* HomeVC.xib */,
                8D4905AB2A31AE7100E38513 /* JoinMemberIntroduceVC.swift */,
                8D4905AC2A31AE7100E38513 /* JoinMemberIntroduceVC.xib */,
                13F88B032B8F46EA0055317B /* WorldCupListVC.swift */,
                13F88B042B8F46EA0055317B /* WorldCupListVC.xib */,
            );
            path = VC;
            sourceTree = "<group>";
@@ -1369,6 +1457,7 @@
                13BEEAE62A4D927100685667 /* WelfareExchangeRecordSubListVC.swift */,
                133A61812A4E6FF70066C4E6 /* WelfareExchangeRecordDetailVC.swift */,
                133A61822A4E6FF70066C4E6 /* WelfareExchangeRecordDetailVC.xib */,
                13F88AFF2B8F3DA80055317B /* WorldCupIntroVC.swift */,
            );
            path = VC;
            sourceTree = "<group>";
@@ -1398,6 +1487,21 @@
                130E40242A4EC029003A3D75 /* SearchStoreDetailVC.swift */,
                13FBB8D42A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.swift */,
                13FBB8D52A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.xib */,
                13477DC02B8C9F28002E69FB /* MeQRCodeVC.swift */,
                13477DC12B8C9F28002E69FB /* MeQRCodeVC.xib */,
                13BBFBBD2B8CAE440027A17A /* WorldCupVC.swift */,
                13BBFBBF2B8CB00F0027A17A /* WorldCupHeaderVC.swift */,
                13BBFBC02B8CB00F0027A17A /* WorldCupHeaderVC.xib */,
                13675FF62B8CBDD400085A66 /* WorldCupMenuVC.swift */,
                13675FF82B8CC05D00085A66 /* WorldCupContentVC.swift */,
                1324D3552B8DE4CA00F168A8 /* WorldCupRecordVC.swift */,
                1324D3572B8DE50000F168A8 /* WorldCupRankVC.swift */,
                13426D652B8F20AB0032338B /* WorldCupContentDetailVC.swift */,
                13426D662B8F20AB0032338B /* WorldCupContentDetailVC.xib */,
                137D2C342B8F5B8E001E34BF /* WorldCupContentApplyVC.swift */,
                137D2C352B8F5B8E001E34BF /* WorldCupContentApplyVC.xib */,
                137D2C3A2B8F630F001E34BF /* WorldCupContentApplyInputVC.swift */,
                137D2C3B2B8F630F001E34BF /* WorldCupContentApplyInputVC.xib */,
            );
            path = VC;
            sourceTree = "<group>";
@@ -1483,6 +1587,7 @@
                13B6BBA22ABAE44E006D0C0E /* CourseSignUpTCell.xib in Resources */,
                13EAF3882AB442A4000A6F07 /* GamesDataSourceTCell.xib in Resources */,
                139A39EE2A41349800737AFB /* YardBookingTCell.xib in Resources */,
                13ECD42F2B8DD82C00187EE9 /* WorldCupTCell.xib in Resources */,
                8DA51DFC2A32C6D00085F4BA /* StoresChooseView.xib in Resources */,
                138D8B942A4000D2009DCA9E /* YardTCell.xib in Resources */,
                8D6810EC2A3710D8004486DE /* StudentChooseView.xib in Resources */,
@@ -1490,7 +1595,9 @@
                131732BB2A405EF800F722AF /* CalendarDateTimeTCell.xib in Resources */,
                8D5732BE2A3724A900B2F8E3 /* AddStudentVC.xib in Resources */,
                136FD9B22A4C354000933B7C /* WelfareRedeemGoodsDetailVC.xib in Resources */,
                13F88B0B2B8F4A1A0055317B /* WorldCupHeadView.xib in Resources */,
                1394B95A2B047A1B00937CC6 /* LogOffVC.xib in Resources */,
                1324D35C2B8DE5EA00F168A8 /* WorldCupRecordTCell.xib in Resources */,
                13272DCD2A40076900AC6481 /* YardBookingTimeView.xib in Resources */,
                1304B85D2A4EB0F8000D4F2E /* SearchBannerCCell.xib in Resources */,
                136FD9AE2A4C2F0500933B7C /* RechargeItemCCell.xib in Resources */,
@@ -1498,6 +1605,7 @@
                8D79A59B2A3967A90029874B /* StudentUpdateInfoView.xib in Resources */,
                1387B6722A4AC9C000BF2F2E /* CourseBookingTCell.xib in Resources */,
                137B86712AB3F87800C4D01B /* GamesPayView.xib in Resources */,
                13BBFBC22B8CB00F0027A17A /* WorldCupHeaderVC.xib in Resources */,
                13A501972A4D772F00FF6763 /* CoinStoreHeadView.xib in Resources */,
                8DC99C8A2A3701D800D0F04E /* CouponChooseView.xib in Resources */,
                137801872A3B01FA00414959 /* ActivitySignupDetailVC.xib in Resources */,
@@ -1525,12 +1633,15 @@
                13B6BB9E2ABAE000006D0C0E /* SignUpCourseVC.xib in Resources */,
                138D4CFC2A47ECAC005233E7 /* CourseInfoScheduleVC.xib in Resources */,
                1393B3972A4AD03A00B73072 /* CourseExerciseTCell.xib in Resources */,
                13F88AFE2B8F29F10055317B /* StudentInfo_4_TCell.xib in Resources */,
                13D084572A406672005B05D5 /* CalendarPickerView.xib in Resources */,
                8D8400DB2A2F1432003AF6A2 /* Assets.xcassets in Resources */,
                8DFA9B862A3172BE00E99281 /* HomeVC.xib in Resources */,
                13A7F72D2AB7E0EC000B3436 /* CourseEXPVC.xib in Resources */,
                13477DC32B8C9F28002E69FB /* MeQRCodeVC.xib in Resources */,
                13EAF3822AB43657000A6F07 /* GamesIntruduceView.xib in Resources */,
                8DFA9B922A317DE900E99281 /* WelfareVC.xib in Resources */,
                13F88B062B8F46EA0055317B /* WorldCupListVC.xib in Resources */,
                13B640C12A54108B00EA33ED /* UploadImgCCell.xib in Resources */,
                8D8DEDF32A31DDC500F2C7FA /* CouponCCell.xib in Resources */,
                138D8B8F2A3FFE36009DCA9E /* YardListVC.xib in Resources */,
@@ -1549,10 +1660,12 @@
                8DF184412A3327EE0095687B /* Common_1_CCell.xib in Resources */,
                13A501922A4D6EA600FF6763 /* CoinStoreCCell.xib in Resources */,
                8D6D58D52A3997250003CFE6 /* StoresInfoView.xib in Resources */,
                13477DCB2B8CA1C1002E69FB /* MyQRCodeTCell.xib in Resources */,
                8D5C150C2A31885B00A8BCC9 /* CommonAlertView.xib in Resources */,
                1376A6A22A4A7E1E00D4C851 /* CourseChargeTCell.xib in Resources */,
                13D7D6242A4EBBCF000136BD /* SearchStoreTCell.xib in Resources */,
                1393B3932A4ACDB200B73072 /* CourseExerciseSubListVC.xib in Resources */,
                13426D682B8F20AB0032338B /* WorldCupContentDetailVC.xib in Resources */,
                130CE4542A4823AC00394384 /* StudentMedalCCell.xib in Resources */,
                8D5B80B72A31C4C700B86520 /* PaymentView.xib in Resources */,
                139A39F42A41388200737AFB /* WelfareFreeVC.xib in Resources */,
@@ -1568,8 +1681,11 @@
                13CCC4BD2A4A820100DEDF19 /* StudentCourseDetailHeadView.xib in Resources */,
                8D5C150D2A31885B00A8BCC9 /* AgreentView.xib in Resources */,
                130EC1822AD3F6C0003CA9BA /* CommonAlertSheetView.xib in Resources */,
                137D2C3D2B8F630F001E34BF /* WorldCupContentApplyInputVC.xib in Resources */,
                137D2C372B8F5B8E001E34BF /* WorldCupContentApplyVC.xib in Resources */,
                1304B8562A4EAA81000D4F2E /* CustomerContentDetailVC.xib in Resources */,
                137801A42A3C644200414959 /* CourseVideoDetailVC.xib in Resources */,
                13921C012B8C838700BED781 /* FindItemCCell.xib in Resources */,
                8D630BF92A31801300F0B7A8 /* SearchVC.xib in Resources */,
                8D6810E82A370EFB004486DE /* CouponTCell.xib in Resources */,
                8D6D6AF32A32D6F800DCA2C6 /* CourseListVC.xib in Resources */,
@@ -1661,6 +1777,7 @@
                8DC3BE112A3803B500C91B7F /* ActivityListVC.swift in Sources */,
                1378018A2A3B08A600414959 /* CourseOnlineListVC.swift in Sources */,
                13D7BA8F2A4BC3E90007E4B7 /* CommonSingleImgCCell.swift in Sources */,
                13426D632B8F0CFE0032338B /* WorldCupRankTCell.swift in Sources */,
                131732B72A405DED00F722AF /* YardDetailDateTimeVC.swift in Sources */,
                13D084552A40666A005B05D5 /* CalendarPickerView.swift in Sources */,
                8DF184442A332CCD0095687B /* StudentInfoTCell.swift in Sources */,
@@ -1678,8 +1795,10 @@
                8DFA9B762A316E9A00E99281 /* LoginRegOrForgotVC.swift in Sources */,
                132876622A49A18700FC9122 /* StudentExchangeVC.swift in Sources */,
                13EAF3802AB4364F000A6F07 /* GamesIntruduceView.swift in Sources */,
                137D2C3C2B8F630F001E34BF /* WorldCupContentApplyInputVC.swift in Sources */,
                8D6810EA2A3710CE004486DE /* StudentChooseView.swift in Sources */,
                1384F6DF2AB97E5700A8B620 /* ExperienceCourseVC.swift in Sources */,
                13ECD42E2B8DD82C00187EE9 /* WorldCupTCell.swift in Sources */,
                13CCC4BB2A4A81F900DEDF19 /* StudentCourseDetailHeadView.swift in Sources */,
                13FBB8D62A4ED96C00FF70DB /* SearchStoreDetailFeedbackVC.swift in Sources */,
                8DFA9B8B2A317DAA00E99281 /* CourseVC.swift in Sources */,
@@ -1687,6 +1806,7 @@
                1387B6662A4AB66300BF2F2E /* CourseBookingListVC.swift in Sources */,
                8DAEB54E2A305A0100814766 /* Colors.swift in Sources */,
                132876682A49A4CB00FC9122 /* StudentReportVC.swift in Sources */,
                13426D672B8F20AB0032338B /* WorldCupContentDetailVC.swift in Sources */,
                133A61882A4E7A200066C4E6 /* CustomerSubListVC.swift in Sources */,
                137B866F2AB3F87000C4D01B /* GamesPayView.swift in Sources */,
                1350BF172ADFD1D9007FC49F /* RatingBar.swift in Sources */,
@@ -1718,10 +1838,12 @@
                8DAEB5522A305B2D00814766 /* Fronts.swift in Sources */,
                13B6BB9D2ABAE000006D0C0E /* SignUpCourseVC.swift in Sources */,
                138D4CFB2A47ECAC005233E7 /* CourseInfoScheduleVC.swift in Sources */,
                13F88B002B8F3DA80055317B /* WorldCupIntroVC.swift in Sources */,
                13272DD02A4034A300AC6481 /* YardDetailVC.swift in Sources */,
                1347D1BA2AB4457A0052082A /* GamesDataSourceSubListVC.swift in Sources */,
                8D8DEDED2A31D82100F2C7FA /* PaymentResultVC.swift in Sources */,
                8D6810E72A370EFB004486DE /* CouponTCell.swift in Sources */,
                13675FF92B8CC05D00085A66 /* WorldCupContentVC.swift in Sources */,
                133E22402AFB85330045B544 /* CustomPointAnnotation.swift in Sources */,
                133A618C2A4E7AF90066C4E6 /* CustomerContentTCell.swift in Sources */,
                1387B66C2A4AC61F00BF2F2E /* CourseBookingFuncView.swift in Sources */,
@@ -1731,11 +1853,14 @@
                8D7D87172A380970003209D6 /* ActivityInfoTCell.swift in Sources */,
                8D5C150E2A31885B00A8BCC9 /* CommonAlertView.swift in Sources */,
                139A39F62A4139E000737AFB /* WelfareWeeklyListVC.swift in Sources */,
                1324D3562B8DE4CA00F168A8 /* WorldCupRecordVC.swift in Sources */,
                133435032A40407200F23951 /* CalendarItemCCell.swift in Sources */,
                13CE11D42AF25C6400F6ACA4 /* UCCateDecorationView.swift in Sources */,
                8D7017892A3308DC00473C40 /* Common_1_TCell.swift in Sources */,
                13D7BA922A4BCE480007E4B7 /* WelfareBillListVC.swift in Sources */,
                1376A6A12A4A7E1E00D4C851 /* CourseChargeTCell.swift in Sources */,
                13BBFBBE2B8CAE440027A17A /* WorldCupVC.swift in Sources */,
                137D2C392B8F5F67001E34BF /* WorldCupModel.swift in Sources */,
                13AFABC12A4AE3DC001FEA16 /* StudentRemarkListVC.swift in Sources */,
                8D6D58D12A39906F0003CFE6 /* ActivitySignupListSubVC.swift in Sources */,
                134BD50A2A5FF72900786819 /* OBSUploader.swift in Sources */,
@@ -1749,6 +1874,7 @@
                134BD52D2A6008BA00786819 /* YYPaymentResultModel.swift in Sources */,
                13B640C02A54108B00EA33ED /* UploadImgCCell.swift in Sources */,
                130E40262A4EC029003A3D75 /* SearchStoreDetailVC.swift in Sources */,
                1324D3582B8DE50000F168A8 /* WorldCupRankVC.swift in Sources */,
                1394B9592B047A1B00937CC6 /* LogOffVC.swift in Sources */,
                1347D1BC2AB448C20052082A /* CourseUnAssignView.swift in Sources */,
                13DA7D4F2AAF03F90085ABF9 /* CommonScanQRCodeVC.swift in Sources */,
@@ -1782,6 +1908,7 @@
                133A61832A4E6FF70066C4E6 /* WelfareExchangeRecordDetailVC.swift in Sources */,
                1378019F2A3BF98900414959 /* CourseOnlineTCell.swift in Sources */,
                8DCF25BA2A38136D00DC6899 /* CityChooseSubTypeView.swift in Sources */,
                13477DC22B8C9F28002E69FB /* MeQRCodeVC.swift in Sources */,
                8D2BCD3E2A3847F600A360C6 /* ActivityDetailApplyVC.swift in Sources */,
                8DFA9B852A3172BE00E99281 /* HomeVC.swift in Sources */,
                13D7BA982A4BD9040007E4B7 /* WelfareCouponsListVC.swift in Sources */,
@@ -1790,9 +1917,11 @@
                8DFA9B912A317DE900E99281 /* WelfareVC.swift in Sources */,
                8D6D58D32A39970C0003CFE6 /* StoresInfoView.swift in Sources */,
                139A39FD2A413C7900737AFB /* WelfareWeeklySubListVC.swift in Sources */,
                137D2C362B8F5B8E001E34BF /* WorldCupContentApplyVC.swift in Sources */,
                13D7BA952A4BD4760007E4B7 /* BillInfoTCell.swift in Sources */,
                130CE4532A4823AC00394384 /* StudentMedalCCell.swift in Sources */,
                1378018D2A3B0BBD00414959 /* CourseOnlineHeadView.swift in Sources */,
                13BBFBC12B8CB00F0027A17A /* WorldCupHeaderVC.swift in Sources */,
                1393B3922A4ACDB200B73072 /* CourseExerciseSubListVC.swift in Sources */,
                1304B8512A4EA5ED000D4F2E /* CustomerContentQATCell.swift in Sources */,
                13801CC72A4D294D0041454D /* ChooseNumberView.swift in Sources */,
@@ -1803,6 +1932,8 @@
                1319386B2AC2EC8300FC63F1 /* WeChatTools.swift in Sources */,
                13801CBE2A4D20D20041454D /* ChooseStoreView.swift in Sources */,
                137801932A3B0D3C00414959 /* CourseOnlineCCell.swift in Sources */,
                13675FF72B8CBDD400085A66 /* WorldCupMenuVC.swift in Sources */,
                1324D35B2B8DE5EA00F168A8 /* WorldCupRecordTCell.swift in Sources */,
                136FD9AD2A4C2F0500933B7C /* RechargeItemCCell.swift in Sources */,
                8D630BFB2A3180B000F0B7A8 /* BaseTabBarVC.swift in Sources */,
                137801862A3B01FA00414959 /* ActivitySignupDetailVC.swift in Sources */,
@@ -1811,16 +1942,21 @@
                13BEEAE72A4D927100685667 /* WelfareExchangeRecordSubListVC.swift in Sources */,
                138D8B932A4000D2009DCA9E /* YardTCell.swift in Sources */,
                1304B8552A4EAA81000D4F2E /* CustomerContentDetailVC.swift in Sources */,
                13F88AFD2B8F29F10055317B /* StudentInfo_4_TCell.swift in Sources */,
                135772AC2AB1B11400EA3544 /* YardBookingDetailVC.swift in Sources */,
                1378019B2A3BF5C000414959 /* CourseOnlineSubListVC.swift in Sources */,
                13477DCA2B8CA1C1002E69FB /* MyQRCodeTCell.swift in Sources */,
                13A501962A4D772F00FF6763 /* CoinStoreHeadView.swift in Sources */,
                13D606B42A4C29C2004F2A7A /* RechargeCenterVC.swift in Sources */,
                8DAEB5502A305AEF00814766 /* Def.swift in Sources */,
                13F88B092B8F4A0B0055317B /* WorldCupHeadView.swift in Sources */,
                8D8400D42A2F1430003AF6A2 /* SceneDelegate.swift in Sources */,
                13F88B052B8F46EA0055317B /* WorldCupListVC.swift in Sources */,
                138D4CFF2A47EF4C005233E7 /* CourseDatetimeCCell.swift in Sources */,
                139A39FA2A413C6500737AFB /* WelfareWeeklyTCell.swift in Sources */,
                8DA51DF72A32BE270085F4BA /* Enums.swift in Sources */,
                130E402A2A4EC33C003A3D75 /* SearchStoreDetailHeadView.swift in Sources */,
                13921C002B8C838700BED781 /* FindItemCCell.swift in Sources */,
                134A750A2A5D0D64006D14AE /* RefreshModel.swift in Sources */,
                1304B8582A4EAEBA000D4F2E /* CommonBannerView.swift in Sources */,
                8D86DE852A3307A400A754EF /* CourseSubTypeView.swift in Sources */,
WanPai/AppDelegate.swift
@@ -14,114 +14,109 @@
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var orientation:UIInterfaceOrientationMask = .portrait
                var window: UIWindow?
                var orientation:UIInterfaceOrientationMask = .portrait
                func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
                                sleep(2)
                                Services.startNetworkMonitor()
                                YYPaymentManager.shared.configuredWeChat(appID: WeChatAPPID, universalLink: WechatUniversalLinks)
                                YYPaymentManager.shared.configuredAlipay(appScheme: APPScheme)
                                AMapServices.shared().enableHTTPS = true
                                AMapServices.shared().apiKey = AMapKey
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        sleep(2)
        Services.startNetworkMonitor()
        YYPaymentManager.shared.configuredWeChat(appID: WeChatAPPID, universalLink: WechatUniversalLinks)
        YYPaymentManager.shared.configuredAlipay(appScheme: APPScheme)
        AMapServices.shared().enableHTTPS = true
        AMapServices.shared().apiKey = AMapKey
        Services.querySystemImg(type: .launch).subscribe(onNext: {data in
            if let img = data.data{
                SDWebImageDownloader.shared.downloadImage(with: URL(string: img)) { image, _, _, _ in
                    if let img = image{
                        LaunchImageHelper.changeAllLaunchImageToLandscape(img)
                    }
                                Services.querySystemImg(type: .launch).subscribe(onNext: {data in
                                                if let img = data.data{
                                                                SDWebImageDownloader.shared.downloadImage(with: URL(string: img)) { image, _, _, _ in
                                                                                if let img = image{
                                                                                                LaunchImageHelper.changeAllLaunchImageToLandscape(img)
                                                                                }
                                                                }
                                                }
                                }).disposed(by: JQ_disposeBag)
                                return true
                }
            }
        }).disposed(by: JQ_disposeBag)
        return true
    }
    // MARK: UISceneSession Lifecycle
                // MARK: UISceneSession Lifecycle
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
                func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
                                return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
                }
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
                func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .pad{
            return .all
        }else{
            return orientation
        }
    }
                }
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        print("---->")
        return YYPaymentManager.shared.handleApplication(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
    }
                func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
                                if UIDevice.current.userInterfaceIdiom == .pad{
                                                return .all
                                }else{
                                                return orientation
                                }
                }
    func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
        print("---->1")
        return YYPaymentManager.shared.handleApplication(application, handleOpen: url)
    }
                func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
                                print("---->")
                                return YYPaymentManager.shared.handleApplication(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
                }
    // NOTE: 9.0以后使用新API接口
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        print("---->2")
        return YYPaymentManager.shared.handleApplication(app, open: url, options: options)
    }
                func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
                                print("---->1")
                                return YYPaymentManager.shared.handleApplication(application, handleOpen: url)
                }
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        print("---->3")
        return YYPaymentManager.shared.handleApplication(userActivity)
    }
                // NOTE: 9.0以后使用新API接口
                func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
                                print("---->2")
                                return YYPaymentManager.shared.handleApplication(app, open: url, options: options)
                }
                func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
                                print("---->3")
                                return YYPaymentManager.shared.handleApplication(userActivity)
                }
}
extension AppDelegate{
    func registerAndLoginSuccess(){
        let snapView = sceneDelegate?.window?.snapshotView(afterScreenUpdates: true)
                func registerAndLoginSuccess(){
                                let snapView = sceneDelegate?.window?.snapshotView(afterScreenUpdates: true)
        let tabBar = BaseTabBarVC()
        let homeNav = BaseNav(rootViewController: HomeVC())
        homeNav.tabBarItem = UITabBarItem(title: "加入玩湃", image: UIImage(named: "tabbar_home"), selectedImage: UIImage(named: "tabbar_home_s")!.withRenderingMode(.alwaysOriginal))
                                let tabBar = BaseTabBarVC()
                                let homeNav = BaseNav(rootViewController: HomeVC())
                                homeNav.tabBarItem = UITabBarItem(title: "加入玩湃", image: UIImage(named: "tabbar_home"), selectedImage: UIImage(named: "tabbar_home_s")!.withRenderingMode(.alwaysOriginal))
        let clouseNav = BaseNav(rootViewController: CourseVC())
        clouseNav.tabBarItem = UITabBarItem(title: "玩湃运动营", image: UIImage(named: "tabbar_course"), selectedImage: UIImage(named: "tabbar_course_s")!.withRenderingMode(.alwaysOriginal))
                                let clouseNav = BaseNav(rootViewController: CourseVC())
                                clouseNav.tabBarItem = UITabBarItem(title: "玩湃运动营", image: UIImage(named: "tabbar_course"), selectedImage: UIImage(named: "tabbar_course_s")!.withRenderingMode(.alwaysOriginal))
        let welfareVCNav = BaseNav(rootViewController: WelfareVC())
        welfareVCNav.tabBarItem = UITabBarItem(title: "使用福利", image: UIImage(named: "tabbar_welfare"), selectedImage: UIImage(named: "tabbar_welfare_s")!.withRenderingMode(.alwaysOriginal))
                                let welfareVCNav = BaseNav(rootViewController: WelfareVC())
                                welfareVCNav.tabBarItem = UITabBarItem(title: "使用福利", image: UIImage(named: "tabbar_welfare"), selectedImage: UIImage(named: "tabbar_welfare_s")!.withRenderingMode(.alwaysOriginal))
        let searchVCNav = BaseNav(rootViewController: SearchVC())
        searchVCNav.tabBarItem = UITabBarItem(title: "搜索玩湃", image: UIImage(named: "tabbar_search"), selectedImage: UIImage(named: "tabbar_search_s")!.withRenderingMode(.alwaysOriginal))
        tabBar.viewControllers = [homeNav,clouseNav,welfareVCNav,searchVCNav]
        sceneDelegate?.window?.rootViewController = tabBar
        sceneDelegate?.window?.rootViewController?.view.addSubview(snapView!)
        sceneDelegate?.window?.makeKeyAndVisible()
                                let searchVCNav = BaseNav(rootViewController: SearchVC())
                                searchVCNav.tabBarItem = UITabBarItem(title: "搜索玩湃", image: UIImage(named: "tabbar_search"), selectedImage: UIImage(named: "tabbar_search_s")!.withRenderingMode(.alwaysOriginal))
                                tabBar.viewControllers = [homeNav,clouseNav,welfareVCNav,searchVCNav]
                                sceneDelegate?.window?.rootViewController = tabBar
                                sceneDelegate?.window?.rootViewController?.view.addSubview(snapView!)
                                sceneDelegate?.window?.makeKeyAndVisible()
        UIView.animate(withDuration: 1.5) {
            snapView?.alpha = 0
            snapView?.transform3D = CATransform3DMakeScale(1.5, 1.5, 1.5)
        } completion: { _ in
            snapView?.removeFromSuperview()
        }
                                UIView.animate(withDuration: 1.5) {
                                                snapView?.alpha = 0
                                                snapView?.transform3D = CATransform3DMakeScale(1.5, 1.5, 1.5)
                                } completion: { _ in
                                                snapView?.removeFromSuperview()
                                }
//        YYSocketManager.instance.startSocket(host: Socket_Url, port: 8888)
    }
                                //        YYSocketManager.instance.startSocket(host: Socket_Url, port: 8888)
                }
    func needLogin(){
        UserViewModel.clearToken()
        UserDefaults.standard.setValue(nil, forKey: "currentStuId")
        if JQ_currentViewController() is LoginVC{return}
        let loginNav = LoginNav(rootViewController: LoginVC())
        loginNav.modalPresentationStyle = .fullScreen
        JQ_currentViewController().present(loginNav, animated: true)
    }
                func needLogin(){
                                UserViewModel.clearToken()
                                UserDefaults.standard.setValue(nil, forKey: "currentStuId")
                                if JQ_currentViewController() is LoginVC{return}
                                let loginNav = LoginNav(rootViewController: LoginVC())
                                loginNav.modalPresentationStyle = .fullScreen
                                JQ_currentViewController().present(loginNav, animated: true)
                }
}
WanPai/Assets.xcassets/Bg/bg_long.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "bg_long@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "bg_long@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Bg/bg_long.imageset/bg_long@2x.png
WanPai/Assets.xcassets/Bg/bg_long.imageset/bg_long@3x.png
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "btn_exchange3@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "btn_exchange@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/btn_exchange3@2x.png
WanPai/Assets.xcassets/Btns/btn_exchange.imageset/btn_exchange@3x.png
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "btn_setting_find@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "btn_setting_find@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/btn_setting_find@2x.png
WanPai/Assets.xcassets/Btns/btn_setting_find.imageset/btn_setting_find@3x.png
WanPai/Assets.xcassets/Icons/icon_age.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_age@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "icon_age@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/icon_age.imageset/icon_age@2x.png
WanPai/Assets.xcassets/Icons/icon_age.imageset/icon_age@3x.png
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_hot_1@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "icon_hot_1@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/icon_hot_1@2x.png
WanPai/Assets.xcassets/Icons/icon_hot_1.imageset/icon_hot_1@3x.png
WanPai/Assets.xcassets/Icons/icon_reset.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_reset@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "icon_reset@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/icon_reset.imageset/icon_reset@2x.png
WanPai/Assets.xcassets/Icons/icon_reset.imageset/icon_reset@3x.png
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_time_1@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "icon_time_1@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/icon_time_1@2x.png
WanPai/Assets.xcassets/Icons/icon_time_1.imageset/icon_time_1@3x.png
WanPai/Assets.xcassets/Icons/icon_winner.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_winner@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "icon_winner@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/icon_winner.imageset/icon_winner@2x.png
WanPai/Assets.xcassets/Icons/icon_winner.imageset/icon_winner@3x.png
WanPai/Assets.xcassets/Icons/rank_1.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "rank_1@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "rank_1@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/rank_1.imageset/rank_1@2x.png
WanPai/Assets.xcassets/Icons/rank_1.imageset/rank_1@3x.png
WanPai/Assets.xcassets/Icons/rank_2.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "rank_2@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "rank_2@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/rank_2.imageset/rank_2@2x.png
WanPai/Assets.xcassets/Icons/rank_2.imageset/rank_2@3x.png
WanPai/Assets.xcassets/Icons/rank_3.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "rank_3@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "rank_3@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
WanPai/Assets.xcassets/Icons/rank_3.imageset/rank_3@2x.png
WanPai/Assets.xcassets/Icons/rank_3.imageset/rank_3@3x.png
WanPai/Common/VC/CommonWebVC.swift
@@ -10,91 +10,91 @@
class CommonWebVC: BaseVC, WKNavigationDelegate {
    private var type:AgreentType!
    private var content:String!
    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var cons_webHeight: NSLayoutConstraint!
    @IBOutlet weak var view_btns: UIView!
    init(type:AgreentType,content:String? = nil) {
        super.init(nibName: nil, bundle: nil)
        self.type = type
        self.content = content
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        view_btns.isHidden = true
        webView.navigationDelegate = self
                private var type:AgreentType!
                private var content:String!
                @IBOutlet weak var webView: WKWebView!
                @IBOutlet weak var cons_webHeight: NSLayoutConstraint!
                @IBOutlet weak var view_btns: UIView!
        if type != .other{
            title = type.titleStr
            Services.queryProtocol(type,progress: false).subscribe(onNext: {[weak self] result in
                if let text = result.data?.jq_wrapHtml(){
                    self?.webView.loadHTMLString(text, baseURL: nil)
                init(type:AgreentType,content:String? = nil) {
                                super.init(nibName: nil, bundle: nil)
                                self.type = type
                                self.content = content
                }
            }).disposed(by: disposeBag)
        }else{
            webView.loadHTMLString(content?.jq_wrapHtml() ?? "", baseURL: nil)
        }
    }
    override func setRx() {
        webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in
            if let size = size{
                return size.height
            }
            return nil
        }.subscribe(onNext: { [unowned self](height) in
            if let height = height{
                self.cons_webHeight.constant = height
            }
        }).disposed(by: disposeBag)
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                view_btns.isHidden = true
                                webView.navigationDelegate = self
    @IBAction func readAction(_ sender: UIButton) {
        switch type {
            case .user:
                UserDefaults.standard.set(object: true, forKey: "agreent_2")
                UserDefaults.standard.synchronize()
            case .safe:
                UserDefaults.standard.set(object: true, forKey: "agreent_3")
                UserDefaults.standard.synchronize()
            case .privacy:
                UserDefaults.standard.set(object: true, forKey: "agreent_1")
                UserDefaults.standard.synchronize()
            default:break
        }
        navigationController?.popViewController()
    }
                                if type != .other{
                                                title = type.titleStr
                                                Services.queryProtocol(type,progress: false).subscribe(onNext: {[weak self] result in
                                                                if let text = result.data?.jq_wrapHtml(){
                                                                                self?.webView.loadHTMLString(text, baseURL: nil)
                                                                }
                                                }).disposed(by: disposeBag)
                                }else{
                                                webView.loadHTMLString(content?.jq_wrapHtml() ?? "", baseURL: nil)
                                }
                }
    @IBAction func cancelAction(_ sender: UIButton) {
        navigationController?.popViewController()
    }
                override func setRx() {
                                webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in
                                                if let size = size{
                                                                return size.height
                                                }
                                                return nil
                                }.subscribe(onNext: { [unowned self](height) in
                                                if let height = height{
                                                                self.cons_webHeight.constant = height
                                                }
                                }).disposed(by: disposeBag)
                }
                @IBAction func readAction(_ sender: UIButton) {
                                switch type {
                                                case .user:
                                                                UserDefaults.standard.set(object: true, forKey: "agreent_2")
                                                                UserDefaults.standard.synchronize()
                                                case .safe:
                                                                UserDefaults.standard.set(object: true, forKey: "agreent_3")
                                                                UserDefaults.standard.synchronize()
                                                case .privacy:
                                                                UserDefaults.standard.set(object: true, forKey: "agreent_1")
                                                                UserDefaults.standard.synchronize()
                                                default:break
                                }
                                navigationController?.popViewController()
                }
                @IBAction func cancelAction(_ sender: UIButton) {
                                navigationController?.popViewController()
                }
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .darkContent
    }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .darkContent
                }
                override var shouldAutorotate: Bool{
                                return false
                }
    override var shouldAutorotate: Bool{
        return false
    }
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        switch type {
            case .user,.safe,.privacy:
                view_btns.isHidden = false
                navigationItem.leftBarButtonItem = UIBarButtonItem()
            default:
                view_btns.isHidden = true
        }
    }
                func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
                                switch type {
                                                case .user,.safe,.privacy:
                                                                view_btns.isHidden = false
                                                                navigationItem.leftBarButtonItem = UIBarButtonItem()
                                                default:
                                                                view_btns.isHidden = true
                                }
                }
}
WanPai/Config/Def.swift
@@ -10,6 +10,7 @@
import JQTools
import SVProgressHUD
import QMUIKit
import OSLog
let SHAKEY = "BT7NPhA0f775uzcUuftWjCE1TYZlWmHZ"
let WechatUniversalLinks = "https://www.weparklife.com/"
@@ -25,269 +26,287 @@
let locationTool = JQ_LocationTool.instance()
var sceneDelegate:SceneDelegate? = {
    var uiScreen:UIScene?
    UIApplication.shared.connectedScenes.forEach { scenes in
        uiScreen = scenes
    }
    return (uiScreen?.delegate as? SceneDelegate)
                var uiScreen:UIScene?
                UIApplication.shared.connectedScenes.forEach { scenes in
                                uiScreen = scenes
                }
                return (uiScreen?.delegate as? SceneDelegate)
}()
func LogSuccess(_ items:Any...,separator:String=" ",file:String=#file,function:String=#function,line:Int=#line){
#if DEBUG
    let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
    print("✅✅✅ SUCCESS: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                if #available(iOS 14.0, *) {
                                let logger = Logger(subsystem: "WanPai", category: function)
                                logger.error("\(items)")
                }else{
                                let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
                                print("✅✅✅ SUCCESS: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                }
#endif
}
func LogError(_ items:Any...,separator:String=" ",file:String=#file,function:String=#function,line:Int=#line){
#if DEBUG
    let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
    print("❌❌❌ ERROR: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                if #available(iOS 14.0, *) {
                                let logger = Logger(subsystem: "WanPai", category: function)
                                logger.error("\(items)")
                }else{
                                let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
                                print("❌❌❌ ERROR: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                }
#endif
}
func LogInfo(_ items:Any...,separator:String=" ",file:String=#file,function:String=#function,line:Int=#line){
#if DEBUG
    let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
    print("⚠️⚠️⚠️INFO: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                if #available(iOS 14.0, *) {
                                let logger = Logger(subsystem: "WanPai", category: function)
                                logger.error("\(items)")
                }else{
                                let file = (file as NSString).lastPathComponent.split(separator: ".").first!;
                                print("⚠️⚠️⚠️INFO: \(file)  \(function) [Line: \(line)]: \(items)",separator);
                }
#endif
}
func LogResponse(_ items:Any...,separator:String=" ",file:String=#file,function:String=#function,line:Int=#line){
#if DEBUG
    print("返回数据")
    print(items);
                print("返回数据")
                print(items);
#endif
}
    //提示框
//提示框
func alert(msg: String) {
    SVProgressHUD.showInfo(withStatus: msg)
                SVProgressHUD.showInfo(withStatus: msg)
}
func alertError(msg:String){
    SVProgressHUD.showError(withStatus: msg)
                SVProgressHUD.showError(withStatus: msg)
}
func alertSuccess(msg:String){
    SVProgressHUD.showSuccess(withStatus: msg)
                SVProgressHUD.showSuccess(withStatus: msg)
}
func showHUD(_ text:String? = nil){
    SVProgressHUD.show(withStatus: text)
                SVProgressHUD.show(withStatus: text)
}
func hiddenHUD(_ delay:TimeInterval? = nil){
    if delay != nil{
        SVProgressHUD.dismiss(withDelay: delay!)
    }else{
        SVProgressHUD.dismiss()
    }
                if delay != nil{
                                SVProgressHUD.dismiss(withDelay: delay!)
                }else{
                                SVProgressHUD.dismiss()
                }
}
extension UIButton {
    func localGradientColor(cornerRadius:Double,bounds:CGRect? = nil){
        self.layer.sublayers?.removeAll(where: {$0 is CAGradientLayer})
        self.jq_gradientColor(colorArr: [UIColor(hexStr: "#FD8802").cgColor,UIColor(hexStr: "#FE7703").cgColor], cornerRadius: cornerRadius, startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0, y: 1), bounds: bounds)
    }
                func localGradientColor(cornerRadius:Double,bounds:CGRect? = nil){
                                self.layer.sublayers?.removeAll(where: {$0 is CAGradientLayer})
                                self.jq_gradientColor(colorArr: [UIColor(hexStr: "#FD8802").cgColor,UIColor(hexStr: "#FE7703").cgColor], cornerRadius: cornerRadius, startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0, y: 1), bounds: bounds)
                }
    public func openCountDown(_ t:Int = 59,defultTitle:String = "获取验证码"){
        var time = t //倒计时时间
        let queue = DispatchQueue.global()
        let timer = DispatchSource.makeTimerSource(flags: [], queue: queue)
        timer.schedule(wallDeadline: DispatchWallTime.now(), repeating: .seconds(1));
        timer.setEventHandler(handler: {
            if time <= 0 {
                timer.cancel()
                DispatchQueue.main.async(execute: {
                    self.setTitle(defultTitle, for: .normal)
                    self.setTitleColor(UIColor(hexStr: "#63BDDB"), for: .normal)
                    self.isUserInteractionEnabled = true
                });
            }else {
                DispatchQueue.main.async(execute: {
                    self.setTitle("\(time)s", for: .normal)
                    self.setTitleColor(UIColor.gray, for: .normal)
                    self.isUserInteractionEnabled = false
                });
            }
            time -= 1
        });
        timer.resume()
    }
                public func openCountDown(_ t:Int = 59,defultTitle:String = "获取验证码"){
                                var time = t //倒计时时间
                                let queue = DispatchQueue.global()
                                let timer = DispatchSource.makeTimerSource(flags: [], queue: queue)
                                timer.schedule(wallDeadline: DispatchWallTime.now(), repeating: .seconds(1));
                                timer.setEventHandler(handler: {
                                                if time <= 0 {
                                                                timer.cancel()
                                                                DispatchQueue.main.async(execute: {
                                                                                self.setTitle(defultTitle, for: .normal)
                                                                                self.setTitleColor(UIColor(hexStr: "#63BDDB"), for: .normal)
                                                                                self.isUserInteractionEnabled = true
                                                                });
                                                }else {
                                                                DispatchQueue.main.async(execute: {
                                                                                self.setTitle("\(time)s", for: .normal)
                                                                                self.setTitleColor(UIColor.gray, for: .normal)
                                                                                self.isUserInteractionEnabled = false
                                                                });
                                                }
                                                time -= 1
                                });
                                timer.resume()
                }
}
func jumpPage(model:String,page:String = "",type:String = "",id:Int? = nil){
    var storeModel:NormalSimpleModel?
    if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
        if let deserModel = HomeStoreModel.deserialize(from: storeStr){
            storeModel = NormalSimpleModel(id: deserModel.storeId, name: deserModel.name)
        }
    }
    switch model {
        case "加入会员":
            if page == "成为会员"{
                let vc = JoinMemberIntroduceVC()
                JQ_currentViewController().jq_push(vc:vc)
            }
        case "首页banner":
            if page == "成为会员"{
                let vc = JoinMemberIntroduceVC()
                JQ_currentViewController().jq_push(vc:vc)
            }
        case "首页":
            if page == "常见问题"{
                JQ_currentViewController().jq_push(vc: CustomerListVC(page: 1))
            }
            ///===============
        case "加入玩湃":
            if page == "主页"{
                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                    JQ_currentViewController().tabBarController?.selectedIndex = 0
                var storeModel:NormalSimpleModel?
                if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
                                if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                                                storeModel = NormalSimpleModel(id: deserModel.storeId, name: deserModel.name)
                                }
                }
            }
            if page == "课程列表"{
                if type == "详情"{
                    JQ_currentViewController().jq_push(vc: CourseDetailVC(id:id ?? 0))
                }else{
                    JQ_currentViewController().jq_push(vc: CourseListVC(selectStore: storeModel))
                }
            }
            if page == "赛事活动列表"{
                if type == "详情"{
                    JQ_currentViewController().jq_push(vc: ActivityDetailVC(id: id ?? 0))
                }else{
                    JQ_currentViewController().jq_push(vc: ActivityListVC())
                }
            }
                switch model {
                                case "加入会员":
                                                if page == "成为会员"{
                                                                let vc = JoinMemberIntroduceVC()
                                                                JQ_currentViewController().jq_push(vc:vc)
                                                }
            if page == "线上课得积分"{
                if type == "详情"{
                    let vc = CourseVideoDetailVC(id: id ?? 0)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }else if type == "列表"{
                    let vc = CourseOnlineSubListVC(classificationId: id ?? 0)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }else if type == "主页"{
                    let vc = CourseOnlineListVC(position: 1)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }
            }
                                case "首页banner":
                                                if page == "成为会员"{
                                                                let vc = JoinMemberIntroduceVC()
                                                                JQ_currentViewController().jq_push(vc:vc)
                                                }
                                case "首页":
                                                if page == "常见问题"{
                                                                JQ_currentViewController().jq_push(vc: CustomerListVC(page: 1))
                                                }
                                                ///===============
            if page == "看视频得奖励"{
                if type == "详情"{
                    let vc = CourseVideoDetailVC(id: id ?? 0)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }else if type == "列表"{
                    let vc = CourseOnlineSubListVC(classificationId: id ?? 0)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }else if type == "主页"{
                    let vc = CourseOnlineListVC(position: 2)
                    vc.title = page
                    JQ_currentViewController().jq_push(vc: vc)
                }
            }
            if page == "预约场地"{
                if type == "详情"{
                    JQ_currentViewController().jq_push(vc: YardDetailVC(id: id ?? 0))
                }else{
                    JQ_currentViewController().jq_push(vc: YardListVC(selectStore: storeModel))
                }
            }
                                case "加入玩湃":
                                                if page == "主页"{
                                                                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                                JQ_currentViewController().tabBarController?.selectedIndex = 0
                                                                }
                                                }
            if page == "智慧球场"{
                JQ_currentViewController().jq_push(vc: GamesVC())
            }
                                                if page == "课程列表"{
                                                                if type == "详情"{
                                                                                JQ_currentViewController().jq_push(vc: CourseDetailVC(id:id ?? 0))
                                                                }else{
                                                                                JQ_currentViewController().jq_push(vc: CourseListVC(selectStore: storeModel))
                                                                }
                                                }
            if page == "成为会员"{
                JQ_currentViewController().jq_push(vc: JoinMemberIntroduceVC())
            }
                                                if page == "赛事活动列表"{
                                                                if type == "详情"{
                                                                                JQ_currentViewController().jq_push(vc: ActivityDetailVC(id: id ?? 0))
                                                                }else{
                                                                                JQ_currentViewController().jq_push(vc: ActivityListVC())
                                                                }
                                                }
        case "开始课程":
            if page == "主页"{
                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                    JQ_currentViewController().tabBarController?.selectedIndex = 1
                }
            }
                                                if page == "线上课得积分"{
                                                                if type == "详情"{
                                                                                let vc = CourseVideoDetailVC(id: id ?? 0)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }else if type == "列表"{
                                                                                let vc = CourseOnlineSubListVC(classificationId: id ?? 0)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }else if type == "主页"{
                                                                                let vc = CourseOnlineListVC(position: 1)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }
                                                }
        case "使用福利":
            if page == "主页"{
                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                    JQ_currentViewController().tabBarController?.selectedIndex = 2
                }
            }
                                                if page == "看视频得奖励"{
                                                                if type == "详情"{
                                                                                let vc = CourseVideoDetailVC(id: id ?? 0)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }else if type == "列表"{
                                                                                let vc = CourseOnlineSubListVC(classificationId: id ?? 0)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }else if type == "主页"{
                                                                                let vc = CourseOnlineListVC(position: 2)
                                                                                vc.title = page
                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                }
                                                }
            if page == "充值中心"{
                JQ_currentViewController().jq_push(vc: RechargeCenterVC())
            }
                                                if page == "预约场地"{
                                                                if type == "详情"{
                                                                                JQ_currentViewController().jq_push(vc: YardDetailVC(id: id ?? 0))
                                                                }else{
                                                                                JQ_currentViewController().jq_push(vc: YardListVC(selectStore: storeModel))
                                                                }
                                                }
            if page == "积分商城"{
                if type == "主页"{
                    JQ_currentViewController().jq_push(vc: CoinStoreCenterVC())
                }
                if type == "指定商品"{
                    JQ_currentViewController().jq_push(vc: WelfareRedeemGoodsDetailVC(commodityId: id ?? 0, goodsType:nil))
                }
            }
                                                if page == "智慧球场"{
                                                                JQ_currentViewController().jq_push(vc: GamesVC())
                                                }
            if page == "本周福利"{
                if type == "限时折扣(主页)"{
                    JQ_currentViewController().jq_push(vc: WelfareWeeklyListVC(page: 0))
                }
                if type == "赠送课时(主页)"{
                    JQ_currentViewController().jq_push(vc: WelfareWeeklyListVC(page: 1))
                }
                if type == "指定折扣"{
                    JQ_currentViewController().jq_push(vc: WelfareWeeklyDetailVC(id: id ?? 0))
                }
            }
                                                if page == "成为会员"{
                                                                JQ_currentViewController().jq_push(vc: JoinMemberIntroduceVC())
                                                }
        case "探索玩湃":
            if page == "门店列表"{
                let vc = SearchStoreListVC()
                JQ_currentViewController().jq_push(vc: vc)
//                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
//                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
//                    JQ_currentViewController().tabBarController?.selectedIndex = 3
//                }
            }
                                                if page == "社区世界杯"{
                                                                JQ_currentViewController().jq_push(vc: WorldCupListVC())
                                                }
            if page == "常见问题"{
                if type == "列表"{
                    JQ_currentViewController().jq_push(vc: CustomerListVC(page: 1))
                }
                if type == "详情"{
                    JQ_currentViewController().jq_push(vc: CustomerContentDetailVC(id: id ?? 0, type: .QA))
                }
            }
                                case "开始课程":
                                                if page == "主页"{
                                                                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                                JQ_currentViewController().tabBarController?.selectedIndex = 1
                                                                }
                                                }
            if page == "公告发布"{
                if type == "列表"{
                    JQ_currentViewController().jq_push(vc: CustomerListVC(page: 0))
                                case "使用福利":
                                                if page == "主页"{
                                                                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                                JQ_currentViewController().tabBarController?.selectedIndex = 2
                                                                }
                                                }
                                                if page == "充值中心"{
                                                                JQ_currentViewController().jq_push(vc: RechargeCenterVC())
                                                }
                                                if page == "积分商城"{
                                                                if type == "主页"{
                                                                                JQ_currentViewController().jq_push(vc: CoinStoreCenterVC())
                                                                }
                                                                if type == "指定商品"{
                                                                                JQ_currentViewController().jq_push(vc: WelfareRedeemGoodsDetailVC(commodityId: id ?? 0, goodsType:nil))
                                                                }
                                                }
                                                if page == "本周福利"{
                                                                if type == "限时折扣(主页)"{
                                                                                JQ_currentViewController().jq_push(vc: WelfareWeeklyListVC(page: 0))
                                                                }
                                                                if type == "赠送课时(主页)"{
                                                                                JQ_currentViewController().jq_push(vc: WelfareWeeklyListVC(page: 1))
                                                                }
                                                                if type == "指定折扣"{
                                                                                JQ_currentViewController().jq_push(vc: WelfareWeeklyDetailVC(id: id ?? 0))
                                                                }
                                                }
                                case "探索玩湃":
                                                if page == "门店列表"{
                                                                let vc = SearchStoreListVC()
                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                //                JQ_currentViewController().navigationController?.popToRootViewController(animated: true)
                                                                //                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                //                    JQ_currentViewController().tabBarController?.selectedIndex = 3
                                                                //                }
                                                }
                                                if page == "常见问题"{
                                                                if type == "列表"{
                                                                                JQ_currentViewController().jq_push(vc: CustomerListVC(page: 1))
                                                                }
                                                                if type == "详情"{
                                                                                JQ_currentViewController().jq_push(vc: CustomerContentDetailVC(id: id ?? 0, type: .QA))
                                                                }
                                                }
                                                if page == "公告发布"{
                                                                if type == "列表"{
                                                                                JQ_currentViewController().jq_push(vc: CustomerListVC(page: 0))
                                                                }
                                                                if type == "详情"{
                                                                                JQ_currentViewController().jq_push(vc: CustomerContentDetailVC(id: id ?? 0, type: .notice))
                                                                }
                                                }
                                default:break
                }
                if type == "详情"{
                    JQ_currentViewController().jq_push(vc: CustomerContentDetailVC(id: id ?? 0, type: .notice))
                }
            }
        default:break
    }
}
WanPai/Config/Enums.swift
@@ -1,450 +1,453 @@
    //
    //  Enums.swift
    //  WanPai
    //
    //  Created by 杨锴 on 2023/6/9.
    //
//
//  Enums.swift
//  WanPai
//
//  Created by 杨锴 on 2023/6/9.
//
import Foundation
import HandyJSON
enum BannerPositionType:Int{
        /// 首页
    case homeTop = 1
        ///线上课得积分
    case onlineCourse = 2
        ///看视频得奖励
    case video = 3
        ///常见问题
    case qusition = 4
                /// 首页
                case homeTop = 1
                ///线上课得积分
                case onlineCourse = 2
                ///看视频得奖励
                case video = 3
                ///常见问题
                case qusition = 4
}
    /// 登录类型
/// 登录类型
enum LoginType{
    case pwd,smsCode
                case pwd,smsCode
}
    /// 支付方式
/// 支付方式
enum PayType:Int,HandyJSONEnum{
    case free = 0 //特殊状态:免费
    case wechat = 1
    case aliPay = 2
    case coin = 3
    case courseNum = 4
    case integral = 5
                case free = 0 //特殊状态:免费
                case wechat = 1
                case aliPay = 2
                case coin = 3
                case courseNum = 4
                case integral = 5
}
enum PayStateType:Int,HandyJSONEnum{
    case unPayment = 1
    case paymented = 2
                case unPayment = 1
                case paymented = 2
}
enum ItemType{
    case course
    case activity
                case course
                case activity
}
    /// 获取短信验证码类型
/// 获取短信验证码类型
enum GetSMSCodeType:Int{
    case login = 1
    case register = 2
    case updatePwd = 3
    case forgotPwd = 4
                case login = 1
                case register = 2
                case updatePwd = 3
                case forgotPwd = 4
    var titleStr:String{
        switch self {
            case .login:
                return "登录"
            case .register:
                return "注册"
            case .updatePwd:
                return "修改密码"
            case .forgotPwd:
                return "忘记密码"
        }
    }
                var titleStr:String{
                                switch self {
                                                case .login:
                                                                return "登录"
                                                case .register:
                                                                return "注册"
                                                case .updatePwd:
                                                                return "修改密码"
                                                case .forgotPwd:
                                                                return "忘记密码"
                                }
                }
}
enum AgreentType:Int {
    case user = 1
    case safe = 3
    case privacy = 2
    case other = 4
    case matchStore = 5
    case useStore = 6
                case user = 1
                case safe = 3
                case privacy = 2
                case other = 4
                case matchStore = 5
                case useStore = 6
    var titleStr:String{
        switch self{
            case .privacy:return "隐私协议"
            case .safe:return "运动安全告知书"
            case .user:return "用户协议"
            case .matchStore:return "参与门店"
            case .other:return ""
            case .useStore:return "可用门店"
        }
    }
                var titleStr:String{
                                switch self{
                                                case .privacy:return "隐私协议"
                                                case .safe:return "运动安全告知书"
                                                case .user:return "用户协议"
                                                case .matchStore:return "参与门店"
                                                case .other:return ""
                                                case .useStore:return "可用门店"
                                }
                }
}
enum SystemImgType:Int{
    case notStudent = 1
    case becomeVip = 2
    case myCoupon = 3
    case shoppingOnline = 4
    case welfareWeekly = 5
    case freeToday = 6
    case launch = 7
                case notStudent = 1
                case becomeVip = 2
                case myCoupon = 3
                case shoppingOnline = 4
                case welfareWeekly = 5
                case freeToday = 6
                case launch = 7
}
enum HomeItemType:Int,HandyJSONEnum{
    case none = 0
        ///报名玩湃运动营
    case course = 1
        ///预约场地
    case booking = 2
        ///报名赛事及活动
    case activity = 3
        ///免费福利
    case welfare = 4
        ///线上运动营积分
    case coin = 5
        ///购买优惠门票
    case ticket = 6
        /// 看视频得奖励
    case video = 7
        ///智慧球场
    case wisdomCourt = 8
                ///世界杯
                case worldcup = 0
                ///报名玩湃运动营
                case course = 1
                ///预约场地
                case booking = 2
                ///报名赛事及活动
                case activity = 3
                ///免费福利
                case welfare = 4
                ///线上运动营积分
                case coin = 5
                ///购买优惠门票
                case ticket = 6
                /// 看视频得奖励
                case video = 7
                ///智慧球场
                case wisdomCourt = 8
    var defaultImg:UIImage{
        switch self {
            case .none:
                return UIImage()
            case .course:
                return UIImage(named: "b_1")!
            case .booking:
                return UIImage(named: "b_5")!
            case .activity:
                return UIImage(named: "b_2")!
            case .welfare:
                return UIImage(named: "b_6")!
            case .coin:
                return UIImage(named: "b_4")!
            case .ticket:
                return UIImage(named: "b_8")!
            case .video:
                return UIImage(named: "b_3")!
            case .wisdomCourt:
                return UIImage(named: "b_7")!
        }
    }
                case nothing = -999
                var defaultImg:UIImage{
                                switch self {
                                                case .course:
                                                                return UIImage(named: "b_1")!
                                                case .booking:
                                                                return UIImage(named: "b_5")!
                                                case .activity:
                                                                return UIImage(named: "b_2")!
                                                case .welfare:
                                                                return UIImage(named: "b_6")!
                                                case .coin:
                                                                return UIImage(named: "b_4")!
                                                case .ticket:
                                                                return UIImage(named: "b_8")!
                                                case .video:
                                                                return UIImage(named: "b_3")!
                                                case .wisdomCourt:
                                                                return UIImage(named: "b_7")!
                                                default:
                                                                return UIImage()
                                }
                }
}
enum SortType:String{
    case asc = "asc"
    case desc = "desc"
    case def = "icon_sort_normal"
                case asc = "asc"
                case desc = "desc"
                case def = "icon_sort_normal"
    var img:UIImage{
        switch self{
            case .asc:return UIImage(named: "icon_asc")!
            case .desc:return UIImage(named: "icon_desc")!
            case .def:return UIImage(named: "icon_sort_normal")!
        }
    }
                var img:UIImage{
                                switch self{
                                                case .asc:return UIImage(named: "icon_asc")!
                                                case .desc:return UIImage(named: "icon_desc")!
                                                case .def:return UIImage(named: "icon_sort_normal")!
                                }
                }
}
enum Sort2Type:Int,HandyJSONEnum{
        //1积分高到低 2积分从低到高 3兑换从高到低
    case coinAsc = 1
    case coinDesc = 2
    case exAsc = 3
    case exDesc = 4
                //1积分高到低 2积分从低到高 3兑换从高到低
                case coinAsc = 1
                case coinDesc = 2
                case exAsc = 3
                case exDesc = 4
}
enum GenderType:Int,HandyJSONEnum{
    case  man = 1
    case  woman = 2
                case  man = 1
                case  woman = 2
}
enum PaymentType:Int,HandyJSONEnum{
    case cash = 1 //现金
    case coin = 2 //玩湃币
    case cashCoin = 3 //现金 + 币
                case cash = 1 //现金
                case coin = 2 //玩湃币
                case cashCoin = 3 //现金 + 币
}
enum CouponType:Int,HandyJSONEnum{
    case none = 0
        ///满减券
    case discount = 1
        /// 代金券
    case voucher = 2
        /// 体验券
    case experience = 3
                case none = 0
                ///满减券
                case discount = 1
                /// 代金券
                case voucher = 2
                /// 体验券
                case experience = 3
    var rawTitle:String{
        switch self {
            case .none:return ""
            case .discount:return "满减券"
            case .voucher:return "代金券"
            case .experience:return "体验券"
        }
    }
                var rawTitle:String{
                                switch self {
                                                case .none:return ""
                                                case .discount:return "满减券"
                                                case .voucher:return "代金券"
                                                case .experience:return "体验券"
                                }
                }
}
enum RegisterAcitivyType:Int,HandyJSONEnum{
        /// 全部用户
    case allUser = 1
        /// 仅限年度会员参与
    case vip = 2
        ///仅限学员参与
    case student = 3
                /// 全部用户
                case allUser = 1
                /// 仅限年度会员参与
                case vip = 2
                ///仅限学员参与
                case student = 3
    var strTitle:String{
        switch self {
            case .allUser:return "全部用户"
            case .vip:return "仅限年度会员"
            case .student:return "仅限运动营成员"
        }
    }
                var strTitle:String{
                                switch self {
                                                case .allUser:return "全部用户"
                                                case .vip:return "仅限年度会员"
                                                case .student:return "仅限运动营成员"
                                }
                }
}
    /// 我的报名活动赛事
/// 我的报名活动赛事
enum SignupType:Int,HandyJSONEnum{
        ///全部
    case all = 0
        ///未开始
    case prepare = 1
        /// 进行中
    case ongoing = 2
        /// 已结束
    case over = 3
        /// 已取消
    case cancel = 4
                ///全部
                case all = 0
                ///未开始
                case prepare = 1
                /// 进行中
                case ongoing = 2
                /// 已结束
                case over = 3
                /// 已取消
                case cancel = 4
    var rawTitle:String{
        switch self {
            case .all:return ""
            case .prepare:return "未开始"
            case .ongoing:return "进行中"
            case .over:return "已结束"
            case .cancel:return "已取消"
        }
    }
                var rawTitle:String{
                                switch self {
                                                case .all:return ""
                                                case .prepare:return "未开始"
                                                case .ongoing:return "进行中"
                                                case .over:return "已结束"
                                                case .cancel:return "已取消"
                                }
                }
}
enum YardBookingType:Int,HandyJSONEnum{
    case none = -1
    case waitPayment = 0
    case pending = 1
    case inStore = 2
    case complete = 3
    case overdue = 4
    case cancel = 5
                case none = -1
                case waitPayment = 0
                case pending = 1
                case inStore = 2
                case complete = 3
                case overdue = 4
                case cancel = 5
    var titleRaw:String{
        switch self {
            case .waitPayment:return "待支付"
            case .pending:return "待核销"
            case .inStore:return "已核销"
            case .complete:return "已完成"
            case .overdue:return "已过期"
            case .cancel:return "已取消"
            case .none:return ""
        }
    }
                var titleRaw:String{
                                switch self {
                                                case .waitPayment:return "待支付"
                                                case .pending:return "待核销"
                                                case .inStore:return "已核销"
                                                case .complete:return "已完成"
                                                case .overdue:return "已过期"
                                                case .cancel:return "已取消"
                                                case .none:return ""
                                }
                }
}
enum CouponConditionType:Int,HandyJSONEnum{
    case nationwide = 1 //全国
    case city = 2 //城市
    case store = 3 // 门店
                case nationwide = 1 //全国
                case city = 2 //城市
                case store = 3 // 门店
    var titleRaw:String{
        switch self {
            case .nationwide:return "全国通用"
            case .city:return "指定城市可用"
            case .store:return "指定门店可用"
        }
    }
                var titleRaw:String{
                                switch self {
                                                case .nationwide:return "全国通用"
                                                case .city:return "指定城市可用"
                                                case .store:return "指定门店可用"
                                }
                }
}
enum CouponUseType:Int,HandyJSONEnum{
    case unused = 1
    case used = 2
    case overdue = 3
                case unused = 1
                case used = 2
                case overdue = 3
}
enum ExchangeType:Int,HandyJSONEnum{
        //商品类型 1实物 2课包 3门票 4优惠券
    case goods = 1
    case course = 2
    case ticket = 3
    case coupon = 4
                //商品类型 1实物 2课包 3门票 4优惠券
                case goods = 1
                case course = 2
                case ticket = 3
                case coupon = 4
    var strTitle:String{
        switch self {
            case .goods:return "实体"
            case .coupon:return "优惠券"
            case .course:return "运动营"
            case .ticket:return "门票"
        }
    }
                var strTitle:String{
                                switch self {
                                                case .goods:return "实体"
                                                case .coupon:return "优惠券"
                                                case .course:return "运动营"
                                                case .ticket:return "门票"
                                }
                }
}
enum ExchangePaymentType:Int,HandyJSONEnum{
    case coin = 1
    case cashAndCoin = 2
    case cash = 3
                case coin = 1
                case cashAndCoin = 2
                case cash = 3
}
enum UseStateType:Int,HandyJSONEnum{
    case used = 1
    case unUsed = 2
    case expired = 3
                case used = 1
                case unUsed = 2
                case expired = 3
    var strTitle:String{
        switch self{
            case .used:return "已使用"
            case .unUsed:return "待使用"
            case .expired:return "已过期"
        }
    }
                var strTitle:String{
                                switch self{
                                                case .used:return "已使用"
                                                case .unUsed:return "待使用"
                                                case .expired:return "已过期"
                                }
                }
}
enum DetailType:Int,HandyJSONEnum{
    case minus = 1 //正数
    case positive = 2 //负数
                case minus = 1 //正数
                case positive = 2 //负数
}
enum StudentAppointType:Int,HandyJSONEnum{
    case pedding = 1
    case begining = 2
    case complete = 3
    case cancel = 4
    case leave = 5
    case truant = 6
                case pedding = 1
                case begining = 2
                case complete = 3
                case cancel = 4
                case leave = 5
                case truant = 6
    var strTitle:String{
        switch self{
            case .pedding:return "待上课"
            case .begining:return "已开始"
            case .complete:return "已完成"
            case .cancel:return "已取消"
            case .leave:return "已请假"
            case .truant:return "旷课"
        }
    }
                var strTitle:String{
                                switch self{
                                                case .pedding:return "待上课"
                                                case .begining:return "已开始"
                                                case .complete:return "已完成"
                                                case .cancel:return "已取消"
                                                case .leave:return "已请假"
                                                case .truant:return "旷课"
                                }
                }
}
enum StudentAppointTypeList:Int{
    case all = 0
    case pedding = 1
    case complete = 2
    case cancel = 3
                case all = 0
                case pedding = 1
                case complete = 2
                case cancel = 3
}
enum StudentAppointDateType:Int,HandyJSONEnum{
    case all = 0
    case week = 1
    case month = 2
    case year = 3
                case all = 0
                case week = 1
                case month = 2
                case year = 3
}
enum MedalType:Int,HandyJSONEnum{
    case club = 1
    case sport = 2
    case communtiy = 3
    case deepPlayer = 4
    case more = 5
                case club = 1
                case sport = 2
                case communtiy = 3
                case deepPlayer = 4
                case more = 5
    var image:UIImage{
        switch self {
            case .club:return UIImage(named: "icon_coupon_1")!
            case .sport:return UIImage(named: "icon_coupon_2")!
            case .communtiy:return UIImage(named: "icon_coupon_3")!
            case .deepPlayer:return UIImage(named: "icon_coupon_4")!
            case .more:return UIImage(named: "icon_coupon_6")!
        }
    }
                var image:UIImage{
                                switch self {
                                                case .club:return UIImage(named: "icon_coupon_1")!
                                                case .sport:return UIImage(named: "icon_coupon_2")!
                                                case .communtiy:return UIImage(named: "icon_coupon_3")!
                                                case .deepPlayer:return UIImage(named: "icon_coupon_4")!
                                                case .more:return UIImage(named: "icon_coupon_6")!
                                }
                }
    var title_en:String{
        switch self {
            case .club:return "COURSE"
            case .sport:return "EVENTS"
            case .communtiy:return "ON_LINE"
            case .deepPlayer:return "APPOINTMENT"
            case .more:return "MORE"
        }
    }
                var title_en:String{
                                switch self {
                                                case .club:return "COURSE"
                                                case .sport:return "EVENTS"
                                                case .communtiy:return "ON_LINE"
                                                case .deepPlayer:return "APPOINTMENT"
                                                case .more:return "MORE"
                                }
                }
    var title:String{
        switch self {
            case .club:return "俱乐部之星"
            case .sport:return "运动大人"
            case .communtiy:return "社区之王"
            case .deepPlayer:return "深度玩家"
            case .more:return "更多"
        }
    }
                var title:String{
                                switch self {
                                                case .club:return "俱乐部之星"
                                                case .sport:return "运动大人"
                                                case .communtiy:return "社区之王"
                                                case .deepPlayer:return "深度玩家"
                                                case .more:return "更多"
                                }
                }
    /**
                /**
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_1"), t1: "COURSE", t2: "俱乐部之星"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_2"), t1: "EVENTS", t2: "运动大人"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_3"), t1: "ON_LINE", t2: "社区之王"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_4"), t1: "APPOINTMENT", t2: "深度玩家"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_5"), t1: "EVENTS", t2: "月度冠军"))
     mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_6"), t1: "MORE", t2: "更多"))*/
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_1"), t1: "COURSE", t2: "俱乐部之星"))
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_2"), t1: "EVENTS", t2: "运动大人"))
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_3"), t1: "ON_LINE", t2: "社区之王"))
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_4"), t1: "APPOINTMENT", t2: "深度玩家"))
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_5"), t1: "EVENTS", t2: "月度冠军"))
                    mentals.append(MentalInfo(img: UIImage(named: "icon_coupon_6"), t1: "MORE", t2: "更多"))*/
}
enum CourseType:Int,HandyJSONEnum{
    case none = 0
    case normal = 1
    case vocation = 2
    case experience = 3
                case none = 0
                case normal = 1
                case vocation = 2
                case experience = 3
    var strTitle:String{
        switch self {
            case .normal: return "常规班"
            case .vocation:return "假期班"
            case .experience:return "体验课"
            default:return ""
        }
    }
                var strTitle:String{
                                switch self {
                                                case .normal: return "常规班"
                                                case .vocation:return "假期班"
                                                case .experience:return "体验课"
                                                default:return ""
                                }
                }
}
enum CardType:Int,HandyJSONEnum{
    case none = 0
    case subCard = 1
    case monthCard = 2
    case quarterCard = 3
    case yearCard = 4
                case none = 0
                case subCard = 1
                case monthCard = 2
                case quarterCard = 3
                case yearCard = 4
    var strTitle:String{
        switch self {
            case .subCard: return "日卡"
            case .monthCard:return "月卡"
            case .quarterCard:return "季卡"
            case .yearCard:return "年卡"
            default:return ""
        }
    }
                var strTitle:String{
                                switch self {
                                                case .subCard: return "日卡"
                                                case .monthCard:return "月卡"
                                                case .quarterCard:return "季卡"
                                                case .yearCard:return "年卡"
                                                default:return ""
                                }
                }
}
enum ScanType:Int,HandyJSONEnum{
    case games = 1000 //游戏
    case course = 1001 //运动营
    case yard = 1002 //场地
                case games = 1000 //游戏
                case course = 1001 //运动营
                case yard = 1002 //场地
}
WanPai/Model/CommonModels.swift
@@ -1,954 +1,963 @@
    //
    //  CommonModels.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/7/7.
    //
//
//  CommonModels.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/7/7.
//
import HandyJSON
struct CourseItemModel:HandyJSON{
    var id = 0
    var storeName = ""
    var name = ""
    var coverDrawing = ""
    var classStartTime = [String]()
    var applicantsNumber = 0
    var payType:PaymentType = .cash
    var originalPrice:Double = 0
    var vipPrice:Double = 0
    var paymentPrice:Double = 0
    var playPaiCoin:Int = 0
    var distance:Double = 0
                var id = 0
                var storeName = ""
                var name = ""
                var coverDrawing = ""
                var classStartTime = [String]()
                var applicantsNumber = 0
                var payType:PaymentType = .cash
                var originalPrice:Double = 0
                var vipPrice:Double = 0
                var paymentPrice:Double = 0
                var playPaiCoin:Int = 0
                var distance:Double = 0
}
struct SignUpCourseItemModel:HandyJSON{
    var coursePackageId = 0
    var coursePayId = 0
    var packageImg = ""
    var courseNameStore = ""
    var courseTime = ""
    var courseTeacher = ""
    var courseNums = 0
    var payStatus:PayStateType = .unPayment
    var coursePackTypeId = 0
    var type:CourseType = .normal
    var orderId:Int = 0
                var coursePackageId = 0
                var coursePayId = 0
                var packageImg = ""
                var courseNameStore = ""
                var courseTime = ""
                var courseTeacher = ""
                var courseNums = 0
                var payStatus:PayStateType = .unPayment
                var coursePackTypeId = 0
                var type:CourseType = .normal
                var orderId:Int = 0
}
struct SignUpCourseItemDetailModel:HandyJSON{
    var amount: Int = 0
    var coursePackageId: Int = 0
    var coursePackageName: String = ""
    var coursePayId: Int = 0
    var courseTimeFrame: String = ""
    var coverDrawing: String = ""
    var introduceDrawing: String = ""
    var payStatus: PayStateType = .paymented // 1:未支付,2:续课
    var vipAmount: Int = 0
    var weeks: String = ""
    var wpGold: Int = 0
    var paymentPrice:Double = 0
    var time = ""
    var list = [CourseDetailListModel]()
    var chooseHours = 0
                var amount: Int = 0
                var coursePackageId: Int = 0
                var coursePackageName: String = ""
                var coursePayId: Int = 0
                var courseTimeFrame: String = ""
                var coverDrawing: String = ""
                var introduceDrawing: String = ""
                var payStatus: PayStateType = .paymented // 1:未支付,2:续课
                var vipAmount: Int = 0
                var weeks: String = ""
                var wpGold: Int = 0
                var paymentPrice:Double = 0
                var time = ""
                var list = [CourseDetailListModel]()
                var chooseHours = 0
    var payType:PayType = .aliPay
    var payPrice:Double = 0
    var orinPrice:Double = 0
    var coinPrice:Int = 0
    var stuIds = [Int]()
                var payType:PayType = .aliPay
                var payPrice:Double = 0
                var orinPrice:Double = 0
                var coinPrice:Int = 0
                var stuIds = [Int]()
}
struct CourseDetailModel:HandyJSON {
    var coverDrawing: String = ""
    var detailDrawing: String = ""
    var distance: Double = 0
    var id: Int = 0
    var introduceDrawing: String = ""
    var lat: String = ""
    var list = [CourseDetailListModel]()
    var lon: String = ""
    var name: String = ""
    var storeAddress: String = ""
    var storeCoverDrawing: String = ""
    var storeName: String = ""
    var student: CourseDetailStudentModel?
    var times = [String]()
    var weeks = [String]()
    var type:CourseType = .normal
    var time = ""
    var isVip = 0 //是否是会员:1:是 0:否
                var coverDrawing: String = ""
                var detailDrawing: String = ""
                var distance: Double = 0
                var id: Int = 0
                var introduceDrawing: String = ""
                var lat: String = ""
                var list = [CourseDetailListModel]()
                var lon: String = ""
                var name: String = ""
                var storeAddress: String = ""
                var storeCoverDrawing: String = ""
                var storeName: String = ""
                var student: CourseDetailStudentModel?
                var times = [String]()
                var weeks = [String]()
                var type:CourseType = .normal
                var time = ""
                var isVip = 0 //是否是会员:1:是 0:否
}
struct CourseDetailListModel:HandyJSON {
    var classHours: Int = 0
    var id: Int = 0
    var originalPrice:Double = 0
    var paymentPrice:Double = 0
    var payType: PaymentType = .cash
    var playPaiCoin:Int = 0
    var vipPrice:Double = 0
                var classHours: Int = 0
                var id: Int = 0
                var originalPrice:Double = 0
                var paymentPrice:Double = 0
                var payType: PaymentType = .cash
                var playPaiCoin:Int = 0
                var vipPrice:Double = 0
}
struct CourseDetailStudentModel:HandyJSON {
    var age: Int = 0
    var id: Int = 0
    var name = ""
    var phone:String = ""
                var age: Int = 0
                var id: Int = 0
                var name = ""
                var phone:String = ""
}
struct StudentProfileModel:HandyJSON{
    var birthday = ""
    var headImg = ""
    var height:Double = 0
    var idCard:String?
    var name = ""
    var phone:String?
    var sex:GenderType = .man
    var weight:Double = 0
                var birthday = ""
                var headImg = ""
                var height:Double = 0
                var idCard:String?
                var name = ""
                var phone:String?
                var sex:GenderType = .man
                var weight:Double = 0
    var stuId:Int?
                var stuId:Int?
}
struct StudentProfile1Model:HandyJSON{
    var birthday = ""
    var isNot = 2 //1. 是默认 2. 不是默认
    var stuAge:Int = 0
    var stuHeight:Double = 0
    var stuId = 0
    var stuName:String = ""
    var stuWeight:Double = 0
    var idCard:String = ""
    var stuPhone:String = ""
    var stuHeadImg:String = ""
    var sex:GenderType = .man
                var birthday = ""
                var isNot = 2 //1. 是默认 2. 不是默认
                var stuAge:Int = 0
                var stuHeight:Double = 0
                var stuId = 0
                var stuName:String = ""
                var stuWeight:Double = 0
                var idCard:String = ""
                var stuPhone:String = ""
                var stuHeadImg:String = ""
                var sex:GenderType = .man
}
struct StudentSimpleProfileModel:HandyJSON{
    var stuId = 0
    var stuName = ""
    var stuImage = ""
                var stuId = 0
                var stuName = ""
                var stuImage = ""
}
struct StudentProfile2Model:HandyJSON{
    var stuAge:Int = 0
    var stuId = 0
    var stuName:String = ""
    var stuPhone:String = ""
    var storeId:Int = 0
    var storeName:String = ""
                var stuAge:Int = 0
                var stuId = 0
                var stuName:String = ""
                var stuPhone:String = ""
                var storeId:Int = 0
                var storeName:String = ""
}
struct CouponInfoModel:HandyJSON{
        ///有效时间
    var effectiveTime: String = ""
        /// 优惠
    var favorable: Double = 0
    var id: Int = 0
    var name: String = ""
    var type:CouponType = .none
        /// 使用条件
    var useCondition: String = ""
                ///有效时间
                var effectiveTime: String = ""
                /// 优惠
                var favorable: Double = 0
                var id: Int = 0
                var name: String = ""
                var type:CouponType = .none
                /// 使用条件
                var useCondition: String = ""
}
struct CouponInfo_1_Model:HandyJSON{
        ///有效时间
    var effectiveTime: String = ""
        /// 优惠
    var favorable: String = ""
    var id: Int = 0
    var name: String = ""
    var type:CouponType = .none
        /// 使用条件
    var useCondition: String = ""
                ///有效时间
                var effectiveTime: String = ""
                /// 优惠
                var favorable: String = ""
                var id: Int = 0
                var name: String = ""
                var type:CouponType = .none
                /// 使用条件
                var useCondition: String = ""
}
struct PaymentModel:HandyJSON{
    var orderString = ""
    var returnId = 0
    var siteBooking:Int = 0
                var orderString = ""
                var returnId = 0
                var siteBooking:Int = 0
}
struct StoreWalfareModel:HandyJSON{
    var phone = ""
    var img = ""
                var phone = ""
                var img = ""
}
struct ActivityListModel:HandyJSON{
    var age: String = ""
    var cityName: String = ""
    var coverDrawing: String = ""
    var heat: Int = 0
    var id: Int = 0
    var introduction: String = ""
    var name: String = ""
    var registerCondition:RegisterAcitivyType = .allUser
    var registerEndTime: String = ""
    var status:SignupType = .all
                var age: String = ""
                var cityName: String = ""
                var coverDrawing: String = ""
                var heat: Int = 0
                var id: Int = 0
                var introduction: String = ""
                var name: String = ""
                var registerCondition:RegisterAcitivyType = .allUser
                var registerEndTime: String = ""
                var status:SignupType = .all
}
struct ActivityDetailModel:HandyJSON{
    var address: String = ""
    var age: String = ""
        ///是否报名
    var apply:Int = 0
    var city: String = ""
    var distance: Double = 0
    var endTime: String = ""
    var id: Int = 0
    var imgs: String = ""
    var introduction: String = ""
    var name: String = ""
    var participant = [ActivityDetailPartModel]()
    var payType: PayType = .aliPay
    var cashPrice: Double = 0
    var classPrice:Int = 0
    var playPaiCoin:Int = 0
    var province: String = ""
    var registerCondition:RegisterAcitivyType = .allUser
    var registerEndTime: String = ""
    var registrationNotes: String = ""
    var startTime: String = ""
    var status: SignupType = .all
    var storeAddress: String = ""
    var storeCoverDrawing: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
    var storeInfos = [ActivityDetailStoreModel]()
    var hasPass = 0 // 0:正常,1:截止
    var isReal:Int = 0
                var address: String = ""
                var age: String = ""
                ///是否报名
                var apply:Int = 0
                var city: String = ""
                var distance: Double = 0
                var endTime: String = ""
                var id: Int = 0
                var imgs: String = ""
                var introduction: String = ""
                var name: String = ""
                var participant = [ActivityDetailPartModel]()
                var payType: PayType = .aliPay
                var cashPrice: Double = 0
                var classPrice:Int = 0
                var playPaiCoin:Int = 0
                var province: String = ""
                var registerCondition:RegisterAcitivyType = .allUser
                var registerEndTime: String = ""
                var registrationNotes: String = ""
                var startTime: String = ""
                var status: SignupType = .all
                var storeAddress: String = ""
                var storeCoverDrawing: String = ""
                var storeLat: String = ""
                var storeLon: String = ""
                var storeName: String = ""
                var storeInfos = [ActivityDetailStoreModel]()
                var hasPass = 0 // 0:正常,1:截止
                var isReal:Int = 0
}
struct ActivityDetailStoreModel:HandyJSON{
    var address = ""
    var storeLon:Double = 0
    var distance:Double = 0
    var storeLat:Double = 0
    var name = ""
    var storeCoverDrawing = ""
                var address = ""
                var storeLon:Double = 0
                var distance:Double = 0
                var storeLat:Double = 0
                var name = ""
                var storeCoverDrawing = ""
}
struct ActivityDetailPartModel:HandyJSON{
    var age = 0
    var id = 0
    var idcard = ""
    var name = ""
    var residueClassHour = 0
    var phone = ""
    var birthday = ""
    var gender:GenderType = .man
    var height:Double = 0
    var weight:Double = 0
    var isStudent = 0 // 1:是学员, 0:否
                var age = 0
                var id = 0
                var idcard = ""
                var name = ""
                var residueClassHour = 0
                var phone = ""
                var birthday = ""
                var gender:GenderType = .man
                var height:Double = 0
                var weight:Double = 0
                var isStudent = 0 // 1:是学员, 0:否
}
struct CityProfileModel:HandyJSON {
    var id  = 0
    var code = 0
    var name = ""
                var id  = 0
                var code = 0
                var name = ""
}
struct BannerModel:HandyJSON{
    var id = 0
    var img = ""
    var jumpPage = ""
                var id = 0
                var img = ""
                var jumpPage = ""
    var page = ""
    var type = ""
    var turnId = 0
    var pid = 0
    var pageId = 0
    var typeId = 0
    var state = 0
    var name = ""
    var model = ""
                var page = ""
                var type = ""
                var turnId = 0
                var pid = 0
                var pageId = 0
                var typeId = 0
                var state = 0
                var name = ""
                var model = ""
                var isOpen = 0
                var isTop = 0
                var sort = 0
                var title = ""
                var buttonImage:String = ""
                var backgroundImage:String = ""
                var content:String = ""
}
struct VideosModel:HandyJSON{
    var id:Int = 0
    var list = [VideoDetailModel]()
    var name:String = ""
                var id:Int = 0
                var list = [VideoDetailModel]()
                var name:String = ""
}
struct VideoDetailModel:HandyJSON {
    var cover: String = ""
    var id:Int = 0
    var integral: Int = 0
    var introduce: String = ""
    var name: String = ""
        ///学习状态(0=未学习,1=已学习)
    var study: Int = 0
                var cover: String = ""
                var id:Int = 0
                var integral: Int = 0
                var introduce: String = ""
                var name: String = ""
                ///学习状态(0=未学习,1=已学习)
                var study: Int = 0
    var courseVideo:String = ""
    var introductionDrawing = ""
                var courseVideo:String = ""
                var introductionDrawing = ""
}
struct WeeklyItemModel:HandyJSON {
    var courseHours: Int = 0
    var coursePackageDiscountId: Int = 0
    var coursePackageName: String = ""
    var dataTime: String = ""
    var date: String = ""
    var discountPrice: Double = 0
    var donateHours: Int = 0
    var image: String = ""
    var originalPrice: Double = 0
        ///状态(1=查看详情 2=暂未开始)
    var status: Int = 0
    var storeDistance: Double = 0
                var courseHours: Int = 0
                var coursePackageDiscountId: Int = 0
                var coursePackageName: String = ""
                var dataTime: String = ""
                var date: String = ""
                var discountPrice: Double = 0
                var donateHours: Int = 0
                var image: String = ""
                var originalPrice: Double = 0
                ///状态(1=查看详情 2=暂未开始)
                var status: Int = 0
                var storeDistance: Double = 0
}
struct WeeklyItemDetailModel:HandyJSON {
    var classHours: Int = 0
    var costPrice: Double = 0
    var coursePackageDiscountId:Int = 0
    var coursePackageName: String = ""
    var coverDrawing:String = ""
        ///折扣价/会员价
    var discountPrice:Double = 0
    var distance:Double = 0
    var freeClassHours:Int = 0
    var introduceDrawing:String = ""
    var storeNameAddr:String = ""
    var time: String = ""
    var wanpaiGold:Int = 0
    var weekTime: String = ""
    var vipPrice:Double = 0
    var detailDrawing = ""
    var holiTime:String = ""
    var type = 1 // 1:常规课,2:假期课
    var payType:PaymentType = .cashCoin
                var classHours: Int = 0
                var costPrice: Double = 0
                var coursePackageDiscountId:Int = 0
                var coursePackageName: String = ""
                var coverDrawing:String = ""
                ///折扣价/会员价
                var discountPrice:Double = 0
                var distance:Double = 0
                var freeClassHours:Int = 0
                var introduceDrawing:String = ""
                var storeNameAddr:String = ""
                var time: String = ""
                var wanpaiGold:Int = 0
                var weekTime: String = ""
                var vipPrice:Double = 0
                var detailDrawing = ""
                var holiTime:String = ""
                var type = 1 // 1:常规课,2:假期课
                var payType:PaymentType = .cashCoin
}
struct SiteItemModel:HandyJSON{
    var distance: Double = 0
    var id: Int = 0
    var name: String = ""
    var price: Double = 0
    var siteTypeName: String = ""
    var storeAddress: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
    var times: String = ""
                var distance: Double = 0
                var id: Int = 0
                var name: String = ""
                var price: Double = 0
                var siteTypeName: String = ""
                var storeAddress: String = ""
                var storeLat: String = ""
                var storeLon: String = ""
                var storeName: String = ""
                var times: String = ""
}
struct SiteDetailModel:HandyJSON{
    var cashPrice: Double = 0
    var cashPriceOne:Double = 0
    var id: Int = 0
    var name: String = ""
    var playPaiCoin: Int = 0
    var playPaiCoinOne:Int = 0
    var siteTypeName: String = ""
    var storeAddress: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
    var storePhone: String = ""
    var storeCoverDrawing = ""
    var distance:Double = 0
    var imgs = ""
    var nextName = [String]() //场地名
    var halfName = [String]() //半场名
    var ishalf = 0 // 是否半场  1:是 2:否
    var introduce = ""
    var typeName = ""
                var cashPrice: Double = 0
                var cashPriceOne:Double = 0
                var id: Int = 0
                var name: String = ""
                var playPaiCoin: Int = 0
                var playPaiCoinOne:Int = 0
                var siteTypeName: String = ""
                var storeAddress: String = ""
                var storeLat: String = ""
                var storeLon: String = ""
                var storeName: String = ""
                var storePhone: String = ""
                var storeCoverDrawing = ""
                var distance:Double = 0
                var imgs = ""
                var nextName = [String]() //场地名
                var halfName = [String]() //半场名
                var ishalf = 0 // 是否半场  1:是 2:否
                var introduce = ""
                var typeName = ""
}
class SiteDetailDateTimeModel:HandyJSON,Equatable{
    var selectable = 0 //是否可选(0=否,1=是)
    var time = ""
                var selectable = 0 //是否可选(0=否,1=是)
                var time = ""
    static func ==(lhs: SiteDetailDateTimeModel, rhs: SiteDetailDateTimeModel) -> Bool {
        return (lhs.selectable == rhs.selectable) && (lhs.time == rhs.time)
    }
                static func ==(lhs: SiteDetailDateTimeModel, rhs: SiteDetailDateTimeModel) -> Bool {
                                return (lhs.selectable == rhs.selectable) && (lhs.time == rhs.time)
                }
    required init() {}
                required init() {}
}
class YardBookingModel:HandyJSON{
    var appointment: String = ""
    var id: Int = 0
    var insertTime: TimeInterval = 0
    var name: String = ""
    var payMoney:Double = 0
    var siteTypeName: String = ""
    var status: YardBookingType = .none
    var storeAddress: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
    var phone:String = ""
    var payType:PayType = .aliPay
                var appointment: String = ""
                var id: Int = 0
                var insertTime: TimeInterval = 0
                var name: String = ""
                var payMoney:Double = 0
                var siteTypeName: String = ""
                var status: YardBookingType = .none
                var storeAddress: String = ""
                var storeLat: String = ""
                var storeLon: String = ""
                var storeName: String = ""
                var phone:String = ""
                var payType:PayType = .aliPay
    required init() {}
                required init() {}
}
struct YardBookingContinuePriceModel:HandyJSON{
    var cash:Double = 0
    var playPaiCoin:Int = 0
                var cash:Double = 0
                var playPaiCoin:Int = 0
}
struct StartClouseHomeModel:HandyJSON{
    var bmi: Double = 0
    var courseList = [StartClouseListModel]()
    var deductedNums: Int = 0
    var exerciseVideoList = [StartClouseVideoListModel]()
    var height: Int = 0
    var imgs: String = ""
        ///是否有学员信息 (1. 有学员信息 2.没有学员信息)
    var isThere: Int = 2
    var remainingNums: Int = 0
    var stuAge: Int = 0
    var stuId: Int = 0
    var stuImg: String = ""
    var stuName: String = ""
    var stuSex: GenderType = .man
    var totalNums: Int = 0
    var weight: Int = 0
    var bodyStatus = ""
                var bmi: Double = 0
                var courseList = [StartClouseListModel]()
                var deductedNums: Int = 0
                var exerciseVideoList = [StartClouseVideoListModel]()
                var height: Int = 0
                var imgs: String = ""
                ///是否有学员信息 (1. 有学员信息 2.没有学员信息)
                var isThere: Int = 2
                var remainingNums: Int = 0
                var stuAge: Int = 0
                var stuId: Int = 0
                var stuImg: String = ""
                var stuName: String = ""
                var stuSex: GenderType = .man
                var totalNums: Int = 0
                var weight: Int = 0
                var bodyStatus = ""
//    func save(){
//        UserDefaults.standard.set(self.toJSONString(), forKey: "StartClouseHomeModel")
//        UserDefaults.standard.synchronize()
//    }
//
//    static func get()->StartClouseHomeModel?{
//        if let string = UserDefaults.standard.string(forKey: "StartClouseHomeModel"){
//            return StartClouseHomeModel.deserialize(from: string)
//        }else{
//            return nil
//        }
//
//    }
                //    func save(){
                //        UserDefaults.standard.set(self.toJSONString(), forKey: "StartClouseHomeModel")
                //        UserDefaults.standard.synchronize()
                //    }
                //
                //    static func get()->StartClouseHomeModel?{
                //        if let string = UserDefaults.standard.string(forKey: "StartClouseHomeModel"){
                //            return StartClouseHomeModel.deserialize(from: string)
                //        }else{
                //            return nil
                //        }
                //
                //    }
}
struct StartClouseListModel:HandyJSON{
    var courseId = 0
    var courseName = ""
    var deductedNums = 0
    var remainingNums = 0
    var totalNums = 0
    var periodOfValidity = ""
    var isAble = 0
    var id = 0
    var courseType = 0 //1:常规,2:假期
    var orderId:Int?
    var coursePayId:Int?
                var courseId = 0
                var courseName = ""
                var deductedNums = 0
                var remainingNums = 0
                var totalNums = 0
                var periodOfValidity = ""
                var isAble = 0
                var id = 0
                var courseType = 0 //1:常规,2:假期
                var orderId:Int?
                var coursePayId:Int?
}
struct StartClouseVideoListModel:HandyJSON {
    var videoCoverImgUrl: String = ""
    var videoName: String = ""
    var videoUrl: String = ""
    var videoId = 0
    var coursePackageId = 0
    var scId:Int = 0
                var videoCoverImgUrl: String = ""
                var videoName: String = ""
                var videoUrl: String = ""
                var videoId = 0
                var coursePackageId = 0
                var scId:Int = 0
}
struct StartClouseReportModel:HandyJSON{
    var bmi:Double = 0
    var height:Int = 0
    var urls = [String]()
    var weight:Int = 0
    var bodyStatus = ""
                var bmi:Double = 0
                var height:Int = 0
                var urls = [String]()
                var weight:Int = 0
                var bodyStatus = ""
}
class StartClouseExploreModel:HandyJSON{
    var distance:Double = 0
    var storeAddr = ""
    var storeId:Int = 0
    var storeImg = ""
    var storeName = ""
                var distance:Double = 0
                var storeAddr = ""
                var storeId:Int = 0
                var storeImg = ""
                var storeName = ""
    var latitude:Double = 0
    var longitude:Double = 0
                var latitude:Double = 0
                var longitude:Double = 0
    var index:Int?
    var annotation:MAPointAnnotation?
                var index:Int?
                var annotation:MAPointAnnotation?
    required init(){}
                required init(){}
}
struct NoticeItemModel:HandyJSON{
    var noticeContents = ""
    var noticeId = 0
    var noticeTitle = ""
    var noticeTime = ""
    var quesId = 0
    var quesTitle = ""
    var quesContents = ""
    var quesTime = ""
                var noticeContents = ""
                var noticeId = 0
                var noticeTitle = ""
                var noticeTime = ""
                var quesId = 0
                var quesTitle = ""
                var quesContents = ""
                var quesTime = ""
}
struct SearchStoreDetailModel:HandyJSON{
    var courseVoList = [SearchStoreDetailCourseModel]()
    var images = [String]()
    var storeAddress: String = ""
    var storeId: Int = 0
    var storeInfo: String = ""
    var storeName: String = ""
    var storeTime: String = ""
    var phone:String = ""
    var lat:Double = 0
    var lon:Double = 0
    var venueList = [SearchStoreDetailVenueModel]()
                var courseVoList = [SearchStoreDetailCourseModel]()
                var images = [String]()
                var storeAddress: String = ""
                var storeId: Int = 0
                var storeInfo: String = ""
                var storeName: String = ""
                var storeTime: String = ""
                var phone:String = ""
                var lat:Double = 0
                var lon:Double = 0
                var venueList = [SearchStoreDetailVenueModel]()
}
struct SearchStoreListModel:HandyJSON{
    var storeAddress:String = ""
    var storeDistance:Double = 0
    var storeImg:String = ""
    var storeId:Int = 0
    var storeInfo:String = ""
    var storeName:String = ""
    var storeTime:String = ""
    var storePhone:String = ""
                var storeAddress:String = ""
                var storeDistance:Double = 0
                var storeImg:String = ""
                var storeId:Int = 0
                var storeInfo:String = ""
                var storeName:String = ""
                var storeTime:String = ""
                var storePhone:String = ""
}
struct SearchStoreDetailCourseModel:HandyJSON{
    var applicantsNumber: Int = 0
    var classHours = [Int]()
    var classStartTime:String?
    var courseId: Int = 0
    var coverDrawing: String = ""
    var name: String = ""
    var originalPrice:Double = 0
    var coin:Int = 0
                var applicantsNumber: Int = 0
                var classHours = [Int]()
                var classStartTime:String?
                var courseId: Int = 0
                var coverDrawing: String = ""
                var name: String = ""
                var originalPrice:Double = 0
                var coin:Int = 0
}
struct SearchStoreDetailVenueModel:HandyJSON{
    var price:Double = 0
    var siteId: Int = 0
    var siteName: String = ""
    var siteTime: String = ""
    var siteType: String = ""
                var price:Double = 0
                var siteId: Int = 0
                var siteName: String = ""
                var siteTime: String = ""
                var siteType: String = ""
}
struct UserInfoModel:HandyJSON{
    var address: String = ""
    var birthday: String = ""
    var memberLifespan: String = ""
    var sex: String = ""
    var userImage: String = ""
    var userName: String = ""
    var userPhone: String = ""
    var userId:Int = 0
    var isVip = 0 //0:否 1:是
    var needChange = 0 // 1需要改,0不需要
                var address: String = ""
                var birthday: String = ""
                var memberLifespan: String = ""
                var sex: String = ""
                var userImage: String = ""
                var userName: String = ""
                var userPhone: String = ""
                var userId:Int = 0
                var isVip = 0 //0:否 1:是
                var needChange = 0 // 1需要改,0不需要
    func save(){
        UserDefaults.standard.set(self.toJSONString(), forKey: "UserInfoModel")
        UserDefaults.standard.synchronize()
    }
                func save(){
                                UserDefaults.standard.set(self.toJSONString(), forKey: "UserInfoModel")
                                UserDefaults.standard.synchronize()
                }
    static func get()->UserInfoModel?{
        if let string = UserDefaults.standard.string(forKey: "UserInfoModel"){
            return UserInfoModel.deserialize(from: string)
        }else{
            return nil
        }
                static func get()->UserInfoModel?{
                                if let string = UserDefaults.standard.string(forKey: "UserInfoModel"){
                                                return UserInfoModel.deserialize(from: string)
                                }else{
                                                return nil
                                }
    }
                }
}
struct BenefitHomeModel:HandyJSON{
    var commodities = [BenefitHomeCommonditiesModel]()
    var image: BenefitImageModel?
    var isMember: String = ""
    var userHeadImg: String = ""
    var userIntegral: Int = 0
    var userName: String = "未命名"
    var wpCoin: Int = 0
                var commodities = [BenefitHomeCommonditiesModel]()
                var image: BenefitImageModel?
                var isMember: String = ""
                var userHeadImg: String = ""
                var userIntegral: Int = 0
                var userName: String = "未命名"
                var wpCoin: Int = 0
}
struct BenefitImageModel:HandyJSON{
    var myConpons: String?
    var onlineShop: String?
    var todayFree: String?
    var weeksBenefit: String?
                var myConpons: String?
                var onlineShop: String?
                var todayFree: String?
                var weeksBenefit: String?
}
struct BenefitHomeCommonditiesModel:HandyJSON{
    var commodityId: Int = 0
    var commodityImg: String = ""
    var commodityName: String = ""
    var commodityPrice: Double = 0
    var goodsType:ExchangeType = .goods
                var commodityId: Int = 0
                var commodityImg: String = ""
                var commodityName: String = ""
                var commodityPrice: Double = 0
                var goodsType:ExchangeType = .goods
}
struct BillingModel:HandyJSON{
    var consumeAmount = ""
    var consumeName = ""
    var consumeTime = ""
    var type:DetailType?//1扣减 2增加
    var recordId:Int?
    var detailsType:DetailType?//1扣减 2增加
                var consumeAmount = ""
                var consumeName = ""
                var consumeTime = ""
                var type:DetailType?//1扣减 2增加
                var recordId:Int?
                var detailsType:DetailType?//1扣减 2增加
//    mutating func mapping(mapper: HelpingMapper) {
//        mapper <<<
//            self.type <-- "detailsType"
//    }
                //    mutating func mapping(mapper: HelpingMapper) {
                //        mapper <<<
                //            self.type <-- "detailsType"
                //    }
}
class CouponModel:HandyJSON{
    var available: String = ""
    var cityOrStore: String = ""
    var effectiveTime: String = ""
    var id: Int = 0
    var instructionsForUse: String = ""
    var name: String = ""
    var ruleModel: CouponModelRuleModel?
    var type:CouponType = .discount
    var useCondition: CouponConditionType = .nationwide
    var useStatus: CouponUseType = .overdue
                var available: String = ""
                var cityOrStore: String = ""
                var effectiveTime: String = ""
                var id: Int = 0
                var instructionsForUse: String = ""
                var name: String = ""
                var ruleModel: CouponModelRuleModel?
                var type:CouponType = .discount
                var useCondition: CouponConditionType = .nationwide
                var useStatus: CouponUseType = .overdue
    var showAll = false
                var showAll = false
    required init(){}
                required init(){}
}
struct CouponModelRuleModel:HandyJSON{
        /// 满X元 条件
    var conditionalAmount: String = ""
        /// (减)抵扣金额
    var deductionAmount: String = ""
                /// 满X元 条件
                var conditionalAmount: String = ""
                /// (减)抵扣金额
                var deductionAmount: String = ""
        /// 名称
    var experienceName: String = ""
                /// 名称
                var experienceName: String = ""
}
struct CoinExchangeModel:HandyJSON{
    var amount:Double = 0
    var wpGold:Int = 0
    var chargeId = 0
                var amount:Double = 0
                var wpGold:Int = 0
                var chargeId = 0
}
struct ExchangeGoodsModel:HandyJSON {
    var belongs: String = ""
    var belongsScope: RegisterAcitivyType = .allUser
    var contents: String = ""
    var cost: Int = 0
    var courseHours: Int = 0
    var endTime: String = ""
    var exchangeAddrType: CouponConditionType = .nationwide
    var exchangeType: ExchangePaymentType = .coin
    var goodId: Int = 0
    var goodName: String = ""
    var goodType: ExchangeType = .goods
    var perLimit: Int = 0
    var pics = [String]()
    var redeemedNum: Int = 0
    var integral:Int = 0
    var cash:Double = 0
    var residueNum: Int = 0
    var startTime: String = ""
    var cardType:CardType! = .subCard
                var belongs: String = ""
                var belongsScope: RegisterAcitivyType = .allUser
                var contents: String = ""
                var cost: Int = 0
                var courseHours: Int = 0
                var endTime: String = ""
                var exchangeAddrType: CouponConditionType = .nationwide
                var exchangeType: ExchangePaymentType = .coin
                var goodId: Int = 0
                var goodName: String = ""
                var goodType: ExchangeType = .goods
                var perLimit: Int = 0
                var pics = [String]()
                var redeemedNum: Int = 0
                var integral:Int = 0
                var cash:Double = 0
                var residueNum: Int = 0
                var startTime: String = ""
                var cardType:CardType! = .subCard
}
struct StoreSimpleModel:HandyJSON{
    var storeName = ""
    var storeId = 0
                var storeName = ""
                var storeId = 0
}
struct MarketMdoel:HandyJSON{
    var amount: Double = 0
    var belongsType: RegisterAcitivyType = .allUser
    var condition: ExchangePaymentType = .cashAndCoin
    var goodId: Int = 0
    var goodImg: String = ""
    var goodName: String = ""
    var goodsType: ExchangeType = .goods
    var integral: Int = 0
    var nums: Int = 0
                var amount: Double = 0
                var belongsType: RegisterAcitivyType = .allUser
                var condition: ExchangePaymentType = .cashAndCoin
                var goodId: Int = 0
                var goodImg: String = ""
                var goodName: String = ""
                var goodsType: ExchangeType = .goods
                var integral: Int = 0
                var nums: Int = 0
}
struct RecordsModel:HandyJSON{
    var detailsId: Int = 0
    var endTime: String = ""
    var goodName: String = ""
    var goodType: ExchangeType = .goods
    var exchangeType: ExchangePaymentType = .coin
    var integral: Int = 0
    var cash: Double = 0
    var startTime: String = ""
    var useStatus: UseStateType = .used
    var cardType:CardType = .none
    var userId:Int = 0
    var sid = [Int]()
    var rid = [Int]()
                var detailsId: Int = 0
                var endTime: String = ""
                var goodName: String = ""
                var goodType: ExchangeType = .goods
                var exchangeType: ExchangePaymentType = .coin
                var integral: Int = 0
                var cash: Double = 0
                var startTime: String = ""
                var useStatus: UseStateType = .used
                var cardType:CardType = .none
                var userId:Int = 0
                var sid = [Int]()
                var rid = [Int]()
}
struct RecordsDetailModel:HandyJSON{
    var belongs: String = ""
    var classHours = 0
    var contents: String = ""
    var detailsId: Int = 0
    var endTime: String = ""
    var goodName: String = ""
    var orderTime: String = ""
    var pics = [String]()
    var startTime: String = ""
    var useType: UseStateType = .unUsed
    var writeOffName: String = ""
    var writeOffTime: String = ""
                var belongs: String = ""
                var classHours = 0
                var contents: String = ""
                var detailsId: Int = 0
                var endTime: String = ""
                var goodName: String = ""
                var orderTime: String = ""
                var pics = [String]()
                var startTime: String = ""
                var useType: UseStateType = .unUsed
                var writeOffName: String = ""
                var writeOffTime: String = ""
    var goodType: ExchangeType = .goods
    var cash: Double = 0
    var exchangeType: ExchangePaymentType = .coin
    var integral: Int = 0
    var exchangeAddrType: CouponConditionType = .nationwide
    var cardType:CardType! = .subCard
                var goodType: ExchangeType = .goods
                var cash: Double = 0
                var exchangeType: ExchangePaymentType = .coin
                var integral: Int = 0
                var exchangeAddrType: CouponConditionType = .nationwide
                var cardType:CardType! = .subCard
}
class StudentAppointModel:HandyJSON {
    var courseHours: Int = 0
    var coursePackageId: Int = 0
    var coursePackageName: String = ""
    var courseStuRecordId: Int = 0
    var status:StudentAppointType = .complete
    var storeNameAddr: String = ""
    var timeFrame: String = ""
//    var ids = [Int]()
    var siteId = 0
                var courseHours: Int = 0
                var coursePackageId: Int = 0
                var coursePackageName: String = ""
                var courseStuRecordId: Int = 0
                var status:StudentAppointType = .complete
                var storeNameAddr: String = ""
                var timeFrame: String = ""
                //    var ids = [Int]()
                var siteId = 0
    var userId = 0
    var sid = [Int]()
    var rid = [Int]()
                var userId = 0
                var sid = [Int]()
                var rid = [Int]()
    required init() {}
                required init() {}
}
struct ExerciseVideoModel:HandyJSON {
    var coursePackageId: Int = 0
    var coverImage: String = ""
    var integral:Int = 0
    var packageName: String = ""
    var studyStatus: Int = 1
    var synopsis: String = ""
    var videoId: Int = 0
    var videoName: String = ""
    var scId:Int = 0
                var coursePackageId: Int = 0
                var coverImage: String = ""
                var integral:Int = 0
                var packageName: String = ""
                var studyStatus: Int = 1
                var synopsis: String = ""
                var videoId: Int = 0
                var videoName: String = ""
                var scId:Int = 0
}
struct ExerciseVideoDetailModel:HandyJSON {
    var coursePackageId: Int = 0
    var detailedDiagram: String = ""
    var integral: Int = 0
    var packageName: String = ""
    var studyStatus: Int = 0
    var synopsis: String = ""
    var videoId: Int = 0
    var videoName: String = ""
    var videoURL: String = ""
                var coursePackageId: Int = 0
                var detailedDiagram: String = ""
                var integral: Int = 0
                var packageName: String = ""
                var studyStatus: Int = 0
                var synopsis: String = ""
                var videoId: Int = 0
                var videoName: String = ""
                var videoURL: String = ""
}
struct StudentMedalModel:HandyJSON {
    var medalName = ""
    var medalType:MedalType = .club
                var medalName = ""
                var medalType:MedalType = .club
}
struct StudentCommentModel:HandyJSON{
    var comTime: String = ""
    var contents: String = ""
    var headImg: String = ""
    var imgs = [String]()
    var stuName: String = ""
                var comTime: String = ""
                var contents: String = ""
                var headImg: String = ""
                var imgs = [String]()
                var stuName: String = ""
}
struct CourseRecordModel:HandyJSON{
    var purchaseAmount:String = ""
    var purchaseTime = ""
    var purchaseType = ""
                var purchaseAmount:String = ""
                var purchaseTime = ""
                var purchaseType = ""
}
class WeeklyCourseModel:HandyJSON{
    var distance:Double = 0
    var data = [WeeklyCourseItemModel]()
    var name = ""
    var lon:Double = 0
    var lat:Double = 0
                var distance:Double = 0
                var data = [WeeklyCourseItemModel]()
                var name = ""
                var lon:Double = 0
                var lat:Double = 0
    required init(){}
                required init(){}
}
class WeeklyCourseItemModel:HandyJSON{
    var id = 0
    var name = ""
    var intro = ""
    var type = 0 // 1:请假 2: 购课
    var time = [String]()
    var num = 0
    var money:Double = 0
    var isType = 0 //1不能请假,0:可以请假 3:已取消
    var courseType = 0 // 1:常规,2:假期课
                var id = 0
                var name = ""
                var intro = ""
                var type = 0 // 1:请假 2: 购课
                var time = [String]()
                var num = 0
                var money:Double = 0
                var isType = 0 //1不能请假,0:可以请假 3:已取消
                var courseType = 0 // 1:常规,2:假期课
    required init(){}
                required init(){}
}
struct ExperienceCourseModel:HandyJSON {
    var id = 0
    var name = ""
    var num = 0
    var week = ""
    var time = [String]()
    var day = [String]()
                var id = 0
                var name = ""
                var num = 0
                var week = ""
                var time = [String]()
                var day = [String]()
}
struct StudentMedalInfoModel:HandyJSON{
    var isTopLevel = 2
    var levelNum = 0
    var medalName = ""
    var medalType:MedalType = .club
    var nextLevel = 0
    var upgradeConditions = ""
                var isTopLevel = 2
                var levelNum = 0
                var medalName = ""
                var medalType:MedalType = .club
                var nextLevel = 0
                var upgradeConditions = ""
}
struct CourseListSubModel:HandyJSON{
    var id = 0
    var courseNum = 0
    var name = ""
                var id = 0
                var courseNum = 0
                var name = ""
}
struct CourseCouponModel:HandyJSON{
    var auditRemark: String = ""
    var auditStatus: Int = 0
    var auditUserId: String = ""
    var cash: Float = 0.0
    var city: String = ""
    var cityCode: String = ""
    var content:String = ""
    var distributionMethod: Int = 0
    var endTime: String = ""
    var id: Int = 0
    var illustrate: String = ""
    var insertTime: String = ""
    var integral: Float = 0.0
    var name: String = ""
    var pickUpQuantity: Int = 0
    var province: String = ""
    var provinceCode: String = ""
    var quantityIssued: Int = 0
    var redemptionMethod: Int = 0
    var startTime: String = ""
    var state: Int = 0
    var status: Int = 0
    var type: CouponType = .discount
    var userPopulation: Int = 0
    var useScope: Int = 0
    var available:String = ""
    var timePeriod:String = "" //有效期
                var auditRemark: String = ""
                var auditStatus: Int = 0
                var auditUserId: String = ""
                var cash: Float = 0.0
                var city: String = ""
                var cityCode: String = ""
                var content:String = ""
                var distributionMethod: Int = 0
                var endTime: String = ""
                var id: Int = 0
                var illustrate: String = ""
                var insertTime: String = ""
                var integral: Float = 0.0
                var name: String = ""
                var pickUpQuantity: Int = 0
                var province: String = ""
                var provinceCode: String = ""
                var quantityIssued: Int = 0
                var redemptionMethod: Int = 0
                var startTime: String = ""
                var state: Int = 0
                var status: Int = 0
                var type: CouponType = .discount
                var userPopulation: Int = 0
                var useScope: Int = 0
                var available:String = ""
                var timePeriod:String = "" //有效期
}
struct YardBookingDetailModel:HandyJSON{
    var data:YardBookingDetailDataModel?
    var shopName:String = ""
    var siteName:String = ""
    var shopAddress:String = ""
    var siteType:String = ""
                var data:YardBookingDetailDataModel?
                var shopName:String = ""
                var siteName:String = ""
                var shopAddress:String = ""
                var siteType:String = ""
//    var ids = [Int]() //区域ID
                //    var ids = [Int]() //区域ID
}
struct YardBookingDetailDataModel:HandyJSON{
    var booker: String = ""
    var cancelTime: String = ""
    var cancelUserId: String = ""
    var city: String = ""
    var cityCode: String = ""
    var endTime: Int = 0
    //0:默认,1:手环
    var goType: Int = 0
    var halfName: String = ""
    var id: Int = 0
    var insertTime: Int = 0
    var isHalf: Int = 0
    var nextName: String = ""
    var orderNo: String = ""
    var payMoney: Double = 0.0
    var payOrderNo: String = ""
    var payTime: Int = 0
    var payType: PayType = .coin
    var payUserId: String = ""
    var phone: String = ""
    var province: String = ""
    var provinceCode: String = ""
    var refundOrderNo: String = ""
    var remark: String = ""
    var siteId: Int = 0
    var startTime: Int = 0
    var status: YardBookingType = .cancel
    var storeId: Int = 0
    var times: String = ""
    var userCouponId: String = ""
    var voucher: String = ""
    var typeName = ""
    var storePhone:String = ""
                var booker: String = ""
                var cancelTime: String = ""
                var cancelUserId: String = ""
                var city: String = ""
                var cityCode: String = ""
                var endTime: Int = 0
                //0:默认,1:手环
                var goType: Int = 0
                var halfName: String = ""
                var id: Int = 0
                var insertTime: Int = 0
                var isHalf: Int = 0
                var nextName: String = ""
                var orderNo: String = ""
                var payMoney: Double = 0.0
                var payOrderNo: String = ""
                var payTime: Int = 0
                var payType: PayType = .coin
                var payUserId: String = ""
                var phone: String = ""
                var province: String = ""
                var provinceCode: String = ""
                var refundOrderNo: String = ""
                var remark: String = ""
                var siteId: Int = 0
                var startTime: Int = 0
                var status: YardBookingType = .cancel
                var storeId: Int = 0
                var times: String = ""
                var userCouponId: String = ""
                var voucher: String = ""
                var typeName = ""
                var storePhone:String = ""
    var appUserId: Int = 0
    var sid = [Int]()
    var rid = [Int]()
                var appUserId: Int = 0
                var sid = [Int]()
                var rid = [Int]()
}
struct GameListModel:HandyJSON {
    var id = 0
    var cash:Double = 0
    var gameId:Int = 0
    var img = ""
    var name = ""
    var integral = 0
    var otherId = 0
    var playCoin = 0
    var video = ""
    var intro = ""
                var id = 0
                var cash:Double = 0
                var gameId:Int = 0
                var img = ""
                var name = ""
                var integral = 0
                var otherId = 0
                var playCoin = 0
                var video = ""
                var intro = ""
}
struct DoorModel:HandyJSON{
    var app_user_id = ""
    var time:DoorTimeModel?
                var app_user_id = ""
                var time:DoorTimeModel?
}
struct DoorTimeModel:HandyJSON{
    var start_time:TimeInterval?
    var end_time:TimeInterval?
                var start_time:TimeInterval?
                var end_time:TimeInterval?
}
struct GamesRecordModel:HandyJSON{
    var game_name = ""
    var score = 0
    var time = ""
                var game_name = ""
                var score = 0
                var time = ""
}
struct OpenDoorModel:HandyJSON{
    var sid = [Int]() //场馆ID,全国通用值为0
    var rid = [Int]() //区域ID,单场馆和多场馆都可以放入,全国可以为空数组
    var uid:Int? //用户ID
    var time = [OpenDoorTimeModel]() //时间
    var type = 2 //固定
                var sid = [Int]() //场馆ID,全国通用值为0
                var rid = [Int]() //区域ID,单场馆和多场馆都可以放入,全国可以为空数组
                var uid:Int? //用户ID
                var time = [OpenDoorTimeModel]() //时间
                var type = 2 //固定
}
struct OpenDoorTimeModel:HandyJSON {
    var start_time:TimeInterval = 0 //开始时间
    var end_time:TimeInterval = 0 //结束时间
                var start_time:TimeInterval = 0 //开始时间
                var end_time:TimeInterval = 0 //结束时间
}
struct LoginModel:HandyJSON{
    var token = ""
    var isBind = 0
                var token = ""
                var isBind = 0
}
WanPai/Network/Services.swift
@@ -1,10 +1,10 @@
    //
    //  Services.swift
    //  YixiuShop
    //
    //  Created by Sweet on 2019/9/30.
    //  Copyright © 2019 jackLove. All rights reserved.
    //
//
//  Services.swift
//  YixiuShop
//
//  Created by Sweet on 2019/9/30.
//  Copyright © 2019 jackLove. All rights reserved.
//
import UIKit
import RxSwift
@@ -13,15 +13,16 @@
#if DEBUG
//let All_Url = "http://192.168.110.27:56666" //罗易胜
let All_Url = "http://192.168.110.85:56666" //正式地址
//let All_Url = "http://192.168.110.85:56666" //正式地址
let All_Url = "http://192.168.110.80:56666" //正式地址
let Game_Url = "https://try.daowepark.com"
    //let Socket_Url = "192.168.110.22"
//let Socket_Url = "192.168.110.22"
#else
let All_Url = "http://8.137.22.229:56666" //正式地址
let Game_Url = "https://port.daowepark.com"//正式地址
//let Game_Url = "https://try.daowepark.com" //测试地址
    //let Socket_Url = "192.168.110.22"
//let Socket_Url = "192.168.110.22"
#endif
class Services: NSObject {
@@ -31,1220 +32,1249 @@
// MARK: -- 游戏
extension Services{
    class func updateInfo(birthday:String?,gender:Int?,name:String?)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/appUser/updateInfo")
            .append(key: "birthday", value: birthday)
            .append(key: "gender", value: gender)
            .append(key: "name", value: name)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func updateInfo(birthday:String?,gender:Int?,name:String?)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/appUser/updateInfo")
                                                .append(key: "birthday", value: birthday)
                                                .append(key: "gender", value: gender)
                                                .append(key: "name", value: name)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 本地离线游戏
    class func game_gameList(spaceId:Int,storeId:Int)->Observable<BaseResponse<[GameListModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/game/queryGameList")
            .append(key: "siteId", value: spaceId)
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 本地离线游戏
                class func game_gameList(spaceId:Int,storeId:Int)->Observable<BaseResponse<[GameListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/game/queryGameList")
                                                .append(key: "siteId", value: spaceId)
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func game_intro()->Observable<BaseResponse<String>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/game/getIntro")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func game_intro()->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/game/getIntro")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    //支付游戏
    class func payGame(configId:Int,gameId:Int,spaceId:Int,sutuId:Int,type:PayType)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/game/payGame")
            .append(key: "configId", value: configId)
            .append(key: "gameId", value: gameId)
            .append(key: "spaceId", value: spaceId)
            .append(key: "sutuId", value: sutuId)
            .append(key: "type", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                //支付游戏
                class func payGame(configId:Int,gameId:Int,spaceId:Int,sutuId:Int,type:PayType)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/game/payGame")
                                                .append(key: "configId", value: configId)
                                                .append(key: "gameId", value: gameId)
                                                .append(key: "spaceId", value: spaceId)
                                                .append(key: "sutuId", value: sutuId)
                                                .append(key: "type", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 启动本地游戏
    class func game_gameStart(gameId:Int,spaceId:Int,sutuId:Int,userID:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: Game_Url)
            .interface(url: "/v7/user_api/general/gameStart")
            .append(key: "space_id", value: spaceId)
            .append(key: "sutu_id", value: sutuId)
            .append(key: "game_id", value: gameId)
            .append(key: "app_user_id", value: userID)
            .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
        return NetworkRequest.request(params: params, method: .post, encoding: JSONEncoding.default, progress: false)
    }
                /// 启动本地游戏
                class func game_gameStart(gameId:Int,spaceId:Int,sutuId:Int,userID:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/gameStart")
                                                .append(key: "space_id", value: spaceId)
                                                .append(key: "sutu_id", value: sutuId)
                                                .append(key: "game_id", value: gameId)
                                                .append(key: "app_user_id", value: userID)
                                                .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
                                return NetworkRequest.request(params: params, method: .post, encoding: JSONEncoding.default, progress: false)
                }
        /// 开门
    class func game_OpenDoorCode(userID:Int)->Observable<BaseResponse<DoorModel>>{
        let params = ParamsAppender.build(url: Game_Url)
            .interface(url: "/v7/user_api/general/getOpenDoorCode")
            .append(key: "app_user_id", value: userID)
            .append(key: "sign", value: "")
        return NetworkRequest.request(params: params, method: .get, progress: false)
    }
                /// 开门
                class func game_OpenDoorCode(userID:Int)->Observable<BaseResponse<DoorModel>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/getOpenDoorCode")
                                                .append(key: "app_user_id", value: userID)
                                                .append(key: "sign", value: "")
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
    /// 用户单机游戏记录
    class func game_generalGameRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
        let params = ParamsAppender.build(url: Game_Url)
            .interface(url: "/v7/user_api/general/gameRecord")
            .append(key: "uid", value: userId)
            .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
            .append(key: "page", value: page)
            .append(key: "limit", value: 20)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 用户单机游戏记录
                class func game_generalGameRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/gameRecord")
                                                .append(key: "uid", value: userId)
                                                .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
                                                .append(key: "page", value: page)
                                                .append(key: "limit", value: 20)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 用户跨城游戏记录
    class func game_generalGameCrossRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
        let params = ParamsAppender.build(url: Game_Url)
            .interface(url: "/v7/user_api/general/cityGameRecord")
            .append(key: "uid", value: userId)
            .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
            .append(key: "page", value: page)
            .append(key: "limit", value: 20)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 用户跨城游戏记录
                class func game_generalGameCrossRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/cityGameRecord")
                                                .append(key: "uid", value: userId)
                                                .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
                                                .append(key: "page", value: page)
                                                .append(key: "limit", value: 20)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 用户跨城游戏记录
    class func game_generalGameAccuracyRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
        let params = ParamsAppender.build(url: Game_Url)
            .interface(url: "/v7/user_api/general/accuracyGameRecord")
            .append(key: "uid", value: userId)
            .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
            .append(key: "page", value: page)
            .append(key: "limit", value: 20)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 用户跨城游戏记录
                class func game_generalGameAccuracyRecord(userId:Int,page:Int,limit:Int = 20)->Observable<BaseResponse<[GamesRecordModel]>>{
                                let params = ParamsAppender.build(url: Game_Url)
                                                .interface(url: "/v7/user_api/general/accuracyGameRecord")
                                                .append(key: "uid", value: userId)
                                                .append(key: "sign", value: "0DB011836143EEE2C2E072967C9F4E4B")
                                                .append(key: "page", value: page)
                                                .append(key: "limit", value: 20)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
}
    // MARK: -- 登录部分
// MARK: -- 登录部分
extension Services{
    static let pageSize: Int = 20
    class func login(phone:String,verity:String,type:LoginType)->Observable<BaseResponse<String>>{
        let params = ParamsAppender.build(url: All_Url)
        if type == .pwd{
            params.interface(url: "/account/base/appUser/loginPassword")
            params.append(key: "password", value: verity.jq_md5String().lowercased())
        }else{
            params.interface(url: "/account/base/appUser/loginSMSCode")
            params.append(key: "code", value: verity)
        }
        params.append(key: "phone", value: phone)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                static let pageSize: Int = 20
                class func login(phone:String,verity:String,type:LoginType)->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                if type == .pwd{
                                                params.interface(url: "/account/base/appUser/loginPassword")
                                                params.append(key: "password", value: verity.jq_md5String().lowercased())
                                }else{
                                                params.interface(url: "/account/base/appUser/loginSMSCode")
                                                params.append(key: "code", value: verity)
                                }
                                params.append(key: "phone", value: phone)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func logOff()->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            params.interface(url: "/account/base/appUser/logOff")
            .append(key: "appId", value: UserInfoModel.get()!.userId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func logOff()->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/account/base/appUser/logOff")
                                                .append(key: "appId", value: UserInfoModel.get()!.userId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func wxLogin(openId:String,nickname:String,headimgurl:String,sex:Int)->Observable<BaseResponse<LoginModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/loginWeChat")
            .append(key: "openId", value: openId)
            .append(key: "nickname", value: nickname)
            .append(key: "headimgurl", value: headimgurl)
            .append(key: "sex", value: sex)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func wxLogin(openId:String,nickname:String,headimgurl:String,sex:Int)->Observable<BaseResponse<LoginModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/loginWeChat")
                                                .append(key: "openId", value: openId)
                                                .append(key: "nickname", value: nickname)
                                                .append(key: "headimgurl", value: headimgurl)
                                                .append(key: "sex", value: sex)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func wxPhoneBind(phone:String,code:String,openId:String,invitePhone:String? = nil)->Observable<BaseResponse<LoginModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/bind")
            .append(key: "phone", value: phone)
            .append(key: "openId", value: openId)
            .append(key: "code", value: code)
            .append(key: "invitePhone", value: invitePhone)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func wxPhoneBind(phone:String,code:String,openId:String,invitePhone:String? = nil)->Observable<BaseResponse<LoginModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/bind")
                                                .append(key: "phone", value: phone)
                                                .append(key: "openId", value: openId)
                                                .append(key: "code", value: code)
                                                .append(key: "invitePhone", value: invitePhone)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func getSMSCode(phone:String,type:GetSMSCodeType)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/getSMSCode")
            .append(key: "phone", value: phone)
            .append(key: "type", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func getSMSCode(phone:String,type:GetSMSCodeType)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/getSMSCode")
                                                .append(key: "phone", value: phone)
                                                .append(key: "type", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func register(phone:String,password:String,code:String,invitePhone:String? = nil)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/addAppUser")
            .append(key: "phone", value: phone)
            .append(key: "password", value: password.jq_md5String().lowercased())
            .append(key: "code", value: code)
            .append(key: "invitePhone", value: invitePhone)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func register(phone:String,password:String,code:String,invitePhone:String? = nil)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/addAppUser")
                                                .append(key: "phone", value: phone)
                                                .append(key: "password", value: password.jq_md5String().lowercased())
                                                .append(key: "code", value: code)
                                                .append(key: "invitePhone", value: invitePhone)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func updatePwd(phone:String,password:String,code:String)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/updatePassword")
            .append(key: "phone", value: phone)
            .append(key: "password", value: password.jq_md5String().lowercased())
            .append(key: "code", value: code)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func updatePwd(phone:String,password:String,code:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/updatePassword")
                                                .append(key: "phone", value: phone)
                                                .append(key: "password", value: password.jq_md5String().lowercased())
                                                .append(key: "code", value: code)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func forgetPwd(phone:String,password:String,code:String)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/appUser/forgetPassword")
            .append(key: "phone", value: phone)
            .append(key: "password", value: password.jq_md5String().lowercased())
            .append(key: "code", value: code)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func forgetPwd(phone:String,password:String,code:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/appUser/forgetPassword")
                                                .append(key: "phone", value: phone)
                                                .append(key: "password", value: password.jq_md5String().lowercased())
                                                .append(key: "code", value: code)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 用户详情
    class func userDetails()->Observable<BaseResponse<UserInfoModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/userDetails")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 用户详情
                class func userDetails()->Observable<BaseResponse<UserInfoModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/userDetails")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    class func updateUserProfile(_ imgUrl:String)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/uploadImage")
            .append(key: "userImage", value: imgUrl)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func updateUserProfile(_ imgUrl:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/uploadImage")
                                                .append(key: "userImage", value: imgUrl)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 勋章
    static func studMedalList(studentId:Int)->Observable<BaseResponse<[StudentMedalModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/stuGoog")
            .append(key: "stuId", value: studentId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 勋章
                static func studMedalList(studentId:Int)->Observable<BaseResponse<[StudentMedalModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/stuGoog")
                                                .append(key: "stuId", value: studentId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 成为会员获取优惠券
        /// - Parameter menthod: 1=积分购买,2=注册赠送
    static func queryMemberCoupon(menthod:Int)->Observable<BaseResponse<[CouponInfo_1_Model]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/coupon/queryCouponList")
            .append(key: "distributionMethod", value: menthod)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 成为会员获取优惠券
                /// - Parameter menthod: 1=积分购买,2=注册赠送
                static func queryMemberCoupon(menthod:Int)->Observable<BaseResponse<[CouponInfo_1_Model]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/coupon/queryCouponList")
                                                .append(key: "distributionMethod", value: menthod)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
    // MARK: -- 首页部分
// MARK: -- 首页部分
extension Services{
    class func homeInfo()->Observable<BaseResponse<HomeStoreModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/appUser/queryJoinPlayPai")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func homeInfo()->Observable<BaseResponse<HomeStoreModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/appUser/queryJoinPlayPai")
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func homeStoreConfig2(storeId:Int)->Observable<BaseResponse<[HomeStoreTopBannerModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryIndexSet")
            .append(key: "id", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func homeStoreConfig2(storeId:Int)->Observable<BaseResponse<[HomeStoreTopBannerModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryIndexSet")
                                                .append(key: "id", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 主页配置
    class func homeStoreConfig(storeId:Int)->Observable<BaseResponse<[HomeStoreConfigModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryStoreConfig")
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 主页配置
                class func homeStoreConfig(storeId:Int)->Observable<BaseResponse<[HomeStoreConfigModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryStoreConfig")
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取banner图
        /// - Parameter position: 位置(1=首页,2=线上课得积分,3=看视频得奖励,4=常见问题)
    class func bannerList(position:BannerPositionType)->Observable<BaseResponse<[BannerModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/banner/queryBannerList")
            .append(key: "position", value: position.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取banner图
                /// - Parameter position: 位置(1=首页,2=线上课得积分,3=看视频得奖励,4=常见问题)
                class func bannerList(position:BannerPositionType)->Observable<BaseResponse<[BannerModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/banner/queryBannerList")
                                                .append(key: "position", value: position.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
}
// MARK: -- 福利相关
extension Services{
    class func benefitHome()->Observable<BaseResponse<BenefitHomeModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/indexOfAppUser")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func benefitHome()->Observable<BaseResponse<BenefitHomeModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/indexOfAppUser")
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 账单
        /// - Parameters:
        ///   - recordType: 记录(1充值 2扣除)
    class func billingList(recordType:Int?,yearMonth:String)->Observable<BaseResponse<[BillingModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/userBilling")
            .append(key: "recordId", value: recordType)
            .append(key: "yearMonth", value: yearMonth)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 账单
                /// - Parameters:
                ///   - recordType: 记录(1充值 2扣除)
                class func billingList(recordType:Int?,yearMonth:String)->Observable<BaseResponse<[BillingModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/userBilling")
                                                .append(key: "recordId", value: recordType)
                                                .append(key: "yearMonth", value: yearMonth)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 优惠券
    class func myCouponList(type:Int?,useStatus:Int?)->Observable<BaseResponse<[CouponModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/coupon/queryCouponPackage")
            .append(key: "couponType", value: type)
            .append(key: "useStatus", value: useStatus)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 优惠券
                class func myCouponList(type:Int?,useStatus:Int?)->Observable<BaseResponse<[CouponModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/coupon/queryCouponPackage")
                                                .append(key: "couponType", value: type)
                                                .append(key: "useStatus", value: useStatus)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 充值明细
        /// - Parameters:
        ///   - yearMonth:  记录(1充值 2扣除)
    class func voucherDetail(recordType:Int?,yearMonth:String,page:Int,pageSize:Int = 20,subType:RechargeRecordVC.RechargeRecordType)->Observable<BaseResponse<[BillingModel]>>{
                /// 充值明细
                /// - Parameters:
                ///   - yearMonth:  记录(1充值 2扣除)
                class func voucherDetail(recordType:Int?,yearMonth:String,page:Int,pageSize:Int = 20,subType:RechargeRecordVC.RechargeRecordType)->Observable<BaseResponse<[BillingModel]>>{
        let params:ParamsAppender!
        if subType == .coin{
            params = ParamsAppender.build(url: All_Url).interface(url: "/account/api/useBenefit/voucherDetail")
        }else{
            params = ParamsAppender.build(url: All_Url).interface(url: "/account/api/useBenefit/integralDetails")
        }
                                let params:ParamsAppender!
                                if subType == .coin{
                                                params = ParamsAppender.build(url: All_Url).interface(url: "/account/api/useBenefit/voucherDetail")
                                }else{
                                                params = ParamsAppender.build(url: All_Url).interface(url: "/account/api/useBenefit/integralDetails")
                                }
        params.append(key: "recordId", value: recordType)
        params.append(key: "yearMonth", value: yearMonth)
        params.append(key: "pageNum", value: page)
        params.append(key: "pageSize", value: pageSize)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                                params.append(key: "recordId", value: recordType)
                                params.append(key: "yearMonth", value: yearMonth)
                                params.append(key: "pageNum", value: page)
                                params.append(key: "pageSize", value: pageSize)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 充值列表
    class func voucherCenter()->Observable<BaseResponse<[CoinExchangeModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/voucherCenter")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 充值列表
                class func voucherCenter()->Observable<BaseResponse<[CoinExchangeModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/voucherCenter")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 支付
    class func useBenefitPayment(amount:Double,payType:PayType)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/payment")
            .append(key: "amount", value: amount)
            .append(key: "payType", value: payType.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 支付
                class func useBenefitPayment(amount:Double,payType:PayType)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/payment")
                                                .append(key: "amount", value: amount)
                                                .append(key: "payType", value: payType.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 充值说明
    class func rechargeDescription()->Observable<BaseResponse<String>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/stored/rechargeDescription")
        return NetworkRequest.request(params: params, method: .post, progress: true)
                /// 充值说明
                class func rechargeDescription()->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/stored/rechargeDescription")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                }
}
    // MARK: -- 运动营相关
// MARK: -- 运动营相关
extension Services {
        /// 获取优惠券
    class func paymentCourseCouponList(id:Int)->Observable<BaseResponse<[CourseCouponModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/paymentCourseCouponList")
            .append(key: "coursePackagePaymentConfigId", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取优惠券
                class func paymentCourseCouponList(id:Int)->Observable<BaseResponse<[CourseCouponModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/paymentCourseCouponList")
                                                .append(key: "coursePackagePaymentConfigId", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func queryCourseList(typeId:Int? = nil,distanceSort:SortType? = nil,salesRanking:SortType? = nil,search:String? = nil,storeId:Int? = nil)->Observable<BaseResponse<[CourseItemModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/queryCourseList")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "coursePackageTypeId", value: typeId)
            .append(key: "distanceSort", value: distanceSort?.rawValue)
            .append(key: "salesRanking", value: salesRanking?.rawValue)
            .append(key: "search", value: search)
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func queryCourseList(typeId:Int? = nil,distanceSort:SortType? = nil,salesRanking:SortType? = nil,search:String? = nil,storeId:Int? = nil)->Observable<BaseResponse<[CourseItemModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/queryCourseList")
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "coursePackageTypeId", value: typeId)
                                                .append(key: "distanceSort", value: distanceSort?.rawValue)
                                                .append(key: "salesRanking", value: salesRanking?.rawValue)
                                                .append(key: "search", value: search)
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func querypaymentCompetitionCourseList(id:Int)->Observable<BaseResponse<[CourseListSubModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/api/competition/paymentCompetitionCourseList")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func querypaymentCompetitionCourseList(id:Int)->Observable<BaseResponse<[CourseListSubModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/competition/api/competition/paymentCompetitionCourseList")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func getMyCourseList(storeId:Int)->Observable<BaseResponse<[CourseListSubModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/getMyCourseList")
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func getMyCourseList(storeId:Int)->Observable<BaseResponse<[CourseListSubModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/getMyCourseList")
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func coursePackageType()->Observable<BaseResponse<[NormalSimpleModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/queryCoursePackageType")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func coursePackageType()->Observable<BaseResponse<[NormalSimpleModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/queryCoursePackageType")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func queryStoreList(cityCode:Int? = nil)->Observable<BaseResponse<[NormalSimpleModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryStoreLists")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "cityCode", value: cityCode)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func queryStoreList(cityCode:Int? = nil)->Observable<BaseResponse<[NormalSimpleModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryStoreLists")
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "cityCode", value: cityCode)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func queryCourseInfo(id:Int,payId:Int? = nil)->Observable<BaseResponse<CourseDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/queryCourseInfo")
            .append(key: "id", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "payId", value: payId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func queryCourseInfo(id:Int,payId:Int? = nil)->Observable<BaseResponse<CourseDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/queryCourseInfo")
                                                .append(key: "id", value: id)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "payId", value: payId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 查询可用优惠券
    class func queryAvaiableCopons(id:Int,price:Double)->Observable<BaseResponse<[CouponInfoModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/coupon/queryAvailableCouponList")
            .append(key: "coursePackageId", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "price", value: "\(price)")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 查询可用优惠券
                class func queryAvaiableCopons(id:Int,price:Double)->Observable<BaseResponse<[CouponInfoModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/coupon/queryAvailableCouponList")
                                                .append(key: "coursePackageId", value: id)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "price", value: "\(price)")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取学员列表
    class func queryStudentList()->Observable<BaseResponse<[CourseDetailStudentModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/student/queryStudentList")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取学员列表
                class func queryStudentList()->Observable<BaseResponse<[CourseDetailStudentModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/student/queryStudentList")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func editStu(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/commitEditStu")
            .append(key: "birthday", value: model.birthday)
            .append(key: "headImg", value: model.headImg)
            .append(key: "height", value: model.height.string)
            .append(key: "idCard", value: model.idCard)
            .append(key: "name", value: model.name)
            .append(key: "phone", value: model.phone)
            .append(key: "sex", value: model.sex.rawValue)
            .append(key: "weight", value: model.weight.string)
            .append(key: "stuId", value: model.stuId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func editStu(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/commitEditStu")
                                                .append(key: "birthday", value: model.birthday)
                                                .append(key: "headImg", value: model.headImg)
                                                .append(key: "height", value: model.height.string)
                                                .append(key: "idCard", value: model.idCard)
                                                .append(key: "name", value: model.name)
                                                .append(key: "phone", value: model.phone)
                                                .append(key: "sex", value: model.sex.rawValue)
                                                .append(key: "weight", value: model.weight.string)
                                                .append(key: "stuId", value: model.stuId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 添加学员
    class func addStudent(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/addData")
            .append(key: "birthday", value: model.birthday)
            .append(key: "headImg", value: model.headImg)
            .append(key: "height", value: model.height.string)
            .append(key: "idCard", value: model.idCard)
            .append(key: "name", value: model.name)
            .append(key: "phone", value: model.phone)
            .append(key: "sex", value: model.sex.rawValue)
            .append(key: "weight", value: model.weight.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 添加学员
                class func addStudent(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/addData")
                                                .append(key: "birthday", value: model.birthday)
                                                .append(key: "headImg", value: model.headImg)
                                                .append(key: "height", value: model.height.string)
                                                .append(key: "idCard", value: model.idCard)
                                                .append(key: "name", value: model.name)
                                                .append(key: "phone", value: model.phone)
                                                .append(key: "sex", value: model.sex.rawValue)
                                                .append(key: "weight", value: model.weight.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 购买运动营
    class func courcePayment(conponId:Int? = nil,courseConfigId:Int,id:Int,price:Double,payType:PayType,stuId:[Int],orderId:Int? = nil)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/paymentCourse")
            .append(key: "couponId", value: conponId)
            .append(key: "coursePackagePaymentConfigId", value: courseConfigId)
            .append(key: "id", value: id)
            .append(key: "payType", value: payType.rawValue)
            .append(key: "price", value: price.string)
            .append(key: "studentIds", value: stuId.map({"\($0)"}).joined(separator: ";"))
            .append(key: "orderId", value: orderId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 购买运动营
                class func courcePayment(conponId:Int? = nil,courseConfigId:Int,id:Int,price:Double,payType:PayType,stuId:[Int],orderId:Int? = nil)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/paymentCourse")
                                                .append(key: "couponId", value: conponId)
                                                .append(key: "coursePackagePaymentConfigId", value: courseConfigId)
                                                .append(key: "id", value: id)
                                                .append(key: "payType", value: payType.rawValue)
                                                .append(key: "price", value: price.string)
                                                .append(key: "studentIds", value: stuId.map({"\($0)"}).joined(separator: ";"))
                                                .append(key: "orderId", value: orderId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 查询店的免费福利
    class func queryStoreFreeBenefit(id:Int)->Observable<BaseResponse<StoreWalfareModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "other/base/store/queryStoreFreeBenefit")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 查询店的免费福利
                class func queryStoreFreeBenefit(id:Int)->Observable<BaseResponse<StoreWalfareModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "other/base/store/queryStoreFreeBenefit")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 本周福利
    class func weekLimitedBenefit(discountType:Int)->Observable<BaseResponse<[WeeklyItemModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/useBenefit/weekLimitedBenefit")
            .append(key: "discountType", value: discountType)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 本周福利
                class func weekLimitedBenefit(discountType:Int)->Observable<BaseResponse<[WeeklyItemModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/useBenefit/weekLimitedBenefit")
                                                .append(key: "discountType", value: discountType)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 本周福利详情
    class func weekBenefitDetail(id:Int)->Observable<BaseResponse<WeeklyItemDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/useBenefit/discountCourseDatas")
            .append(key: "coursePackageDiscountId", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 本周福利详情
                class func weekBenefitDetail(id:Int)->Observable<BaseResponse<WeeklyItemDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/useBenefit/discountCourseDatas")
                                                .append(key: "coursePackageDiscountId", value: id)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
extension Services{
        /// 已报名运动营-运动营列表
    static func registeredCourse(courseTypeId:Int? = nil,search:String? = nil)->Observable<BaseResponse<[SignUpCourseItemModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/registeredCourses")
            .append(key: "courseTypeId", value: courseTypeId)
            .append(key: "search", value: search)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 已报名运动营-运动营列表
                static func registeredCourse(courseTypeId:Int? = nil,search:String? = nil)->Observable<BaseResponse<[SignUpCourseItemModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/registeredCourses")
                                                .append(key: "courseTypeId", value: courseTypeId)
                                                .append(key: "search", value: search)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    static func registeredData(coursePayId:Int,orderId:Int? = nil)->Observable<BaseResponse<SignUpCourseItemDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/RegisteredData")
            .append(key: "coursePayId", value: coursePayId)
            .append(key: "orderId", value: orderId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                static func registeredData(coursePayId:Int,orderId:Int? = nil)->Observable<BaseResponse<SignUpCourseItemDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/RegisteredData")
                                                .append(key: "coursePayId", value: coursePayId)
                                                .append(key: "orderId", value: orderId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 开始上课:学员列表
    static func startCourceStudentList()->Observable<BaseResponse<[StudentProfile1Model]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/listOfStu")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 开始上课:学员列表
                static func startCourceStudentList()->Observable<BaseResponse<[StudentProfile1Model]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/listOfStu")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 切换学员
    static func startCourseSwitch(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/switchStu")
            .append(key: "stuId", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 切换学员
                static func startCourseSwitch(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/switchStu")
                                                .append(key: "stuId", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 设置默认
    static func courseDefaultSet(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/editDefault")
            .append(key: "stuId", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 设置默认
                static func courseDefaultSet(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/editDefault")
                                                .append(key: "stuId", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 上课首页
    static func startCourseHome()->Observable<BaseResponse<StartClouseHomeModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/queryStudentData")
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 上课首页
                static func startCourseHome()->Observable<BaseResponse<StartClouseHomeModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/queryStudentData")
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取学员测试报告
    static func queryPhysical(stuId:Int)->Observable<BaseResponse<StartClouseReportModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/queryPhysical")
            .append(key: "stuID", value: stuId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取学员测试报告
                static func queryPhysical(stuId:Int)->Observable<BaseResponse<StartClouseReportModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/queryPhysical")
                                                .append(key: "stuID", value: stuId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 学员预约运动营列表
    static func studentAppointList(page:Int,stuId:Int,status:StudentAppointTypeList?,search:String,timeType:StudentAppointDateType)->Observable<BaseResponse<[StudentAppointModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/stuAppointList")
            .append(key: "appointStatus", value: status?.rawValue)
            .append(key: "timeType", value: timeType.rawValue)
            .append(key: "search", value: search)
            .append(key: "stuId", value: stuId)
            .append(key: "pageNum", value: page)
            .append(key: "size", value: 20)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 学员预约运动营列表
                static func studentAppointList(page:Int,stuId:Int,status:StudentAppointTypeList?,search:String,timeType:StudentAppointDateType)->Observable<BaseResponse<[StudentAppointModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/stuAppointList")
                                                .append(key: "appointStatus", value: status?.rawValue)
                                                .append(key: "timeType", value: timeType.rawValue)
                                                .append(key: "search", value: search)
                                                .append(key: "stuId", value: stuId)
                                                .append(key: "pageNum", value: page)
                                                .append(key: "size", value: 20)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 课后练习-获取布置运动营列表
    static func queryArrangeCourseList()->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/course/queryArrangeCourseList")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 课后练习-获取布置运动营列表
                static func queryArrangeCourseList()->Observable<BaseResponse<[CityProfileModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/course/queryArrangeCourseList")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 课后练习-课后视频列表
    static func exerciseCourseList(courseTypeId:Int?,search:String? = nil)->Observable<BaseResponse<[ExerciseVideoModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/afterSourceList")
            .append(key: "courseTypeId", value: courseTypeId)
            .append(key: "search", value: search)
            .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 课后练习-课后视频列表
                static func exerciseCourseList(courseTypeId:Int?,search:String? = nil)->Observable<BaseResponse<[ExerciseVideoModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/afterSourceList")
                                                .append(key: "courseTypeId", value: courseTypeId)
                                                .append(key: "search", value: search)
                                                .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 课后练习-课后视频详情
    static func exerciseCourseDetail(coursePackageId:Int,videoId:Int,scId:Int? = nil)->Observable<BaseResponse<ExerciseVideoDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/afterSourceDetail")
            .append(key: "coursePackageId", value: coursePackageId)
            .append(key: "videoId", value: videoId)
            .append(key: "scId", value: scId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 课后练习-课后视频详情
                static func exerciseCourseDetail(coursePackageId:Int,videoId:Int,scId:Int? = nil)->Observable<BaseResponse<ExerciseVideoDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/afterSourceDetail")
                                                .append(key: "coursePackageId", value: coursePackageId)
                                                .append(key: "videoId", value: videoId)
                                                .append(key: "scId", value: scId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 取消预约
    static func cancelCourse(courseStuRecordId:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/cancelCourse")
            .append(key: "courseStuRecordId", value: courseStuRecordId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 取消预约
                static func cancelCourse(courseStuRecordId:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/cancelCourse")
                                                .append(key: "courseStuRecordId", value: courseStuRecordId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 学员评语
    static func stuComment(stuId:Int)->Observable<BaseResponse<[StudentCommentModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/stuComment")
            .append(key: "stuId", value: stuId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 学员评语
                static func stuComment(stuId:Int)->Observable<BaseResponse<[StudentCommentModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/stuComment")
                                                .append(key: "stuId", value: stuId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 课时详情-记录列表
    static func recordDetails(stuId:Int,lessionId:Int,startTime:String?,type:Int?)->Observable<BaseResponse<[CourseRecordModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/recordDetails")
            .append(key: "stuId", value: stuId)
            .append(key: "lessionId", value: lessionId)
            .append(key: "time", value: startTime)
            .append(key: "type", value: type)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 课时详情-记录列表
                static func recordDetails(stuId:Int,lessionId:Int,startTime:String?,type:Int?)->Observable<BaseResponse<[CourseRecordModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/recordDetails")
                                                .append(key: "stuId", value: stuId)
                                                .append(key: "lessionId", value: lessionId)
                                                .append(key: "time", value: startTime)
                                                .append(key: "type", value: type)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    static func lessonDetails(lessonId:Int,stuId:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/lessonDetails")
            .append(key: "stuId", value: stuId)
            .append(key: "lessonId", value: lessonId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                static func lessonDetails(lessonId:Int,stuId:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/lessonDetails")
                                                .append(key: "stuId", value: stuId)
                                                .append(key: "lessonId", value: lessonId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 上课首页-运动营列表
    static func weeksOfCourseDetails(stuId:Int,time:Date,storeId:Int)->Observable<BaseResponse<WeeklyCourseModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/weeksOfCourseDetailsList")
            .append(key: "stuId", value: stuId)
            .append(key: "time", value: time.jq_format("yyyy-MM-dd"))
            .append(key: "storeId", value: storeId)
            .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 上课首页-运动营列表
                static func weeksOfCourseDetails(stuId:Int,time:Date,storeId:Int)->Observable<BaseResponse<WeeklyCourseModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/weeksOfCourseDetailsList")
                                                .append(key: "stuId", value: stuId)
                                                .append(key: "time", value: time.jq_format("yyyy-MM-dd"))
                                                .append(key: "storeId", value: storeId)
                                                .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 更新课后视频学习状态
    static func updateVideoStatus(coursePackageId:Int,videoId:Int?,scId:Int? = nil)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/updateVideoStatus")
            .append(key: "coursePackageId", value: coursePackageId)
            .append(key: "videoId", value: videoId)
            .append(key: "isOver", value: 1)
            .append(key: "scId", value: scId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 更新课后视频学习状态
                static func updateVideoStatus(coursePackageId:Int,videoId:Int?,scId:Int? = nil)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/updateVideoStatus")
                                                .append(key: "coursePackageId", value: coursePackageId)
                                                .append(key: "videoId", value: videoId)
                                                .append(key: "isOver", value: 1)
                                                .append(key: "scId", value: scId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 观看视频结束后领取奖励
    static func receiveAward(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/benefitsVideo/receiveAward")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 观看视频结束后领取奖励
                static func receiveAward(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/benefitsVideo/receiveAward")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 上课主页-请假操作
    static func startCourceRreverse(courseId:Int,time:String,stuId:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/reverse")
            .append(key: "courseID", value: courseId)
            .append(key: "time", value: time)
            .append(key: "stuId", value: stuId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 上课主页-请假操作
                static func startCourceRreverse(courseId:Int,time:String,stuId:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/reverse")
                                                .append(key: "courseID", value: courseId)
                                                .append(key: "time", value: time)
                                                .append(key: "stuId", value: stuId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 体验购课
    static func payCourseInfo(courseId:Int)->Observable<BaseResponse<ExperienceCourseModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/payCourseInfo")
            .append(key: "courseId", value: courseId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 体验购课
                static func payCourseInfo(courseId:Int)->Observable<BaseResponse<ExperienceCourseModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/payCourseInfo")
                                                .append(key: "courseId", value: courseId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
    /// 确认购课
    static func payCourse(courseId:Int,num:Int,oldCourseId:Int,time:[String])->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/payCourse")
            .append(key: "courseId", value: courseId)
            .append(key: "num", value: num)
            .append(key: "oldCourseId", value: oldCourseId)
            .append(key: "time", value: time.joined(separator: ",").replacingOccurrences(of: ".", with: "-"))
            .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 确认购课
                static func payCourse(courseId:Int,num:Int,oldCourseId:Int,time:[String])->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/course/api/startCource/payCourse")
                                                .append(key: "courseId", value: courseId)
                                                .append(key: "num", value: num)
                                                .append(key: "oldCourseId", value: oldCourseId)
                                                .append(key: "time", value: time.joined(separator: ",").replacingOccurrences(of: ".", with: "-"))
                                                .append(key: "stuId", value: UserDefaults.standard.value(forKey: "currentStuId") as? Int)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 学员勋章详情
    static func courseStuMedal(stuId:Int)->Observable<BaseResponse<[StudentMedalInfoModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/stuMedal")
            .append(key: "stuId", value: stuId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 学员勋章详情
                static func courseStuMedal(stuId:Int)->Observable<BaseResponse<[StudentMedalInfoModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/stuMedal")
                                                .append(key: "stuId", value: stuId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 有未分配课时
    static func weeksOfGetHours()->Observable<BaseResponse<Int>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/weeksOfGetHours")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 有未分配课时
                static func weeksOfGetHours()->Observable<BaseResponse<Int>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/weeksOfGetHours")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 分配课时
    static func weeksOfAddHours(packetId:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/startCource/weeksOfAddHours")
            .append(key: "packetId", value: packetId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 分配课时
                static func weeksOfAddHours(packetId:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/startCource/weeksOfAddHours")
                                                .append(key: "packetId", value: packetId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
// MARK: -- 探索玩湃
extension Services{
    static func exploreStoreList(search:String? = nil,space:Int? = nil,cityCode:Int? = nil)->Observable<BaseResponse<[SearchStoreListModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/exploreWP/storeList")
            .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "search", value: search)
            .append(key: "space", value: space)
            .append(key: "cityCode", value: cityCode)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                static func exploreStoreList(search:String? = nil,space:Int? = nil,cityCode:Int? = nil)->Observable<BaseResponse<[SearchStoreListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/exploreWP/storeList")
                                                .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "search", value: search)
                                                .append(key: "space", value: space)
                                                .append(key: "cityCode", value: cityCode)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 探索玩湃首页数据
    static func exploreHome()->Observable<BaseResponse<[StartClouseExploreModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/exploreWP/indexOfEx")
            .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 探索玩湃首页数据
                static func exploreHome()->Observable<BaseResponse<[StartClouseExploreModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/exploreWP/indexOfEx")
                                                .append(key: "latitude", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "longitude", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取公告列表/常见问题列表
    static func exploreNoticeList(type:CustomerSubListVC.CustomerSubType)->Observable<BaseResponse<[NoticeItemModel]>>{
        let params = ParamsAppender.build(url: All_Url)
        if type == .notice{
            params.interface(url: "/account/base/exploreWP/noticeList")
        }else{
            params.interface(url: "/account/base/exploreWP/exceptionList")
        }
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取公告列表/常见问题列表
                static func exploreNoticeList(type:CustomerSubListVC.CustomerSubType)->Observable<BaseResponse<[NoticeItemModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                if type == .notice{
                                                params.interface(url: "/account/base/exploreWP/noticeList")
                                }else{
                                                params.interface(url: "/account/base/exploreWP/exceptionList")
                                }
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        ///  查看详情
    static func exploreNoticeDetail(id:Int,type:CustomerSubListVC.CustomerSubType)->Observable<BaseResponse<NoticeItemModel>>{
        let params = ParamsAppender.build(url: All_Url)
        if type == .notice{
            params.interface(url: "/account/base/exploreWP/noticeDetail")
            params.append(key: "noId", value: id)
        }else{
            params.interface(url: "/account/base/exploreWP/exceptionDetail")
            params.append(key: "quesId", value: id)
        }
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                ///  查看详情
                static func exploreNoticeDetail(id:Int,type:CustomerSubListVC.CustomerSubType)->Observable<BaseResponse<NoticeItemModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                if type == .notice{
                                                params.interface(url: "/account/base/exploreWP/noticeDetail")
                                                params.append(key: "noId", value: id)
                                }else{
                                                params.interface(url: "/account/base/exploreWP/exceptionDetail")
                                                params.append(key: "quesId", value: id)
                                }
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 客服电话
    static func customerPhone()->Observable<BaseResponse<[String]>>{
        let params = ParamsAppender.build(url: All_Url)
            params.interface(url: "/account/base/exploreWP/customerList")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 客服电话
                static func customerPhone()->Observable<BaseResponse<[String]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/account/base/exploreWP/customerList")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取门店详情
    static func exploreStoreDetail(storeId:Int)->Observable<BaseResponse<SearchStoreDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/base/exploreWP/storeDetail")
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取门店详情
                static func exploreStoreDetail(storeId:Int)->Observable<BaseResponse<SearchStoreDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/base/exploreWP/storeDetail")
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 评价门店
    static func evaluationStore(id:Int,content:String,imgs:String,score:Double)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/storeEvaluation/saveEvaluation")
            .append(key: "storeId", value: id)
            .append(key: "content", value: content)
            .append(key: "imgs", value: imgs)
            .append(key: "score", value: score)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 评价门店
                static func evaluationStore(id:Int,content:String,imgs:String,score:Double)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/storeEvaluation/saveEvaluation")
                                                .append(key: "storeId", value: id)
                                                .append(key: "content", value: content)
                                                .append(key: "imgs", value: imgs)
                                                .append(key: "score", value: score)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
// MARK: --  商城部分
extension Services{
        /// 积分商城-商品详情
    static func UseBenefitDetail(goodsId:Int,goodsType:ExchangeType)->Observable<BaseResponse<ExchangeGoodsModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/goodsDetails")
            .append(key: "goodId", value: goodsId)
            .append(key: "goodsType", value: goodsType.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 积分商城-商品详情
                static func UseBenefitDetail(goodsId:Int,goodsType:ExchangeType)->Observable<BaseResponse<ExchangeGoodsModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/goodsDetails")
                                                .append(key: "goodId", value: goodsId)
                                                .append(key: "goodsType", value: goodsType.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 积分商城-商品详情
    static func UseBenefitDetailOne(goodsId:Int)->Observable<BaseResponse<ExchangeGoodsModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/goodsDetailsOne")
            .append(key: "goodId", value: goodsId)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 积分商城-商品详情
                static func UseBenefitDetailOne(goodsId:Int)->Observable<BaseResponse<ExchangeGoodsModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/goodsDetailsOne")
                                                .append(key: "goodId", value: goodsId)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 兑换门店
    static func exchangeStoreIds(id:Int,type:ExchangeType)->Observable<BaseResponse<[StoreSimpleModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/exchangeStoreIds")
            .append(key: "pointsMerId", value: id)
            .append(key: "goodsType", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 兑换门店
                static func exchangeStoreIds(id:Int,type:ExchangeType)->Observable<BaseResponse<[StoreSimpleModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/exchangeStoreIds")
                                                .append(key: "pointsMerId", value: id)
                                                .append(key: "goodsType", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 兑换商品
    static func exchangeOperation(exchangeType:ExchangePaymentType,goodsId:Int,goodsType:ExchangeType,num:Int,payType:PayType?,stuIds:String,storeId:Int?)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/productRedemptionOperation")
            .append(key: "exchangeType", value: exchangeType.rawValue)
            .append(key: "goodId", value: goodsId)
            .append(key: "goodsType", value: goodsType.rawValue)
            .append(key: "nums", value: num)
            .append(key: "payType", value: payType?.rawValue)
            .append(key: "stuIds", value: stuIds)
            .append(key: "storeId", value: storeId)
        return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
    }
                /// 兑换商品
                static func exchangeOperation(exchangeType:ExchangePaymentType,goodsId:Int,goodsType:ExchangeType,num:Int,payType:PayType?,stuIds:String,storeId:Int?)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/productRedemptionOperation")
                                                .append(key: "exchangeType", value: exchangeType.rawValue)
                                                .append(key: "goodId", value: goodsId)
                                                .append(key: "goodsType", value: goodsType.rawValue)
                                                .append(key: "nums", value: num)
                                                .append(key: "payType", value: payType?.rawValue)
                                                .append(key: "stuIds", value: stuIds)
                                                .append(key: "storeId", value: storeId)
                                return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
                }
        /// 积分商城-实体、门票、优惠券为默认门店|课包为默认学员
    static func goodsOfCourseStore(isCourse:Bool,pointsMerId:Int)->Observable<BaseResponse<StudentProfile2Model>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/goodsOfCourseStore")
            .append(key: "isCourse", value: isCourse)
            .append(key: "pointsMerId", value: pointsMerId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 积分商城-实体、门票、优惠券为默认门店|课包为默认学员
                static func goodsOfCourseStore(isCourse:Bool,pointsMerId:Int)->Observable<BaseResponse<StudentProfile2Model>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/goodsOfCourseStore")
                                                .append(key: "isCourse", value: isCourse)
                                                .append(key: "pointsMerId", value: pointsMerId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 商城中心
    class func mallList(page:Int,goodsType:ExchangeType?,rank:Sort2Type?,search:String?,shopId:Int?)->Observable<BaseResponse<[MarketMdoel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/integralMallList")
            .append(key: "goodsType", value: goodsType?.rawValue)
            .append(key: "rank", value: rank?.rawValue)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
            .append(key: "pageNum", value: page)
            .append(key: "pageSize", value: 20)
            .append(key: "search", value: search)
            .append(key: "shopId", value: shopId)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 商城中心
                class func mallList(page:Int,goodsType:ExchangeType?,rank:Sort2Type?,search:String?,shopId:Int?)->Observable<BaseResponse<[MarketMdoel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/integralMallList")
                                                .append(key: "goodsType", value: goodsType?.rawValue)
                                                .append(key: "rank", value: rank?.rawValue)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                                .append(key: "pageNum", value: page)
                                                .append(key: "pageSize", value: 20)
                                                .append(key: "search", value: search)
                                                .append(key: "shopId", value: shopId)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 积分商城-兑换记录
    class func exchangeRecords(page:Int,goodType:ExchangeType? = nil,useType:UseStateType? = nil)->Observable<BaseResponse<[RecordsModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/exchangeRecords")
            .append(key: "goodType", value: goodType?.rawValue)
            .append(key: "useType", value: useType?.rawValue)
            .append(key: "page", value:page)
            .append(key: "size", value: 20)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 积分商城-兑换记录
                class func exchangeRecords(page:Int,goodType:ExchangeType? = nil,useType:UseStateType? = nil)->Observable<BaseResponse<[RecordsModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/exchangeRecords")
                                                .append(key: "goodType", value: goodType?.rawValue)
                                                .append(key: "useType", value: useType?.rawValue)
                                                .append(key: "page", value:page)
                                                .append(key: "size", value: 20)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 兑换记录-详情
    class  func exchangeRecordDetail(id:Int,goodType:ExchangeType)->Observable<BaseResponse<RecordsDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/useBenefit/redemptionDetails")
            .append(key: "detailsId", value: id)
//            .append(key: "goodType", value: goodType.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 兑换记录-详情
                class  func exchangeRecordDetail(id:Int,goodType:ExchangeType)->Observable<BaseResponse<RecordsDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/useBenefit/redemptionDetails")
                                                .append(key: "detailsId", value: id)
                                //            .append(key: "goodType", value: goodType.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
// MARK: -- 预约场地
extension Services{
        /// 场地预约详情
    static func siteDetail(id:Int)->Observable<BaseResponse<YardBookingDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/queryMySiteById")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
        /// 获取场地类型
    static func querySiteType()->Observable<BaseResponse<[NormalSimpleModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteType")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 场地预约详情
                static func siteDetail(id:Int)->Observable<BaseResponse<YardBookingDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/queryMySiteById")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取场地列表
    static func querySiteList(pageNum:Int,pageSize:Int,siteTypeId:Int?,cityCode:Int?,storeId:Int?,startTime:String?,endTime:String?,search:String?)->Observable<BaseResponse<[SiteItemModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteList")
            .append(key: "pageNum", value: pageNum)
            .append(key: "pageSize", value: pageSize)
            .append(key: "siteTypeId", value: siteTypeId)
            .append(key: "cityCode", value: cityCode)
            .append(key: "storeId", value: storeId)
            .append(key: "startTime", value: startTime)
            .append(key: "endTime", value: endTime)
            .append(key: "search", value: search)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取场地类型
                static func querySiteType()->Observable<BaseResponse<[NormalSimpleModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/site/querySiteType")
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取场地详情
    static func querySiteDetail(id:Int)->Observable<BaseResponse<SiteDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteInfo")
            .append(key: "id", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取场地列表
                static func querySiteList(pageNum:Int,pageSize:Int,siteTypeId:Int?,cityCode:Int?,storeId:Int?,startTime:String?,endTime:String?,search:String?)->Observable<BaseResponse<[SiteItemModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/site/querySiteList")
                                                .append(key: "pageNum", value: pageNum)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "siteTypeId", value: siteTypeId)
                                                .append(key: "cityCode", value: cityCode)
                                                .append(key: "storeId", value: storeId)
                                                .append(key: "startTime", value: startTime)
                                                .append(key: "endTime", value: endTime)
                                                .append(key: "search", value: search)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取场地详情-时间表
        /// - Parameters:
        ///   - day: YYYY-MM-dd
    static func querySiteTimes(id:Int,day:String,halfName:String?,siteName:String?)->Observable<BaseResponse<[SiteDetailDateTimeModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteTimes")
            .append(key: "id", value: id)
            .append(key: "day", value: day)
            .append(key: "halfName", value: halfName)
            .append(key: "siteName", value: siteName)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取场地详情
                static func querySiteDetail(id:Int)->Observable<BaseResponse<SiteDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/site/querySiteInfo")
                                                .append(key: "id", value: id)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 预约场地支付
    static func reservationSite(booker:String,couponId:Int?,id:Int,payType:PayType,phone:String,times:String,halfName:String? = nil,isHalf:Int,nextName:String? = nil)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/reservationSite")
            .append(key: "booker", value: booker)
            .append(key: "couponId", value: couponId)
            .append(key: "id", value: id)
            .append(key: "payType", value: payType.rawValue)
            .append(key: "phone", value: phone)
            .append(key: "times", value: times)
            .append(key: "halfName", value: halfName)
            .append(key: "isHalf", value: isHalf)
            .append(key: "nextName", value: nextName)
        return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
    }
                /// 获取场地详情-时间表
                /// - Parameters:
                ///   - day: YYYY-MM-dd
                static func querySiteTimes(id:Int,day:String,halfName:String?,siteName:String?)->Observable<BaseResponse<[SiteDetailDateTimeModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/site/querySiteTimes")
                                                .append(key: "id", value: id)
                                                .append(key: "day", value: day)
                                                .append(key: "halfName", value: halfName)
                                                .append(key: "siteName", value: siteName)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取优惠券列表
    static func querySiteCouponList(price:Double,siteId:Int)->Observable<BaseResponse<[CouponInfoModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/coupon/querySiteCouponList")
            .append(key: "price", value: price.string)
            .append(key: "siteId", value: siteId)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 预约场地支付
                static func reservationSite(booker:String,couponId:Int?,id:Int,payType:PayType,phone:String,times:String,halfName:String? = nil,isHalf:Int,nextName:String? = nil)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/reservationSite")
                                                .append(key: "booker", value: booker)
                                                .append(key: "couponId", value: couponId)
                                                .append(key: "id", value: id)
                                                .append(key: "payType", value: payType.rawValue)
                                                .append(key: "phone", value: phone)
                                                .append(key: "times", value: times)
                                                .append(key: "halfName", value: halfName)
                                                .append(key: "isHalf", value: isHalf)
                                                .append(key: "nextName", value: nextName)
                                return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
                }
                /// 获取优惠券列表
                static func querySiteCouponList(price:Double,siteId:Int)->Observable<BaseResponse<[CouponInfoModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/coupon/querySiteCouponList")
                                                .append(key: "price", value: price.string)
                                                .append(key: "siteId", value: siteId)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取我的预约场地列表
    class func queryMySite(page:Int,pageSize:Int = 20,status:YardBookingType?)->Observable<BaseResponse<[YardBookingModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/queryMySite")
            .append(key: "pageNo", value: page)
            .append(key: "pageSize", value: pageSize)
            .append(key: "status", value: status?.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取我的预约场地列表
                class func queryMySite(page:Int,pageSize:Int = 20,status:YardBookingType?)->Observable<BaseResponse<[YardBookingModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/queryMySite")
                                                .append(key: "pageNo", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "status", value: status?.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取继续支付场地金额
    class func continuePaymentPrice(id:Int)->Observable<BaseResponse<YardBookingContinuePriceModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/queryContinuePaymentMySitePrice")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取继续支付场地金额
                class func continuePaymentPrice(id:Int)->Observable<BaseResponse<YardBookingContinuePriceModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/queryContinuePaymentMySitePrice")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 继续支付
    class func continuePayment(id:Int,payType:PayType)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/continuePaymentMySite")
            .append(key: "id", value: id)
            .append(key: "payType", value: payType.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
                /// 继续支付
                class func continuePayment(id:Int,payType:PayType)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/continuePaymentMySite")
                                                .append(key: "id", value: id)
                                                .append(key: "payType", value: payType.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                }
        /// 取消我的预约
    class func cancelMySite(id:Int)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/api/site/cancelMySite")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 取消我的预约
                class func cancelMySite(id:Int)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/api/site/cancelMySite")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
    // MARK: -- Activity
// MARK: -- Activity
extension Services{
        /// 获取视频列表
        /// - Parameter position: 位置(1=线上课得积分,2=看视频得奖励)
    class func benefitsVideoList(position:Int,search:String)->Observable<BaseResponse<[VideosModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/benefitsVideo/queryClassificationBenefitsVideosList")
            .append(key: "position", value: position)
            .append(key: "search", value: search)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取视频列表
                /// - Parameter position: 位置(1=线上课得积分,2=看视频得奖励)
                class func benefitsVideoList(position:Int,search:String)->Observable<BaseResponse<[VideosModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/benefitsVideo/queryClassificationBenefitsVideosList")
                                                .append(key: "position", value: position)
                                                .append(key: "search", value: search)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取视频列表
    class func benefitsVideoSubList(classificationId:Int,pageNo:Int,pageSize:Int,search:String)->Observable<BaseResponse<[VideoDetailModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/benefitsVideo/queryBenefitsVideosList")
            .append(key: "classificationId", value: classificationId)
            .append(key: "pageNo", value: pageNo)
            .append(key: "pageSize", value: pageSize)
            .append(key: "search", value: search)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取视频列表
                class func benefitsVideoSubList(classificationId:Int,pageNo:Int,pageSize:Int,search:String)->Observable<BaseResponse<[VideoDetailModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/benefitsVideo/queryBenefitsVideosList")
                                                .append(key: "classificationId", value: classificationId)
                                                .append(key: "pageNo", value: pageNo)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "search", value: search)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取视频详情
    class func benefitsVideoDetail(id:Int)->Observable<BaseResponse<VideoDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/benefitsVideo/queryBenefitsVideosInfo")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取视频详情
                class func benefitsVideoDetail(id:Int)->Observable<BaseResponse<VideoDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/activity/api/benefitsVideo/queryBenefitsVideosInfo")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
// MARK: -- 活动赛事相关
extension Services{
        /// 获取赛事列表
    class func queryCompetitionList(cityCode:Int?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/base/competition/queryCompetitionList")
            .append(key: "cityCode", value: cityCode)
            .append(key: "content", value: content)
            .append(key: "heat", value: heat?.rawValue)
            .append(key: "registerCondition", value: registerCondition)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取赛事列表
                class func queryCompetitionList(cityCode:Int?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/competition/base/competition/queryCompetitionList")
                                                .append(key: "cityCode", value: cityCode)
                                                .append(key: "content", value: content)
                                                .append(key: "heat", value: heat?.rawValue)
                                                .append(key: "registerCondition", value: registerCondition)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取赛事详情
    class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/base/competition/queryCompetitionInfo")
            .append(key: "id", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取赛事详情
                class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/competition/base/competition/queryCompetitionInfo")
                                                .append(key: "id", value: id)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取已报名赛事列表
    class func queryMyCompetitionList(page:Int,pageSize:Int = 20,type:SignupType)->Observable<BaseResponse<[ActivityListModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/api/competition/queryMyCompetitionList")
            .append(key: "pageNo", value: page)
            .append(key: "pageSize", value: pageSize)
            .append(key: "type", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取已报名赛事列表
                class func queryMyCompetitionList(page:Int,pageSize:Int = 20,type:SignupType)->Observable<BaseResponse<[ActivityListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/competition/api/competition/queryMyCompetitionList")
                                                .append(key: "pageNo", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "type", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 获取参赛人员列表
    class func queryParticipantList(isAuth:Int? = nil)->Observable<BaseResponse<[ActivityDetailPartModel]>>{
        var params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/queryParticipantList")
        if isAuth == 1{
            params.append(key: "isPre", value: isAuth)
        }
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                /// 获取参赛人员列表
                class func queryParticipantList(isAuth:Int? = nil)->Observable<BaseResponse<[ActivityDetailPartModel]>>{
                                var params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/participant/queryParticipantList")
                                if isAuth == 1{
                                                params.append(key: "isPre", value: isAuth)
                                }
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
        /// 编辑参赛人员信息
    class func editParticipant(id:Int,height:Int,weight:Int,phone:String?,isStudent:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/editParticipant")
            .append(key: "id", value: id)
            .append(key: "height", value: height)
            .append(key: "weight", value: weight)
            .append(key: "phone", value: phone)
            .append(key: "isStudent", value: isStudent)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 编辑参赛人员信息
                class func editParticipant(id:Int,height:Int,weight:Int,phone:String?,isStudent:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/participant/editParticipant")
                                                .append(key: "id", value: id)
                                                .append(key: "height", value: height)
                                                .append(key: "weight", value: weight)
                                                .append(key: "phone", value: phone)
                                                .append(key: "isStudent", value: isStudent)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 添加参赛人员
    class func addParticipant(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/addParticipant")
            .append(key: "birthday", value: model.birthday)
            .append(key: "headImg", value: model.headImg)
            .append(key: "height", value: model.height.string)
            .append(key: "idcard", value: model.idCard)
            .append(key: "name", value: model.name)
            .append(key: "phone", value: model.phone)
            .append(key: "gender", value: model.sex.rawValue)
            .append(key: "weight", value: model.weight.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 添加参赛人员
                class func addParticipant(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/participant/addParticipant")
                                                .append(key: "birthday", value: model.birthday)
                                                .append(key: "headImg", value: model.headImg)
                                                .append(key: "height", value: model.height.string)
                                                .append(key: "idcard", value: model.idCard)
                                                .append(key: "name", value: model.name)
                                                .append(key: "phone", value: model.phone)
                                                .append(key: "gender", value: model.sex.rawValue)
                                                .append(key: "weight", value: model.weight.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 编辑参赛人员
    class func editParticipant(_ model:ActivityDetailPartModel)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/api/participant/editParticipant")
            .append(key: "id", value: model.id)
            .append(key: "idcard", value: model.idcard)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 编辑参赛人员
                class func editParticipant(_ model:ActivityDetailPartModel)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/competition/api/participant/editParticipant")
                                                .append(key: "id", value: model.id)
                                                .append(key: "idcard", value: model.idcard)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 删除参赛人员
    class func deleParticipant(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/delParticipant")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 删除参赛人员
                class func deleParticipant(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/participant/delParticipant")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 赛事报名
    class func paymentCompetition(id:Int,userIds:String,payType:PayType,coursePaymentId:Int? = nil)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/paymentCompetition")
            .append(key: "id", value: id)
            .append(key: "ids", value: userIds)
            .append(key: "payType", value: payType.rawValue)
            .append(key: "coursePaymentId", value: coursePaymentId)
        return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
    }
                /// 赛事报名
                class func paymentCompetition(id:Int,userIds:String,payType:PayType,coursePaymentId:Int? = nil)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/competition/paymentCompetition")
                                                .append(key: "id", value: id)
                                                .append(key: "ids", value: userIds)
                                                .append(key: "payType", value: payType.rawValue)
                                                .append(key: "coursePaymentId", value: coursePaymentId)
                                return NetworkRequest.request(params: params, method: .post, progress: true,ignoreAlert: true)
                }
        /// 查询已报名赛事详情
    class func queryMyCompetitionInfo(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/queryMyCompetitionInfo")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 查询已报名赛事详情
                class func queryMyCompetitionInfo(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/competition/queryMyCompetitionInfo")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 取消当前报名
    class func cancelMyCOmpetition(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/cancelMyCompetition")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 取消当前报名
                class func cancelMyCOmpetition(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "competition/api/competition/cancelMyCompetition")
                                                .append(key: "id", value: id)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
    // MARK: -- 其他
// MARK: -- 其他
extension Services{
    class func queryProtocol(_ type:AgreentType,progress:Bool = true)->Observable<BaseResponse<String>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/protocol/queryProtocol")
            .append(key: "type", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: progress)
    }
                class func queryProtocol(_ type:AgreentType,progress:Bool = true)->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/protocol/queryProtocol")
                                                .append(key: "type", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: progress)
                }
    class func querySystemImg(type:SystemImgType)->Observable<BaseResponse<String>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/systemImg/querySystemImg")
            .append(key: "position", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
                class func querySystemImg(type:SystemImgType)->Observable<BaseResponse<String>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/systemImg/querySystemImg")
                                                .append(key: "position", value: type.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: false)
                }
    class func enrollMember(paytype:PayType)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/account/api/appUser/addVipPayment")
            .append(key: "payType", value: paytype.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                class func enrollMember(paytype:PayType)->Observable<BaseResponse<PaymentModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/account/api/appUser/addVipPayment")
                                                .append(key: "payType", value: paytype.rawValue)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取省市数据
    class func queryProvinceAndCity(pcode:Int? = nil)->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryProvinceAndCity")
            .append(key: "pcode", value: pcode)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取省市数据
                class func queryProvinceAndCity(pcode:Int? = nil)->Observable<BaseResponse<[CityProfileModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryProvinceAndCity")
                                                .append(key: "pcode", value: pcode)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取城市code获取门店
    class func queryStoreAtCity(cityCode:Int?,provinceCode:Int)->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryStoreByCityCode")
            .append(key: "cityCode", value: cityCode)
            .append(key: "provinceCode", value: provinceCode)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取城市code获取门店
                class func queryStoreAtCity(cityCode:Int?,provinceCode:Int)->Observable<BaseResponse<[CityProfileModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryStoreByCityCode")
                                                .append(key: "cityCode", value: cityCode)
                                                .append(key: "provinceCode", value: provinceCode)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
                /// 获取全部城市
                class func queryAllCity()->Observable<BaseResponse<[CityProfileModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/store/queryAllCity")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
//2.0
extension Services{
                /// 获取平台配置模块详情
                class func getHomeModule()->Observable<BaseResponse<BannerModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/other/base/homeModule/getHomeModule")
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
        /// 获取全部城市
    class func queryAllCity()->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryAllCity")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
                /// 获取世界杯列表
                /// - Parameters:
                ///   - id: 当前门店id
                ///   - content: 当前内容
                ///   - gender:报名条件(0=全部,1=男,2=女
                ///   - sort: 热度排序(1=正序,2=降序)
                ///   - storeId: 所在赛点
                class func worldCupList(id:Int,content:String?,gender:Int?,sort:Int?,storeId:Int?)->Observable<BaseResponse<[WorldCupListModel]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                                .interface(url: "/communityWorldCup/api/worldCup/getWorldCupList")
                                                .append(key: "id", value: id)
                                                .append(key: "content", value: content)
                                                .append(key: "gender", value: gender)
                                                .append(key: "storeId", value: storeId)
                                                .append(key: "sort", value: sort)
                                                .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
                                                .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
                                return NetworkRequest.request(params: params, method: .post, progress: true)
                }
}
extension Services{
    static func startNetworkMonitor(){
        let manager = NetworkReachabilityManager(host: All_Url)
        manager?.startListening(onUpdatePerforming: { status in
            switch status {
                case .notReachable:alertError(msg: "当前网络不可用")
                case .reachable(let type):
                    switch type{
                        case .ethernetOrWiFi:alert(msg: "当前为Wi-Fi网络")
                        case .cellular:alert(msg: "当前为移动网络")
                    }
                default:break
            }
        })
    }
                static func startNetworkMonitor(){
                                let manager = NetworkReachabilityManager(host: All_Url)
                                manager?.startListening(onUpdatePerforming: { status in
                                                switch status {
                                                                case .notReachable:alertError(msg: "当前网络不可用")
                                                                case .reachable(let type):
                                                                                switch type{
                                                                                                case .ethernetOrWiFi:alert(msg: "当前为Wi-Fi网络")
                                                                                                case .cellular:alert(msg: "当前为移动网络")
                                                                                }
                                                                default:break
                                                }
                                })
                }
}
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift
@@ -13,263 +13,263 @@
class ActivityDetailApplyVC: BaseVC {
    @IBOutlet weak var view_banner: UIView!
    @IBOutlet weak var label_storeNames: UILabel!
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var label_joinCondition: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_duetime: UILabel!
    @IBOutlet weak var label_starttime: UILabel!
    @IBOutlet weak var label_endtime: UILabel!
    @IBOutlet weak var label_ageScope: UILabel!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var label_money: UILabel!
    @IBOutlet weak var label_coin: UILabel!
    @IBOutlet weak var label_courseNum: UILabel!
    @IBOutlet weak var label_introducion: UILabel!
    @IBOutlet weak var btn_enroll: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var btn_addStudent: QMUIButton!
    @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
    @IBOutlet weak var label_matchStore: UILabel!
    @IBOutlet weak var btn_moreMatchStore: UIButton!
                @IBOutlet weak var view_banner: UIView!
                @IBOutlet weak var label_storeNames: UILabel!
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_joinCondition: UILabel!
                @IBOutlet weak var label_address: UILabel!
                @IBOutlet weak var label_duetime: UILabel!
                @IBOutlet weak var label_starttime: UILabel!
                @IBOutlet weak var label_endtime: UILabel!
                @IBOutlet weak var label_ageScope: UILabel!
                @IBOutlet weak var label_city: UILabel!
                @IBOutlet weak var label_money: UILabel!
                @IBOutlet weak var label_coin: UILabel!
                @IBOutlet weak var label_courseNum: UILabel!
                @IBOutlet weak var label_introducion: UILabel!
                @IBOutlet weak var btn_enroll: UIButton!
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var btn_addStudent: QMUIButton!
                @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
                @IBOutlet weak var label_matchStore: UILabel!
                @IBOutlet weak var btn_moreMatchStore: UIButton!
    @IBOutlet weak var view_money: UIView!
    @IBOutlet weak var view_coin: UIView!
    @IBOutlet weak var view_courseNum: UIView!
                @IBOutlet weak var view_money: UIView!
                @IBOutlet weak var view_coin: UIView!
                @IBOutlet weak var view_courseNum: UIView!
    private lazy var bannerView:CommonBannerView = {
        let v = CommonBannerView()
        return v
    }()
                private lazy var bannerView:CommonBannerView = {
                                let v = CommonBannerView()
                                return v
                }()
    var activityDetailModel:ActivityDetailModel!
    private var students = [ActivityDetailPartModel]()
                var activityDetailModel:ActivityDetailModel!
                private var students = [ActivityDetailPartModel]()
    required init(model:ActivityDetailModel) {
        super.init(nibName: nil, bundle: nil)
        self.activityDetailModel = model
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "活动详情"
        label_storeNames.text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
        btn_moreMatchStore.isHidden = (label_storeNames.text?.count ?? 0) < 50
        label_title.text = activityDetailModel.name
        label_joinCondition.text = activityDetailModel.registerCondition.strTitle + "参与"
        label_address.text = activityDetailModel.address
        label_duetime.text = activityDetailModel.registerEndTime
        label_starttime.text = activityDetailModel.startTime
        label_endtime.text = activityDetailModel.endTime
        label_ageScope.text = activityDetailModel.age + "岁"
        label_introducion.text = activityDetailModel.introduction
        label_city.isHidden = activityDetailModel.province.isEmpty || activityDetailModel.city.isEmpty
        label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
        label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
        label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
        label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
        view_money.isHidden = activityDetailModel.cashPrice == 0
        view_courseNum.isHidden = activityDetailModel.classPrice == 0
        view_coin.isHidden = activityDetailModel.playPaiCoin == 0
        students.append(contentsOf: activityDetailModel.participant)
        cons_tableHei.constant = Double(students.count) * 100
        tableView.reloadData()
        let imgs = activityDetailModel.imgs.components(separatedBy: ",")
        var items = [CommonBannerModel]()
        for (index,img) in imgs.enumerated(){
            items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
        }
        bannerView.setItems(items: items)
    }
    override func setUI() {
        btn_addStudent.imagePosition = .right
        btn_addStudent.spacingBetweenImageAndTitle = 4
        tableView.delegate = self
        tableView.dataSource = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
        view_banner.addSubview(bannerView)
        bannerView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.56)
        let moreBtnAttributeding = AttributedStringbuilder.build().add(string: "查看更多", withFont: UIFont.systemFont(ofSize: 12, weight: .medium), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
        btn_moreMatchStore.setAttributedTitle(moreBtnAttributeding, for: .normal)
    }
    @IBAction func matchStoreAction(_ sender: UIButton) {
        let text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
        AgreentView.show(type: .matchStore, content: text)
    }
    @IBAction func addStudentAction(_ sender: QMUIButton) {
        StudentChooseView.show(itemType: .activity, defaultStu: students,isAuth: activityDetailModel.isReal) { [weak self] studs in
            self?.students = studs as! [ActivityDetailPartModel]
            self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
            self?.tableView.reloadData()
        } needAddClouse: {[weak self] () in
            let vc = ActivityStudentListVC()
            self?.push(vc: vc)
        }
    }
    @IBAction func applyAction(_ sender: UIButton) {
        guard students.count != 0 else {
            alertError(msg: "请至少选择一位活动人员");return
        }
        if activityDetailModel.storeInfos.count > 1{
            let a = activityDetailModel.storeInfos.map({$0.name})
            StoresInfo_2_View.show(a) {[weak self] status in
                guard let weakSelf = self else { return }
                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                if status{
                    let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                    //零元购
                    if price == 0 && coin == 0 && course == 0{
                        weakSelf.payment(type: .coin,paymentId: 0)
                        return
                    }
                    PaymentView.show(enumType: .activity, money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                        guard let weakSelf = self else { return }
                        if type == .courseNum{
                            PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                weakSelf.payment(type: type,paymentId: id)
                            }
                        }else{
                            weakSelf.payment(type: type)
                        }
                    }
                }else{
                    weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                        NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                    })
                required init(model:ActivityDetailModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.activityDetailModel = model
                }
            }
        }else{
            StoresInfoView.show(activityDetailModel.storeInfos.first!) { [weak self] status in
                guard let weakSelf = self else { return }
                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                if status{
                        //零元购
                    if price == 0 && coin == 0 && course == 0{
                        weakSelf.payment(type: .coin,paymentId: 0)
                        return
                    }
                    let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                    PaymentView.show(enumType: .activity, money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                        guard let weakSelf = self else { return }
                        if type == .courseNum{
                            PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                weakSelf.payment(type: type,paymentId: id)
                            }
                        }else{
                            weakSelf.payment(type: type)
                        }
                    }
                }else{
                    weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                        NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                    })
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
            }
        }
    }
    private func payment(type:PayType,paymentId:Int? = nil){
        let ids = students.map({"\($0.id)"}).joined(separator: ";")
        Services.paymentCompetition(id: activityDetailModel.id, userIds: ids, payType: type,coursePaymentId: paymentId).subscribe(onNext: {[weak self] data in
            NotificationCenter.default.post(name: StudentRefresh_Nofi, object: nil)
            if let m = data.data{
                switch type {
                    case .aliPay:
                        let req = YYAlipayRequest(orderString: m.orderString)
                        YYPaymentManager.shared.sendPaymentRequest(req) { result in
                            switch result {
                                case .success:
                                    let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                    self?.push(vc: vc)
                                case .cancel:
                                    alert(msg: "已取消")
                                case .failure(_):
                                    let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .activityApply)
                                    self?.push(vc: vc)
                            }
                        }
                    case .wechat:break
                    case .coin,.free:
                        let vc = PaymentResultVC(result: .success, objType: .activityApply)
                        self?.push(vc: vc)
                    case .courseNum:
                        let vc = PaymentResultVC(result: .success, objType: .activityApply)
                        self?.push(vc: vc)
                    default:break
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "活动详情"
                                label_storeNames.text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
                                btn_moreMatchStore.isHidden = (label_storeNames.text?.count ?? 0) < 50
                                label_title.text = activityDetailModel.name
                                label_joinCondition.text = activityDetailModel.registerCondition.strTitle + "参与"
                                label_address.text = activityDetailModel.address
                                label_duetime.text = activityDetailModel.registerEndTime
                                label_starttime.text = activityDetailModel.startTime
                                label_endtime.text = activityDetailModel.endTime
                                label_ageScope.text = activityDetailModel.age + "岁"
                                label_introducion.text = activityDetailModel.introduction
                                label_city.isHidden = activityDetailModel.province.isEmpty || activityDetailModel.city.isEmpty
                                label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
                                label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
                                label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
                                label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
                                view_money.isHidden = activityDetailModel.cashPrice == 0
                                view_courseNum.isHidden = activityDetailModel.classPrice == 0
                                view_coin.isHidden = activityDetailModel.playPaiCoin == 0
                                students.append(contentsOf: activityDetailModel.participant)
                                cons_tableHei.constant = Double(students.count) * 100
                                tableView.reloadData()
                                let imgs = activityDetailModel.imgs.components(separatedBy: ",")
                                var items = [CommonBannerModel]()
                                for (index,img) in imgs.enumerated(){
                                                items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                                }
                                bannerView.setItems(items: items)
                }
            }
        },onError: {[weak self] error in
            if let er = error as? NetworkRequest.NetRequestError{
                switch er {
                    case .Other(let code,let string):
                        let vc = PaymentResultVC(result: .fail(string,code), objType: .yard,handleVC: nil)
                        self?.push(vc: vc)
                    default:
                        let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .yard,handleVC: nil)
                        self?.push(vc: vc)
                override func setUI() {
                                btn_addStudent.imagePosition = .right
                                btn_addStudent.spacingBetweenImageAndTitle = 4
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
                                view_banner.addSubview(bannerView)
                                bannerView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.56)
                                let moreBtnAttributeding = AttributedStringbuilder.build().add(string: "查看更多", withFont: UIFont.systemFont(ofSize: 12, weight: .medium), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
                                btn_moreMatchStore.setAttributedTitle(moreBtnAttributeding, for: .normal)
                }
            }
        }).disposed(by: disposeBag)
    }
                @IBAction func matchStoreAction(_ sender: UIButton) {
                                let text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
                                AgreentView.show(type: .matchStore, content: text)
                }
                @IBAction func addStudentAction(_ sender: QMUIButton) {
                                StudentChooseView.show(itemType: .activity, defaultStu: students,isAuth: activityDetailModel.isReal) { [weak self] studs in
                                                self?.students = studs as! [ActivityDetailPartModel]
                                                self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
                                                self?.tableView.reloadData()
                                } needAddClouse: {[weak self] () in
                                                let vc = ActivityStudentListVC()
                                                self?.push(vc: vc)
                                }
                }
                @IBAction func applyAction(_ sender: UIButton) {
                                guard students.count != 0 else {
                                                alertError(msg: "请至少选择一位活动人员");return
                                }
                                if activityDetailModel.storeInfos.count > 1{
                                                let a = activityDetailModel.storeInfos.map({$0.name})
                                                StoresInfo_2_View.show(a) {[weak self] status in
                                                                guard let weakSelf = self else { return }
                                                                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                                                                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                                                                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                                                                if status{
                                                                                let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                                                                                //零元购
                                                                                if price == 0 && coin == 0 && course == 0{
                                                                                                weakSelf.payment(type: .coin,paymentId: 0)
                                                                                                return
                                                                                }
                                                                                PaymentView.show(enumType: .activity, money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                                                                                                guard let weakSelf = self else { return }
                                                                                                if type == .courseNum{
                                                                                                                PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                                                                                                                weakSelf.payment(type: type,paymentId: id)
                                                                                                                }
                                                                                                }else{
                                                                                                                weakSelf.payment(type: type)
                                                                                                }
                                                                                }
                                                                }else{
                                                                                weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                                                                                                NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                                                                                })
                                                                }
                                                }
                                }else{
                                                StoresInfoView.show(activityDetailModel.storeInfos.first!) { [weak self] status in
                                                                guard let weakSelf = self else { return }
                                                                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                                                                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                                                                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                                                                if status{
                                                                                //零元购
                                                                                if price == 0 && coin == 0 && course == 0{
                                                                                                weakSelf.payment(type: .coin,paymentId: 0)
                                                                                                return
                                                                                }
                                                                                let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                                                                                PaymentView.show(enumType: .activity, money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                                                                                                guard let weakSelf = self else { return }
                                                                                                if type == .courseNum{
                                                                                                                PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                                                                                                                weakSelf.payment(type: type,paymentId: id)
                                                                                                                }
                                                                                                }else{
                                                                                                                weakSelf.payment(type: type)
                                                                                                }
                                                                                }
                                                                }else{
                                                                                weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                                                                                                NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                                                                                })
                                                                }
                                                }
                                }
                }
                private func payment(type:PayType,paymentId:Int? = nil){
                                let ids = students.map({"\($0.id)"}).joined(separator: ";")
                                Services.paymentCompetition(id: activityDetailModel.id, userIds: ids, payType: type,coursePaymentId: paymentId).subscribe(onNext: {[weak self] data in
                                                NotificationCenter.default.post(name: StudentRefresh_Nofi, object: nil)
                                                if let m = data.data{
                                                                switch type {
                                                                                case .aliPay:
                                                                                                let req = YYAlipayRequest(orderString: m.orderString)
                                                                                                YYPaymentManager.shared.sendPaymentRequest(req) { result in
                                                                                                                switch result {
                                                                                                                                case .success:
                                                                                                                                                let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                                                                                                                                self?.push(vc: vc)
                                                                                                                                case .cancel:
                                                                                                                                                alert(msg: "已取消")
                                                                                                                                case .failure(_):
                                                                                                                                                let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .activityApply)
                                                                                                                                                self?.push(vc: vc)
                                                                                                                }
                                                                                                }
                                                                                case .wechat:break
                                                                                case .coin,.free:
                                                                                                let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                                                                                self?.push(vc: vc)
                                                                                case .courseNum:
                                                                                                let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                                                                                self?.push(vc: vc)
                                                                                default:break
                                                                }
                                                }
                                },onError: {[weak self] error in
                                                if let er = error as? NetworkRequest.NetRequestError{
                                                                switch er {
                                                                                case .Other(let code,let string):
                                                                                                let vc = PaymentResultVC(result: .fail(string,code), objType: .yard,handleVC: nil)
                                                                                                self?.push(vc: vc)
                                                                                default:
                                                                                                let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .yard,handleVC: nil)
                                                                                                self?.push(vc: vc)
                                                                }
                                                }
                                }).disposed(by: disposeBag)
                }
}
extension ActivityDetailApplyVC:UITableViewDelegate{
}
extension ActivityDetailApplyVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let student = students[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
        cell.indexPath = indexPath
        cell.activityDetailPartModel = student
        cell.btn_edit.isHidden = true
        cell.img_radio.isHidden = true
        cell.delClouse = {[weak self] index in
            tableView.beginUpdates()
            self?.students.remove(at: index.row)
            tableView.deleteItemsAtIndexPaths([index], animationStyle: .automatic)
            tableView.endUpdates()
            tableView.reloadData()
            self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
        }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let student = students[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
                                cell.indexPath = indexPath
                                cell.activityDetailPartModel = student
                                cell.btn_edit.isHidden = true
                                cell.img_radio.isHidden = true
                                cell.delClouse = {[weak self] index in
                                                tableView.beginUpdates()
                                                self?.students.remove(at: index.row)
                                                tableView.deleteItemsAtIndexPaths([index], animationStyle: .automatic)
                                                tableView.endUpdates()
                                                tableView.reloadData()
                                                self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
                                }
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return students.count
    }
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return students.count
                }
}
WanPai/Root/Activity/VC/ActivityDetailVC.swift
@@ -10,121 +10,121 @@
import JQTools
class ActivityDetailVC: BaseVC {
    private var id:Int!
                private var id:Int!
    @IBOutlet weak var view_banner: UIView!
    @IBOutlet weak var label_storeNames: UILabel!
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var label_joinCondition: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_duetime: UILabel!
    @IBOutlet weak var label_starttime: UILabel!
    @IBOutlet weak var label_endtime: UILabel!
    @IBOutlet weak var label_ageScope: UILabel!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var label_money: UILabel!
    @IBOutlet weak var label_coin: UILabel!
    @IBOutlet weak var label_courseNum: UILabel!
    @IBOutlet weak var label_introducion: UILabel!
    @IBOutlet weak var img_enrollRequired: UIImageView!
    @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint!
    @IBOutlet weak var btn_enroll: UIButton!
    @IBOutlet weak var label_matchStore: UILabel!
    @IBOutlet weak var btn_moreMatchStore: UIButton!
                @IBOutlet weak var view_banner: UIView!
                @IBOutlet weak var label_storeNames: UILabel!
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_joinCondition: UILabel!
                @IBOutlet weak var label_address: UILabel!
                @IBOutlet weak var label_duetime: UILabel!
                @IBOutlet weak var label_starttime: UILabel!
                @IBOutlet weak var label_endtime: UILabel!
                @IBOutlet weak var label_ageScope: UILabel!
                @IBOutlet weak var label_city: UILabel!
                @IBOutlet weak var label_money: UILabel!
                @IBOutlet weak var label_coin: UILabel!
                @IBOutlet weak var label_courseNum: UILabel!
                @IBOutlet weak var label_introducion: UILabel!
                @IBOutlet weak var img_enrollRequired: UIImageView!
                @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint!
                @IBOutlet weak var btn_enroll: UIButton!
                @IBOutlet weak var label_matchStore: UILabel!
                @IBOutlet weak var btn_moreMatchStore: UIButton!
    @IBOutlet weak var view_money: UIView!
    @IBOutlet weak var view_coin: UIView!
    @IBOutlet weak var view_courseNum: UIView!
                @IBOutlet weak var view_money: UIView!
                @IBOutlet weak var view_coin: UIView!
                @IBOutlet weak var view_courseNum: UIView!
    private lazy var bannerView:CommonBannerView = {
        let v = CommonBannerView()
        return v
    }()
                private lazy var bannerView:CommonBannerView = {
                                let v = CommonBannerView()
                                return v
                }()
    var activityDetailModel:ActivityDetailModel!{
        didSet{
            label_storeNames.text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
            btn_moreMatchStore.isHidden = (label_storeNames.text?.count ?? 0) < 50
                var activityDetailModel:ActivityDetailModel!{
                                didSet{
                                                label_storeNames.text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
                                                btn_moreMatchStore.isHidden = (label_storeNames.text?.count ?? 0) < 50
            label_title.text = activityDetailModel.name
            label_joinCondition.text = activityDetailModel.registerCondition.strTitle + "参与"
            label_address.text = activityDetailModel.address
            label_duetime.text = activityDetailModel.registerEndTime
            label_starttime.text = activityDetailModel.startTime
            label_endtime.text = activityDetailModel.endTime
            label_ageScope.text = activityDetailModel.age + "岁"
            label_introducion.text = activityDetailModel.introduction
            label_city.isHidden = activityDetailModel.province.isEmpty || activityDetailModel.city.isEmpty
            label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
            SDWebImageDownloader.shared.downloadImage(with: URL(string: activityDetailModel.registrationNotes)!) {[weak self] image, data, error, status in
                guard let img = image else {
                    self?.cons_imgEnrollHei.constant = 0;return
                }
                                                label_title.text = activityDetailModel.name
                                                label_joinCondition.text = activityDetailModel.registerCondition.strTitle + "参与"
                                                label_address.text = activityDetailModel.address
                                                label_duetime.text = activityDetailModel.registerEndTime
                                                label_starttime.text = activityDetailModel.startTime
                                                label_endtime.text = activityDetailModel.endTime
                                                label_ageScope.text = activityDetailModel.age + "岁"
                                                label_introducion.text = activityDetailModel.introduction
                                                label_city.isHidden = activityDetailModel.province.isEmpty || activityDetailModel.city.isEmpty
                                                label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
                                                SDWebImageDownloader.shared.downloadImage(with: URL(string: activityDetailModel.registrationNotes)!) {[weak self] image, data, error, status in
                                                                guard let img = image else {
                                                                                self?.cons_imgEnrollHei.constant = 0;return
                                                                }
                let radio = img.size.width / img.size.height
                self?.cons_imgEnrollHei.constant = JQ_ScreenW / radio
                self?.img_enrollRequired.image = img
            }
                                                                let radio = img.size.width / img.size.height
                                                                self?.cons_imgEnrollHei.constant = JQ_ScreenW / radio
                                                                self?.img_enrollRequired.image = img
                                                }
            view_money.isHidden = activityDetailModel.cashPrice == 0
            view_courseNum.isHidden = activityDetailModel.classPrice == 0
            view_coin.isHidden = activityDetailModel.playPaiCoin == 0
                                                view_money.isHidden = activityDetailModel.cashPrice == 0
                                                view_courseNum.isHidden = activityDetailModel.classPrice == 0
                                                view_coin.isHidden = activityDetailModel.playPaiCoin == 0
            label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
            label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
            label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
                                                label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
                                                label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
                                                label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
            if activityDetailModel.hasPass == 1{
                btn_enroll.setTitle("报名已截止", for: .normal)
                btn_enroll.backgroundColor = UIColor.gray.withAlphaComponent(0.5)
                btn_enroll.isEnabled = false
            }
                                                if activityDetailModel.hasPass == 1{
                                                                btn_enroll.setTitle("报名已截止", for: .normal)
                                                                btn_enroll.backgroundColor = UIColor.gray.withAlphaComponent(0.5)
                                                                btn_enroll.isEnabled = false
                                                }
            let imgs = activityDetailModel.imgs.components(separatedBy: ",")
            var items = [CommonBannerModel]()
            for (index,img) in imgs.enumerated(){
                items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
            }
            bannerView.setItems(items: items)
        }
    }
                                                let imgs = activityDetailModel.imgs.components(separatedBy: ",")
                                                var items = [CommonBannerModel]()
                                                for (index,img) in imgs.enumerated(){
                                                                items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                                                }
                                                bannerView.setItems(items: items)
                                }
                }
    required init(id:Int) {
        super.init(nibName: nil, bundle: nil)
        self.id = id
    }
                required init(id:Int) {
                                super.init(nibName: nil, bundle: nil)
                                self.id = id
                }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "活动详情"
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "活动详情"
        Services.queryCompetitionDetail(id: id).subscribe(onNext: {[weak self] data in
            if let data = data.data{
                self?.activityDetailModel = data
            }
        }).disposed(by: disposeBag)
    }
                                Services.queryCompetitionDetail(id: id).subscribe(onNext: {[weak self] data in
                                                if let data = data.data{
                                                                self?.activityDetailModel = data
                                                }
                                }).disposed(by: disposeBag)
                }
    override func setUI() {
        view_banner.addSubview(bannerView)
        bannerView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.56)
                override func setUI() {
                                view_banner.addSubview(bannerView)
                                bannerView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.56)
        let moreBtnAttributeding = AttributedStringbuilder.build().add(string: "查看更多", withFont: UIFont.systemFont(ofSize: 12, weight: .medium), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
        btn_moreMatchStore.setAttributedTitle(moreBtnAttributeding, for: .normal)
    }
                                let moreBtnAttributeding = AttributedStringbuilder.build().add(string: "查看更多", withFont: UIFont.systemFont(ofSize: 12, weight: .medium), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
                                btn_moreMatchStore.setAttributedTitle(moreBtnAttributeding, for: .normal)
                }
    @IBAction func matchStoreAction(_ sender: UIButton) {
        let text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
        AgreentView.show(type: .matchStore, content: text)
    }
                @IBAction func matchStoreAction(_ sender: UIButton) {
                                let text = activityDetailModel.storeInfos.map({$0.name}).joined(separator: ",")
                                AgreentView.show(type: .matchStore, content: text)
                }
    @IBAction func joinAction(_ sender: UIButton) {
        let vc = ActivityDetailApplyVC(model: activityDetailModel)
        push(vc: vc)
    }
                @IBAction func joinAction(_ sender: UIButton) {
                                let vc = ActivityDetailApplyVC(model: activityDetailModel)
                                push(vc: vc)
                }
}
WanPai/Root/Activity/VC/ActivityListVC.swift
@@ -12,163 +12,163 @@
class ActivityListViewModel:RefreshModel<ActivityListModel>{
    var cityCode = BehaviorRelay<Int?>(value:nil)
    var content = BehaviorRelay<String>(value: "")
    var heat = BehaviorRelay<SortType?>(value:nil)
    var registerCondition = BehaviorRelay<RegisterAcitivyType?>(value:nil)
                var cityCode = BehaviorRelay<Int?>(value:nil)
                var content = BehaviorRelay<String>(value: "")
                var heat = BehaviorRelay<SortType?>(value:nil)
                var registerCondition = BehaviorRelay<RegisterAcitivyType?>(value:nil)
    override func api() -> (Observable<BaseResponse<[ActivityListModel]>>)? {
        return Services.queryCompetitionList(cityCode: cityCode.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue)
    }
                override func api() -> (Observable<BaseResponse<[ActivityListModel]>>)? {
                                return Services.queryCompetitionList(cityCode: cityCode.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue)
                }
}
class ActivityListVC: BaseVC {
    @IBOutlet weak var view_top: UIView!
    @IBOutlet weak var tf_search: QMUITextField!
    @IBOutlet weak var btn_holdCity: QMUIButton!
    @IBOutlet weak var btn_joinCondition: QMUIButton!
    @IBOutlet weak var btn_hotFilter: QMUIButton!
    @IBOutlet weak var tableView: BaseTableView!
                @IBOutlet weak var view_top: UIView!
                @IBOutlet weak var tf_search: QMUITextField!
                @IBOutlet weak var btn_holdCity: QMUIButton!
                @IBOutlet weak var btn_joinCondition: QMUIButton!
                @IBOutlet weak var btn_hotFilter: QMUIButton!
                @IBOutlet weak var tableView: BaseTableView!
    private var courseSubTypeView:CourseSubTypeView?
    private var cityChooseSubTypeView:CityChooseSubTypeView?
                private var courseSubTypeView:CourseSubTypeView?
                private var cityChooseSubTypeView:CityChooseSubTypeView?
    private var viewModel = ActivityListViewModel()
    private var selectSignupConditionModel:NormalSimpleModel?
    private var cityModel:HomeStoreModel?
                private var viewModel = ActivityListViewModel()
                private var selectSignupConditionModel:NormalSimpleModel?
                private var cityModel:HomeStoreModel?
    init(cityModel:HomeStoreModel? = nil){
        super.init(nibName: nil, bundle: nil)
        self.cityModel = cityModel
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "活动列表"
        if cityModel != nil{
            btn_holdCity.setTitle(cityModel!.city, for: .normal)
            viewModel.cityCode.accept(cityModel!.cityCode)
        }
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
    }
    override func setUI() {
        tableView.delegate = self
        tableView.dataSource = self
        tf_search.delegate = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "ActivityInfoTCell", bundle: nil), forCellReuseIdentifier: "_ActivityInfoTCell")
//        tableView.jq_setEmptyView()
        btn_holdCity.imagePosition = .right
        btn_holdCity.spacingBetweenImageAndTitle = 5
        btn_joinCondition.imagePosition = .right
        btn_joinCondition.spacingBetweenImageAndTitle = 5
        btn_hotFilter.imagePosition = .right
        btn_hotFilter.spacingBetweenImageAndTitle = 5
    }
                init(cityModel:HomeStoreModel? = nil){
                                super.init(nibName: nil, bundle: nil)
                                self.cityModel = cityModel
                }
    override func setRx() {
        tf_search.rx.text.orEmpty.changed.bind(to: viewModel.content).disposed(by: disposeBag)
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    }
    @IBAction func searchAction(_ sender: Any) {
        tf_search.resignFirstResponder()
        viewModel.beginRefresh()
    }
    @IBAction func holdCityAction(_ sender: QMUIButton) {
        view.endEditing(true)
        guard !sender.isSelected else {return}
        hiddenMenu()
        sender.isSelected = true
        cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { [weak self] m in
            sender.setTitle(m.name, for: .normal)
            self?.viewModel.cityCode.accept(m.code)
            self?.viewModel.beginRefresh()
            sender.isSelected = false
        } closeClouse: {
            sender.isSelected = false
        }
    }
    @IBAction func signupConditionAction(_ sender: QMUIButton) {
        view.endEditing(true)
        guard !sender.isSelected else {return}
        hiddenMenu()
        sender.isSelected = true
        var items = Array<NormalSimpleModel>()
        items.append(NormalSimpleModel(id: 1, name: "全部用户参与"))
        items.append(NormalSimpleModel(id: 2, name: "仅限年度会员参与"))
        items.append(NormalSimpleModel(id: 3, name: "仅限运动营成员参与"))
        courseSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: btn_joinCondition, items: items,selectModel: selectSignupConditionModel) { [weak self] m in
            sender.setTitle(m.name, for: .normal)
            sender.isSelected = false
            self?.selectSignupConditionModel = m
            self?.viewModel.registerCondition.accept(RegisterAcitivyType(rawValue: m.id))
            self?.viewModel.beginRefresh()
        } closeClouse: {
            sender.isSelected = false
        }
    }
    @IBAction func hotFliterAction(_ sender: UIButton) {
        view.endEditing(true)
        sender.isSelected = !sender.isSelected
        let sortType = sender.isSelected ? SortType.desc:SortType.asc
        sender.setImage(sortType.img, for: .normal)
        viewModel.heat.accept(sortType)
        viewModel.beginRefresh()
    }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "活动列表"
                                if cityModel != nil{
                                                btn_holdCity.setTitle(cityModel!.city, for: .normal)
                                                viewModel.cityCode.accept(cityModel!.cityCode)
                                }
                                viewModel.configure(tableView,needMore: false)
                                viewModel.beginRefresh()
                }
    @IBAction func signupAction(_ sender: UIButton) {
        view.endEditing(true)
        let vc = ActivitySignupListVC()
        push(vc: vc)
    }
                override func setUI() {
                                tableView.delegate = self
                                tableView.dataSource = self
                                tf_search.delegate = self
                                tableView.separatorStyle = .none
                                tableView.register(UINib(nibName: "ActivityInfoTCell", bundle: nil), forCellReuseIdentifier: "_ActivityInfoTCell")
                                //        tableView.jq_setEmptyView()
    private func hiddenMenu(){
        btn_holdCity.isSelected = false
        btn_joinCondition.isSelected = false
        courseSubTypeView?.removeFromSuperview()
        cityChooseSubTypeView?.removeFromSuperview()
    }
                                btn_holdCity.imagePosition = .right
                                btn_holdCity.spacingBetweenImageAndTitle = 5
                                btn_joinCondition.imagePosition = .right
                                btn_joinCondition.spacingBetweenImageAndTitle = 5
                                btn_hotFilter.imagePosition = .right
                                btn_hotFilter.spacingBetweenImageAndTitle = 5
                }
                override func setRx() {
                                tf_search.rx.text.orEmpty.changed.bind(to: viewModel.content).disposed(by: disposeBag)
                }
                @IBAction func searchAction(_ sender: Any) {
                                tf_search.resignFirstResponder()
                                viewModel.beginRefresh()
                }
                @IBAction func holdCityAction(_ sender: QMUIButton) {
                                view.endEditing(true)
                                guard !sender.isSelected else {return}
                                hiddenMenu()
                                sender.isSelected = true
                                cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { [weak self] m in
                                                sender.setTitle(m.name, for: .normal)
                                                self?.viewModel.cityCode.accept(m.code)
                                                self?.viewModel.beginRefresh()
                                                sender.isSelected = false
                                } closeClouse: {
                                                sender.isSelected = false
                                }
                }
                @IBAction func signupConditionAction(_ sender: QMUIButton) {
                                view.endEditing(true)
                                guard !sender.isSelected else {return}
                                hiddenMenu()
                                sender.isSelected = true
                                var items = Array<NormalSimpleModel>()
                                items.append(NormalSimpleModel(id: 1, name: "全部用户参与"))
                                items.append(NormalSimpleModel(id: 2, name: "仅限年度会员参与"))
                                items.append(NormalSimpleModel(id: 3, name: "仅限运动营成员参与"))
                                courseSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: btn_joinCondition, items: items,selectModel: selectSignupConditionModel) { [weak self] m in
                                                sender.setTitle(m.name, for: .normal)
                                                sender.isSelected = false
                                                self?.selectSignupConditionModel = m
                                                self?.viewModel.registerCondition.accept(RegisterAcitivyType(rawValue: m.id))
                                                self?.viewModel.beginRefresh()
                                } closeClouse: {
                                                sender.isSelected = false
                                }
                }
                @IBAction func hotFliterAction(_ sender: UIButton) {
                                view.endEditing(true)
                                sender.isSelected = !sender.isSelected
                                let sortType = sender.isSelected ? SortType.desc:SortType.asc
                                sender.setImage(sortType.img, for: .normal)
                                viewModel.heat.accept(sortType)
                                viewModel.beginRefresh()
                }
                @IBAction func signupAction(_ sender: UIButton) {
                                view.endEditing(true)
                                let vc = ActivitySignupListVC()
                                push(vc: vc)
                }
                private func hiddenMenu(){
                                btn_holdCity.isSelected = false
                                btn_joinCondition.isSelected = false
                                courseSubTypeView?.removeFromSuperview()
                                cityChooseSubTypeView?.removeFromSuperview()
                }
}
extension ActivityListVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let model = viewModel.dataSource.value[indexPath.row]
        let vc = ActivityDetailVC(id: model.id)
        push(vc: vc)
    }
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let model = viewModel.dataSource.value[indexPath.row]
                                let vc = ActivityDetailVC(id: model.id)
                                push(vc: vc)
                }
}
extension ActivityListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell
        cell.activityListModel = model
        cell.label_state.isHidden = true
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSource.value.count
    }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let model = viewModel.dataSource.value[indexPath.row]
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell
                                cell.activityListModel = model
                                cell.label_state.isHidden = true
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return viewModel.dataSource.value.count
                }
}
extension ActivityListVC:QMUITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        viewModel.beginRefresh()
        return true
    }
                func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                textField.resignFirstResponder()
                                viewModel.beginRefresh()
                                return true
                }
}
WanPai/Root/Course/VC/CourseListVC.swift
@@ -14,234 +14,234 @@
class CourseListViewModel:RefreshModel<CourseItemModel>{
    var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
    var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
    var selectPackeType = BehaviorRelay<NormalSimpleModel?>(value: nil)
    var selectStore = BehaviorRelay<NormalSimpleModel?>(value: nil)
    var distanceSort = BehaviorRelay<SortType?>(value: nil)
    var salesRanking = BehaviorRelay<SortType?>(value: nil)
    var search = BehaviorRelay<String?>(value: nil)
                var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
                var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
                var selectPackeType = BehaviorRelay<NormalSimpleModel?>(value: nil)
                var selectStore = BehaviorRelay<NormalSimpleModel?>(value: nil)
                var distanceSort = BehaviorRelay<SortType?>(value: nil)
                var salesRanking = BehaviorRelay<SortType?>(value: nil)
                var search = BehaviorRelay<String?>(value: nil)
    override func api() -> (Observable<BaseResponse<[CourseItemModel]>>)? {
        return Services.queryCourseList(typeId: selectPackeType.value?.id, distanceSort: distanceSort.value, salesRanking: salesRanking.value, search: search.value, storeId: selectStore.value?.id)
    }
                override func api() -> (Observable<BaseResponse<[CourseItemModel]>>)? {
                                return Services.queryCourseList(typeId: selectPackeType.value?.id, distanceSort: distanceSort.value, salesRanking: salesRanking.value, search: search.value, storeId: selectStore.value?.id)
                }
    func getDefaultData(){
        Services.coursePackageType().subscribe(onNext: {[weak self] data in
            if var datas = data.data{
                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
                self?.packageTypeData.accept(datas)
            }
        }) { error in
                func getDefaultData(){
                                Services.coursePackageType().subscribe(onNext: {[weak self] data in
                                                if var datas = data.data{
                                                                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
                                                                self?.packageTypeData.accept(datas)
                                                }
                                }) { error in
        }.disposed(by: disposeBag)
                                }.disposed(by: disposeBag)
        Services.queryStoreList().subscribe(onNext: {[weak self] data in
            if var datas = data.data{
                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
                self?.storesData.accept(datas)
            }
        }) { error in
                                Services.queryStoreList().subscribe(onNext: {[weak self] data in
                                                if var datas = data.data{
                                                                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
                                                                self?.storesData.accept(datas)
                                                }
                                }) { error in
        }.disposed(by: disposeBag)
    }
                                }.disposed(by: disposeBag)
                }
}
class CourseListVC: BaseVC{
    @IBOutlet weak var view_topView: UIView!
    @IBOutlet weak var tf_search: QMUITextField!
    @IBOutlet weak var tableView: BaseTableView!
    @IBOutlet weak var btn_courseType: QMUIButton!
    @IBOutlet weak var btn_stores: QMUIButton!
    @IBOutlet weak var btn_sales: QMUIButton!
    @IBOutlet weak var btn_distance: QMUIButton!
                @IBOutlet weak var view_topView: UIView!
                @IBOutlet weak var tf_search: QMUITextField!
                @IBOutlet weak var tableView: BaseTableView!
                @IBOutlet weak var btn_courseType: QMUIButton!
                @IBOutlet weak var btn_stores: QMUIButton!
                @IBOutlet weak var btn_sales: QMUIButton!
                @IBOutlet weak var btn_distance: QMUIButton!
    private var viewModel = CourseListViewModel()
    private var showSubTypeView:CourseSubTypeView?
                private var viewModel = CourseListViewModel()
                private var showSubTypeView:CourseSubTypeView?
    init(selectStore:NormalSimpleModel? = nil) {
        super.init(nibName: nil, bundle: nil)
        if selectStore != nil{
            viewModel.selectStore.accept(selectStore)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "运动营列表"
        viewModel.getDefaultData()
        viewModel.beginRefresh()
    }
    override func setUI() {
        btn_courseType.imagePosition = .right
        btn_stores.imagePosition = .right
        btn_sales.imagePosition = .right
        btn_distance.imagePosition = .right
        btn_courseType.spacingBetweenImageAndTitle = 5
        btn_stores.spacingBetweenImageAndTitle = 5
        btn_sales.spacingBetweenImageAndTitle = 5
        btn_distance.spacingBetweenImageAndTitle = 5
                init(selectStore:NormalSimpleModel? = nil) {
                                super.init(nibName: nil, bundle: nil)
                                if selectStore != nil{
                                                viewModel.selectStore.accept(selectStore)
                                }
                }
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell")
        tableView.separatorStyle = .none
        tf_search.delegate = self
        viewModel.configure(tableView,needMore: false)
        btn_stores.setTitle(viewModel.selectStore.value?.name ?? "所在门店", for: .normal)
    }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "运动营列表"
                                viewModel.getDefaultData()
                                viewModel.beginRefresh()
                }
    override func setRx() {
        tf_search.rx.controlEvent(.editingDidEnd).subscribe(onNext: { [weak self] in
            if self?.tf_search.text?.isEmpty ?? true{
                self?.viewModel.search.accept(nil)
            }else{
                self?.viewModel.search.accept(self?.tf_search.text!)
            }
        }).disposed(by: disposeBag)
    }
                override func setUI() {
                                btn_courseType.imagePosition = .right
                                btn_stores.imagePosition = .right
                                btn_sales.imagePosition = .right
                                btn_distance.imagePosition = .right
    private func cleanOther(){
        showSubTypeView?.removeFromSuperview()
        btn_courseType.isSelected = false
        btn_stores.isSelected = false
        btn_sales.isSelected = false
        btn_distance.isSelected = false
    }
    @IBAction func searchAction(_ sender: UIButton) {
        view.endEditing(true)
        guard !tf_search.isEmpty else {
            alert(msg: "请输入搜索内容");return
        }
        viewModel.beginRefresh()
    }
                                btn_courseType.spacingBetweenImageAndTitle = 5
                                btn_stores.spacingBetweenImageAndTitle = 5
                                btn_sales.spacingBetweenImageAndTitle = 5
                                btn_distance.spacingBetweenImageAndTitle = 5
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell")
                                tableView.separatorStyle = .none
                                tf_search.delegate = self
                                viewModel.configure(tableView,needMore: false)
                                btn_stores.setTitle(viewModel.selectStore.value?.name ?? "所在门店", for: .normal)
                }
                override func setRx() {
                                tf_search.rx.controlEvent(.editingDidEnd).subscribe(onNext: { [weak self] in
                                                if self?.tf_search.text?.isEmpty ?? true{
                                                                self?.viewModel.search.accept(nil)
                                                }else{
                                                                self?.viewModel.search.accept(self?.tf_search.text!)
                                                }
                                }).disposed(by: disposeBag)
                }
                private func cleanOther(){
                                showSubTypeView?.removeFromSuperview()
                                btn_courseType.isSelected = false
                                btn_stores.isSelected = false
                                btn_sales.isSelected = false
                                btn_distance.isSelected = false
                }
                @IBAction func searchAction(_ sender: UIButton) {
                                view.endEditing(true)
                                guard !tf_search.isEmpty else {
                                                alert(msg: "请输入搜索内容");return
                                }
                                viewModel.beginRefresh()
                }
    @IBAction func enrolledAction(_ sender: UIButton) {
        view.endEditing(true)
        let vc = SignUpCourseVC()
        push(vc: vc)
    }
    @IBAction func crouseTypeAction(_ sender: UIButton) {
        view.endEditing(true)
        guard viewModel.packageTypeData.value != nil else {
            alertError(msg: "分类数据加载失败,请再试一次")
            viewModel.getDefaultData()
            return
        }
        guard !sender.isSelected else {return}
        cleanOther()
        sender.isSelected = true
        showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.packageTypeData.value!,selectModel: viewModel.selectPackeType.value) { [weak self] m in
            if m.name != "全部"{
                sender.setTitle(m.name, for: .normal)
                self?.viewModel.selectPackeType.accept(m)
            }else{
                sender.setTitle("运动营类型", for: .normal)
                self?.viewModel.selectPackeType.accept(nil)
            }
            sender.isSelected = false
            self?.viewModel.beginRefresh()
        } closeClouse: {
            sender.isSelected = false
        }
    }
    @IBAction func inStoresAction(_ sender: UIButton) {
        view.endEditing(true)
        guard viewModel.storesData.value != nil else {
            alertError(msg: "分类数据加载失败,请再试一次")
            viewModel.getDefaultData()
            return
        }
        guard !sender.isSelected else {return}
        cleanOther()
        sender.isSelected = true
        showSubTypeView =  CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.storesData.value!,selectModel: viewModel.selectStore.value) { [weak self] m in
            if m.name != "全部"{
                sender.setTitle(m.name, for: .normal)
                self?.viewModel.selectStore.accept(m)
            }else{
                sender.setTitle("所在门店", for: .normal)
                self?.viewModel.selectStore.accept(nil)
            }
            sender.isSelected = false
            self?.viewModel.beginRefresh()
        } closeClouse: {
            sender.isSelected = false
        }
    }
    @IBAction func saleAction(_ sender: UIButton) {
        view.endEditing(true)
        sender.isSelected = !sender.isSelected
        let sortType = sender.isSelected ? SortType.desc:SortType.asc
        viewModel.salesRanking.accept(sortType)
        sender.setImage(viewModel.salesRanking.value?.img, for: .normal)
        //复原距离
        viewModel.distanceSort.accept(nil)
        btn_distance.isSelected = false
        btn_distance.setImage(SortType.def.img, for: .normal)
        viewModel.beginRefresh()
    }
    @IBAction func distanceAction(_ sender: UIButton) {
        view.endEditing(true)
        sender.isSelected = !sender.isSelected
        let sortType = sender.isSelected ? SortType.desc:SortType.asc
        viewModel.distanceSort.accept(sortType)
        sender.setImage(viewModel.distanceSort.value?.img, for: .normal)
                @IBAction func enrolledAction(_ sender: UIButton) {
                                view.endEditing(true)
                                let vc = SignUpCourseVC()
                                push(vc: vc)
                }
        //复原销量
        viewModel.salesRanking.accept(nil)
        btn_sales.isSelected = false
        btn_sales.setImage(SortType.def.img, for: .normal)
                @IBAction func crouseTypeAction(_ sender: UIButton) {
                                view.endEditing(true)
                                guard viewModel.packageTypeData.value != nil else {
                                                alertError(msg: "分类数据加载失败,请再试一次")
                                                viewModel.getDefaultData()
                                                return
                                }
        viewModel.beginRefresh()
    }
                                guard !sender.isSelected else {return}
                                cleanOther()
                                sender.isSelected = true
                                showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.packageTypeData.value!,selectModel: viewModel.selectPackeType.value) { [weak self] m in
                                                if m.name != "全部"{
                                                                sender.setTitle(m.name, for: .normal)
                                                                self?.viewModel.selectPackeType.accept(m)
                                                }else{
                                                                sender.setTitle("运动营类型", for: .normal)
                                                                self?.viewModel.selectPackeType.accept(nil)
                                                }
                                                sender.isSelected = false
                                                self?.viewModel.beginRefresh()
                                } closeClouse: {
                                                sender.isSelected = false
                                }
                }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
                @IBAction func inStoresAction(_ sender: UIButton) {
                                view.endEditing(true)
                                guard viewModel.storesData.value != nil else {
                                                alertError(msg: "分类数据加载失败,请再试一次")
                                                viewModel.getDefaultData()
                                                return
                                }
                                guard !sender.isSelected else {return}
                                cleanOther()
                                sender.isSelected = true
                                showSubTypeView =  CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.storesData.value!,selectModel: viewModel.selectStore.value) { [weak self] m in
                                                if m.name != "全部"{
                                                                sender.setTitle(m.name, for: .normal)
                                                                self?.viewModel.selectStore.accept(m)
                                                }else{
                                                                sender.setTitle("所在门店", for: .normal)
                                                                self?.viewModel.selectStore.accept(nil)
                                                }
                                                sender.isSelected = false
                                                self?.viewModel.beginRefresh()
                                } closeClouse: {
                                                sender.isSelected = false
                                }
                }
                @IBAction func saleAction(_ sender: UIButton) {
                                view.endEditing(true)
                                sender.isSelected = !sender.isSelected
                                let sortType = sender.isSelected ? SortType.desc:SortType.asc
                                viewModel.salesRanking.accept(sortType)
                                sender.setImage(viewModel.salesRanking.value?.img, for: .normal)
                                //复原距离
                                viewModel.distanceSort.accept(nil)
                                btn_distance.isSelected = false
                                btn_distance.setImage(SortType.def.img, for: .normal)
                                viewModel.beginRefresh()
                }
                @IBAction func distanceAction(_ sender: UIButton) {
                                view.endEditing(true)
                                sender.isSelected = !sender.isSelected
                                let sortType = sender.isSelected ? SortType.desc:SortType.asc
                                viewModel.distanceSort.accept(sortType)
                                sender.setImage(viewModel.distanceSort.value?.img, for: .normal)
                                //复原销量
                                viewModel.salesRanking.accept(nil)
                                btn_sales.isSelected = false
                                btn_sales.setImage(SortType.def.img, for: .normal)
                                viewModel.beginRefresh()
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
}
extension CourseListVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let item = viewModel.dataSource.value[indexPath.row]
        let vc = CourseDetailVC(id: item.id)
        push(vc: vc)
    }
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let item = viewModel.dataSource.value[indexPath.row]
                                let vc = CourseDetailVC(id: item.id)
                                push(vc: vc)
                }
}
extension CourseListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseTCell") as! CourseTCell
        cell.courseItemModel = viewModel.dataSource.value[indexPath.row]
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSource.value.count
    }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseTCell") as! CourseTCell
                                cell.courseItemModel = viewModel.dataSource.value[indexPath.row]
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return viewModel.dataSource.value.count
                }
}
extension CourseListVC:QMUITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        viewModel.beginRefresh()
        return true
    }
                func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                textField.resignFirstResponder()
                                viewModel.beginRefresh()
                                return true
                }
}
WanPai/Root/Games/VC/GamesDataSourceSubListVC.swift
@@ -10,70 +10,70 @@
import RxSwift
class GamesDataSourceViewModel:RefreshModel<GamesRecordModel>{
    private var type:GamesSubType!
                private var type:GamesSubType!
    init(type:GamesSubType) {
        super.init()
        self.type = type
    }
                init(type:GamesSubType) {
                                super.init()
                                self.type = type
                }
    let userId = BehaviorRelay<Int>(value:0)
                let userId = BehaviorRelay<Int>(value:0)
    override func api() -> (Observable<BaseResponse<[GamesRecordModel]>>)? {
        if type == .offline{
            return Services.game_generalGameRecord(userId: userId.value, page: page)
        }else if type == .crossMatch{
            return Services.game_generalGameCrossRecord(userId: userId.value, page: page)
        }else{
            return Services.game_generalGameAccuracyRecord(userId: userId.value, page: page)
        }
    }
                override func api() -> (Observable<BaseResponse<[GamesRecordModel]>>)? {
                                if type == .offline{
                                                return Services.game_generalGameRecord(userId: userId.value, page: page)
                                }else if type == .crossMatch{
                                                return Services.game_generalGameCrossRecord(userId: userId.value, page: page)
                                }else{
                                                return Services.game_generalGameAccuracyRecord(userId: userId.value, page: page)
                                }
                }
}
class GamesDataSourceSubListVC: BaseVC {
    private var type:GamesSubType!
    private var tableView:BaseTableView!
    private var viewModel:GamesDataSourceViewModel!
                private var type:GamesSubType!
                private var tableView:BaseTableView!
                private var viewModel:GamesDataSourceViewModel!
    init(type:GamesSubType) {
        super.init(nibName: nil, bundle: nil)
        self.type = type
        self.viewModel = GamesDataSourceViewModel(type: type)
    }
                init(type:GamesSubType) {
                                super.init(nibName: nil, bundle: nil)
                                self.type = type
                                self.viewModel = GamesDataSourceViewModel(type: type)
                }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                override func viewDidLoad() {
                                super.viewDidLoad()
//        tableView.jq_setEmptyView()
        viewModel.configure(tableView)
        Services.userDetails().subscribe(onNext: {[weak self] data in
            if let userId = data.data?.userId{
                self?.viewModel.userId.accept(userId)
                self?.viewModel.beginRefresh()
            }
        }) { error in
                                //        tableView.jq_setEmptyView()
                                viewModel.configure(tableView)
                                Services.userDetails().subscribe(onNext: {[weak self] data in
                                                if let userId = data.data?.userId{
                                                                self?.viewModel.userId.accept(userId)
                                                                self?.viewModel.beginRefresh()
                                                }
                                }) { error in
        }.disposed(by: disposeBag)
    }
                                }.disposed(by: disposeBag)
                }
    override func setUI() {
        tableView = BaseTableView(frame: .zero, style: .plain)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "GamesDataSourceTCell", bundle: nil), forCellReuseIdentifier: "_GamesDataSourceTCell")
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.edges.equalToSuperview().inset(UIEdgeInsets(top: 7.5, left: 0, bottom: 0, right: 0))
        }
    }
                override func setUI() {
                                tableView = BaseTableView(frame: .zero, style: .plain)
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.register(UINib(nibName: "GamesDataSourceTCell", bundle: nil), forCellReuseIdentifier: "_GamesDataSourceTCell")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview().inset(UIEdgeInsets(top: 7.5, left: 0, bottom: 0, right: 0))
                                }
                }
}
extension GamesDataSourceSubListVC:UITableViewDelegate{
@@ -81,21 +81,21 @@
}
extension GamesDataSourceSubListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "_GamesDataSourceTCell") as! GamesDataSourceTCell
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_GamesDataSourceTCell") as! GamesDataSourceTCell
        if type == .offline{
            cell.label_gameName.text = viewModel.dataSource.value[indexPath.row].game_name
            cell.label_score.text = "\(viewModel.dataSource.value[indexPath.row].score)"
            cell.label_type.text = viewModel.dataSource.value[indexPath.row].time
        }
        return cell
    }
                                if type == .offline{
                                                cell.label_gameName.text = viewModel.dataSource.value[indexPath.row].game_name
                                                cell.label_score.text = "\(viewModel.dataSource.value[indexPath.row].score)"
                                                cell.label_type.text = viewModel.dataSource.value[indexPath.row].time
                                }
                                return cell
                }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if type == .offline{
            return viewModel.dataSource.value.count
        }
        return 0
    }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                if type == .offline{
                                                return viewModel.dataSource.value.count
                                }
                                return 0
                }
}
WanPai/Root/Games/VC/GamesDataSourceVC.swift
@@ -1,9 +1,9 @@
    //
    //  GamesDataSourceVC.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/9/15.
    //
//
//  GamesDataSourceVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/9/15.
//
import UIKit
import SPPageMenu
@@ -12,95 +12,95 @@
class GamesDataSourceVC: BaseVC {
    private var pageMenu:SPPageMenu = {
        let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
            // 追踪线
        pageMenu.trackerWidth = 56
        pageMenu.setTrackerHeight(3, cornerRadius: 1.5)
        pageMenu.tracker.backgroundColor = Def_ThemeColor
        pageMenu.trackerFollowingMode = .always
        pageMenu.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
                private var pageMenu:SPPageMenu = {
                                let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
                                // 追踪线
                                pageMenu.trackerWidth = 56
                                pageMenu.setTrackerHeight(3, cornerRadius: 1.5)
                                pageMenu.tracker.backgroundColor = Def_ThemeColor
                                pageMenu.trackerFollowingMode = .always
                                pageMenu.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            // 分割线
        pageMenu.dividingLine.backgroundColor = .clear
        pageMenu.dividingLineHeight = 1
                                // 分割线
                                pageMenu.dividingLine.backgroundColor = .clear
                                pageMenu.dividingLineHeight = 1
            // item
        pageMenu.spacing = 20.0
        pageMenu.permutationWay = .notScrollEqualWidths
//        pageMenu.setItems(["单机游戏","跨城赛","90°准度赛"], selectedItemIndex: 0)
        pageMenu.setItems(["单机游戏"], selectedItemIndex: 0)
                                // item
                                pageMenu.spacing = 20.0
                                pageMenu.permutationWay = .notScrollEqualWidths
                                //        pageMenu.setItems(["单机游戏","跨城赛","90°准度赛"], selectedItemIndex: 0)
                                pageMenu.setItems(["单机游戏"], selectedItemIndex: 0)
            // 字体
        pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 14, weight: .semibold)
        pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 14,weight: .medium)
            // 颜色
        pageMenu.selectedItemTitleColor = .black.withAlphaComponent(0.8)
        pageMenu.unSelectedItemTitleColor = .black.withAlphaComponent(0.6)
                                // 字体
                                pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 14, weight: .semibold)
                                pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 14,weight: .medium)
                                // 颜色
                                pageMenu.selectedItemTitleColor = .black.withAlphaComponent(0.8)
                                pageMenu.unSelectedItemTitleColor = .black.withAlphaComponent(0.6)
        return pageMenu
    }()
                                return pageMenu
                }()
    lazy var pageViewController:FFPageViewController = {
        let pageVC = FFPageViewController()
        pageVC.view.backgroundColor = .clear
        pageVC.scrollview.backgroundColor = .clear
                lazy var pageViewController:FFPageViewController = {
                                let pageVC = FFPageViewController()
                                pageVC.view.backgroundColor = .clear
                                pageVC.scrollview.backgroundColor = .clear
        pageVC.scrollview.bounces = false
        return pageVC
    }()
                                pageVC.scrollview.bounces = false
                                return pageVC
                }()
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "我的数据"
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "我的数据"
        pageMenu.delegate = self
        pageViewController.delegate = self
    }
                                pageMenu.delegate = self
                                pageViewController.delegate = self
                }
    override func setUI() {
        pageMenu.layer.shadowColor = UIColor(hexStr: "#EFEEEE").withAlphaComponent(0.5).cgColor
        pageMenu.layer.shadowOffset = CGSize(width: 0, height: 2)
        pageMenu.layer.shadowOpacity = 1
        view.addSubview(pageMenu)
        pageMenu.snp.makeConstraints { make in
            make.top.equalTo(view.safeAreaLayoutGuide)
            make.left.right.equalToSuperview()
            make.height.equalTo(45)
        }
                override func setUI() {
                                pageMenu.layer.shadowColor = UIColor(hexStr: "#EFEEEE").withAlphaComponent(0.5).cgColor
                                pageMenu.layer.shadowOffset = CGSize(width: 0, height: 2)
                                pageMenu.layer.shadowOpacity = 1
                                view.addSubview(pageMenu)
                                pageMenu.snp.makeConstraints { make in
                                                make.top.equalTo(view.safeAreaLayoutGuide)
                                                make.left.right.equalToSuperview()
                                                make.height.equalTo(45)
                                }
        view.backgroundColor = .white
        addChild(pageViewController)
        view.insertSubview(pageViewController.view, at: 0)
        pageViewController.didMove(toParent: self)
                                view.backgroundColor = .white
                                addChild(pageViewController)
                                view.insertSubview(pageViewController.view, at: 0)
                                pageViewController.didMove(toParent: self)
        pageViewController.view.snp.makeConstraints { make in
            make.top.equalTo(pageMenu.snp.bottom)
            make.left.right.bottom.equalToSuperview()
        }
    }
                                pageViewController.view.snp.makeConstraints { make in
                                                make.top.equalTo(pageMenu.snp.bottom)
                                                make.left.right.bottom.equalToSuperview()
                                }
                }
}
extension GamesDataSourceVC:SPPageMenuDelegate{
    func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
        pageViewController.scroll(toPage: index, animation: true)
    }
                func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
                                pageViewController.scroll(toPage: index, animation: true)
                }
}
extension GamesDataSourceVC:FFPageViewControllerDelegate{
    func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
        pageMenu.selectedItemIndex = currentPage
    }
                func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
                                pageMenu.selectedItemIndex = currentPage
                }
    func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
        return 3
    }
                func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                                return 3
                }
    func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
        let vc = GamesDataSourceSubListVC(type: GamesSubType(rawValue: page)!)
        return vc
    }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                let vc = GamesDataSourceSubListVC(type: GamesSubType(rawValue: page)!)
                                return vc
                }
}
WanPai/Root/Games/VC/GamesListVC.swift
@@ -12,93 +12,93 @@
class GamesListVC: BaseVC {
    private var model:QRCodeModel!
    private(set) var pageMenu:SPPageMenu = {
        let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
            // 追踪线
        pageMenu.trackerWidth = 0
        pageMenu.setTrackerHeight(0, cornerRadius: 1.5)
        pageMenu.tracker.backgroundColor = .clear
        pageMenu.trackerFollowingMode = .always
        pageMenu.contentInset = UIEdgeInsets(top: 0, left: 19, bottom: 0, right: 19)
//        pageMenu.setItems(["单机游戏","互联游戏"], selectedItemIndex: 0)
        pageMenu.setItems(["单机游戏"], selectedItemIndex: 0)
                private var model:QRCodeModel!
                private(set) var pageMenu:SPPageMenu = {
                                let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
                                // 追踪线
                                pageMenu.trackerWidth = 0
                                pageMenu.setTrackerHeight(0, cornerRadius: 1.5)
                                pageMenu.tracker.backgroundColor = .clear
                                pageMenu.trackerFollowingMode = .always
                                pageMenu.contentInset = UIEdgeInsets(top: 0, left: 19, bottom: 0, right: 19)
                                //        pageMenu.setItems(["单机游戏","互联游戏"], selectedItemIndex: 0)
                                pageMenu.setItems(["单机游戏"], selectedItemIndex: 0)
            // 分割线
        pageMenu.dividingLine.backgroundColor = .clear
        pageMenu.dividingLineHeight = 1
                                // 分割线
                                pageMenu.dividingLine.backgroundColor = .clear
                                pageMenu.dividingLineHeight = 1
            // item
        pageMenu.spacing = 27.0
        pageMenu.permutationWay = .scrollAdaptContent
                                // item
                                pageMenu.spacing = 27.0
                                pageMenu.permutationWay = .scrollAdaptContent
            // 字体
        pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 21, weight: .medium)
        pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 18,weight: .medium)
            // 颜色
        pageMenu.selectedItemTitleColor = UIColor(hexStr: "#6CC366")
        pageMenu.unSelectedItemTitleColor = UIColor(hexStr: "#A4A4A4")
        return pageMenu
    }()
                                // 字体
                                pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 21, weight: .medium)
                                pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 18,weight: .medium)
                                // 颜色
                                pageMenu.selectedItemTitleColor = UIColor(hexStr: "#6CC366")
                                pageMenu.unSelectedItemTitleColor = UIColor(hexStr: "#A4A4A4")
                                return pageMenu
                }()
    lazy var pageViewController:FFPageViewController = {
        let pageVC = FFPageViewController()
        pageVC.view.backgroundColor = .clear
        pageVC.scrollview.backgroundColor = .clear
                lazy var pageViewController:FFPageViewController = {
                                let pageVC = FFPageViewController()
                                pageVC.view.backgroundColor = .clear
                                pageVC.scrollview.backgroundColor = .clear
        pageVC.scrollview.bounces = false
        return pageVC
    }()
                                pageVC.scrollview.bounces = false
                                return pageVC
                }()
    init(model:QRCodeModel) {
        super.init(nibName: nil, bundle: nil)
        self.model = model
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "智慧球场"
                init(model:QRCodeModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.model = model
                }
    }
    override func setUI() {
        view.backgroundColor = Def_ThemeColor
        pageMenu.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: 91)
        pageMenu.delegate = self
        view.addSubview(pageMenu)
        view.addSubview(pageViewController.view)
        pageViewController.view.backgroundColor = .clear
        pageViewController.delegate = self
        pageViewController.view.snp.makeConstraints { make in
            make.top.equalTo(pageMenu.snp.bottom)
            make.left.right.bottom.equalToSuperview()
        }
    }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "智慧球场"
                }
                override func setUI() {
                                view.backgroundColor = Def_ThemeColor
                                pageMenu.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: 91)
                                pageMenu.delegate = self
                                view.addSubview(pageMenu)
                                view.addSubview(pageViewController.view)
                                pageViewController.view.backgroundColor = .clear
                                pageViewController.delegate = self
                                pageViewController.view.snp.makeConstraints { make in
                                                make.top.equalTo(pageMenu.snp.bottom)
                                                make.left.right.bottom.equalToSuperview()
                                }
                }
}
extension GamesListVC:SPPageMenuDelegate{
    func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
        pageViewController.scroll(toPage: index, animation: true)
    }
                func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
                                pageViewController.scroll(toPage: index, animation: true)
                }
}
extension GamesListVC:FFPageViewControllerDelegate{
    func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
        pageMenu.selectedItemIndex = currentPage
    }
                func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
                                pageMenu.selectedItemIndex = currentPage
                }
    func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
        return 2
    }
                func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                                return 2
                }
    func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
        let vc = GamesSubListVC(type: GamesSubType(rawValue: page)!,model: model)
        return vc
    }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                let vc = GamesSubListVC(type: GamesSubType(rawValue: page)!,model: model)
                                return vc
                }
}
WanPai/Root/Games/VC/GamesSubListVC.swift
@@ -10,93 +10,93 @@
import RxSwift
enum GamesSubType:Int{
    case offline = 0
    case crossMatch = 1
    case accuracyMatch = 2
                case offline = 0
                case crossMatch = 1
                case accuracyMatch = 2
}
class GamesOffLineViewModel:RefreshModel<GameListModel>{
    let spaceId = BehaviorRelay<Int>(value: 0)
    let sutuId = BehaviorRelay<Int>(value: 0)
    let storeId = BehaviorRelay<Int>(value: 0)
                let spaceId = BehaviorRelay<Int>(value: 0)
                let sutuId = BehaviorRelay<Int>(value: 0)
                let storeId = BehaviorRelay<Int>(value: 0)
    override func api() -> (Observable<BaseResponse<[GameListModel]>>)? {
        return Services.game_gameList(spaceId: spaceId.value, storeId: storeId.value)
    }
                override func api() -> (Observable<BaseResponse<[GameListModel]>>)? {
                                return Services.game_gameList(spaceId: spaceId.value, storeId: storeId.value)
                }
}
class GamesSubListVC: BaseVC {
    private var type:GamesSubType!
    private var model:QRCodeModel!
                private var type:GamesSubType!
                private var model:QRCodeModel!
    private let offLineViewModel = GamesOffLineViewModel()
    private var homeStoreModel:HomeStoreModel!
    private var tableView:BaseTableView!
                private let offLineViewModel = GamesOffLineViewModel()
                private var homeStoreModel:HomeStoreModel!
                private var tableView:BaseTableView!
    init(type:GamesSubType,model:QRCodeModel) {
        super.init(nibName: nil, bundle: nil)
        self.type = type
        self.model = model
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
            if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                offLineViewModel.storeId.accept(deserModel.storeId)
                if type == .offline{
                    offLineViewModel.spaceId.accept(model.space_id!)
                    offLineViewModel.sutuId.accept(model.sutu_id!)
                    offLineViewModel.configure(tableView, needMore: false)
                    offLineViewModel.beginRefresh()
                init(type:GamesSubType,model:QRCodeModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.type = type
                                self.model = model
                }
            }
        }
    }
    override func setUI() {
        tableView = BaseTableView(frame: .zero, style: .plain)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "GamesTCell", bundle: nil), forCellReuseIdentifier: "_GamesTCell")
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
//        tableView.jq_setEmptyView()
    }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
                                                if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                                                                offLineViewModel.storeId.accept(deserModel.storeId)
                                                                if type == .offline{
                                                                                offLineViewModel.spaceId.accept(model.space_id!)
                                                                                offLineViewModel.sutuId.accept(model.sutu_id!)
                                                                                offLineViewModel.configure(tableView, needMore: false)
                                                                                offLineViewModel.beginRefresh()
                                                                }
                                                }
                                }
                }
                override func setUI() {
                                tableView = BaseTableView(frame: .zero, style: .plain)
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.register(UINib(nibName: "GamesTCell", bundle: nil), forCellReuseIdentifier: "_GamesTCell")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                //        tableView.jq_setEmptyView()
                }
}
extension GamesSubListVC:UITableViewDelegate{
}
extension GamesSubListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "_GamesTCell") as! GamesTCell
        if type == .offline{
            cell.gameListModel = offLineViewModel.dataSource.value[indexPath.row]
            cell.QRCodeModel = model
            cell.spaceId = offLineViewModel.spaceId.value
            cell.storeId = offLineViewModel.storeId.value
            cell.sutuId = offLineViewModel.sutuId.value
        }
        return cell
    }
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_GamesTCell") as! GamesTCell
                                if type == .offline{
                                                cell.gameListModel = offLineViewModel.dataSource.value[indexPath.row]
                                                cell.QRCodeModel = model
                                                cell.spaceId = offLineViewModel.spaceId.value
                                                cell.storeId = offLineViewModel.storeId.value
                                                cell.sutuId = offLineViewModel.sutuId.value
                                }
                                return cell
                }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 212
    }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                return 212
                }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return offLineViewModel.dataSource.value.count
    }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return offLineViewModel.dataSource.value.count
                }
}
WanPai/Root/Home/Model/HomeModel.swift
@@ -9,45 +9,45 @@
import HandyJSON
struct HomeStoreModel:HandyJSON{
    var isVip = 0
    var storeId = 0
    var name = ""
    var lon:Double = 0
    var lat:Double = 0
                var isVip = 0
                var storeId = 0
                var name = ""
                var lon:Double = 0
                var lat:Double = 0
    var province = ""
    var provinceCode:Int = 0
    var city:String = ""
    var cityCode:Int = 0
                var province = ""
                var provinceCode:Int = 0
                var city:String = ""
                var cityCode:Int = 0
}
class HomeStoreConfigModel:HandyJSON {
   required init() {}
                required init() {}
    var type:HomeItemType = .none
    var isOpen:Int = 0
    var sort:Int = 0
    var backgroundImage:String = ""
    var cellHeight:Double = 270
                var type:HomeItemType = .worldcup
                var isOpen:Int = 0
                var sort:Int = 0
                var backgroundImage:String = ""
                var cellHeight:Double = 270
}
class HomeStoreTopBannerModel:HandyJSON{
    required init() {}
                required init() {}
    var backgroundImage:String = ""
    var name = "" //模块
    var page = "" //页面
    var type:String = "" //类型
    var turnId:Int?
    var model = ""
    var sort = 0
    var cellHeight:Double = 270
                var backgroundImage:String = ""
                var name = "" //模块
                var page = "" //页面
                var type:String = "" //类型
                var turnId:Int?
                var model = ""
                var sort = 0
                var cellHeight:Double = 270
}
struct NormalSimpleModel:HandyJSON{
    var id = 0
    var name = ""
                var id = 0
                var name = ""
}
WanPai/Root/Home/Model/WorldCupModel.swift
New file
@@ -0,0 +1,22 @@
//
//  WorldCupModel.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import Foundation
import HandyJSON
struct WorldCupListModel:HandyJSON{
                var age: String = ""
                var content: String = ""
                var coverImg: String = ""
                var heat: Int = 0
                var id: String = ""
                var lat: String = ""
                var lon: String = ""
                var matchNumber: Int = 0
                var name: String = ""
                var registrationClosingTime: String = ""
}
WanPai/Root/Home/VC/HomeVC.swift
@@ -1,9 +1,9 @@
    //
    //  HomeVC.swift
    //  WanPai
    //
    //  Created by 杨锴 on 2023/6/8.
    //
//
//  HomeVC.swift
//  WanPai
//
//  Created by 杨锴 on 2023/6/8.
//
import UIKit
import JQTools
@@ -15,358 +15,361 @@
let UpdateCurrentStore_Noti = Notification.Name.init("UpdateCurrentStore_Noti")
class HomeVC: BaseVC{
    @IBOutlet weak var collectionView: BaseCollectionView!
    @IBOutlet weak var label_vipInfo: UILabel!
    @IBOutlet weak var view_banner: CommonBannerView!
    @IBOutlet weak var btn_localTap: TapBtn!
    private var layout:FlowLayout!
    @IBOutlet weak var label_store: UILabel!
    private var items = Array<Any>()
    private var storeModel:HomeStoreModel?
    private var storeId:Int?
    private var currentLocal:CLLocation?
                @IBOutlet weak var collectionView: BaseCollectionView!
                @IBOutlet weak var label_vipInfo: UILabel!
                @IBOutlet weak var view_banner: CommonBannerView!
                @IBOutlet weak var btn_localTap: TapBtn!
                private var layout:FlowLayout!
                @IBOutlet weak var label_store: UILabel!
                private var items = Array<Any>()
                private var storeModel:HomeStoreModel?
                private var storeId:Int?
                private var currentLocal:CLLocation?
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let nav = navigationController as? BaseNav{
            nav.navigationController(nav, willShow: self, animated: true)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        startLocation()
        Services.bannerList(position: .homeTop).subscribe(onNext: {[weak self] data in
            if let models = data.data{
                var bannerResources = [CommonBannerModel]()
                for (i,item) in models.enumerated() {
                    bannerResources.append(CommonBannerModel(index:i,resource:item.img,mediaType:.imageUrl))
                }
                self?.view_banner.setItems(items: bannerResources,selectClouse: { m in
                    jumpPage(model: models[m.index].model, page: models[m.index].page, type: models[m.index].type, id: models[m.index].turnId)
                })
            }
        }) { error in
        }.disposed(by: disposeBag)
    }
    override func setUI() {
        view.backgroundColor = UIColor(hexStr: "EEF0F3")
        layout = FlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 14, left: 34, bottom: 14, right: 34)
        collectionView.collectionViewLayout = layout
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = .white
        collectionView.register(UINib(nibName: "HomeCCell", bundle: nil), forCellWithReuseIdentifier: "_HomeCCell")
//        collectionView.jq_setEmptyView("无数据", image: UIImage(named: "icon_LOGO")?.jq_imageWithTintColor(color: .gray), foregroundColor: .gray, clouse: nil)
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(ChooseHomeStore_Noti).take(until: self.rx.deallocated).subscribe(onNext: { [weak self] noti in
            guard let weakSelf = self else { return }
            weakSelf.chooseStoresAction(weakSelf.btn_localTap)
        }).disposed(by: disposeBag)
    }
    private func getStoreInfo(){
        Services.homeInfo().subscribe(onNext: {[weak self] data in
            if let m = data.data{
                self?.storeModel = m
                var text = "欢迎来到 快乐运动俱乐部"
                if m.storeId != 0{
                    self?.label_store.text = m.name.isEmpty ? "门店获取失败":m.name
                    self?.storeModel = m
                    self?.storeId = m.storeId
                    if m.isVip == 0{text.append("\n加入我们 成为会员")}
                    self?.label_vipInfo.text = text
                    UserDefaults.standard.set(m.toJSONString(), forKey: "CurrentStore")
                    UserDefaults.standard.synchronize()
                    self?.getStoreItemList()
                }
            }
        }) { [weak self] error in
            self?.label_store.text = "门店获取失败"
        }.disposed(by: disposeBag)
    }
    private func getStoreItemList(){
        items.removeAll()
        Services.homeStoreConfig(storeId: storeId!).subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            self?.items.append(contentsOf: (data.data ?? []).filter({$0.isOpen == 1}))
            Services.homeStoreConfig2(storeId: weakSelf.storeId!).subscribe(onNext: {[weak self] data in
                self?.items.append(contentsOf: (data.data ?? []))
                self?.downloadImgs()
            }) { error in
            }.disposed(by: weakSelf.disposeBag)
        }) { error in
        }.disposed(by: disposeBag)
    }
    //图片下载
    private func downloadImgs(){
        let group = DispatchGroup()
        let queue = DispatchQueue(label: "imgRadio")
        let w = (view.frame.width - 78.0) / 2.0
        for item in items{
            if let m = item as? HomeStoreConfigModel{
                queue.async(group: group){ () in
                    group.enter()
                    guard SDImageCache.shared.diskImageDataExists(withKey: m.backgroundImage) else {
                        SDWebImageDownloader.shared.downloadImage(with: URL(string: m.backgroundImage), options: .useNSURLCache) { _, _,_ in
                        } completed: { image, data, error, status in
                            if let img = image{
                                m.cellHeight = w / (img.size.width / img.size.height)
                            }else{
                                m.cellHeight =  w / (m.type.defaultImg.size.width / m.type.defaultImg.size.height)
                            }
                            group.leave()
                        }
                        return
                    }
                    if let data = SDImageCache.shared.diskCache.data(forKey: m.backgroundImage),let img = UIImage(data: data){
                        m.cellHeight = w / (img.size.width / img.size.height)
                        group.leave()
                    }
                }
            }
            if let m = item as? HomeStoreTopBannerModel{
                queue.async(group: group){() in
                    group.enter()
                    guard SDImageCache.shared.diskImageDataExists(withKey: m.backgroundImage) else {
                        SDWebImageDownloader.shared.downloadImage(with: URL(string: m.backgroundImage), options: .useNSURLCache) { _, _,_ in
                        } completed: { image, data, error, status in
                            if let img = image{
                                m.cellHeight = w / (img.size.width / img.size.height)
                            }
                            group.leave()
                        }
                    return
                    }
                    if let data = SDImageCache.shared.diskCache.data(forKey: m.backgroundImage),let img = UIImage(data: data){
                        m.cellHeight = w / (img.size.width / img.size.height)
                        group.leave()
                    }
                }
            }
        }
        group.notify(queue: .main) {
            self.items = self.items.sorted { v1, v2 in
                var sort1 = 0
                var sort2 = 0
                if let m = v1 as? HomeStoreTopBannerModel{
                    sort1 = m.sort
                override func viewDidAppear(_ animated: Bool) {
                                super.viewDidAppear(animated)
                                if let nav = navigationController as? BaseNav{
                                                nav.navigationController(nav, willShow: self, animated: true)
                                }
                }
                if let m = v1 as? HomeStoreConfigModel{
                    sort1 = m.sort
                override func viewDidLoad() {
                                super.viewDidLoad()
                                startLocation()
                                Services.bannerList(position: .homeTop).subscribe(onNext: {[weak self] data in
                                                if let models = data.data{
                                                                var bannerResources = [CommonBannerModel]()
                                                                for (i,item) in models.enumerated() {
                                                                                bannerResources.append(CommonBannerModel(index:i,resource:item.img,mediaType:.imageUrl))
                                                                }
                                                                self?.view_banner.setItems(items: bannerResources,selectClouse: { m in
                                                                                jumpPage(model: models[m.index].model, page: models[m.index].page, type: models[m.index].type, id: models[m.index].turnId)
                                                                })
                                                }
                                }) { error in
                                }.disposed(by: disposeBag)
                }
                if let m = v2 as? HomeStoreTopBannerModel{
                    sort2 = m.sort
                override func setUI() {
                                view.backgroundColor = UIColor(hexStr: "EEF0F3",darkStr: nil)
                                layout = FlowLayout()
                                layout.sectionInset = UIEdgeInsets(top: 14, left: 34, bottom: 14, right: 34)
                                collectionView.collectionViewLayout = layout
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.backgroundColor = .white
                                collectionView.register(UINib(nibName: "HomeCCell", bundle: nil), forCellWithReuseIdentifier: "_HomeCCell")
                                //        collectionView.jq_setEmptyView("无数据", image: UIImage(named: "icon_LOGO")?.jq_imageWithTintColor(color: .gray), foregroundColor: .gray, clouse: nil)
                }
                if let m = v2 as? HomeStoreConfigModel{
                    sort2 = m.sort
                override func setRx() {
                                NotificationCenter.default.rx.notification(ChooseHomeStore_Noti).take(until: self.rx.deallocated).subscribe(onNext: { [weak self] noti in
                                                guard let weakSelf = self else { return }
                                                weakSelf.chooseStoresAction(weakSelf.btn_localTap)
                                }).disposed(by: disposeBag)
                }
                return sort1 < sort2
            }
            let v = self.items.compactMap { any in
                if let m = any as? HomeStoreTopBannerModel{
                    return "\(m.sort)"
                private func getStoreInfo(){
                                Services.homeInfo().subscribe(onNext: {[weak self] data in
                                                if let m = data.data{
                                                                self?.storeModel = m
                                                                var text = "欢迎来到 快乐运动俱乐部"
                                                                if m.storeId != 0{
                                                                                self?.label_store.text = m.name.isEmpty ? "门店获取失败":m.name
                                                                                self?.storeModel = m
                                                                                self?.storeId = m.storeId
                                                                                if m.isVip == 0{text.append("\n加入我们 成为会员")}
                                                                                self?.label_vipInfo.text = text
                                                                                UserDefaults.standard.set(m.toJSONString(), forKey: "CurrentStore")
                                                                                UserDefaults.standard.synchronize()
                                                                                self?.getStoreItemList()
                                                                }
                                                }
                                }) { [weak self] error in
                                                self?.label_store.text = "门店获取失败"
                                }.disposed(by: disposeBag)
                }
                if let m = any as? HomeStoreConfigModel{
                    return "\(m.sort)"
                private func getStoreItemList(){
                                items.removeAll()
                                Services.homeStoreConfig(storeId: storeId!).subscribe(onNext: {[weak self] data in
                                                guard let weakSelf = self else { return }
                                                self?.items.append(contentsOf: (data.data ?? []).filter({$0.isOpen == 1}))
                                                Services.homeStoreConfig2(storeId: weakSelf.storeId!).subscribe(onNext: {[weak self] data in
                                                                self?.items.append(contentsOf: (data.data ?? []))
                                                                self?.downloadImgs()
                                                }) { error in
                                                }.disposed(by: weakSelf.disposeBag)
                                }) { error in
                                }.disposed(by: disposeBag)
                }
                return ""
            }
            self.layout.collectionView?.reloadData()
            self.collectionView.reloadData()
        }
    }
                //图片下载
                private func downloadImgs(){
                                let group = DispatchGroup()
                                let queue = DispatchQueue(label: "imgRadio")
                                let w = (view.frame.width - 78.0) / 2.0
                                for item in items{
                                                if let m = item as? HomeStoreConfigModel{
                                                                queue.async(group: group){ () in
                                                                                group.enter()
                                                                                guard SDImageCache.shared.diskImageDataExists(withKey: m.backgroundImage) else {
                                                                                                SDWebImageDownloader.shared.downloadImage(with: URL(string: m.backgroundImage), options: .useNSURLCache) { _, _,_ in
                                                                                                } completed: { image, data, error, status in
                                                                                                                if let img = image{
                                                                                                                                m.cellHeight = w / (img.size.width / img.size.height)
                                                                                                                }else{
                                                                                                                                m.cellHeight =  w / (m.type.defaultImg.size.width / m.type.defaultImg.size.height)
                                                                                                                }
                                                                                                                group.leave()
                                                                                                }
                                                                                                return
                                                                                }
                                                                                if let data = SDImageCache.shared.diskCache.data(forKey: m.backgroundImage),let img = UIImage(data: data){
                                                                                                m.cellHeight = w / (img.size.width / img.size.height)
                                                                                                group.leave()
                                                                                }
                                                                }
                                                }
    private func startLocation(){
        locationTool.startLocation { [weak self] local in
            guard self!.currentLocal != nil else {
                self!.currentLocal = local
                self!.getStoreInfo()
                locationTool.stopLocation()
                return
            }
                                                if let m = item as? HomeStoreTopBannerModel{
                                                                queue.async(group: group){() in
                                                                                group.enter()
                                                                                guard SDImageCache.shared.diskImageDataExists(withKey: m.backgroundImage) else {
                                                                                                SDWebImageDownloader.shared.downloadImage(with: URL(string: m.backgroundImage), options: .useNSURLCache) { _, _,_ in
                                                                                                } completed: { image, data, error, status in
                                                                                                                if let img = image{
                                                                                                                                m.cellHeight = w / (img.size.width / img.size.height)
                                                                                                                }
                                                                                                                group.leave()
                                                                                                }
                                                                                                return
                                                                                }
        } errorClouse: { [weak self] error in
            alertError(msg: "定位获取失败")
            self?.label_store.text = "定位获取失败"
        }
    }
                                                                                if let data = SDImageCache.shared.diskCache.data(forKey: m.backgroundImage),let img = UIImage(data: data){
                                                                                                m.cellHeight = w / (img.size.width / img.size.height)
                                                                                                group.leave()
                                                                                }
                                                                }
                                                }
                                }
    @IBAction func scanAction(_ sender: UIButton) {
        let codeVC = CommonScanQRCodeVC {[weak self] text, status in
            if status{
                if let model = QRCodeModel.deserialize(from: text){
                    if model.scan_type == .games{
                        let gamesListVC = GamesListVC(model: model)
                        self?.push(vc: gamesListVC)
                    }else if model.scan_type == .yard{
                        let vc = YardDetailVC(id: model.id!)
                        self?.push(vc: vc)
                    }else if model.scan_type == .course{
                        let vc = CourseDetailVC(id: model.id!)
                        self?.push(vc: vc)
                    }
                }else{
                    alertError(msg: "识别失败")
                                group.notify(queue: .main) {
                                                self.items = self.items.sorted { v1, v2 in
                                                                var sort1 = 0
                                                                var sort2 = 0
                                                                if let m = v1 as? HomeStoreTopBannerModel{
                                                                                sort1 = m.sort
                                                                }
                                                                if let m = v1 as? HomeStoreConfigModel{
                                                                                sort1 = m.sort
                                                                }
                                                                if let m = v2 as? HomeStoreTopBannerModel{
                                                                                sort2 = m.sort
                                                                }
                                                                if let m = v2 as? HomeStoreConfigModel{
                                                                                sort2 = m.sort
                                                                }
                                                                return sort1 < sort2
                                                }
                                                let v = self.items.compactMap { any in
                                                                if let m = any as? HomeStoreTopBannerModel{
                                                                                return "\(m.sort)"
                                                                }
                                                                if let m = any as? HomeStoreConfigModel{
                                                                                return "\(m.sort)"
                                                                }
                                                                return ""
                                                }
                                                self.layout.collectionView?.reloadData()
                                                self.collectionView.reloadData()
                                }
                }
            }
        }
        push(vc: codeVC)
    }
                private func startLocation(){
                                locationTool.startLocation { [weak self] local in
                                                guard self!.currentLocal != nil else {
                                                                self!.currentLocal = local
                                                                self!.getStoreInfo()
                                                                locationTool.stopLocation()
                                                                return
                                                }
    @IBAction func joinMemberAction(_ sender: UIButton) {
        let joinMemberVC = JoinMemberIntroduceVC()
        push(vc: joinMemberVC)
    }
    @IBAction func chooseStoresAction(_ sender: TapBtn) {
        StoresChooseView.show(defaultM: storeModel) { [weak self] province,city,store in
            guard let weakSelf = self else { return }
            weakSelf.storeId = store.id
            weakSelf.label_store.text = store.name
            weakSelf.storeModel = HomeStoreModel(isVip: weakSelf.storeModel?.isVip ?? 0, storeId: store.id, name: store.name, lon: 0, lat: 0, province: province.name, provinceCode: province.code, city: city?.name ?? "", cityCode: city?.code ?? 0)
            weakSelf.items.removeAll()
            weakSelf.getStoreItemList()
                                } errorClouse: { [weak self] error in
                                                alertError(msg: "定位获取失败")
                                                self?.label_store.text = "定位获取失败"
                                }
                }
            UserDefaults.standard.set(weakSelf.storeModel!.toJSONString(), forKey: "CurrentStore")
            UserDefaults.standard.synchronize()
            NotificationCenter.default.post(name: UpdateCurrentStore_Noti, object: nil, userInfo: nil)
                @IBAction func scanAction(_ sender: UIButton) {
                                let codeVC = CommonScanQRCodeVC {[weak self] text, status in
                                                if status{
                                                                if let model = QRCodeModel.deserialize(from: text){
                                                                                if model.scan_type == .games{
                                                                                                let gamesListVC = GamesListVC(model: model)
                                                                                                self?.push(vc: gamesListVC)
                                                                                }else if model.scan_type == .yard{
                                                                                                let vc = YardDetailVC(id: model.id!)
                                                                                                self?.push(vc: vc)
                                                                                }else if model.scan_type == .course{
                                                                                                let vc = CourseDetailVC(id: model.id!)
                                                                                                self?.push(vc: vc)
                                                                                }
                                                                }else{
                                                                                alertError(msg: "识别失败")
                                                                }
                                                }
        }
    }
                                }
                                push(vc: codeVC)
                }
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .lightContent
    }
                @IBAction func joinMemberAction(_ sender: UIButton) {
                                let joinMemberVC = JoinMemberIntroduceVC()
                                push(vc: joinMemberVC)
                }
                @IBAction func chooseStoresAction(_ sender: TapBtn) {
                                StoresChooseView.show(defaultM: storeModel) { [weak self] province,city,store in
                                                guard let weakSelf = self else { return }
                                                weakSelf.storeId = store.id
                                                weakSelf.label_store.text = store.name
                                                weakSelf.storeModel = HomeStoreModel(isVip: weakSelf.storeModel?.isVip ?? 0, storeId: store.id, name: store.name, lon: 0, lat: 0, province: province.name, provinceCode: province.code, city: city?.name ?? "", cityCode: city?.code ?? 0)
                                                weakSelf.items.removeAll()
                                                weakSelf.getStoreItemList()
                                                UserDefaults.standard.set(weakSelf.storeModel!.toJSONString(), forKey: "CurrentStore")
                                                UserDefaults.standard.synchronize()
                                                NotificationCenter.default.post(name: UpdateCurrentStore_Noti, object: nil, userInfo: nil)
                                }
                }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .lightContent
                }
}
extension HomeVC:UICollectionViewDelegate,UICollectionViewDelegateWaterFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, colum section: Int) -> Int {
        return 2
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacing section: Int) -> CGFloat {
        return 10
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sectionInsetForItems section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 34, bottom: 14, right: 34)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, itemWidth: CGFloat, caculateHeight indexPath: IndexPath) -> CGFloat {
        let item = items[indexPath.row]
        if let m = item as? HomeStoreConfigModel{
            return m.cellHeight
        }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, colum section: Int) -> Int {
                                return 2
                }
        if let m = item as? HomeStoreTopBannerModel{
            return m.cellHeight
        }
        return 200
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacing section: Int) -> CGFloat {
                                return 10
                }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sectionInsetForItems section: Int) -> UIEdgeInsets {
                                return UIEdgeInsets(top: 0, left: 34, bottom: 14, right: 34)
                }
        var simpleModel:NormalSimpleModel?
        if storeModel != nil{
            simpleModel = NormalSimpleModel(id: storeModel!.storeId, name: storeModel!.name)
        }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, itemWidth: CGFloat, caculateHeight indexPath: IndexPath) -> CGFloat {
                                let item = items[indexPath.row]
                                if let m = item as? HomeStoreConfigModel{
                                                return m.cellHeight
                                }
        let item = items[indexPath.row]
        if let m = item as? HomeStoreConfigModel{
            switch m.type{
                case .course:
                    let vc = CourseListVC(selectStore: simpleModel)
                    push(vc: vc)
                case .booking:
                    let vc = YardListVC(selectStore: simpleModel)
                    push(vc: vc)
                case .activity:
                    let vc = ActivityListVC(cityModel: storeModel)
                    push(vc: vc)
                case .video:
                    let vc = CourseOnlineListVC(position: 2)
                    vc.title = "看视频得奖励"
                    push(vc: vc)
                case .coin:
                    let vc = CourseOnlineListVC(position: 1)
                    vc.title = "线上课得积分"
                    push(vc: vc)
                case .ticket:
                    let vc = CoinStoreCenterVC(selectStore: simpleModel,type: .ticket)
                    push(vc: vc)
                                if let m = item as? HomeStoreTopBannerModel{
                                                return m.cellHeight
                                }
                                return 200
                }
                case .wisdomCourt:
                    guard storeId != 0 else {alert(msg: "请先选择门店");return}
                    let vc = GamesVC()
                    push(vc: vc)
                case .welfare:
                    if storeId != 0{
                        Services.queryStoreFreeBenefit(id: storeId!).subscribe(onNext: {[weak self] data in
                            if let m = data.data{
                                let vc = WelfareFreeVC(m)
                                self?.push(vc: vc)
                            }
                        }).disposed(by: disposeBag)
                    }else{
                        alertError(msg: "当前门店获取失败")
                    }
                case .none:break
            }
        }
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let m = item as? HomeStoreTopBannerModel{
            jumpPage(model: m.name, page: m.page, type: m.type,id: m.turnId)
        }
    }
                                var simpleModel:NormalSimpleModel?
                                if storeModel != nil{
                                                simpleModel = NormalSimpleModel(id: storeModel!.storeId, name: storeModel!.name)
                                }
                                let item = items[indexPath.row]
                                if let m = item as? HomeStoreConfigModel{
                                                switch m.type{
                                                                case .worldcup:
                                                                                let vc = WorldCupIntroVC()
                                                                                push(vc: vc)
                                                                case .course:
                                                                                let vc = CourseListVC(selectStore: simpleModel)
                                                                                push(vc: vc)
                                                                case .booking:
                                                                                let vc = YardListVC(selectStore: simpleModel)
                                                                                push(vc: vc)
                                                                case .activity:
                                                                                let vc = ActivityListVC(cityModel: storeModel)
                                                                                push(vc: vc)
                                                                case .video:
                                                                                let vc = CourseOnlineListVC(position: 2)
                                                                                vc.title = "看视频得奖励"
                                                                                push(vc: vc)
                                                                case .coin:
                                                                                let vc = CourseOnlineListVC(position: 1)
                                                                                vc.title = "线上课得积分"
                                                                                push(vc: vc)
                                                                case .ticket:
                                                                                let vc = CoinStoreCenterVC(selectStore: simpleModel,type: .ticket)
                                                                                push(vc: vc)
                                                                case .wisdomCourt:
                                                                                guard storeId != 0 else {alert(msg: "请先选择门店");return}
                                                                                let vc = GamesVC()
                                                                                push(vc: vc)
                                                                case .welfare:
                                                                                if storeId != 0{
                                                                                                Services.queryStoreFreeBenefit(id: storeId!).subscribe(onNext: {[weak self] data in
                                                                                                                if let m = data.data{
                                                                                                                                let vc = WelfareFreeVC(m)
                                                                                                                                self?.push(vc: vc)
                                                                                                                }
                                                                                                }).disposed(by: disposeBag)
                                                                                }else{
                                                                                                alertError(msg: "当前门店获取失败")
                                                                                }
                                                                case .nothing:
                                                                                break
                                                }
                                }
                                if let m = item as? HomeStoreTopBannerModel{
                                                jumpPage(model: m.name, page: m.page, type: m.type,id: m.turnId)
                                }
                }
}
extension HomeVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeCCell", for: indexPath) as! HomeCCell
        guard indexPath.row < items.count else {return cell}
        let item = items[indexPath.row]
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeCCell", for: indexPath) as! HomeCCell
                                guard indexPath.row < items.count else {return cell}
                                let item = items[indexPath.row]
        if let m = item as? HomeStoreConfigModel{
            cell.img.sd_setImage(with: URL(string: m.backgroundImage), placeholderImage: nil, options: .lowPriority)
        }
                                if let m = item as? HomeStoreConfigModel{
                                                cell.img.sd_setImage(with: URL(string: m.backgroundImage), placeholderImage: nil, options: .lowPriority)
                                }
        if let m = item as? HomeStoreTopBannerModel{
            cell.img.sd_setImage(with: URL(string: m.backgroundImage), placeholderImage: nil, options: .lowPriority)
        }
        cell.img.cornerRadius = 10
        return cell
    }
                                if let m = item as? HomeStoreTopBannerModel{
                                                cell.img.sd_setImage(with: URL(string: m.backgroundImage), placeholderImage: nil, options: .lowPriority)
                                }
                                cell.img.cornerRadius = 10
                                return cell
                }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return items.count
                }
}
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift
@@ -11,68 +11,68 @@
import JQTools
class JoinMemberIntroduceVC: BaseVC {
    @IBOutlet weak var btn_join: QMUIButton!
    @IBOutlet weak var webView: WKWebView!
                @IBOutlet weak var btn_join: QMUIButton!
                @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "成为会员"
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "成为会员"
        Services.querySystemImg(type: .becomeVip).subscribe(onNext: {data in
            if let imgString = data.data{
                let html = "<img src='\(imgString)' width='\(JQ_ScreenW)' loading=eager/>"
                self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
            }
        }) { error in
                                Services.querySystemImg(type: .becomeVip).subscribe(onNext: {data in
                                                if let imgString = data.data{
                                                                let html = "<img src='\(imgString)' width='\(JQ_ScreenW)' loading=eager/>"
                                                                self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
                                                }
                                }) { error in
        }.disposed(by: disposeBag)
    }
                                }.disposed(by: disposeBag)
                }
    override func setUI() {
        btn_join.spacingBetweenImageAndTitle = 3
        btn_join.imagePosition = .left
    }
                override func setUI() {
                                btn_join.spacingBetweenImageAndTitle = 3
                                btn_join.imagePosition = .left
                }
    @IBAction func joinAction(_ sender: QMUIButton) {
                @IBAction func joinAction(_ sender: QMUIButton) {
        var price = 0.01
                                var price = 0.01
#if !DEBUG
        price = 199
                                price = 199
#endif
        PaymentView.show(enumType: .joinMember, money: (ali:price,wx:price,coin:nil,course:nil,integral:nil)) { type in
            Services.enrollMember(paytype: type).subscribe(onNext: {data in
                switch type {
                    case .aliPay:
                        if let orderString = data.data?.orderString{
                            YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: orderString)) {[weak self] result in
                                guard let weakSelf = self else { return }
                                switch result {
                                    case .success:
                                        let vc = PaymentResultVC(result: .success, objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil)
                                        weakSelf.push(vc: vc)
                                    case .cancel:
                                        let vc = PaymentResultVC(result: .fail("已取消支付", 0), objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil)
                                        weakSelf.push(vc: vc)
                                    case .failure(let error):
                                        if let er = error as? NetworkRequest.NetRequestError{
                                            switch er {
                                                case .Other(let code,let string):
                                                    let vc = PaymentResultVC(result: .fail(string,code), objType: .member)
                                                    weakSelf.push(vc: vc)
                                                default:
                                                    let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .member)
                                                    weakSelf.push(vc: vc)
                                            }
                                        }
                                PaymentView.show(enumType: .joinMember, money: (ali:price,wx:price,coin:nil,course:nil,integral:nil)) { type in
                                                Services.enrollMember(paytype: type).subscribe(onNext: {data in
                                                                switch type {
                                                                                case .aliPay:
                                                                                                if let orderString = data.data?.orderString{
                                                                                                                YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: orderString)) {[weak self] result in
                                                                                                                                guard let weakSelf = self else { return }
                                                                                                                                switch result {
                                                                                                                                                case .success:
                                                                                                                                                                let vc = PaymentResultVC(result: .success, objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil)
                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                case .cancel:
                                                                                                                                                                let vc = PaymentResultVC(result: .fail("已取消支付", 0), objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil)
                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                case .failure(let error):
                                                                                                                                                                if let er = error as? NetworkRequest.NetRequestError{
                                                                                                                                                                                switch er {
                                                                                                                                                                                                case .Other(let code,let string):
                                                                                                                                                                                                                let vc = PaymentResultVC(result: .fail(string,code), objType: .member)
                                                                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                                                                default:
                                                                                                                                                                                                                let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .member)
                                                                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                                                }
                                                                                                                                                                }
                                                                                                                                }
                                                                                                                }
                                                                                                }
                                                                                case .wechat:break
                                                                                default:break
                                                                }
                                                }).disposed(by: self.disposeBag)
                                }
                            }
                        }
                    case .wechat:break
                    default:break
                }
            }).disposed(by: self.disposeBag)
        }
    }
}
WanPai/Root/Home/VC/WorldCupListVC.swift
New file
@@ -0,0 +1,150 @@
//
//  WorldCupListVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
import JQTools
import QMUIKit
import RxRelay
import RxSwift
class WorldCupListViewModel:RefreshModel<WorldCupListModel>{
                var search = BehaviorRelay<String?>(value:nil)
                var gender = BehaviorRelay<Int?>(value:nil)
                var sort = BehaviorRelay<Int?>(value:nil)
                var storeId = BehaviorRelay<Int?>(value: nil)
                override func api() -> (Observable<BaseResponse<[WorldCupListModel]>>)? {
                                let deserModel = HomeStoreModel.deserialize(from: UserDefaults.standard.object(forKey: "CurrentStore") as? String)
                                return Services.worldCupList(id: deserModel!.storeId, content: search.value, gender: gender.value, sort: sort.value, storeId: storeId.value)
                }
}
class WorldCupListVC: BaseVC {
                private var tableview:BaseTableView!
                private var pointView:CourseSubTypeView?
                private var conditionView:CourseSubTypeView?
                private var hotView:CourseSubTypeView?
                private var viewModel = WorldCupListViewModel()
                private var headerView:CommonBannerView = {
                                var banner = CommonBannerView()
                                banner.backgroundColor = .white
                                banner.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.564)
                                return banner
                }()
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "社区世界杯"
                                viewModel.beginRefresh()
    }
                override func setUI() {
                                let bgImg = UIImageView(image: UIImage(named: "bg_long"))
                                bgImg.contentMode = .scaleAspectFill
                                view.addSubview(bgImg)
                                bgImg.snp.makeConstraints { make in
                                                make.top.equalTo(200)
                                                make.left.right.bottom.equalToSuperview()
                                }
                                tableview = BaseTableView(frame: .zero, style: .plain)
                                tableview.tableHeaderView = headerView
                                view.addSubview(tableview)
                                tableview.delegate = self
                                tableview.dataSource = self
                                if #available(iOS 15.0, *) {
                                                tableview.sectionHeaderTopPadding = 0
                                }
                                tableview.backgroundColor = .clear
                                tableview.register(UINib(nibName: "WorldCupTCell", bundle: nil), forCellReuseIdentifier: "_WorldCupTCell")
                                tableview.register(UINib(nibName: "WorldCupHeadView", bundle: nil), forHeaderFooterViewReuseIdentifier: "_headerView")
                                tableview.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                viewModel.configure(tableview)
                }
}
extension WorldCupListVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let vc = WorldCupContentApplyVC()
                                push(vc: vc)
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//                                return viewModel.dataSource.value.count
                                return 1
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_WorldCupTCell") as! WorldCupTCell
                                cell.backgroundColor = .clear
                                return cell
                }
                func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
                                let headView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_headerView") as! WorldCupHeadView
                                headView.delegate = self
                                return headView
                }
                func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
                                return 105
                }
}
extension WorldCupListVC:WorldCupHeadDelegate{
                func search(text: String) {
                }
                func atPoint(_ btn: QMUIButton) {
                                conditionView?.removeFromSuperview()
                                hotView?.removeFromSuperview()
                                btn.isSelected = true
                                pointView = CourseSubTypeView.show(inView: self.view, afterView: btn, items: [NormalSimpleModel(id: 0, name: "测试")]) { model in
                                } closeClouse: {
                                                btn.isSelected = false
                                }
                }
                func atCondition(_ btn: QMUIButton) {
                                pointView?.removeFromSuperview()
                                hotView?.removeFromSuperview()
                                btn.isSelected = true
                                var items = [NormalSimpleModel]()
                                items.append(NormalSimpleModel(id: 0, name: "全部"))
                                items.append(NormalSimpleModel(id: 1, name: "男"))
                                items.append(NormalSimpleModel(id: 2, name: "女"))
                                conditionView = CourseSubTypeView.show(inView: self.view, afterView: btn, items: items) { model in
                                                btn.setTitle(model.name, for: .normal)
                                } closeClouse: {
                                                btn.isSelected = false
                                }
                }
                func atHot(_ btn: QMUIButton) {
                                pointView?.removeFromSuperview()
                                conditionView?.removeFromSuperview()
                                btn.isSelected = !btn.isSelected
                                let sortType = btn.isSelected ? SortType.desc:SortType.asc
                                btn.setImage(sortType.img, for: .normal)
                }
}
WanPai/Root/Home/VC/WorldCupListVC.xib
New file
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WorldCupListVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sfF-Oz-h9P">
                    <rect key="frame" x="0.0" y="59" width="393" height="105"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hSD-2a-yWS">
                            <rect key="frame" x="14" y="15" width="326" height="38"/>
                            <subviews>
                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_search" translatesAutoresizingMaskIntoConstraints="NO" id="J6l-AT-tQO">
                                    <rect key="frame" x="4" y="10.666666666666671" width="17" height="17"/>
                                </imageView>
                                <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="输入赛事名称" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="c9g-cP-dFW" customClass="QMUITextField">
                                    <rect key="frame" x="25" y="0.0" width="291" height="38"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <textInputTraits key="textInputTraits" returnKeyType="search"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="color" keyPath="placeholderColor">
                                            <color key="value" red="0.7843137255" green="0.79215686269999996" blue="0.83921568629999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                </textField>
                            </subviews>
                            <color key="backgroundColor" red="0.96470588239999999" green="0.96470588239999999" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="38" id="4hc-7s-hLB"/>
                                <constraint firstAttribute="bottom" secondItem="c9g-cP-dFW" secondAttribute="bottom" id="HnE-hi-l8y"/>
                                <constraint firstItem="c9g-cP-dFW" firstAttribute="top" secondItem="hSD-2a-yWS" secondAttribute="top" id="Owk-5n-M1i"/>
                                <constraint firstAttribute="trailing" secondItem="c9g-cP-dFW" secondAttribute="trailing" constant="10" id="Ut2-Dt-LcB"/>
                                <constraint firstItem="J6l-AT-tQO" firstAttribute="centerY" secondItem="hSD-2a-yWS" secondAttribute="centerY" id="VLq-HI-ZUn"/>
                                <constraint firstItem="J6l-AT-tQO" firstAttribute="leading" secondItem="hSD-2a-yWS" secondAttribute="leading" constant="4" id="fDj-Ud-97S"/>
                                <constraint firstItem="c9g-cP-dFW" firstAttribute="leading" secondItem="J6l-AT-tQO" secondAttribute="trailing" constant="4" id="l1i-sJ-Ggh"/>
                            </constraints>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                    <real key="value" value="4.1600000000000001"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                        </view>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Eog-I3-3Qf">
                            <rect key="frame" x="340" y="15" width="53" height="38"/>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="搜索">
                                <color key="titleColor" name="FE6E0D"/>
                            </state>
                        </button>
                        <stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="34" translatesAutoresizingMaskIntoConstraints="NO" id="fVz-yT-yaM">
                            <rect key="frame" x="14" y="53" width="268" height="52"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Z7Q-0r-hlk" customClass="QMUIButton">
                                    <rect key="frame" x="0.0" y="0.0" width="79" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="举办城市" image="icon_down_arrow">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="selected" image="icon_down_arrow_s">
                                        <color key="titleColor" name="FE6E0D"/>
                                    </state>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8O9-Hj-qgP" customClass="QMUIButton">
                                    <rect key="frame" x="113" y="0.0" width="79" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="报名条件" image="icon_down_arrow">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="selected" image="icon_down_arrow_s">
                                        <color key="titleColor" name="FE6E0D"/>
                                    </state>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9cf-8N-H7O" customClass="QMUIButton">
                                    <rect key="frame" x="226" y="0.0" width="42" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="热度" image="icon_sort_normal">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="highlighted" image="icon_sort_normal"/>
                                </button>
                            </subviews>
                        </stackView>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="Eog-I3-3Qf" firstAttribute="bottom" secondItem="hSD-2a-yWS" secondAttribute="bottom" id="4VU-um-GMd"/>
                        <constraint firstAttribute="trailing" secondItem="Eog-I3-3Qf" secondAttribute="trailing" id="CKQ-ss-wf6"/>
                        <constraint firstAttribute="bottom" secondItem="fVz-yT-yaM" secondAttribute="bottom" id="JyY-zS-pwk"/>
                        <constraint firstItem="fVz-yT-yaM" firstAttribute="top" secondItem="hSD-2a-yWS" secondAttribute="bottom" id="SfR-zD-gnR"/>
                        <constraint firstAttribute="height" constant="105" id="Uls-pD-o8d"/>
                        <constraint firstItem="Eog-I3-3Qf" firstAttribute="top" secondItem="hSD-2a-yWS" secondAttribute="top" id="UqT-Cr-0hd"/>
                        <constraint firstAttribute="trailing" secondItem="hSD-2a-yWS" secondAttribute="trailing" constant="53" id="YAA-8p-MeB"/>
                        <constraint firstItem="Eog-I3-3Qf" firstAttribute="leading" secondItem="hSD-2a-yWS" secondAttribute="trailing" id="Zly-xe-KpI"/>
                        <constraint firstItem="fVz-yT-yaM" firstAttribute="leading" secondItem="sfF-Oz-h9P" secondAttribute="leading" constant="14" id="dJs-42-7Jq"/>
                        <constraint firstItem="hSD-2a-yWS" firstAttribute="top" secondItem="sfF-Oz-h9P" secondAttribute="top" constant="15" id="wVC-eP-Tat"/>
                        <constraint firstItem="hSD-2a-yWS" firstAttribute="leading" secondItem="sfF-Oz-h9P" secondAttribute="leading" constant="14" id="yf5-fm-joh"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
                            <size key="value" width="0.0" height="2"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
                            <color key="value" red="0.87450980389999999" green="0.87450980389999999" blue="0.87450980389999999" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
                            <real key="value" value="1"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="sfF-Oz-h9P" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="PQE-xC-ztr"/>
                <constraint firstItem="sfF-Oz-h9P" firstAttribute="trailing" secondItem="fnl-2z-Ty3" secondAttribute="trailing" id="gVk-X4-GWi"/>
                <constraint firstItem="sfF-Oz-h9P" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="vnA-5Y-0Gm"/>
            </constraints>
            <point key="canvasLocation" x="140" y="21"/>
        </view>
    </objects>
    <resources>
        <image name="icon_down_arrow" width="13" height="8"/>
        <image name="icon_down_arrow_s" width="13" height="8"/>
        <image name="icon_search" width="17" height="17"/>
        <image name="icon_sort_normal" width="9" height="12"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Home/View/WorldCupHeadView.swift
New file
@@ -0,0 +1,72 @@
//
//  WorldCupHeadView.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
import JQTools
import QMUIKit
protocol WorldCupHeadDelegate {
                func search(text:String)
                func atPoint(_ btn:QMUIButton)
                func atCondition(_ btn:QMUIButton)
                func atHot(_ btn:QMUIButton)
}
class WorldCupHeadView: UITableViewHeaderFooterView,JQNibView{
                @IBOutlet weak var tf_search: QMUITextField!
                @IBOutlet weak var btn_search: UIButton!
                @IBOutlet weak var btn_point: QMUIButton!
                @IBOutlet weak var btn_condition: QMUIButton!
                @IBOutlet weak var btn_hot: QMUIButton!
                var delegate:WorldCupHeadDelegate?
                override func awakeFromNib() {
                                super.awakeFromNib()
                                btn_point.spacingBetweenImageAndTitle = 5
                                btn_condition.spacingBetweenImageAndTitle = 5
                                btn_hot.spacingBetweenImageAndTitle = 5
                                btn_point.imagePosition = .right
                                btn_condition.imagePosition = .right
                                btn_hot.imagePosition = .right
                                tf_search.returnKeyType = .search
                                tf_search.delegate = self
                }
                @IBAction func atPointAction(_ sender: QMUIButton) {
                                btn_point.isSelected = true
                                btn_condition.isSelected = false
                                btn_hot.isSelected = false
                                delegate?.atPoint(sender)
                }
                @IBAction func atCoditionAction(_ sender: QMUIButton) {
                                btn_condition.isSelected = true
                                btn_point.isSelected = false
                                btn_hot.isSelected = false
                                delegate?.atCondition(sender)
                }
                @IBAction func atHotAction(_ sender: QMUIButton) {
                                btn_condition.isSelected = false
                                btn_point.isSelected = false
                                delegate?.atHot(sender)
                }
                @IBAction func searchAction(_ sender: QMUIButton) {
                                delegate?.search(text: tf_search.text!)
                }
}
extension WorldCupHeadView:QMUITextFieldDelegate{
                func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                textField.resignFirstResponder()
                                delegate?.search(text: textField.text!)
                                return true
                }
}
WanPai/Root/Home/View/WorldCupHeadView.xib
New file
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="WorldCupHeadView" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="393" height="118"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ek4-ol-Kwt">
                    <rect key="frame" x="0.0" y="0.0" width="393" height="105"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CXW-eJ-9qe">
                            <rect key="frame" x="14" y="15" width="326" height="38"/>
                            <subviews>
                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_search" translatesAutoresizingMaskIntoConstraints="NO" id="dJg-KL-qo2">
                                    <rect key="frame" x="4" y="10.666666666666668" width="17" height="17"/>
                                </imageView>
                                <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="搜索" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ZL5-mj-nIt" customClass="QMUITextField">
                                    <rect key="frame" x="25" y="0.0" width="291" height="38"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <textInputTraits key="textInputTraits" returnKeyType="search"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="color" keyPath="placeholderColor">
                                            <color key="value" red="0.7843137255" green="0.79215686269999996" blue="0.83921568629999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                </textField>
                            </subviews>
                            <color key="backgroundColor" red="0.96470588239999999" green="0.96470588239999999" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="38" id="AES-Ub-ySP"/>
                                <constraint firstItem="ZL5-mj-nIt" firstAttribute="top" secondItem="CXW-eJ-9qe" secondAttribute="top" id="JaC-ZI-4a8"/>
                                <constraint firstAttribute="bottom" secondItem="ZL5-mj-nIt" secondAttribute="bottom" id="V3x-6h-0iA"/>
                                <constraint firstAttribute="trailing" secondItem="ZL5-mj-nIt" secondAttribute="trailing" constant="10" id="dzm-lA-rZu"/>
                                <constraint firstItem="dJg-KL-qo2" firstAttribute="leading" secondItem="CXW-eJ-9qe" secondAttribute="leading" constant="4" id="hxb-EH-Sig"/>
                                <constraint firstItem="ZL5-mj-nIt" firstAttribute="leading" secondItem="dJg-KL-qo2" secondAttribute="trailing" constant="4" id="viY-qz-F47"/>
                                <constraint firstItem="dJg-KL-qo2" firstAttribute="centerY" secondItem="CXW-eJ-9qe" secondAttribute="centerY" id="yog-6x-AwH"/>
                            </constraints>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                    <real key="value" value="4.1600000000000001"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                        </view>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ae0-Ig-puo">
                            <rect key="frame" x="340" y="15" width="53" height="38"/>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="搜索">
                                <color key="titleColor" name="FE6E0D"/>
                            </state>
                            <connections>
                                <action selector="searchAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="VE9-mw-Tkg"/>
                            </connections>
                        </button>
                        <stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="34" translatesAutoresizingMaskIntoConstraints="NO" id="RAp-2w-eQZ">
                            <rect key="frame" x="14" y="53" width="268" height="52"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UqK-cy-hEv" customClass="QMUIButton">
                                    <rect key="frame" x="0.0" y="0.0" width="79" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="所在赛点" image="icon_down_arrow">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="selected" image="icon_down_arrow_s">
                                        <color key="titleColor" name="FE6E0D"/>
                                    </state>
                                    <connections>
                                        <action selector="atPointAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="KD0-WJ-wGM"/>
                                    </connections>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="g0f-NI-dTH" customClass="QMUIButton">
                                    <rect key="frame" x="113" y="0.0" width="79" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="报名条件" image="icon_down_arrow">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="selected" image="icon_down_arrow_s">
                                        <color key="titleColor" name="FE6E0D"/>
                                    </state>
                                    <connections>
                                        <action selector="atCoditionAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="nNg-7D-SU7"/>
                                    </connections>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fJe-vk-DMh" customClass="QMUIButton">
                                    <rect key="frame" x="226" y="0.0" width="42" height="52"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="热度" image="icon_sort_normal">
                                        <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    </state>
                                    <state key="highlighted" image="icon_sort_normal"/>
                                    <connections>
                                        <action selector="atHotAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="JE1-P3-UEA"/>
                                    </connections>
                                </button>
                            </subviews>
                        </stackView>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="RAp-2w-eQZ" firstAttribute="leading" secondItem="Ek4-ol-Kwt" secondAttribute="leading" constant="14" id="98L-lP-7L9"/>
                        <constraint firstAttribute="trailing" secondItem="CXW-eJ-9qe" secondAttribute="trailing" constant="53" id="GW1-lv-oN9"/>
                        <constraint firstItem="CXW-eJ-9qe" firstAttribute="leading" secondItem="Ek4-ol-Kwt" secondAttribute="leading" constant="14" id="RKt-uT-fh2"/>
                        <constraint firstItem="RAp-2w-eQZ" firstAttribute="top" secondItem="CXW-eJ-9qe" secondAttribute="bottom" id="XEQ-sf-I56"/>
                        <constraint firstAttribute="height" constant="105" id="Xj4-xu-u70"/>
                        <constraint firstItem="ae0-Ig-puo" firstAttribute="leading" secondItem="CXW-eJ-9qe" secondAttribute="trailing" id="aEz-jx-oTK"/>
                        <constraint firstItem="CXW-eJ-9qe" firstAttribute="top" secondItem="Ek4-ol-Kwt" secondAttribute="top" constant="15" id="eAf-pr-old"/>
                        <constraint firstAttribute="bottom" secondItem="RAp-2w-eQZ" secondAttribute="bottom" id="fdT-0M-4u5"/>
                        <constraint firstAttribute="trailing" secondItem="ae0-Ig-puo" secondAttribute="trailing" id="h4Z-5Y-Cpt"/>
                        <constraint firstItem="ae0-Ig-puo" firstAttribute="bottom" secondItem="CXW-eJ-9qe" secondAttribute="bottom" id="s4c-7m-Wpt"/>
                        <constraint firstItem="ae0-Ig-puo" firstAttribute="top" secondItem="CXW-eJ-9qe" secondAttribute="top" id="wBa-In-t7T"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
                            <size key="value" width="0.0" height="2"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
                            <color key="value" red="0.87450980389999999" green="0.87450980389999999" blue="0.87450980389999999" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
                            <real key="value" value="1"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
            </subviews>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="Ek4-ol-Kwt" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="9If-Sf-EKU"/>
                <constraint firstItem="Ek4-ol-Kwt" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="UVo-c1-zQd"/>
                <constraint firstAttribute="trailing" secondItem="Ek4-ol-Kwt" secondAttribute="trailing" id="pOT-gq-tRk"/>
            </constraints>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <connections>
                <outlet property="btn_condition" destination="g0f-NI-dTH" id="tV5-1H-D9h"/>
                <outlet property="btn_hot" destination="fJe-vk-DMh" id="Xtv-FB-qlb"/>
                <outlet property="btn_point" destination="UqK-cy-hEv" id="QRi-Xq-lWy"/>
                <outlet property="btn_search" destination="ae0-Ig-puo" id="g1g-Na-9EG"/>
                <outlet property="tf_search" destination="ZL5-mj-nIt" id="7eB-4q-NQf"/>
            </connections>
            <point key="canvasLocation" x="139.69465648854961" y="-238.02816901408451"/>
        </view>
    </objects>
    <resources>
        <image name="icon_down_arrow" width="13" height="8"/>
        <image name="icon_down_arrow_s" width="13" height="8"/>
        <image name="icon_search" width="17" height="17"/>
        <image name="icon_sort_normal" width="9" height="12"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Login/VC/LoginVC.swift
@@ -11,251 +11,255 @@
import JQTools
class LoginVC: BaseVC {
    @IBOutlet weak var btn_pwdLogin: UIButton!
    @IBOutlet weak var btn_smsCodeLogin: UIButton!
    @IBOutlet weak var tf_phone: QMUITextField!
    @IBOutlet weak var tf_verify: QMUITextField!
    @IBOutlet weak var btn_getCode: UIButton!
    @IBOutlet weak var btn_eye: UIButton!
    @IBOutlet weak var btn_wechat: QMUIButton!
    @IBOutlet weak var textView_treaty: UITextView!
    @IBOutlet weak var btn_login: UIButton!
    @IBOutlet weak var btn_register: UIButton!
    @IBOutlet weak var cons_registerCenterX: NSLayoutConstraint!
    @IBOutlet weak var cons_loginCenterX: NSLayoutConstraint!
    @IBOutlet weak var btn_reader: UIButton!
    @IBOutlet weak var cons_stackHei: NSLayoutConstraint!
    @IBOutlet weak var stack_handleView: UIStackView!
    @IBOutlet weak var view_threeParty: UIView!
    @IBOutlet weak var cons_loginWidth: NSLayoutConstraint!
    private let loginType = BehaviorRelay<LoginType>(value: .pwd)
                @IBOutlet weak var btn_pwdLogin: UIButton!
                @IBOutlet weak var btn_smsCodeLogin: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func setUI() {
        view_threeParty.isHidden = !WXApi.isWXAppInstalled()
        btn_wechat.imagePosition = .top
        btn_wechat.spacingBetweenImageAndTitle = 8
        textView_treaty.isEditable = false
        textView_treaty.linkTextAttributes = [.foregroundColor:UIColor(hexStr: "#3a9edc").withAlphaComponent(0.8)]
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = NSLineBreakMode.byCharWrapping
        paragraphStyle.lineSpacing = 5
        let content = "我已阅读并同意\n《隐私协议》\n《用户协议》\n《运动安全告知书》"
        let attribute = NSMutableAttributedString(string: content)
        attribute.addAttribute(.foregroundColor, value: UIColor.black.withAlphaComponent(0.6), range: NSRange(location: 0, length: content.count))
        attribute.addAttribute(.font, value: UIFont.systemFont(ofSize: 12, weight: .medium), range: NSRange(location: 0, length: content.count))
        attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://treaty")!], range: content.jq_subRange("《隐私协议》")!)
        attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《隐私协议》")!)
        attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《隐私协议》")!)
        attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://user")!], range: content.jq_subRange("《用户协议》")!)
        attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《用户协议》")!)
        attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《用户协议》")!)
                @IBOutlet weak var tf_phone: QMUITextField!
                @IBOutlet weak var tf_verify: QMUITextField!
                @IBOutlet weak var btn_getCode: UIButton!
                @IBOutlet weak var btn_eye: UIButton!
                @IBOutlet weak var btn_wechat: QMUIButton!
                @IBOutlet weak var textView_treaty: UITextView!
                @IBOutlet weak var btn_login: UIButton!
                @IBOutlet weak var btn_register: UIButton!
                @IBOutlet weak var cons_registerCenterX: NSLayoutConstraint!
                @IBOutlet weak var cons_loginCenterX: NSLayoutConstraint!
                @IBOutlet weak var btn_reader: UIButton!
                @IBOutlet weak var cons_stackHei: NSLayoutConstraint!
                @IBOutlet weak var stack_handleView: UIStackView!
                @IBOutlet weak var view_threeParty: UIView!
        attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://sportSafety")!], range: content.jq_subRange("《运动安全告知书》")!)
        attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《运动安全告知书》")!)
        attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《运动安全告知书》")!)
                @IBOutlet weak var cons_loginWidth: NSLayoutConstraint!
                private let loginType = BehaviorRelay<LoginType>(value: .pwd)
                override func viewDidLoad() {
                                super.viewDidLoad()
                }
                override func setUI() {
                                view_threeParty.isHidden = !WXApi.isWXAppInstalled()
                                btn_wechat.imagePosition = .top
                                btn_wechat.spacingBetweenImageAndTitle = 8
        attribute.addAttributes([.paragraphStyle:paragraphStyle], range: _NSRange(location: 0, length: content.count))
        self.textView_treaty.attributedText = attribute
        self.textView_treaty.delegate = self
                                textView_treaty.isEditable = false
                                textView_treaty.linkTextAttributes = [.foregroundColor:UIColor(hexStr: "#3a9edc").withAlphaComponent(0.8)]
                                let paragraphStyle = NSMutableParagraphStyle()
                                paragraphStyle.lineBreakMode = NSLineBreakMode.byCharWrapping
                                paragraphStyle.lineSpacing = 5
        btn_login.localGradientColor(cornerRadius: 20)
    }
    override func setRx() {
        loginType.subscribe(onNext: { [weak self] type in
            guard let weakSelf = self else {return}
            weakSelf.tf_verify.text = ""
            weakSelf.btn_getCode.isHidden = type == .pwd
            weakSelf.btn_eye.isHidden = type == .smsCode
            switch type {
            case .pwd:
                weakSelf.tf_verify.isSecureTextEntry = !weakSelf.btn_eye.isSelected
                weakSelf.tf_verify.keyboardType = .default
                weakSelf.tf_verify.maximumTextLength = 18
                weakSelf.tf_verify.placeholder = "请输入密码"
            case .smsCode:
                weakSelf.tf_verify.isSecureTextEntry = false
                weakSelf.tf_verify.keyboardType = .numberPad
                weakSelf.tf_verify.maximumTextLength = 6
                weakSelf.tf_verify.placeholder = "请输入验证码"
            }
        }).disposed(by: disposeBag)
    }
                                let content = "我已阅读并同意\n《隐私协议》\n《用户协议》\n《运动安全告知书》"
                                let attribute = NSMutableAttributedString(string: content)
                                attribute.addAttribute(.foregroundColor, value: UIColor.black.withAlphaComponent(0.6), range: NSRange(location: 0, length: content.count))
                                attribute.addAttribute(.font, value: UIFont.systemFont(ofSize: 12, weight: .medium), range: NSRange(location: 0, length: content.count))
                                attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://treaty")!], range: content.jq_subRange("《隐私协议》")!)
                                attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《隐私协议》")!)
                                attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《隐私协议》")!)
    @IBAction func exchangeLoginTypeAction(_ sender: UIButton) {
        btn_pwdLogin.isSelected = sender.tag == 10
        btn_smsCodeLogin.isSelected = sender.tag == 11
        let type:LoginType = sender.tag == 10 ? .pwd:.smsCode
        loginType.accept(type)
        cons_registerCenterX.constant = btn_pwdLogin.isSelected ? -82:0
        cons_loginCenterX.constant = btn_pwdLogin.isSelected ? 82:0
        cons_loginWidth.constant = btn_pwdLogin.isSelected ? 144:189
        let str = btn_pwdLogin.isSelected ? "登录":"注册/登录"
        self.cons_stackHei.constant = self.btn_pwdLogin.isSelected ? 25:0
                                attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://user")!], range: content.jq_subRange("《用户协议》")!)
                                attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《用户协议》")!)
                                attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《用户协议》")!)
        UIView.animate(withDuration: 0.4) {
            self.view.layoutIfNeeded()
            self.btn_login.setTitle(str, for: .normal)
            if self.btn_pwdLogin.isSelected{
                self.stack_handleView.alpha = 1
                self.btn_login.localGradientColor(cornerRadius: 20,bounds: CGRect(x: 0, y: 0, width: 144, height: 40))
            }else{
                self.stack_handleView.alpha = 0
                self.btn_login.localGradientColor(cornerRadius: 20,bounds: CGRect(x: 0, y: 0, width: 189, height: 40))
            }
        } completion: { _ in
            self.tf_verify.text = ""
            self.view.endEditing(false)
        }
    }
    @IBAction func eyeAction(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
        if loginType.value == .pwd{
            tf_verify.isSecureTextEntry = !sender.isSelected
        }
    }
    @IBAction func getCodeAction(_ sender: UIButton) {
        guard !tf_phone.text!.isEmpty else {alertError(msg: tf_phone.placeholder!);return}
        guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的手机号");return}
        Services.getSMSCode(phone: tf_phone.text!, type: .login).subscribe(onNext: {data in
            if data.code == 200{
                sender.openCountDown()
            }else{
                alertError(msg: data.msg)
            }
        }) { error in
            alertError(msg: error.localizedDescription)
        }.disposed(by: disposeBag)
    }
    @IBAction func loginAction(_ sender: UIButton) {
                                attribute.addAttributes([NSAttributedString.Key.link:URL(string: "tip://sportSafety")!], range: content.jq_subRange("《运动安全告知书》")!)
                                attribute.addAttribute(NSAttributedString.Key.underlineStyle, value: NSNumber(value:NSUnderlineStyle.single.rawValue), range: content.jq_subRange("《运动安全告知书》")!)
                                attribute.addAttribute(.underlineColor, value: UIColor(hexStr: "#3a9edc"), range: content.jq_subRange("《运动安全告知书》")!)
        let type = loginType.value
        guard !tf_phone.text!.isEmpty else {alertError(msg: tf_phone.placeholder!);return}
        guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的手机号");return}
        guard !tf_verify.text!.isEmpty else {alertError(msg: tf_verify.placeholder!);return}
        guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
        Services.login(phone: tf_phone.text!, verity: tf_verify.text!, type: type).subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            if let token = data.data{
                UserViewModel.saveToken(token)
                Services.userDetails().subscribe(onNext: {[weak self] data in
                    guard let weakSelf = self else { return }
                    if let m = data.data{
                        //需要修改密码
                        if m.needChange == 1{
                            let vc = LoginRegOrForgotVC(type: .updatePwd,force: weakSelf.tf_phone.text!)
                            self?.push(vc: vc)
                        }else{
                            m.save()
                            app.registerAndLoginSuccess()
                        }
                    }
                }) { error in
                                attribute.addAttributes([.paragraphStyle:paragraphStyle], range: _NSRange(location: 0, length: content.count))
                                self.textView_treaty.attributedText = attribute
                                self.textView_treaty.delegate = self
                }.disposed(by: weakSelf.disposeBag)
            }
        }) { error in
                                btn_login.localGradientColor(cornerRadius: 20)
                }
        }.disposed(by: disposeBag)
    }
    @IBAction func updatePwdAction(_ sender: UIButton) {
        let vc = LoginRegOrForgotVC(type: .updatePwd)
        push(vc: vc)
    }
    @IBAction func forgotPwdAction(_ sender: UIButton) {
        let vc = LoginRegOrForgotVC(type: .forgotPwd)
        push(vc: vc)
    }
    @IBAction func registerAction(_ sender: UIButton) {
        guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
        let vc = LoginRegOrForgotVC(type: .register)
        push(vc: vc)
    }
    @IBAction func readAgreentAction(_ sender: UIButton) {
                override func setRx() {
                                loginType.subscribe(onNext: { [weak self] type in
                                                guard let weakSelf = self else {return}
                                                weakSelf.tf_verify.text = ""
                                                weakSelf.btn_getCode.isHidden = type == .pwd
                                                weakSelf.btn_eye.isHidden = type == .smsCode
                                                switch type {
                                                                case .pwd:
                                                                                weakSelf.tf_verify.isSecureTextEntry = !weakSelf.btn_eye.isSelected
                                                                                weakSelf.tf_verify.keyboardType = .default
                                                                                weakSelf.tf_verify.maximumTextLength = 18
                                                                                weakSelf.tf_verify.placeholder = "请输入密码"
                                                                case .smsCode:
                                                                                weakSelf.tf_verify.isSecureTextEntry = false
                                                                                weakSelf.tf_verify.keyboardType = .numberPad
                                                                                weakSelf.tf_verify.maximumTextLength = 6
                                                                                weakSelf.tf_verify.placeholder = "请输入验证码"
                                                }
        var temp = [String]()
                                }).disposed(by: disposeBag)
        let v1 = UserDefaults.standard.value(forKey: "agreent_1")
        let v2 = UserDefaults.standard.value(forKey: "agreent_2")
        let v3 = UserDefaults.standard.value(forKey: "agreent_3")
                }
        if v1 == nil{temp.append("《隐私协议》")}
        if v2 == nil{temp.append("《用户协议》")}
        if v3 == nil{temp.append("《运动营告知书》")}
                @IBAction func exchangeLoginTypeAction(_ sender: UIButton) {
                                btn_pwdLogin.isSelected = sender.tag == 10
                                btn_smsCodeLogin.isSelected = sender.tag == 11
                                let type:LoginType = sender.tag == 10 ? .pwd:.smsCode
                                loginType.accept(type)
        if temp.count > 0{
            alert(msg: String(format: "请阅读并同意 %@", temp.joined(separator: ",")));return
        }
                                cons_registerCenterX.constant = btn_pwdLogin.isSelected ? -82:0
                                cons_loginCenterX.constant = btn_pwdLogin.isSelected ? 82:0
                                cons_loginWidth.constant = btn_pwdLogin.isSelected ? 144:189
        sender.isSelected = !sender.isSelected
    }
    @IBAction func wechatLoginAcion(_ sender: QMUIButton) {
        guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
        showHUD()
        WeChatTools.sendAuthRequest()
    }
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .default
    }
                                let str = btn_pwdLogin.isSelected ? "登录":"注册/登录"
    override var shouldAutorotate: Bool{
        return false
    }
                                self.cons_stackHei.constant = self.btn_pwdLogin.isSelected ? 25:0
                                UIView.animate(withDuration: 0.4) {
                                                self.view.layoutIfNeeded()
                                                self.btn_login.setTitle(str, for: .normal)
                                                if self.btn_pwdLogin.isSelected{
                                                                self.stack_handleView.alpha = 1
                                                                self.btn_login.localGradientColor(cornerRadius: 20,bounds: CGRect(x: 0, y: 0, width: 144, height: 40))
                                                }else{
                                                                self.stack_handleView.alpha = 0
                                                                self.btn_login.localGradientColor(cornerRadius: 20,bounds: CGRect(x: 0, y: 0, width: 189, height: 40))
                                                }
                                } completion: { _ in
                                                self.tf_verify.text = ""
                                                self.view.endEditing(false)
                                }
                }
                @IBAction func eyeAction(_ sender: UIButton) {
                                sender.isSelected = !sender.isSelected
                                if loginType.value == .pwd{
                                                tf_verify.isSecureTextEntry = !sender.isSelected
                                }
                }
                @IBAction func getCodeAction(_ sender: UIButton) {
                                guard !tf_phone.text!.isEmpty else {alertError(msg: tf_phone.placeholder!);return}
                                guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的手机号");return}
                                Services.getSMSCode(phone: tf_phone.text!, type: .login).subscribe(onNext: {data in
                                                if data.code == 200{
                                                                sender.openCountDown()
                                                }else{
                                                                alertError(msg: data.msg)
                                                }
                                }) { error in
                                                alertError(msg: error.localizedDescription)
                                }.disposed(by: disposeBag)
                }
                @IBAction func loginAction(_ sender: UIButton) {
                                let type = loginType.value
                                guard !tf_phone.text!.isEmpty else {alertError(msg: tf_phone.placeholder!);return}
                                guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的手机号");return}
                                guard !tf_verify.text!.isEmpty else {alertError(msg: tf_verify.placeholder!);return}
                                #if !DEBUG
                                guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
                                #endif
                                Services.login(phone: tf_phone.text!, verity: tf_verify.text!, type: type).subscribe(onNext: {[weak self] data in
                                                guard let weakSelf = self else { return }
                                                if let token = data.data{
                                                                UserViewModel.saveToken(token)
                                                                Services.userDetails().subscribe(onNext: {[weak self] data in
                                                                                guard let weakSelf = self else { return }
                                                                                if let m = data.data{
                                                                                                //需要修改密码
                                                                                                if m.needChange == 1{
                                                                                                                let vc = LoginRegOrForgotVC(type: .updatePwd,force: weakSelf.tf_phone.text!)
                                                                                                                self?.push(vc: vc)
                                                                                                }else{
                                                                                                                m.save()
                                                                                                                app.registerAndLoginSuccess()
                                                                                                }
                                                                                }
                                                                }) { error in
                                                                }.disposed(by: weakSelf.disposeBag)
                                                }
                                }) { error in
                                }.disposed(by: disposeBag)
                }
                @IBAction func updatePwdAction(_ sender: UIButton) {
                                let vc = LoginRegOrForgotVC(type: .updatePwd)
                                push(vc: vc)
                }
                @IBAction func forgotPwdAction(_ sender: UIButton) {
                                let vc = LoginRegOrForgotVC(type: .forgotPwd)
                                push(vc: vc)
                }
                @IBAction func registerAction(_ sender: UIButton) {
                                guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
                                let vc = LoginRegOrForgotVC(type: .register)
                                push(vc: vc)
                }
                @IBAction func readAgreentAction(_ sender: UIButton) {
                                var temp = [String]()
                                let v1 = UserDefaults.standard.value(forKey: "agreent_1")
                                let v2 = UserDefaults.standard.value(forKey: "agreent_2")
                                let v3 = UserDefaults.standard.value(forKey: "agreent_3")
                                if v1 == nil{temp.append("《隐私协议》")}
                                if v2 == nil{temp.append("《用户协议》")}
                                if v3 == nil{temp.append("《运动营告知书》")}
                                if temp.count > 0{
                                                alert(msg: String(format: "请阅读并同意 %@", temp.joined(separator: ",")));return
                                }
                                sender.isSelected = !sender.isSelected
                }
                @IBAction func wechatLoginAcion(_ sender: QMUIButton) {
                                guard btn_reader.isSelected else {alert(msg: "请阅读并同意《隐私协议》《用户协议》《运动安全告知书》");return}
                                showHUD()
                                WeChatTools.sendAuthRequest()
                }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .default
                }
                override var shouldAutorotate: Bool{
                                return false
                }
}
extension LoginVC:UITextViewDelegate{
    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
                func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        var str:String = ""
                                var str:String = ""
        if #available(iOS 16.0, *) {
            str = URL.host(percentEncoded: true)!
        } else {
            str = URL.host!
        }
                                if #available(iOS 16.0, *) {
                                                str = URL.host(percentEncoded: true)!
                                } else {
                                                str = URL.host!
                                }
        switch str {
            case "treaty":
                push(vc: CommonWebVC(type: .privacy))
            case "user":
                push(vc: CommonWebVC(type: .user))
            case "sportSafety":
                push(vc: CommonWebVC(type: .safe))
            default:break
        }
        return true
    }
                                switch str {
                                                case "treaty":
                                                                push(vc: CommonWebVC(type: .privacy))
                                                case "user":
                                                                push(vc: CommonWebVC(type: .user))
                                                case "sportSafety":
                                                                push(vc: CommonWebVC(type: .safe))
                                                default:break
                                }
                                return true
                }
}
WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift
@@ -9,58 +9,58 @@
import JQTools
class StudentInfo_2_TCell: UITableViewCell {
    @IBOutlet weak var img_radio: UIImageView!
    @IBOutlet weak var btn_delete: UIButton!
    @IBOutlet weak var btn_edit: UIButton!
    @IBOutlet weak var label_name: UILabel!
    @IBOutlet weak var label_idCard: UILabel!
    @IBOutlet weak var label_age: UILabel!
    @IBOutlet weak var label_phone: UILabel!
    @IBOutlet weak var view_container: UIView!
    @IBOutlet weak var btn_verifiy: UIButton!
    var indexPath:IndexPath?
                @IBOutlet weak var img_radio: UIImageView!
                @IBOutlet weak var btn_delete: UIButton!
                @IBOutlet weak var btn_edit: UIButton!
    var delClouse:((IndexPath)->Void)?
//    var editClouse:((IndexPath)->Void)?
                @IBOutlet weak var label_name: UILabel!
                @IBOutlet weak var label_idCard: UILabel!
                @IBOutlet weak var label_age: UILabel!
                @IBOutlet weak var label_phone: UILabel!
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var btn_verifiy: UIButton!
    var activityDetailPartModel:ActivityDetailPartModel!{
        didSet{
            label_name.text = activityDetailPartModel.name
            label_idCard.text = activityDetailPartModel.idcard
            label_age.text = "\(activityDetailPartModel.age)岁"
            label_phone.text = activityDetailPartModel.phone
        }
    }
    var isChoose:Bool!{
        didSet{
            img_radio.isHidden = !isChoose
            btn_delete.isHidden = isChoose
            btn_edit.isHidden = isChoose
        }
    }
                var indexPath:IndexPath?
    override func awakeFromNib() {
        super.awakeFromNib()
        selectionStyle = .none
    }
    @IBAction func editAction(_ sender: UIButton) {
        StudentUpdateInfoView.show(activityDetailPartModel)
    }
                var delClouse:((IndexPath)->Void)?
                //    var editClouse:((IndexPath)->Void)?
                var activityDetailPartModel:ActivityDetailPartModel!{
                                didSet{
                                                label_name.text = activityDetailPartModel.name
                                                label_idCard.text = activityDetailPartModel.idcard
                                                label_age.text = "\(activityDetailPartModel.age)岁"
                                                label_phone.text = activityDetailPartModel.phone
                                }
                }
                var isChoose:Bool!{
                                didSet{
                                                img_radio.isHidden = !isChoose
                                                btn_delete.isHidden = isChoose
                                                btn_edit.isHidden = isChoose
                                }
                }
                override func awakeFromNib() {
                                super.awakeFromNib()
                                selectionStyle = .none
                }
                @IBAction func editAction(_ sender: UIButton) {
                                StudentUpdateInfoView.show(activityDetailPartModel)
                }
    @IBAction func delAction(_ sender: UIButton) {
        if let index = indexPath{
            delClouse?(index)
        }
    }
                @IBAction func delAction(_ sender: UIButton) {
                                if let index = indexPath{
                                                delClouse?(index)
                                }
                }
    @IBAction func verifyAction(_ sender: UIButton) {
        let vc = AddStudentVC(activityDetailPartModel: activityDetailPartModel)
        JQ_currentViewController().jq_push(vc: vc)
    }
                @IBAction func verifyAction(_ sender: UIButton) {
                                let vc = AddStudentVC(activityDetailPartModel: activityDetailPartModel)
                                JQ_currentViewController().jq_push(vc: vc)
                }
}
WanPai/Root/Other/VC/ProfileVC.swift
@@ -10,142 +10,142 @@
import JQTools
class ProfileVC: BaseVC {
    @IBOutlet weak var btn_userProfile: UIButton!
    @IBOutlet weak var tf_username: UITextField!
    @IBOutlet weak var label_contact: UILabel!
    @IBOutlet weak var tf_gender: UITextField!
    @IBOutlet weak var tf_birthday: UITextField!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_vipDutime: UILabel!
    @IBOutlet weak var view_vipExpired: UIView!
    private var profileImg:UIImage?
                @IBOutlet weak var btn_userProfile: UIButton!
                @IBOutlet weak var tf_username: UITextField!
                @IBOutlet weak var label_contact: UILabel!
                @IBOutlet weak var tf_gender: UITextField!
                @IBOutlet weak var tf_birthday: UITextField!
                @IBOutlet weak var label_address: UILabel!
                @IBOutlet weak var label_vipDutime: UILabel!
                @IBOutlet weak var view_vipExpired: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
                private var profileImg:UIImage?
        title = "个人信息"
                override func viewDidLoad() {
                                super.viewDidLoad()
        tf_gender.delegate = self
        tf_birthday.delegate = self
                                title = "个人信息"
        Services.userDetails().subscribe(onNext: {[weak self] data in
            if let model = data.data{
                self?.tf_username.text = model.userName
                self?.label_contact.text = model.userPhone
                self?.tf_gender.text = model.sex
                self?.tf_birthday.text = model.birthday
                self?.label_address.text = model.address
                self?.label_vipDutime.text = model.memberLifespan
                self?.btn_userProfile.sd_setImage(with: URL(string: model.userImage), for: .normal,placeholderImage: UIImage(named: "btn_userProfile"))
                self?.view_vipExpired.isHidden = model.isVip == 0
            }
                                tf_gender.delegate = self
                                tf_birthday.delegate = self
        }).disposed(by: disposeBag)
    }
                                Services.userDetails().subscribe(onNext: {[weak self] data in
                                                if let model = data.data{
                                                                self?.tf_username.text = model.userName
                                                                self?.label_contact.text = model.userPhone
                                                                self?.tf_gender.text = model.sex
                                                                self?.tf_birthday.text = model.birthday
                                                                self?.label_address.text = model.address
                                                                self?.label_vipDutime.text = model.memberLifespan
                                                                self?.btn_userProfile.sd_setImage(with: URL(string: model.userImage), for: .normal,placeholderImage: UIImage(named: "btn_userProfile"))
                                                                self?.view_vipExpired.isHidden = model.isVip == 0
                                                }
    override func setRx() {
        tf_username.rx.controlEvent(.editingDidEnd).subscribe(onNext: {[weak self] () in
            guard let weakSelf = self else { return }
            if weakSelf.tf_username.isEmpty{
                alertError(msg: "请输入用户名称");return
            }
                                }).disposed(by: disposeBag)
                }
            Services.updateInfo(birthday: nil, gender: nil, name: weakSelf.tf_username.text).subscribe(onNext: {[weak self] data in
                self?.updateUserInfo()
            }).disposed(by: weakSelf.disposeBag)
        }).disposed(by: disposeBag)
    }
                override func setRx() {
                                tf_username.rx.controlEvent(.editingDidEnd).subscribe(onNext: {[weak self] () in
                                                guard let weakSelf = self else { return }
                                                if weakSelf.tf_username.isEmpty{
                                                                alertError(msg: "请输入用户名称");return
                                                }
    private func updateUserInfo(){
        Services.userDetails().subscribe(onNext: {data in
            if let m = data.data{m.save()}
            alertSuccess(msg: "修改成功")
            NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
        }) { error in
                                                Services.updateInfo(birthday: nil, gender: nil, name: weakSelf.tf_username.text).subscribe(onNext: {[weak self] data in
                                                                self?.updateUserInfo()
                                                }).disposed(by: weakSelf.disposeBag)
                                }).disposed(by: disposeBag)
                }
        }.disposed(by: disposeBag)
    }
                private func updateUserInfo(){
                                Services.userDetails().subscribe(onNext: {data in
                                                if let m = data.data{m.save()}
                                                alertSuccess(msg: "修改成功")
                                                NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
                                }) { error in
    @IBAction func logoutAction(_ sender: UIButton) {
        CommonAlertView.show(title: "提示", content: "确认退出当前账号?",cancelStr: "关闭",completeStr: nil,isSingle: false) { status in
            if status{
                UserViewModel.clearToken()
                app.needLogin()
            }
        }
    }
                                }.disposed(by: disposeBag)
                }
    @IBAction func logOffAction(_ sender: Any) {
        let vc = LogOffVC()
        push(vc: vc)
    }
                @IBAction func logoutAction(_ sender: UIButton) {
                                CommonAlertView.show(title: "提示", content: "确认退出当前账号?",cancelStr: "关闭",completeStr: nil,isSingle: false) { status in
                                                if status{
                                                                UserViewModel.clearToken()
                                                                app.needLogin()
                                                }
                                }
                }
    @IBAction func updateProfileAction(_ sender: UIButton) {
        JQ_ImagePickerTool.getSharedInstance().singleImage({ image in
            self.profileImg = image
            self.btn_userProfile.setImage(image, for: .normal)
            image.uploadImgToService().subscribe { text in
                Services.updateUserProfile(text).subscribe(onNext: {[weak self] _ in
                    guard let weakSelf = self else { return }
                    alertSuccess(msg: "修改成功")
                    self?.btn_userProfile.sd_setImage(with: URL(string: text), for: .normal,placeholderImage: UIImage(named: "btn_userProfile"))
                    Services.userDetails().subscribe(onNext: {data in
                        if let m = data.data{m.save()}
                        alertSuccess(msg: "修改成功")
                        NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
                    }) { error in
                @IBAction func logOffAction(_ sender: Any) {
                                let vc = LogOffVC()
                                push(vc: vc)
                }
                    }.disposed(by: weakSelf.disposeBag)
                }) { error in
                    alertError(msg: error.localizedDescription)
                }.disposed(by: self.disposeBag)
            } onError: { error in
                alertError(msg: error.localizedDescription)
            }.disposed(by: self.disposeBag)
        }, clipSize: CGSize(width: JQ_ScreenW, height: JQ_ScreenW))
    }
    @IBAction func dismissAccountAction(_ sender: UIButton) {
                @IBAction func updateProfileAction(_ sender: UIButton) {
                                JQ_ImagePickerTool.getSharedInstance().singleImage({ image in
                                                self.profileImg = image
                                                self.btn_userProfile.setImage(image, for: .normal)
                                                image.uploadImgToService().subscribe { text in
                                                                Services.updateUserProfile(text).subscribe(onNext: {[weak self] _ in
                                                                                guard let weakSelf = self else { return }
                                                                                alertSuccess(msg: "修改成功")
                                                                                self?.btn_userProfile.sd_setImage(with: URL(string: text), for: .normal,placeholderImage: UIImage(named: "btn_userProfile"))
                                                                                Services.userDetails().subscribe(onNext: {data in
                                                                                                if let m = data.data{m.save()}
                                                                                                alertSuccess(msg: "修改成功")
                                                                                                NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
                                                                                }) { error in
    }
                                                                                }.disposed(by: weakSelf.disposeBag)
                                                                }) { error in
                                                                                alertError(msg: error.localizedDescription)
                                                                }.disposed(by: self.disposeBag)
                                                } onError: { error in
                                                                alertError(msg: error.localizedDescription)
                                                }.disposed(by: self.disposeBag)
                                }, clipSize: CGSize(width: JQ_ScreenW, height: JQ_ScreenW))
                }
                @IBAction func dismissAccountAction(_ sender: UIButton) {
                }
}
extension ProfileVC:UITextFieldDelegate{
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        view.endEditing(true)
        if textField == tf_gender{
            let items = ["男","女"]
            CommonAlertSheetView.show(items: items) {[weak self] index in
                guard let weakSelf = self else { return }
                guard textField.text != items[index] else {return}
                textField.text = items[index]
                var gender:GenderType!
                func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
                                view.endEditing(true)
                                if textField == tf_gender{
                                                let items = ["男","女"]
                                                CommonAlertSheetView.show(items: items) {[weak self] index in
                                                                guard let weakSelf = self else { return }
                                                                guard textField.text != items[index] else {return}
                                                                textField.text = items[index]
                                                                var gender:GenderType!
                if index == 0{
                    gender = .man
                }else{
                    gender = .woman
                                                                if index == 0{
                                                                                gender = .man
                                                                }else{
                                                                                gender = .woman
                                                                }
                                                                Services.updateInfo(birthday: nil, gender: gender.rawValue, name: nil).subscribe(onNext: {[weak self] data in
                                                                                self?.updateUserInfo()
                                                                }).disposed(by: weakSelf.disposeBag)
                                                }
                                }
                                if textField == tf_birthday{
                                                CommonDatePickerView.show(before: 60, after: 0, type: .YMD) {[weak self] year, month, day, _, _ in
                                                                guard let weakSelf = self else { return }
                                                                let date = String(format: "%ld-%02ld-%02ld", year!,month!,day!)
                                                                guard textField.text != date else {return}
                                                                textField.text = date
                                                                Services.updateInfo(birthday: textField.text, gender: nil, name: nil).subscribe(onNext: {[weak self] data in
                                                                                self?.updateUserInfo()
                                                                }).disposed(by: weakSelf.disposeBag)
                                                }
                                }
                                return false
                }
                Services.updateInfo(birthday: nil, gender: gender.rawValue, name: nil).subscribe(onNext: {[weak self] data in
                    self?.updateUserInfo()
                }).disposed(by: weakSelf.disposeBag)
            }
        }
        if textField == tf_birthday{
            CommonDatePickerView.show(before: 60, after: 0, type: .YMD) {[weak self] year, month, day, _, _ in
                guard let weakSelf = self else { return }
                let date = String(format: "%ld-%02ld-%02ld", year!,month!,day!)
                guard textField.text != date else {return}
                textField.text = date
                Services.updateInfo(birthday: textField.text, gender: nil, name: nil).subscribe(onNext: {[weak self] data in
                    self?.updateUserInfo()
                }).disposed(by: weakSelf.disposeBag)
            }
        }
        return false
    }
}
WanPai/Root/Search/CCell/SearchBannerCCell.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -11,7 +11,7 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="SearchBannerCCell" customModule="WanPai" customModuleProvider="target">
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="_SearchBannerCCell" id="gTV-IL-0wX" customClass="SearchBannerCCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="382" height="187"/>
            <autoresizingMask key="autoresizingMask"/>
            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
WanPai/Root/Search/TCell/MyQRCodeTCell.swift
New file
@@ -0,0 +1,21 @@
//
//  MyQRCodeTCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
class MyQRCodeTCell: UITableViewCell {
                @IBOutlet weak var view_container: UIView!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
                                view_container.borderColor = UIColor(hexString: "#FD8602")
                                view_container.borderWidth = 1
                                view_container.cornerRadius = 4
                                selectionStyle = .none
    }
}
WanPai/Root/Search/TCell/MyQRCodeTCell.xib
New file
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MyQRCodeTCell" rowHeight="207" id="KGk-i7-Jjw" customClass="MyQRCodeTCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="462" height="207"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
                <rect key="frame" x="0.0" y="0.0" width="462" height="207"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OzX-LD-ebb">
                        <rect key="frame" x="14" y="7" width="434" height="193"/>
                        <subviews>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="姓名:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DWx-WW-QMK">
                                <rect key="frame" x="8" y="88" width="36" height="17"/>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Hlr-vD-idp">
                                <rect key="frame" x="44" y="88" width="13.333333333333336" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KwF-AF-WE6">
                                <rect key="frame" x="105.33333333333333" y="88" width="13.333333333333329" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="hOG-rl-POS">
                                <rect key="frame" x="357" y="66.666666666666671" width="60" height="60"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="60" id="MdW-PM-sUS"/>
                                    <constraint firstAttribute="width" constant="60" id="PTp-ML-UZf"/>
                                </constraints>
                            </imageView>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="年龄:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZFl-29-gbc">
                                <rect key="frame" x="69.333333333333329" y="88" width="36" height="17"/>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="点击查看二维码" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Kr-Zx-4BQ">
                                <rect key="frame" x="251" y="88" width="100" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <color key="textColor" red="0.30980392156862746" green="0.30588235294117649" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                        </subviews>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstItem="KwF-AF-WE6" firstAttribute="leading" secondItem="ZFl-29-gbc" secondAttribute="trailing" id="7aV-MS-9Iw"/>
                            <constraint firstItem="DWx-WW-QMK" firstAttribute="leading" secondItem="OzX-LD-ebb" secondAttribute="leading" constant="8" id="HC2-wx-Td9"/>
                            <constraint firstItem="Hlr-vD-idp" firstAttribute="leading" secondItem="DWx-WW-QMK" secondAttribute="trailing" id="Laa-j8-s7g"/>
                            <constraint firstItem="hOG-rl-POS" firstAttribute="leading" secondItem="4Kr-Zx-4BQ" secondAttribute="trailing" constant="6" id="TBX-Ot-GVW"/>
                            <constraint firstItem="DWx-WW-QMK" firstAttribute="centerY" secondItem="OzX-LD-ebb" secondAttribute="centerY" id="TF3-1A-eXd"/>
                            <constraint firstItem="ZFl-29-gbc" firstAttribute="leading" secondItem="Hlr-vD-idp" secondAttribute="trailing" constant="12" id="TNA-r7-InE"/>
                            <constraint firstItem="Hlr-vD-idp" firstAttribute="centerY" secondItem="DWx-WW-QMK" secondAttribute="centerY" id="bbG-vu-r9O"/>
                            <constraint firstItem="hOG-rl-POS" firstAttribute="centerY" secondItem="DWx-WW-QMK" secondAttribute="centerY" id="jaS-7D-1N9"/>
                            <constraint firstItem="4Kr-Zx-4BQ" firstAttribute="centerY" secondItem="DWx-WW-QMK" secondAttribute="centerY" id="uGo-RE-QzM"/>
                            <constraint firstItem="ZFl-29-gbc" firstAttribute="centerY" secondItem="DWx-WW-QMK" secondAttribute="centerY" id="vH0-Ra-M3e"/>
                            <constraint firstItem="KwF-AF-WE6" firstAttribute="centerY" secondItem="ZFl-29-gbc" secondAttribute="centerY" id="vpB-YO-2zI"/>
                            <constraint firstAttribute="trailing" secondItem="hOG-rl-POS" secondAttribute="trailing" constant="17" id="wan-ln-9Vq"/>
                        </constraints>
                    </view>
                </subviews>
                <constraints>
                    <constraint firstAttribute="trailing" secondItem="OzX-LD-ebb" secondAttribute="trailing" constant="14" id="KzL-qb-i20"/>
                    <constraint firstItem="OzX-LD-ebb" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="7" id="XjE-QD-6BJ"/>
                    <constraint firstAttribute="bottom" secondItem="OzX-LD-ebb" secondAttribute="bottom" constant="7" id="elT-Vz-NzY"/>
                    <constraint firstItem="OzX-LD-ebb" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="mPB-aB-eKF"/>
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="view_container" destination="OzX-LD-ebb" id="7ap-FZ-Wsy"/>
            </connections>
            <point key="canvasLocation" x="247.32824427480915" y="77.816901408450704"/>
        </tableViewCell>
    </objects>
    <resources>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/TCell/StudentInfo_4_TCell.swift
New file
@@ -0,0 +1,16 @@
//
//  StudentInfo_4_TCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
class StudentInfo_4_TCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}
WanPai/Root/Search/TCell/StudentInfo_4_TCell.xib
New file
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_StudentInfo_4_TCell" rowHeight="103" id="KGk-i7-Jjw" customClass="StudentInfo_4_TCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="403" height="103"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
                <rect key="frame" x="0.0" y="0.0" width="403" height="103"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lrQ-mr-sWP">
                        <rect key="frame" x="14" y="7" width="375" height="76"/>
                        <subviews>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="姓名:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eWZ-Em-PQG">
                                <rect key="frame" x="10" y="13" width="36" height="20"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="20" id="zFd-cz-VQz"/>
                                </constraints>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h4n-nl-K9g">
                                <rect key="frame" x="46" y="14.666666666666668" width="13.333333333333336" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <nil key="textColor"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="身份证号:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Nm2-xJ-jxS">
                                <rect key="frame" x="114" y="13" width="72" height="20"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="20" id="B82-1y-Fbe"/>
                                    <constraint firstAttribute="width" constant="72" id="o3i-lB-8Jp"/>
                                </constraints>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="tqb-xC-9qk">
                                <rect key="frame" x="186" y="14.666666666666668" width="13.333333333333343" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <nil key="textColor"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="年龄:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eaR-JM-XUJ">
                                <rect key="frame" x="10" y="44" width="36" height="20"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="20" id="Y2c-YW-6sh"/>
                                </constraints>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rtg-7l-b7G">
                                <rect key="frame" x="46" y="45.666666666666664" width="13.333333333333336" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <nil key="textColor"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系电话:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HAc-KK-Chh">
                                <rect key="frame" x="114" y="44" width="64.666666666666686" height="20"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="20" id="iiL-jE-dh8"/>
                                </constraints>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="z6w-gZ-omO">
                                <rect key="frame" x="178.66666666666666" y="45.666666666666664" width="13.333333333333343" height="17"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <nil key="textColor"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="DCI-Sz-1AX">
                                <rect key="frame" x="337" y="33" width="30" height="30"/>
                                <color key="backgroundColor" systemColor="systemGray5Color"/>
                                <constraints>
                                    <constraint firstAttribute="width" constant="30" id="aI6-s0-d6m"/>
                                    <constraint firstAttribute="height" constant="30" id="f0E-c6-1a5"/>
                                </constraints>
                            </imageView>
                        </subviews>
                        <viewLayoutGuide key="safeArea" id="bhV-d6-1Sg"/>
                        <color key="backgroundColor" red="1" green="0.90588235289999997" blue="0.80000000000000004" alpha="0.080000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="Nm2-xJ-jxS" firstAttribute="leading" secondItem="lrQ-mr-sWP" secondAttribute="leading" constant="114" id="4dS-HB-dTR"/>
                            <constraint firstItem="eaR-JM-XUJ" firstAttribute="leading" secondItem="lrQ-mr-sWP" secondAttribute="leading" constant="10" id="88R-n9-FZs"/>
                            <constraint firstAttribute="trailing" secondItem="DCI-Sz-1AX" secondAttribute="trailing" constant="8" id="9Eh-QF-rOj"/>
                            <constraint firstAttribute="height" constant="76" id="9nc-TG-xhN"/>
                            <constraint firstItem="tqb-xC-9qk" firstAttribute="centerY" secondItem="Nm2-xJ-jxS" secondAttribute="centerY" id="Ld7-vd-fEr"/>
                            <constraint firstItem="eaR-JM-XUJ" firstAttribute="top" secondItem="eWZ-Em-PQG" secondAttribute="bottom" constant="11" id="Ry0-a6-onh"/>
                            <constraint firstItem="HAc-KK-Chh" firstAttribute="centerY" secondItem="eaR-JM-XUJ" secondAttribute="centerY" id="SbV-Dd-fbT"/>
                            <constraint firstItem="Nm2-xJ-jxS" firstAttribute="centerY" secondItem="eWZ-Em-PQG" secondAttribute="centerY" id="Tgd-B2-xAz"/>
                            <constraint firstItem="Rtg-7l-b7G" firstAttribute="leading" secondItem="eaR-JM-XUJ" secondAttribute="trailing" id="TiF-od-rsK"/>
                            <constraint firstItem="h4n-nl-K9g" firstAttribute="centerY" secondItem="eWZ-Em-PQG" secondAttribute="centerY" id="TyB-tL-JP3"/>
                            <constraint firstAttribute="bottom" secondItem="DCI-Sz-1AX" secondAttribute="bottom" constant="13" id="alz-VD-tW3"/>
                            <constraint firstItem="z6w-gZ-omO" firstAttribute="leading" secondItem="HAc-KK-Chh" secondAttribute="trailing" id="bIV-pH-hJ5"/>
                            <constraint firstItem="Rtg-7l-b7G" firstAttribute="centerY" secondItem="eaR-JM-XUJ" secondAttribute="centerY" id="bMO-EN-qF1"/>
                            <constraint firstItem="eWZ-Em-PQG" firstAttribute="top" secondItem="lrQ-mr-sWP" secondAttribute="top" constant="13" id="frQ-I3-Hni"/>
                            <constraint firstItem="HAc-KK-Chh" firstAttribute="leading" secondItem="Nm2-xJ-jxS" secondAttribute="leading" id="gsH-PE-w8V"/>
                            <constraint firstItem="z6w-gZ-omO" firstAttribute="centerY" secondItem="HAc-KK-Chh" secondAttribute="centerY" id="juP-6o-dCQ"/>
                            <constraint firstItem="h4n-nl-K9g" firstAttribute="leading" secondItem="eWZ-Em-PQG" secondAttribute="trailing" id="k4L-Um-CVt"/>
                            <constraint firstItem="eWZ-Em-PQG" firstAttribute="leading" secondItem="lrQ-mr-sWP" secondAttribute="leading" constant="10" id="seN-gS-VQt"/>
                            <constraint firstItem="tqb-xC-9qk" firstAttribute="leading" secondItem="Nm2-xJ-jxS" secondAttribute="trailing" id="zV1-UF-HvO"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
                                <color key="value" red="0.99215686270000003" green="0.47450980390000003" blue="0.0078431372550000003" alpha="0.28000000000000003" colorSpace="custom" customColorSpace="sRGB"/>
                            </userDefinedRuntimeAttribute>
                            <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
                                <real key="value" value="1"/>
                            </userDefinedRuntimeAttribute>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="4"/>
                            </userDefinedRuntimeAttribute>
                        </userDefinedRuntimeAttributes>
                    </view>
                </subviews>
                <constraints>
                    <constraint firstItem="lrQ-mr-sWP" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="7" id="CNl-qS-Zrj"/>
                    <constraint firstItem="lrQ-mr-sWP" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="NzU-hG-Kzc"/>
                    <constraint firstAttribute="trailing" secondItem="lrQ-mr-sWP" secondAttribute="trailing" constant="14" id="c59-Sg-d1q"/>
                    <constraint firstAttribute="bottom" secondItem="lrQ-mr-sWP" secondAttribute="bottom" constant="7" id="xHK-B8-9Ww"/>
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <point key="canvasLocation" x="144.27480916030532" y="41.197183098591552"/>
        </tableViewCell>
    </objects>
    <resources>
        <systemColor name="systemGray5Color">
            <color red="0.89803921568627454" green="0.89803921568627454" blue="0.91764705882352937" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/TCell/WorldCupRankTCell.swift
New file
@@ -0,0 +1,104 @@
//
//  WorldCupRankTCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
import JQTools
class WorldCupRankTCell: UITableViewCell {
                private var rankImg:UIImageView!
                private var rankLabel:UILabel!
                private var userImg:UIImageView!
                private var userNameLabel:UILabel!
                private var numerLabel:UILabel!
                private var radioLabel:UILabel!
                override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
                                super.init(style: .default, reuseIdentifier: reuseIdentifier)
                                setUI()
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                private func setUI(){
                                selectionStyle = .none
                                rankImg = UIImageView(image: UIImage(named: "rank_1"))
                                contentView.addSubview(rankImg)
                                rankImg.snp.makeConstraints { make in
                                                make.left.equalTo(15)
                                                make.top.equalTo(12)
                                                make.width.equalTo(22)
                                                make.height.equalTo(26)
                                }
                                rankLabel = UILabel()
                                rankLabel.text = "1"
                                rankLabel.font = UIFont.init(name: "Impact", size: 12)
                                rankLabel.textColor = UIColor(hexString: "#777777")
                                rankLabel.textAlignment = .center
                                contentView.addSubview(rankLabel)
                                rankLabel.snp.makeConstraints { make in
                                                make.center.equalTo(rankImg)
                                }
                                userImg = UIImageView()
                                userImg.backgroundColor = .black.withAlphaComponent(0.4)
                                userImg.cornerRadius = 17
                                contentView.addSubview(userImg)
                                userImg.snp.makeConstraints { make in
                                                make.left.equalTo(rankImg.snp.right).offset(37)
                                                make.centerY.equalToSuperview()
                                                make.width.height.equalTo(34)
                                }
                                userNameLabel = UILabel()
                                userNameLabel.text = "wang"
                                userNameLabel.font = UIFont.systemFont(ofSize: 14, weight: .medium)
                                userNameLabel.textColor = .black
                                contentView.addSubview(userNameLabel)
                                userNameLabel.snp.makeConstraints { make in
                                                make.left.equalTo(userImg.snp.right).offset(10)
                                                make.centerY.equalToSuperview()
                                                make.height.equalTo(20)
                                }
                                numerLabel = UILabel()
                                numerLabel.text = "0"
                                numerLabel.font = UIFont.systemFont(ofSize: 12)
                                numerLabel.textColor = .black.withAlphaComponent(0.6)
                                numerLabel.textAlignment = .center
                                contentView.addSubview(numerLabel)
                                numerLabel.snp.makeConstraints { make in
                                                make.left.equalToSuperview().offset((JQ_ScreenW - 28) * 0.469)
                                                make.centerY.equalToSuperview()
                                                make.height.equalTo(17)
                                                make.right.equalToSuperview().offset(-((JQ_ScreenW - 28) * 0.201))
                                }
                                radioLabel = UILabel()
                                radioLabel.text = "0%"
                                radioLabel.font = UIFont.systemFont(ofSize: 12)
                                radioLabel.textColor = .black.withAlphaComponent(0.6)
                                radioLabel.textAlignment = .center
                                contentView.addSubview(radioLabel)
                                radioLabel.snp.makeConstraints { make in
                                                make.left.equalTo(numerLabel.snp.right)
                                                make.centerY.equalToSuperview()
                                                make.height.equalTo(17)
                                                make.right.equalToSuperview()
                                }
                }
}
WanPai/Root/Search/TCell/WorldCupRecordTCell.swift
New file
@@ -0,0 +1,17 @@
//
//  WorldCupRecordTCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/27.
//
import UIKit
class WorldCupRecordTCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
                                backgroundColor = .clear
    }
}
WanPai/Root/Search/TCell/WorldCupRecordTCell.xib
New file
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_WorldCupRecordTCell" rowHeight="123" id="KGk-i7-Jjw" customClass="WorldCupRecordTCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="494" height="123"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
                <rect key="frame" x="0.0" y="0.0" width="494" height="123"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="67p-OH-6vX">
                        <rect key="frame" x="14" y="6.6666666666666643" width="466" height="110"/>
                        <subviews>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WLz-mA-V2e">
                                <rect key="frame" x="10" y="12" width="36" height="20"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="20" id="xjt-TO-ZAY"/>
                                </constraints>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                <nil key="textColor"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比分: " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ycz-Dk-ChZ">
                                <rect key="frame" x="9.9999999999999964" y="40" width="46.666666666666657" height="17"/>
                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0:0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LL4-oU-Vn8">
                                <rect key="frame" x="56.666666666666671" y="34.666666666666671" width="35.333333333333329" height="27.666666666666671"/>
                                <fontDescription key="fontDescription" type="system" pointSize="24"/>
                                <color key="textColor" name="FE6E0D"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0000.00.00 00:00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="49D-wu-uWd">
                                <rect key="frame" x="10" y="64" width="95.666666666666671" height="14.333333333333329"/>
                                <fontDescription key="fontDescription" type="system" pointSize="11"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="获得积分:0" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LHg-l0-pUp">
                                <rect key="frame" x="389.66666666666669" y="47.666666666666671" width="69.333333333333314" height="14.333333333333336"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                <color key="textColor" name="FE6E0D"/>
                                <nil key="highlightedColor"/>
                            </label>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_winner" translatesAutoresizingMaskIntoConstraints="NO" id="2Te-if-XIR">
                                <rect key="frame" x="444" y="0.0" width="22" height="24"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="0.90588235294117647" blue="0.80000000000000004" alpha="0.080000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="trailing" secondItem="2Te-if-XIR" secondAttribute="trailing" id="A8M-Pg-S6f"/>
                            <constraint firstItem="49D-wu-uWd" firstAttribute="leading" secondItem="WLz-mA-V2e" secondAttribute="leading" id="AKr-WD-GxM"/>
                            <constraint firstItem="LHg-l0-pUp" firstAttribute="centerY" secondItem="67p-OH-6vX" secondAttribute="centerY" id="BFn-3b-FmZ"/>
                            <constraint firstItem="LL4-oU-Vn8" firstAttribute="leading" secondItem="Ycz-Dk-ChZ" secondAttribute="trailing" id="Sni-AN-30G"/>
                            <constraint firstItem="2Te-if-XIR" firstAttribute="top" secondItem="67p-OH-6vX" secondAttribute="top" id="WKp-ua-Q6U"/>
                            <constraint firstItem="WLz-mA-V2e" firstAttribute="top" secondItem="67p-OH-6vX" secondAttribute="top" constant="12" id="cUA-zQ-4xD"/>
                            <constraint firstItem="LL4-oU-Vn8" firstAttribute="centerY" secondItem="Ycz-Dk-ChZ" secondAttribute="centerY" id="dO1-6s-y7B"/>
                            <constraint firstItem="49D-wu-uWd" firstAttribute="top" secondItem="Ycz-Dk-ChZ" secondAttribute="bottom" constant="7" id="mMF-0d-y2V"/>
                            <constraint firstItem="Ycz-Dk-ChZ" firstAttribute="top" secondItem="WLz-mA-V2e" secondAttribute="bottom" constant="8" id="of5-3m-FA3"/>
                            <constraint firstItem="Ycz-Dk-ChZ" firstAttribute="leading" secondItem="67p-OH-6vX" secondAttribute="leading" constant="10" id="ooT-IF-dpa"/>
                            <constraint firstAttribute="trailing" secondItem="LHg-l0-pUp" secondAttribute="trailing" constant="7" id="yGx-oa-WSc"/>
                            <constraint firstItem="WLz-mA-V2e" firstAttribute="leading" secondItem="67p-OH-6vX" secondAttribute="leading" constant="10" id="yna-nJ-0Qz"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                                <color key="value" red="0.99215686270000003" green="0.47450980390000003" blue="0.0078431372550000003" alpha="0.28000000000000003" colorSpace="custom" customColorSpace="sRGB"/>
                            </userDefinedRuntimeAttribute>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                                <real key="value" value="1"/>
                            </userDefinedRuntimeAttribute>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="4"/>
                            </userDefinedRuntimeAttribute>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        </userDefinedRuntimeAttributes>
                    </view>
                </subviews>
                <constraints>
                    <constraint firstItem="67p-OH-6vX" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="IfT-Bb-50e"/>
                    <constraint firstAttribute="trailing" secondItem="67p-OH-6vX" secondAttribute="trailing" constant="14" id="J7c-dv-mJT"/>
                    <constraint firstItem="67p-OH-6vX" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="6.5" id="ekC-B2-KYj"/>
                    <constraint firstAttribute="bottom" secondItem="67p-OH-6vX" secondAttribute="bottom" constant="6.5" id="h4k-c2-X0T"/>
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <point key="canvasLocation" x="271.75572519083971" y="48.239436619718312"/>
        </tableViewCell>
    </objects>
    <resources>
        <image name="icon_winner" width="22" height="24"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
    </resources>
</document>
WanPai/Root/Search/TCell/WorldCupTCell.swift
New file
@@ -0,0 +1,23 @@
//
//  WorldCupTCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/27.
//
import UIKit
class WorldCupTCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }
}
WanPai/Root/Search/TCell/WorldCupTCell.xib
New file
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_WorldCupTCell" rowHeight="288" id="KGk-i7-Jjw" customClass="WorldCupTCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="518" height="288"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
                <rect key="frame" x="0.0" y="0.0" width="518" height="288"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oFc-5H-7bu">
                        <rect key="frame" x="20.666666666666671" y="37" width="50" height="20.666666666666671"/>
                        <constraints>
                            <constraint firstAttribute="height" constant="20.5" id="2jX-yQ-pBm"/>
                        </constraints>
                        <fontDescription key="fontDescription" type="system" pointSize="21"/>
                        <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="y0L-La-CTe">
                        <rect key="frame" x="481.66666666666669" y="40.666666666666664" width="13" height="17"/>
                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
                        <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="INC-Mr-eUQ">
                        <rect key="frame" x="460.33333333333331" y="34.666666666666664" width="11.666666666666686" height="23"/>
                        <fontDescription key="fontDescription" type="system" pointSize="19"/>
                        <color key="textColor" red="1" green="0.4823529411764706" blue="0.086274509803921567" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_hot_1" translatesAutoresizingMaskIntoConstraints="NO" id="idI-Bn-7t7">
                        <rect key="frame" x="433" y="29.666666666666671" width="24" height="28"/>
                    </imageView>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="NAy-P9-bIs">
                        <rect key="frame" x="16" y="77.666666666666671" width="111" height="148.33333333333331"/>
                        <constraints>
                            <constraint firstAttribute="height" constant="148.5" id="Zyi-pO-3bz"/>
                            <constraint firstAttribute="width" constant="111" id="a2M-YX-Bmz"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="5"/>
                            </userDefinedRuntimeAttribute>
                        </userDefinedRuntimeAttributes>
                    </imageView>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Aw5-DE-ZTd">
                        <rect key="frame" x="141.00000000000003" y="77.666666666666671" width="348.66666666666674" height="18"/>
                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
                        <color key="textColor" red="0.62352941176470589" green="0.62745098039215685" blue="0.62745098039215685" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_age" translatesAutoresizingMaskIntoConstraints="NO" id="bT7-Y5-qoi">
                        <rect key="frame" x="145" y="192" width="17.666666666666657" height="21.666666666666657"/>
                    </imageView>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_time_1" translatesAutoresizingMaskIntoConstraints="NO" id="e7G-ry-OMa">
                        <rect key="frame" x="143" y="154" width="22" height="22"/>
                    </imageView>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OGN-Ix-gGZ">
                        <rect key="frame" x="180.33333333333334" y="193.66666666666666" width="14" height="18"/>
                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
                        <color key="textColor" red="0.62352941176470589" green="0.62745098039215685" blue="0.62745098039215685" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SpG-d6-Mry">
                        <rect key="frame" x="180.33333333333334" y="156" width="14" height="18"/>
                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
                        <color key="textColor" red="0.62352941179999999" green="0.62745098040000002" blue="0.62745098040000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="详情" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aek-ei-GPD">
                        <rect key="frame" x="393" y="193" width="96" height="33"/>
                        <color key="backgroundColor" red="0.082352941176470587" green="0.18823529411764706" blue="0.44705882352941173" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="width" constant="96" id="7ia-ML-84A"/>
                            <constraint firstAttribute="height" constant="33" id="kHE-zK-JNl"/>
                        </constraints>
                        <fontDescription key="fontDescription" type="system" pointSize="19"/>
                        <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="16.5"/>
                            </userDefinedRuntimeAttribute>
                        </userDefinedRuntimeAttributes>
                    </label>
                </subviews>
                <constraints>
                    <constraint firstItem="NAy-P9-bIs" firstAttribute="top" secondItem="oFc-5H-7bu" secondAttribute="bottom" constant="20" id="5X1-Ji-YkO"/>
                    <constraint firstItem="oFc-5H-7bu" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="37" id="85e-cl-qd0"/>
                    <constraint firstAttribute="trailing" secondItem="Aw5-DE-ZTd" secondAttribute="trailing" constant="28.5" id="BSI-kj-WEz"/>
                    <constraint firstItem="NAy-P9-bIs" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="16" id="CWg-TO-saA"/>
                    <constraint firstItem="SpG-d6-Mry" firstAttribute="centerY" secondItem="e7G-ry-OMa" secondAttribute="centerY" id="F6s-bY-LKk"/>
                    <constraint firstItem="Aw5-DE-ZTd" firstAttribute="leading" secondItem="NAy-P9-bIs" secondAttribute="trailing" constant="14" id="JBj-Uz-DN6"/>
                    <constraint firstItem="y0L-La-CTe" firstAttribute="bottom" secondItem="oFc-5H-7bu" secondAttribute="bottom" id="Jhb-q7-a96"/>
                    <constraint firstItem="OGN-Ix-gGZ" firstAttribute="leading" secondItem="bT7-Y5-qoi" secondAttribute="trailing" constant="17.5" id="RO1-4l-siK"/>
                    <constraint firstItem="bT7-Y5-qoi" firstAttribute="centerX" secondItem="e7G-ry-OMa" secondAttribute="centerX" id="S2R-pm-p9d"/>
                    <constraint firstItem="INC-Mr-eUQ" firstAttribute="leading" secondItem="idI-Bn-7t7" secondAttribute="trailing" constant="3.5" id="SiA-Z0-Kmo"/>
                    <constraint firstItem="y0L-La-CTe" firstAttribute="leading" secondItem="INC-Mr-eUQ" secondAttribute="trailing" constant="9.5" id="Txg-fh-c2e"/>
                    <constraint firstItem="aek-ei-GPD" firstAttribute="bottom" secondItem="NAy-P9-bIs" secondAttribute="bottom" id="V4N-eG-lah"/>
                    <constraint firstItem="oFc-5H-7bu" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="20.5" id="Xjs-6e-rGf"/>
                    <constraint firstAttribute="bottom" secondItem="NAy-P9-bIs" secondAttribute="bottom" constant="23" id="aUI-v3-ilP"/>
                    <constraint firstItem="OGN-Ix-gGZ" firstAttribute="leading" secondItem="SpG-d6-Mry" secondAttribute="leading" id="cRp-bJ-md4"/>
                    <constraint firstItem="Aw5-DE-ZTd" firstAttribute="top" secondItem="NAy-P9-bIs" secondAttribute="top" id="dwB-i0-o0R"/>
                    <constraint firstItem="bT7-Y5-qoi" firstAttribute="leading" secondItem="NAy-P9-bIs" secondAttribute="trailing" constant="18" id="ehR-kF-Z0n"/>
                    <constraint firstItem="bT7-Y5-qoi" firstAttribute="top" secondItem="e7G-ry-OMa" secondAttribute="bottom" constant="16" id="lv9-Kj-R7x"/>
                    <constraint firstItem="INC-Mr-eUQ" firstAttribute="bottom" secondItem="idI-Bn-7t7" secondAttribute="bottom" id="oT2-DL-cMO"/>
                    <constraint firstItem="bT7-Y5-qoi" firstAttribute="bottom" secondItem="NAy-P9-bIs" secondAttribute="bottom" constant="-12.5" id="pql-FI-e49"/>
                    <constraint firstAttribute="trailing" secondItem="y0L-La-CTe" secondAttribute="trailing" constant="23.5" id="pwk-0N-cSQ"/>
                    <constraint firstAttribute="trailing" secondItem="aek-ei-GPD" secondAttribute="trailing" constant="29" id="sKj-rM-bvV"/>
                    <constraint firstItem="OGN-Ix-gGZ" firstAttribute="centerY" secondItem="bT7-Y5-qoi" secondAttribute="centerY" id="vr1-s1-Um4"/>
                    <constraint firstItem="y0L-La-CTe" firstAttribute="bottom" secondItem="INC-Mr-eUQ" secondAttribute="bottom" id="zoH-JO-oVr"/>
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <point key="canvasLocation" x="288.54961832061065" y="106.33802816901409"/>
        </tableViewCell>
    </objects>
    <resources>
        <image name="icon_age" width="17.666666030883789" height="21.666666030883789"/>
        <image name="icon_hot_1" width="24" height="28"/>
        <image name="icon_time_1" width="22" height="22"/>
    </resources>
</document>
WanPai/Root/Search/VC/CustomerSubListVC.swift
@@ -11,113 +11,113 @@
import RxRelay
class CustomerContentViewModel:RefreshModel<NoticeItemModel>{
    var type = BehaviorRelay<CustomerSubListVC.CustomerSubType>.init(value: .notice)
    override func api() -> (Observable<BaseResponse<[NoticeItemModel]>>)? {
        return Services.exploreNoticeList(type: type.value)
    }
                var type = BehaviorRelay<CustomerSubListVC.CustomerSubType>.init(value: .notice)
                override func api() -> (Observable<BaseResponse<[NoticeItemModel]>>)? {
                                return Services.exploreNoticeList(type: type.value)
                }
}
class CustomerSubListVC: BaseVC {
    private let viewModel = CustomerContentViewModel()
                private let viewModel = CustomerContentViewModel()
    public enum CustomerSubType {
        case notice,QA
    }
    lazy var tableView:BaseTableView = {
        let table = BaseTableView(frame: .zero, style: .plain)
        table.separatorStyle = .none
        table.delegate = self
        table.dataSource = self
        table.register(UINib(nibName: "CustomerContentTCell", bundle: nil), forCellReuseIdentifier: "_CustomerContentTCell")
        table.register(UINib(nibName: "CustomerContentQATCell", bundle: nil), forCellReuseIdentifier: "_CustomerContentQATCell")
        return table
    }()
    init(type: CustomerSubType!) {
        super.init(nibName: nil, bundle: nil)
        viewModel.type.accept(type)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        if viewModel.type.value == .QA{
            Services.bannerList(position: .qusition).subscribe(onNext: {[weak self]data in
                if let models = data.data,models.count > 0{
                    let bannberView = CommonBannerView(frame: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.564))
                    self?.tableView.tableHeaderView = bannberView
                    let imgs = models.map({$0.img})
                    var items = [CommonBannerModel]()
                    for (index,img) in imgs.enumerated(){
                        items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                    }
                    bannberView.setItems(items: items) { m in
                        let model = models[m.index]
                        jumpPage(model: model.model, page: model.page, type: model.type, id: model.turnId)
                    }
                    self?.tableView.reloadData()
                public enum CustomerSubType {
                                case notice,QA
                }
            }) { error in
            }.disposed(by: disposeBag)
        }
                lazy var tableView:BaseTableView = {
                                let table = BaseTableView(frame: .zero, style: .plain)
                                table.separatorStyle = .none
                                table.delegate = self
                                table.dataSource = self
                                table.register(UINib(nibName: "CustomerContentTCell", bundle: nil), forCellReuseIdentifier: "_CustomerContentTCell")
                                table.register(UINib(nibName: "CustomerContentQATCell", bundle: nil), forCellReuseIdentifier: "_CustomerContentQATCell")
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
//        tableView.jq_setEmptyView()
    }
                                return table
                }()
    override func setUI() {
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }
                init(type: CustomerSubType!) {
                                super.init(nibName: nil, bundle: nil)
                                viewModel.type.accept(type)
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                if viewModel.type.value == .QA{
                                                Services.bannerList(position: .qusition).subscribe(onNext: {[weak self]data in
                                                                if let models = data.data,models.count > 0{
                                                                                let bannberView = CommonBannerView(frame: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.564))
                                                                                self?.tableView.tableHeaderView = bannberView
                                                                                let imgs = models.map({$0.img})
                                                                                var items = [CommonBannerModel]()
                                                                                for (index,img) in imgs.enumerated(){
                                                                                                items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                                                                                }
                                                                                bannberView.setItems(items: items) { m in
                                                                                                let model = models[m.index]
                                                                                                jumpPage(model: model.model, page: model.page, type: model.type, id: model.turnId)
                                                                                }
                                                                                self?.tableView.reloadData()
                                                                }
                                                }) { error in
                                                }.disposed(by: disposeBag)
                                }
                                viewModel.configure(tableView,needMore: false)
                                viewModel.beginRefresh()
                                //        tableView.jq_setEmptyView()
                }
                override func setUI() {
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                }
}
extension CustomerSubListVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let model = viewModel.dataSource.value[indexPath.row]
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let model = viewModel.dataSource.value[indexPath.row]
        var id = 0
        if  viewModel.type.value == .notice{
            id = model.noticeId
        }else{
            id = model.quesId
        }
                                var id = 0
                                if  viewModel.type.value == .notice{
                                                id = model.noticeId
                                }else{
                                                id = model.quesId
                                }
        let vc = CustomerContentDetailVC(id: id, type: viewModel.type.value)
        push(vc: vc)
    }
                                let vc = CustomerContentDetailVC(id: id, type: viewModel.type.value)
                                push(vc: vc)
                }
}
extension CustomerSubListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSource.value.count
    }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return viewModel.dataSource.value.count
                }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = viewModel.dataSource.value[indexPath.row]
        if  viewModel.type.value == .notice{
        let cell = tableView.dequeueReusableCell(withIdentifier: "_CustomerContentTCell") as! CustomerContentTCell
            cell.noticeItemModel = model
        return cell
        }else{
            let cell = tableView.dequeueReusableCell(withIdentifier: "_CustomerContentQATCell") as! CustomerContentQATCell
            cell.noticeItemModel = model
            return cell
        }
    }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let model = viewModel.dataSource.value[indexPath.row]
                                if  viewModel.type.value == .notice{
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_CustomerContentTCell") as! CustomerContentTCell
                                                cell.noticeItemModel = model
                                                return cell
                                }else{
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_CustomerContentQATCell") as! CustomerContentQATCell
                                                cell.noticeItemModel = model
                                                return cell
                                }
                }
}
WanPai/Root/Search/VC/MeQRCodeVC.swift
New file
@@ -0,0 +1,47 @@
//
//  MeQRCodeVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
class MeQRCodeVC: BaseVC {
                @IBOutlet weak var tableView: UITableView!
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "我的二维码"
                }
                override func setUI() {
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.register(UINib(nibName: "MyQRCodeTCell", bundle: nil), forCellReuseIdentifier: "_MyQRCodeTCell")
                }
}
extension    MeQRCodeVC:UITableViewDelegate,UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                QRPreview.show("123")
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 2
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_MyQRCodeTCell") as! MyQRCodeTCell
                                return cell
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                return 90
                }
}
WanPai/Root/Search/VC/MeQRCodeVC.xib
New file
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MeQRCodeVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="tableView" destination="xCU-ZT-TBO" id="aff-vD-UvB"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="二维码注意事项" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0gE-4P-a4a">
                    <rect key="frame" x="14.999999999999993" y="75" width="114.33333333333331" height="22"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="22" id="gBb-xJ-VYA"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kn2-C1-gHg">
                    <rect key="frame" x="15" y="105" width="363" height="17"/>
                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="xCU-ZT-TBO">
                    <rect key="frame" x="0.0" y="152" width="393" height="666"/>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                </tableView>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="kn2-C1-gHg" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="15" id="3Kt-py-gcN"/>
                <constraint firstItem="0gE-4P-a4a" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="15" id="9Ac-Tn-mZu"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="xCU-ZT-TBO" secondAttribute="trailing" id="9Ni-TZ-R2m"/>
                <constraint firstItem="0gE-4P-a4a" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" constant="16" id="GMH-nc-D89"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="kn2-C1-gHg" secondAttribute="trailing" constant="15" id="Gp3-Hk-kVc"/>
                <constraint firstItem="kn2-C1-gHg" firstAttribute="top" secondItem="0gE-4P-a4a" secondAttribute="bottom" constant="8" id="LHr-qK-f3L"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="xCU-ZT-TBO" secondAttribute="bottom" id="NHh-jh-sCv"/>
                <constraint firstItem="xCU-ZT-TBO" firstAttribute="top" secondItem="kn2-C1-gHg" secondAttribute="bottom" constant="30" id="Ujj-3X-9be"/>
                <constraint firstItem="xCU-ZT-TBO" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="fgz-yk-0HY"/>
            </constraints>
            <point key="canvasLocation" x="83" y="21"/>
        </view>
    </objects>
    <resources>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/SearchVC.swift
@@ -9,183 +9,219 @@
import JQTools
class SearchVC: BaseVC {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var banner_collectionView: UICollectionView!
    @IBOutlet weak var label_empty: UILabel!
    @IBOutlet weak var view_container: UIView!
//    @IBOutlet weak var btn_special: UIButton!
    @IBOutlet weak var btn_userLocal: UIButton!
        //    @IBOutlet weak var cons_CollectionAspect: NSLayoutConstraint!
                @IBOutlet weak var scrollView: UIScrollView!
                @IBOutlet weak var banner_collectionView: UICollectionView!
                @IBOutlet weak var func_collectionView: UICollectionView!
                @IBOutlet weak var user_avarImg: UIImageView!
                @IBOutlet weak var label_userName: UILabel!
                @IBOutlet weak var label_vip: UILabel!
                @IBOutlet weak var img_vipMedal: UIImageView!
                @IBOutlet weak var label_wpCoin: UILabel!
                @IBOutlet weak var label_coin: UILabel!
                var benefitHomeModel:BenefitHomeModel?
                private var models = [StartClouseExploreModel]()
    private var models = [StartClouseExploreModel]()
    private lazy var mapView:MAMapView = {
        let map = MAMapView()
        map.delegate = self
        map.isShowsUserLocation = true
        map.userTrackingMode = .none
        map.isZoomEnabled = true
        map.isScrollEnabled = true
        return map
    }()
                private var items = ["我的二维码","我的预约","社区世界杯","已报名活动","我的运动营","人员管理","我的券包","兑换记录","消费记录","积分明细","我的玩湃币","裁判入口"]
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.contentInsetAdjustmentBehavior = .never
        Services.exploreHome().subscribe(onNext: {[weak self] data in
            if let models = data.data,models.count > 0{
                self?.models = models
                self?.loadMap()
                self?.banner_collectionView.reloadData()
            }else{
            }
        }).disposed(by: disposeBag)
    }
    override func setUI() {
        banner_collectionView.delegate = self
        banner_collectionView.dataSource = self
        banner_collectionView.register(UINib(nibName: "SearchBannerCCell", bundle: nil), forCellWithReuseIdentifier: "_SearchBannerCCell")
    }
    private func loadMap(){
        label_empty.isHidden = true
        view_container.addSubview(mapView)
        mapView.frame = CGRect(origin: .zero, size: view_container.size)
        for (index,v) in models.enumerated(){
            let point = CustomPointAnnotation()
            point.coordinate = CLLocationCoordinate2D(latitude: v.latitude, longitude:v.longitude)
            point.title = v.storeAddr
            point.index = index
            v.index = index
            v.annotation = point
        }
        let points = models.map({$0.annotation}) as! [CustomPointAnnotation]
        mapView.addAnnotations(points)
        mapView.showAnnotations(points, animated: true)
        mapView.selectAnnotation(points.first!, animated: true)
        view_container.bringSubviewToFront(btn_userLocal)
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        view_container.cornerRadius = 10
    }
    @IBAction func customerAction(_ sender: Any) {
        let vc = CustomerListVC()
        push(vc: vc)
    }
    @IBAction func privilegeAction(_ sender: UIButton) {
        let vc = JoinMemberIntroduceVC()
        push(vc: vc)
    }
    @IBAction func userLocationAction(_ sender: Any) {
        let userCoordinate = mapView.userLocation.coordinate
        mapView.setCenter(userCoordinate, animated: true)
    }
    @IBAction func aboutMinProgram(_ sender: Any) {
        CommonAlertView.show(title: "提示", content: "即将打开小程序,是否继续?") { status in
            if status{
                let miniProgam = WXLaunchMiniProgramReq.object()
                miniProgam.userName = WeChatMinProgram
                #if DEBUG
                miniProgam.miniProgramType = .preview
                #else
                miniProgam.miniProgramType = .release
                #endif
                miniProgam.path = WeChatMinProgramPath
                WXApi.send(miniProgam) { s in
                    if !s{
                        alert(msg: "打开失败")
                    }
                override func viewDidDisappear(_ animated: Bool) {
                                super.viewDidDisappear(animated)
                }
            }
        }
    }
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .darkContent
    }
                override func viewDidLoad() {
                                super.viewDidLoad()
                                scrollView.contentInsetAdjustmentBehavior = .never
                                Services.exploreHome().subscribe(onNext: {[weak self] data in
                                                if let models = data.data,models.count > 0{
                                                                self?.models = models
                                                                self?.banner_collectionView.reloadData()
                                                }else{
                                                }
                                }).disposed(by: disposeBag)
                }
                override func viewDidAppear(_ animated: Bool) {
                                super.viewDidAppear(animated)
                                getData()
                }
                override func setUI() {
                                banner_collectionView.delegate = self
                                banner_collectionView.dataSource = self
                                banner_collectionView.register(UINib(nibName: "SearchBannerCCell", bundle: nil), forCellWithReuseIdentifier: "_SearchBannerCCell")
                                func_collectionView.delegate = self
                                func_collectionView.dataSource = self
                                func_collectionView.register(UINib(nibName: "FindItemCCell", bundle: nil), forCellWithReuseIdentifier: "_FindItemCCell")
                                func_collectionView.contentInset = UIEdgeInsets(top: 25, left: 0, bottom: 25, right: 0)
                }
                override func viewDidLayoutSubviews() {
                                super.viewDidLayoutSubviews()
                }
                private func getData(){
                                Services.benefitHome().subscribe(onNext: {[weak self] data in
                                                if let model = data.data{
                                                                self?.benefitHomeModel = model
                                                                self?.user_avarImg.sd_setImage(with: URL(string: model.userHeadImg))
                                                                self?.label_userName.text = model.userName.isEmpty ? "未命名":model.userName
                                                                self?.label_vip.text = model.isMember
                                                                self?.label_wpCoin.text = model.wpCoin.currencyNotPrefix()
                                                                self?.label_coin.text = "\(model.userIntegral)"
                                                }
                                }) { error in
                                }.disposed(by: disposeBag)
                }
                @IBAction func customerAction(_ sender: Any) {
                                let vc = CustomerListVC()
                                push(vc: vc)
                }
                @IBAction func wpCoinDetailAction(_ sender: Any) {
                                let vc = RechargeRecordVC(coin: benefitHomeModel?.wpCoin ?? 0,subtype: .coin)
                                push(vc: vc)
                }
                @IBAction func coinDetailAction(_ sender: Any) {
                                let vc = RechargeRecordVC(coin: benefitHomeModel?.userIntegral ?? 0,subtype: .integral)
                                push(vc: vc)
                }
                @IBAction func settingAction(_ sender: Any) {
                                let vc = ProfileVC()
                                push(vc: vc)
                }
                @IBAction func aboutMinProgram(_ sender: Any) {
                                CommonAlertView.show(title: "提示", content: "即将打开小程序,是否继续?") { status in
                                                if status{
                                                                let miniProgam = WXLaunchMiniProgramReq.object()
                                                                miniProgam.userName = WeChatMinProgram
#if DEBUG
                                                                miniProgam.miniProgramType = .preview
#else
                                                                miniProgam.miniProgramType = .release
#endif
                                                                miniProgam.path = WeChatMinProgramPath
                                                                WXApi.send(miniProgam) { s in
                                                                                if !s{
                                                                                                alert(msg: "打开失败")
                                                                                }
                                                                }
                                                }
                                }
                }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .darkContent
                }
}
extension SearchVC:UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let model = models[indexPath.row]
        let vc = SearchStoreDetailVC(id: model.storeId)
        push(vc: vc)
    }
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                if collectionView == func_collectionView{
                                                switch items[indexPath.row]
                                                {
                                                                case "我的二维码":
                                                            let vc    = MeQRCodeVC()
                                                                push(vc: vc)
                                                                case "我的预约":
                                                                let vc = YardBookingListVC()
                                                                push(vc: vc)
                                                                case "社区世界杯":
                                                                let vc = WorldCupVC()
                                                                push(vc: vc)
                                                                case "已报名活动":
                                                                let vc = ActivitySignupListVC()
                                                                push(vc: vc)
                                                                case "我的运动营":
                                                                self.tabBarController?.selectedIndex = 1
                                                                case "人员管理":
                                                                break
                                                                case "我的券包":
                                                                let vc = WelfareCouponsListVC()
                                                                push(vc: vc)
                                                                case "兑换记录":
                                                                let vc = WelfareExchangeRecordListVC()
                                                                push(vc: vc)
                                                                case "消费记录":
                                                                 let vc = WelfareBillListVC()
                                                                push(vc: vc)
                                                                case "积分明细":
                                                                let vc = RechargeRecordVC(coin: benefitHomeModel?.userIntegral ?? 0,subtype: .integral)
                                                                push(vc: vc)
                                                                case "我的玩湃币":
                                                                let vc = RechargeRecordVC(coin: benefitHomeModel?.wpCoin ?? 0,subtype: .coin)
                                                                push(vc: vc)
                                                                case "裁判入口":
                                                                break
                                                                default:
                                                                                break
                                                }
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let page = Int(scrollView.contentOffset.x / JQ_ScreenW)
        let model = models[page]
        mapView.selectAnnotation(model.annotation, animated: true)
    }
                                }
                                if collectionView == banner_collectionView{
                                                let model = models[indexPath.row]
                                                let vc = SearchStoreDetailVC(id: model.storeId)
                                                push(vc: vc)
                                }
                }
}
extension SearchVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return models.count
    }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                if collectionView == func_collectionView{
                                                return items.count
                                }
                                return models.count
                }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_SearchBannerCCell", for: indexPath) as! SearchBannerCCell
        let model = models[indexPath.row]
        cell.startClouseExploreItemModel = model
        return cell
    }
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                if collectionView == func_collectionView{
                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_FindItemCCell", for: indexPath) as! FindItemCCell
                                                cell.label_title.text = items[indexPath.row]
                                                return cell
                                }
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_SearchBannerCCell", for: indexPath) as! SearchBannerCCell
                                let model = models[indexPath.row]
                                cell.startClouseExploreItemModel = model
                                return cell
                }
}
extension SearchVC:UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
                                if collectionView == func_collectionView{
                                                return 0
                                }
                                return 0
                }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: JQ_ScreenW, height: JQ_ScreenW * 0.6541)
    }
}
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
                                if collectionView == func_collectionView{
                                                return 0
                                }
                                return 0
                }
extension SearchVC:MAMapViewDelegate{
    func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
        if annotation is CustomPointAnnotation{
            var pointView =  mapView.dequeueReusableAnnotationView(withIdentifier: "point") as? CustomPointAnnotationView
            if pointView == nil{
                pointView = CustomPointAnnotationView(annotation: annotation, reuseIdentifier: "point")
            }
            pointView?.canShowCallout = true
            pointView?.label.text = "\((annotation as! CustomPointAnnotation).index + 1)"
            pointView?.image = UIImage(named: "icon_point")?.withTintColor(UIColor(hexStr: "#f54444"))
            return pointView
        }
        return nil
    }
    func mapView(_ mapView: MAMapView!, didSelect view: MAAnnotationView!) {
        view.image = UIImage(named: "icon_point")?.withTintColor(UIColor(hexStr: "#2980ff"))
    }
    func mapView(_ mapView: MAMapView!, didDeselect view: MAAnnotationView!) {
        view.image = UIImage(named: "icon_point")?.withTintColor(UIColor(hexStr: "#f54444"))
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                                if collectionView == func_collectionView{
                                                return CGSize(width: JQ_ScreenW/4, height: 120)
                                }
                                return CGSize(width: JQ_ScreenW, height: JQ_ScreenW * 0.6541)
                }
}
WanPai/Root/Search/VC/SearchVC.xib
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <accessibilityOverrides/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
@@ -12,11 +13,15 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SearchVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="banner_collectionView" destination="GVG-mQ-5A4" id="keS-lx-iWt"/>
                <outlet property="btn_userLocal" destination="G6c-mm-jtO" id="AS9-Qs-vFK"/>
                <outlet property="label_empty" destination="FYv-6M-gC5" id="SA6-TH-Aqp"/>
                <outlet property="func_collectionView" destination="pyk-ne-JeM" id="eQ5-10-Hci"/>
                <outlet property="img_vipMedal" destination="reN-LL-PRO" id="WIl-zY-wuj"/>
                <outlet property="label_coin" destination="TBO-dZ-vzH" id="aHo-fb-qUS"/>
                <outlet property="label_userName" destination="Iaq-eP-lJ7" id="t4z-lA-fha"/>
                <outlet property="label_vip" destination="qIB-bn-Xg1" id="Sq1-tH-0I7"/>
                <outlet property="label_wpCoin" destination="ywf-si-kai" id="kQb-4s-4nT"/>
                <outlet property="scrollView" destination="Jbe-CY-MmI" id="MM5-aA-VjT"/>
                <outlet property="user_avarImg" destination="IFx-3f-1QD" id="cmc-3A-1pW"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
                <outlet property="view_container" destination="kz4-Kz-Gzm" id="w2p-IO-YFO"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
@@ -25,51 +30,163 @@
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jbe-CY-MmI">
                    <rect key="frame" x="0.0" y="0.0" width="393" height="818"/>
                    <rect key="frame" x="0.0" y="59" width="393" height="759"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="w1y-Zq-96N">
                            <rect key="frame" x="0.0" y="0.0" width="393" height="838.66666666666663"/>
                            <rect key="frame" x="0.0" y="0.0" width="393" height="1140.6666666666667"/>
                            <subviews>
                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="前往玩湃" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DLd-us-4A3">
                                    <rect key="frame" x="23" y="42" width="65.333333333333329" height="22"/>
                                    <constraints>
                                        <constraint firstAttribute="height" constant="22" id="MPB-gD-l4i"/>
                                    </constraints>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                    <color key="textColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                    <nil key="highlightedColor"/>
                                </label>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kz4-Kz-Gzm">
                                    <rect key="frame" x="23" y="81" width="347" height="194.66666666666663"/>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1Yu-z5-de2">
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="300"/>
                                    <subviews>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="当前城市暂无门店" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FYv-6M-gC5">
                                            <rect key="frame" x="0.0" y="0.0" width="347" height="194.66666666666666"/>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                            <color key="textColor" red="0.20392156859999999" green="0.3411764706" blue="0.42352941179999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="IFx-3f-1QD">
                                            <rect key="frame" x="26.000000000000007" y="23.666666666666679" width="98.666666666666686" height="98.333333333333314"/>
                                            <color key="backgroundColor" name="F6F6F6"/>
                                            <constraints>
                                                <constraint firstAttribute="width" constant="98.5" id="0g6-gD-Ksh"/>
                                                <constraint firstAttribute="height" constant="98.5" id="UCu-DG-iun"/>
                                            </constraints>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="49.25"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </imageView>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Iaq-eP-lJ7">
                                            <rect key="frame" x="138.66666666666666" y="57.000000000000007" width="19.333333333333343" height="26.333333333333336"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="22"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="G6c-mm-jtO">
                                            <rect key="frame" x="312" y="159.66666666666666" width="30" height="30"/>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qIB-bn-Xg1">
                                            <rect key="frame" x="138.66666666666666" y="94.333333333333343" width="14" height="18"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_vip_medal" translatesAutoresizingMaskIntoConstraints="NO" id="reN-LL-PRO">
                                            <rect key="frame" x="166" y="92" width="21" height="23"/>
                                            <constraints>
                                                <constraint firstAttribute="width" constant="21" id="912-zr-umq"/>
                                                <constraint firstAttribute="height" constant="23" id="D5U-Mo-93F"/>
                                            </constraints>
                                        </imageView>
                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xGl-Vo-Gjm">
                                            <rect key="frame" x="322" y="54.333333333333329" width="37" height="37"/>
                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                            <state key="normal" image="btn_map_local"/>
                                            <state key="normal" image="btn_setting_find"/>
                                            <connections>
                                                <action selector="userLocationAction:" destination="-1" eventType="touchUpInside" id="yGj-0G-xcT"/>
                                                <action selector="settingAction:" destination="-1" eventType="touchUpInside" id="hsF-IP-mlP"/>
                                            </connections>
                                        </button>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ywf-si-kai">
                                            <rect key="frame" x="41.666666666666657" y="192" width="119" height="46.333333333333343"/>
                                            <constraints>
                                                <constraint firstAttribute="height" constant="46.5" id="cbL-nZ-eFp"/>
                                                <constraint firstAttribute="width" constant="119" id="jaF-0A-wRM"/>
                                            </constraints>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="24"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="23.25"/>
                                                </userDefinedRuntimeAttribute>
                                                <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                                                    <color key="value" name="FE6E0D"/>
                                                </userDefinedRuntimeAttribute>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                                                    <real key="value" value="1"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </label>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="玩湃币" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QKu-db-8Fs">
                                            <rect key="frame" x="76.666666666666671" y="163.66666666666666" width="49" height="19.333333333333343"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TBO-dZ-vzH">
                                            <rect key="frame" x="232" y="192" width="119" height="46.333333333333343"/>
                                            <constraints>
                                                <constraint firstAttribute="width" constant="119" id="7lF-XU-ufo"/>
                                                <constraint firstAttribute="height" constant="46.5" id="Twf-2f-oAl"/>
                                            </constraints>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="24"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="23.25"/>
                                                </userDefinedRuntimeAttribute>
                                                <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                                                    <color key="value" name="FE6E0D"/>
                                                </userDefinedRuntimeAttribute>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                                                    <real key="value" value="1"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </label>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="积分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3pw-YC-Oys">
                                            <rect key="frame" x="275.33333333333331" y="163.66666666666666" width="32.666666666666686" height="19.333333333333343"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <nil key="highlightedColor"/>
                                        </label>
                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hBG-jc-I1P">
                                            <rect key="frame" x="72" y="244.33333333333331" width="58" height="29"/>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                            <state key="normal" title="查看详情">
                                                <color key="titleColor" red="1" green="1" blue="1" alpha="0.29999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
                                            </state>
                                            <connections>
                                                <action selector="wpCoinDetailAction:" destination="-1" eventType="touchUpInside" id="MBO-4C-n3j"/>
                                            </connections>
                                        </button>
                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DTA-Zx-9lB">
                                            <rect key="frame" x="262.66666666666669" y="244.33333333333331" width="58" height="29"/>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                            <state key="normal" title="查看详情">
                                                <color key="titleColor" red="1" green="1" blue="1" alpha="0.29999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
                                            </state>
                                            <connections>
                                                <action selector="coinDetailAction:" destination="-1" eventType="touchUpInside" id="VQC-F2-UZo"/>
                                            </connections>
                                        </button>
                                    </subviews>
                                    <color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/>
                                    <color key="backgroundColor" red="0.10588235294117647" green="0.22745098039215686" blue="0.52941176470588236" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                    <constraints>
                                        <constraint firstItem="FYv-6M-gC5" firstAttribute="top" secondItem="kz4-Kz-Gzm" secondAttribute="top" id="6Qg-cL-kbh"/>
                                        <constraint firstAttribute="width" secondItem="kz4-Kz-Gzm" secondAttribute="height" multiplier="1:0.561" id="8hG-Ai-TyT"/>
                                        <constraint firstAttribute="bottom" secondItem="FYv-6M-gC5" secondAttribute="bottom" id="Q4a-4F-XMA"/>
                                        <constraint firstAttribute="trailing" secondItem="G6c-mm-jtO" secondAttribute="trailing" constant="5" id="f1j-Zi-1Aq"/>
                                        <constraint firstAttribute="trailing" secondItem="FYv-6M-gC5" secondAttribute="trailing" id="kb0-0U-Ri8"/>
                                        <constraint firstItem="FYv-6M-gC5" firstAttribute="leading" secondItem="kz4-Kz-Gzm" secondAttribute="leading" id="nwW-5i-AUH"/>
                                        <constraint firstAttribute="bottom" secondItem="G6c-mm-jtO" secondAttribute="bottom" constant="5" id="psO-W6-VUl"/>
                                        <constraint firstAttribute="bottom" secondItem="ywf-si-kai" secondAttribute="bottom" constant="61.5" id="2Ey-PZ-oVs"/>
                                        <constraint firstItem="ywf-si-kai" firstAttribute="centerX" secondItem="QKu-db-8Fs" secondAttribute="centerX" id="6rX-2G-Mrr"/>
                                        <constraint firstItem="Iaq-eP-lJ7" firstAttribute="top" secondItem="IFx-3f-1QD" secondAttribute="top" constant="33.5" id="8T1-8Q-gib"/>
                                        <constraint firstItem="reN-LL-PRO" firstAttribute="centerY" secondItem="qIB-bn-Xg1" secondAttribute="centerY" id="BeY-KC-laa"/>
                                        <constraint firstItem="IFx-3f-1QD" firstAttribute="top" secondItem="1Yu-z5-de2" secondAttribute="top" constant="23.5" id="E6N-4k-GPZ"/>
                                        <constraint firstItem="DTA-Zx-9lB" firstAttribute="top" secondItem="TBO-dZ-vzH" secondAttribute="bottom" constant="6" id="HhC-ff-6wp"/>
                                        <constraint firstItem="qIB-bn-Xg1" firstAttribute="leading" secondItem="Iaq-eP-lJ7" secondAttribute="leading" id="JzW-jd-ATz"/>
                                        <constraint firstAttribute="width" secondItem="1Yu-z5-de2" secondAttribute="height" multiplier="1:0.763" id="Kr8-62-LYF"/>
                                        <constraint firstItem="ywf-si-kai" firstAttribute="top" secondItem="QKu-db-8Fs" secondAttribute="bottom" constant="9" id="L5f-Wd-uEY"/>
                                        <constraint firstItem="TBO-dZ-vzH" firstAttribute="centerY" secondItem="ywf-si-kai" secondAttribute="centerY" id="LvV-6U-Pmw"/>
                                        <constraint firstItem="TBO-dZ-vzH" firstAttribute="top" secondItem="3pw-YC-Oys" secondAttribute="bottom" constant="9" id="NGT-uL-LPH"/>
                                        <constraint firstItem="DTA-Zx-9lB" firstAttribute="centerX" secondItem="TBO-dZ-vzH" secondAttribute="centerX" id="OMM-7I-mY8"/>
                                        <constraint firstItem="reN-LL-PRO" firstAttribute="leading" secondItem="qIB-bn-Xg1" secondAttribute="trailing" constant="13.5" id="RG9-2c-y1p"/>
                                        <constraint firstItem="qIB-bn-Xg1" firstAttribute="top" secondItem="Iaq-eP-lJ7" secondAttribute="bottom" constant="11" id="S1p-gw-G8F"/>
                                        <constraint firstItem="hBG-jc-I1P" firstAttribute="centerX" secondItem="ywf-si-kai" secondAttribute="centerX" id="SKj-6E-fFA"/>
                                        <constraint firstItem="hBG-jc-I1P" firstAttribute="top" secondItem="ywf-si-kai" secondAttribute="bottom" constant="6" id="ZRW-iT-ity"/>
                                        <constraint firstItem="ywf-si-kai" firstAttribute="leading" secondItem="1Yu-z5-de2" secondAttribute="leading" constant="41.5" id="dy9-73-RcY"/>
                                        <constraint firstItem="IFx-3f-1QD" firstAttribute="leading" secondItem="1Yu-z5-de2" secondAttribute="leading" constant="26" id="hAd-UM-xF3"/>
                                        <constraint firstItem="TBO-dZ-vzH" firstAttribute="centerX" secondItem="3pw-YC-Oys" secondAttribute="centerX" id="oWb-y0-H8A"/>
                                        <constraint firstAttribute="trailing" secondItem="TBO-dZ-vzH" secondAttribute="trailing" constant="42" id="qQN-dr-eUO"/>
                                        <constraint firstItem="xGl-Vo-Gjm" firstAttribute="centerY" secondItem="IFx-3f-1QD" secondAttribute="centerY" id="tX3-fg-Fqb"/>
                                        <constraint firstAttribute="trailing" secondItem="xGl-Vo-Gjm" secondAttribute="trailing" constant="34" id="uEs-l3-zLr"/>
                                        <constraint firstItem="Iaq-eP-lJ7" firstAttribute="leading" secondItem="IFx-3f-1QD" secondAttribute="trailing" constant="14" id="x9S-au-83K"/>
                                    </constraints>
                                </view>
                                <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="W2A-PE-Zq8">
                                    <rect key="frame" x="26" y="621.66666666666663" width="341" height="162"/>
                                    <rect key="frame" x="26" y="923.66666666666663" width="341" height="161.99999999999989"/>
                                    <subviews>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Lz2-Km-ydI" customClass="TapBtn" customModule="WanPai" customModuleProvider="target">
                                            <rect key="frame" x="0.0" y="0.0" width="162.66666666666666" height="162"/>
@@ -78,7 +195,7 @@
                                                    <rect key="frame" x="15" y="15" width="45" height="38"/>
                                                </imageView>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="CONTACTS US" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Md-SF-0cM">
                                                    <rect key="frame" x="13.999999999999993" y="72" width="109.33333333333331" height="22"/>
                                                    <rect key="frame" x="13.999999999999993" y="72.000000000000114" width="109.33333333333331" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="HM2-qC-zym"/>
                                                    </constraints>
@@ -87,7 +204,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="客服中心" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Y6t-EV-EyM">
                                                    <rect key="frame" x="15" y="99" width="65.333333333333329" height="22"/>
                                                    <rect key="frame" x="15" y="99.000000000000114" width="65.333333333333329" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="duk-64-lzR"/>
                                                    </constraints>
@@ -96,7 +213,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" red="0.47450980392156861" green="0.85490196078431369" blue="0.88627450980392153" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <color key="backgroundColor" red="0.93725490196078431" green="0.40784313725490196" blue="0.2627450980392157" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <constraints>
                                                <constraint firstItem="Gep-Rx-b5x" firstAttribute="top" secondItem="Lz2-Km-ydI" secondAttribute="top" constant="15" id="222-ed-hq8"/>
                                                <constraint firstItem="Gep-Rx-b5x" firstAttribute="leading" secondItem="Lz2-Km-ydI" secondAttribute="leading" constant="15" id="27p-qb-pUW"/>
@@ -122,7 +239,7 @@
                                                    <rect key="frame" x="15" y="15" width="48" height="36"/>
                                                </imageView>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ABOUT US" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qdw-6R-Ebr">
                                                    <rect key="frame" x="14" y="70" width="79.666666666666671" height="22"/>
                                                    <rect key="frame" x="14" y="70.000000000000114" width="79.666666666666671" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="xax-sJ-ZYz"/>
                                                    </constraints>
@@ -131,7 +248,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="关于玩湃" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bus-yA-9bf">
                                                    <rect key="frame" x="15" y="97" width="65.333333333333329" height="22"/>
                                                    <rect key="frame" x="15" y="97.000000000000114" width="65.333333333333329" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="Z4Q-9e-vKA"/>
                                                    </constraints>
@@ -140,7 +257,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" red="0.71764705882352942" green="0.85882352941176465" blue="0.70588235294117641" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <color key="backgroundColor" red="0.98039215686274506" green="0.5725490196078431" blue="0.23529411764705882" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                            <constraints>
                                                <constraint firstItem="VHu-Vv-jwl" firstAttribute="top" secondItem="V7G-4l-CVL" secondAttribute="top" constant="15" id="I4c-VH-KpA"/>
                                                <constraint firstItem="bus-yA-9bf" firstAttribute="leading" secondItem="VHu-Vv-jwl" secondAttribute="leading" id="K4r-tk-7NG"/>
@@ -154,6 +271,9 @@
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="12"/>
                                                </userDefinedRuntimeAttribute>
                                                <userDefinedRuntimeAttribute type="color" keyPath="titleColorForSelected">
                                                    <color key="value" red="0.98039215686274506" green="0.5725490196078431" blue="0.23529411764705882" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                            <connections>
                                                <action selector="aboutMinProgram:" destination="-1" eventType="touchUpInside" id="e1R-22-FZ6"/>
@@ -165,12 +285,24 @@
                                    </constraints>
                                </stackView>
                                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="GVG-mQ-5A4">
                                    <rect key="frame" x="0.0" y="307.66666666666669" width="393" height="257.00000000000006"/>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                    <rect key="frame" x="0.0" y="650" width="393" height="235.66666666666663"/>
                                    <constraints>
                                        <constraint firstAttribute="width" secondItem="GVG-mQ-5A4" secondAttribute="height" multiplier="1:0.6541" id="r90-ek-NTR"/>
                                        <constraint firstAttribute="width" secondItem="GVG-mQ-5A4" secondAttribute="height" multiplier="1:0.6" id="X5h-hG-CdI"/>
                                    </constraints>
                                    <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="QDn-jj-8xs">
                                        <size key="itemSize" width="128" height="128"/>
                                        <size key="headerReferenceSize" width="0.0" height="0.0"/>
                                        <size key="footerReferenceSize" width="0.0" height="0.0"/>
                                        <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
                                    </collectionViewFlowLayout>
                                </collectionView>
                                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="pyk-ne-JeM">
                                    <rect key="frame" x="0.0" y="300" width="393" height="350"/>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                    <constraints>
                                        <constraint firstAttribute="height" constant="350" id="jCJ-Yw-mTl"/>
                                    </constraints>
                                    <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="5aa-zU-PhM">
                                        <size key="itemSize" width="128" height="128"/>
                                        <size key="headerReferenceSize" width="0.0" height="0.0"/>
                                        <size key="footerReferenceSize" width="0.0" height="0.0"/>
@@ -181,17 +313,20 @@
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstItem="GVG-mQ-5A4" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" id="17N-sE-wz0"/>
                                <constraint firstItem="kz4-Kz-Gzm" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" constant="23" id="3Uf-8q-OAN"/>
                                <constraint firstItem="pyk-ne-JeM" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" id="7Xf-ZR-hQR"/>
                                <constraint firstAttribute="trailing" secondItem="GVG-mQ-5A4" secondAttribute="trailing" id="7x0-XI-UxS"/>
                                <constraint firstItem="W2A-PE-Zq8" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" constant="26" id="AtV-Kr-OEc"/>
                                <constraint firstItem="GVG-mQ-5A4" firstAttribute="top" secondItem="kz4-Kz-Gzm" secondAttribute="bottom" constant="32" id="Igg-1d-nE8"/>
                                <constraint firstItem="1Yu-z5-de2" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" id="JqE-HY-pRY"/>
                                <constraint firstAttribute="bottom" secondItem="W2A-PE-Zq8" secondAttribute="bottom" constant="55" id="K5D-B5-JBH"/>
                                <constraint firstItem="DLd-us-4A3" firstAttribute="top" secondItem="w1y-Zq-96N" secondAttribute="top" constant="42" id="LL4-80-YhX"/>
                                <constraint firstItem="GVG-mQ-5A4" firstAttribute="top" secondItem="pyk-ne-JeM" secondAttribute="bottom" id="My8-KA-VdK"/>
                                <constraint firstAttribute="trailing" secondItem="GVG-mQ-5A4" secondAttribute="trailing" id="OvB-FO-WkW"/>
                                <constraint firstItem="kz4-Kz-Gzm" firstAttribute="top" secondItem="DLd-us-4A3" secondAttribute="bottom" constant="17" id="TYk-Ic-7l5"/>
                                <constraint firstAttribute="trailing" secondItem="1Yu-z5-de2" secondAttribute="trailing" id="QDA-wd-kB5"/>
                                <constraint firstItem="GVG-mQ-5A4" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" id="TwR-1K-Ho3"/>
                                <constraint firstItem="1Yu-z5-de2" firstAttribute="top" secondItem="w1y-Zq-96N" secondAttribute="top" id="Y1k-jv-2qV"/>
                                <constraint firstAttribute="trailing" secondItem="W2A-PE-Zq8" secondAttribute="trailing" constant="26" id="Yfu-Bf-75b"/>
                                <constraint firstItem="DLd-us-4A3" firstAttribute="leading" secondItem="w1y-Zq-96N" secondAttribute="leading" constant="23" id="fiq-V8-p3c"/>
                                <constraint firstAttribute="trailing" secondItem="kz4-Kz-Gzm" secondAttribute="trailing" constant="23" id="rbO-WH-9CE"/>
                                <constraint firstItem="W2A-PE-Zq8" firstAttribute="top" secondItem="GVG-mQ-5A4" secondAttribute="bottom" constant="57" id="ve8-5z-kaa"/>
                                <constraint firstItem="pyk-ne-JeM" firstAttribute="top" secondItem="1Yu-z5-de2" secondAttribute="bottom" id="YmX-dT-TjT"/>
                                <constraint firstAttribute="trailing" secondItem="pyk-ne-JeM" secondAttribute="trailing" id="chk-q8-hgZ"/>
                                <constraint firstItem="W2A-PE-Zq8" firstAttribute="top" secondItem="GVG-mQ-5A4" secondAttribute="bottom" constant="38" id="l5Z-U6-M2g"/>
                            </constraints>
                        </view>
                    </subviews>
@@ -207,7 +342,7 @@
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstAttribute="bottomMargin" secondItem="Jbe-CY-MmI" secondAttribute="bottom" id="Btj-dx-XBF"/>
                <constraint firstItem="Jbe-CY-MmI" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="NG7-gf-ggs"/>
                <constraint firstItem="Jbe-CY-MmI" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="topMargin" id="Fcm-pV-uQH"/>
                <constraint firstAttribute="trailing" secondItem="Jbe-CY-MmI" secondAttribute="trailing" id="OdW-Am-JXo"/>
                <constraint firstItem="Jbe-CY-MmI" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="rgC-is-DeR"/>
            </constraints>
@@ -215,14 +350,18 @@
        </view>
    </objects>
    <resources>
        <image name="btn_map_local" width="30" height="30"/>
        <image name="btn_setting_find" width="37" height="37"/>
        <image name="icon_aboutUs" width="48" height="36"/>
        <image name="icon_customer" width="45" height="38"/>
        <image name="icon_vip_medal" width="16" height="16"/>
        <namedColor name="F6F6F6">
            <color red="0.9649999737739563" green="0.9649999737739563" blue="0.9649999737739563" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
        <systemColor name="systemGroupedBackgroundColor">
            <color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/WorldCupContentApplyInputVC.swift
New file
@@ -0,0 +1,29 @@
//
//  WorldCupContentApplyInputVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
class WorldCupContentApplyInputVC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    /*
    // MARK: - Navigation
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */
}
WanPai/Root/Search/VC/WorldCupContentApplyInputVC.xib
New file
@@ -0,0 +1,679 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WorldCupContentApplyInputVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d0O-dD-t7J">
                    <rect key="frame" x="0.0" y="59" width="393" height="711"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WO4-Rx-Gdq">
                            <rect key="frame" x="0.0" y="0.0" width="393" height="960.66666666666663"/>
                            <subviews>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iHH-PB-5zL">
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="220"/>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                    <constraints>
                                        <constraint firstAttribute="width" secondItem="iHH-PB-5zL" secondAttribute="height" multiplier="1:0.56" id="lTW-40-rWe"/>
                                    </constraints>
                                </view>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="IJF-wN-cS1">
                                    <rect key="frame" x="0.0" y="219.99999999999994" width="393" height="740.66666666666652"/>
                                    <subviews>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="k1X-n1-EzF">
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="52"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" horizontalCompressionResistancePriority="250" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Xa-dp-XwP">
                                                    <rect key="frame" x="13.999999999999998" y="14" width="16.333333333333329" height="28"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="25" id="ETB-PF-7N6"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xVk-Kj-DRY">
                                                    <rect key="frame" x="14" y="51" width="379" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="deH-R4-ol4"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IQk-5x-j1y">
                                                    <rect key="frame" x="367.33333333333331" y="15.333333333333316" width="11.666666666666686" height="21.666666666666671"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                                                    <color key="textColor" name="FE6E0D"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_hot_1" translatesAutoresizingMaskIntoConstraints="NO" id="YYf-Qa-yXX">
                                                    <rect key="frame" x="344.33333333333331" y="13" width="19" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="18.859999999999999" id="22p-RB-Osz"/>
                                                        <constraint firstAttribute="height" constant="22" id="GrN-wd-cUC"/>
                                                    </constraints>
                                                </imageView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstAttribute="trailing" secondItem="IQk-5x-j1y" secondAttribute="trailing" constant="14" id="0dG-f4-qgt"/>
                                                <constraint firstAttribute="bottom" secondItem="xVk-Kj-DRY" secondAttribute="bottom" id="3dy-57-mY7"/>
                                                <constraint firstItem="IQk-5x-j1y" firstAttribute="leading" secondItem="YYf-Qa-yXX" secondAttribute="trailing" constant="4" id="5p6-ST-z53"/>
                                                <constraint firstAttribute="trailing" secondItem="xVk-Kj-DRY" secondAttribute="trailing" id="Fv8-sG-QV9"/>
                                                <constraint firstItem="YYf-Qa-yXX" firstAttribute="centerY" secondItem="k1X-n1-EzF" secondAttribute="centerY" constant="-2" id="Iaa-ht-pJu"/>
                                                <constraint firstItem="IQk-5x-j1y" firstAttribute="centerY" secondItem="k1X-n1-EzF" secondAttribute="centerY" id="OeV-sD-mfd"/>
                                                <constraint firstItem="xVk-Kj-DRY" firstAttribute="leading" secondItem="k1X-n1-EzF" secondAttribute="leading" constant="14" id="gCh-C0-DsH"/>
                                                <constraint firstItem="0Xa-dp-XwP" firstAttribute="top" secondItem="k1X-n1-EzF" secondAttribute="top" constant="14" id="oLY-4v-vJZ"/>
                                                <constraint firstItem="xVk-Kj-DRY" firstAttribute="top" secondItem="0Xa-dp-XwP" secondAttribute="bottom" constant="9" id="sps-pd-jLB"/>
                                                <constraint firstItem="0Xa-dp-XwP" firstAttribute="leading" secondItem="k1X-n1-EzF" secondAttribute="leading" constant="14" id="zFY-4u-fUx"/>
                                            </constraints>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="2"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </view>
                                        <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="14a-Wt-CUA">
                                            <rect key="frame" x="0.0" y="52" width="393" height="380.33333333333331"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="m2Y-Gb-mqM">
                                                    <rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZV1-eV-YLd">
                                                            <rect key="frame" x="14" y="18" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="32a-ED-JNt"/>
                                                                <constraint firstAttribute="height" constant="4" id="4xH-Pq-Gaw"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="截止报名时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IrW-dH-dqc">
                                                            <rect key="frame" x="22" y="13" width="73.666666666666671" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="u82-O5-aYe">
                                                            <rect key="frame" x="22" y="35.333333333333314" width="11.666666666666664" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="ZV1-eV-YLd" firstAttribute="top" secondItem="m2Y-Gb-mqM" secondAttribute="top" constant="18" id="AdP-UB-P16"/>
                                                        <constraint firstAttribute="height" constant="60" id="FXC-XG-lH9"/>
                                                        <constraint firstItem="u82-O5-aYe" firstAttribute="leading" secondItem="IrW-dH-dqc" secondAttribute="leading" id="W7c-4y-v3w"/>
                                                        <constraint firstItem="IrW-dH-dqc" firstAttribute="centerY" secondItem="ZV1-eV-YLd" secondAttribute="centerY" id="cNt-ay-Hdc"/>
                                                        <constraint firstItem="IrW-dH-dqc" firstAttribute="leading" secondItem="ZV1-eV-YLd" secondAttribute="trailing" constant="4" id="ffP-w4-hjp"/>
                                                        <constraint firstItem="ZV1-eV-YLd" firstAttribute="leading" secondItem="m2Y-Gb-mqM" secondAttribute="leading" constant="14" id="kqf-zu-UVf"/>
                                                        <constraint firstItem="u82-O5-aYe" firstAttribute="top" secondItem="IrW-dH-dqc" secondAttribute="bottom" constant="8" id="tPD-Lv-EC4"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="J7X-7e-3ZV">
                                                    <rect key="frame" x="0.0" y="60" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IGH-qd-QdU">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="M6l-qD-gM8"/>
                                                                <constraint firstAttribute="height" constant="4" id="gm9-5q-K9Z"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="开始时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="k0a-1L-bTy">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="da2-LT-7vP">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="IGH-qd-QdU" firstAttribute="leading" secondItem="J7X-7e-3ZV" secondAttribute="leading" constant="14" id="1E3-qJ-vu9"/>
                                                        <constraint firstItem="k0a-1L-bTy" firstAttribute="leading" secondItem="IGH-qd-QdU" secondAttribute="trailing" constant="4" id="68s-Dr-raS"/>
                                                        <constraint firstItem="IGH-qd-QdU" firstAttribute="top" secondItem="J7X-7e-3ZV" secondAttribute="top" constant="11" id="IQa-xE-mRx"/>
                                                        <constraint firstItem="da2-LT-7vP" firstAttribute="leading" secondItem="k0a-1L-bTy" secondAttribute="leading" id="Jaj-ca-3W9"/>
                                                        <constraint firstAttribute="height" constant="46" id="WEd-aR-Hgt"/>
                                                        <constraint firstItem="da2-LT-7vP" firstAttribute="top" secondItem="k0a-1L-bTy" secondAttribute="bottom" constant="8" id="fHq-Cf-VTu"/>
                                                        <constraint firstItem="k0a-1L-bTy" firstAttribute="centerY" secondItem="IGH-qd-QdU" secondAttribute="centerY" id="htC-Nr-ELd"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="v3O-7N-rmL">
                                                    <rect key="frame" x="0.0" y="106" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NDp-Oj-Z2I">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="W0D-zc-rpG"/>
                                                                <constraint firstAttribute="height" constant="4" id="yuL-Rk-etJ"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QGU-ac-iPD">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KWP-oW-KNC">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="QGU-ac-iPD" firstAttribute="centerY" secondItem="NDp-Oj-Z2I" secondAttribute="centerY" id="0C4-yb-AH9"/>
                                                        <constraint firstAttribute="height" constant="46" id="HEB-Xn-AUE"/>
                                                        <constraint firstItem="NDp-Oj-Z2I" firstAttribute="leading" secondItem="v3O-7N-rmL" secondAttribute="leading" constant="14" id="HsH-45-Gm3"/>
                                                        <constraint firstItem="KWP-oW-KNC" firstAttribute="top" secondItem="QGU-ac-iPD" secondAttribute="bottom" constant="8" id="S3n-OW-vPe"/>
                                                        <constraint firstItem="KWP-oW-KNC" firstAttribute="leading" secondItem="QGU-ac-iPD" secondAttribute="leading" id="U1d-Qy-VJu"/>
                                                        <constraint firstItem="NDp-Oj-Z2I" firstAttribute="top" secondItem="v3O-7N-rmL" secondAttribute="top" constant="11" id="Uhj-wb-KYN"/>
                                                        <constraint firstItem="QGU-ac-iPD" firstAttribute="leading" secondItem="NDp-Oj-Z2I" secondAttribute="trailing" constant="4" id="XTb-Dg-44g"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qId-co-idC">
                                                    <rect key="frame" x="0.0" y="152" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mfo-6J-oqN">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="GXG-wA-fY5"/>
                                                                <constraint firstAttribute="width" constant="4" id="dI7-gB-6gk"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名年龄" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vC4-SB-uvi">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q5v-M5-mW9">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="46" id="QIG-8R-zvY"/>
                                                        <constraint firstItem="vC4-SB-uvi" firstAttribute="centerY" secondItem="mfo-6J-oqN" secondAttribute="centerY" id="TI4-yf-nt0"/>
                                                        <constraint firstItem="mfo-6J-oqN" firstAttribute="top" secondItem="qId-co-idC" secondAttribute="top" constant="11" id="aFM-zi-yeE"/>
                                                        <constraint firstItem="Q5v-M5-mW9" firstAttribute="leading" secondItem="vC4-SB-uvi" secondAttribute="leading" id="mhQ-Qj-11Y"/>
                                                        <constraint firstItem="vC4-SB-uvi" firstAttribute="leading" secondItem="mfo-6J-oqN" secondAttribute="trailing" constant="4" id="nkf-8o-LKJ"/>
                                                        <constraint firstItem="Q5v-M5-mW9" firstAttribute="top" secondItem="vC4-SB-uvi" secondAttribute="bottom" constant="8" id="rtf-Q1-36I"/>
                                                        <constraint firstItem="mfo-6J-oqN" firstAttribute="leading" secondItem="qId-co-idC" secondAttribute="leading" constant="14" id="yLO-hg-2bD"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="l9R-Ga-fLH">
                                                    <rect key="frame" x="0.0" y="198" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="okM-ez-6Ik">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="KhN-fK-aHU"/>
                                                                <constraint firstAttribute="width" constant="4" id="Pp4-HY-dWW"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛者性别" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="H3I-yA-Bya">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="61.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TnZ-pd-b7f">
                                                            <rect key="frame" x="22" y="28.333333333333368" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="okM-ez-6Ik" firstAttribute="top" secondItem="l9R-Ga-fLH" secondAttribute="top" constant="11" id="0BW-bd-iEI"/>
                                                        <constraint firstItem="TnZ-pd-b7f" firstAttribute="leading" secondItem="H3I-yA-Bya" secondAttribute="leading" id="GND-FZ-kue"/>
                                                        <constraint firstItem="H3I-yA-Bya" firstAttribute="leading" secondItem="okM-ez-6Ik" secondAttribute="trailing" constant="4" id="KlC-rP-ex6"/>
                                                        <constraint firstItem="TnZ-pd-b7f" firstAttribute="top" secondItem="H3I-yA-Bya" secondAttribute="bottom" constant="8" id="Rbk-Il-vl2"/>
                                                        <constraint firstItem="okM-ez-6Ik" firstAttribute="leading" secondItem="l9R-Ga-fLH" secondAttribute="leading" constant="14" id="pnu-oL-m8E"/>
                                                        <constraint firstItem="H3I-yA-Bya" firstAttribute="centerY" secondItem="okM-ez-6Ik" secondAttribute="centerY" id="voF-RF-Jt3"/>
                                                        <constraint firstAttribute="height" constant="46" id="zbm-p5-z06"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="e17-4R-Ahj">
                                                    <rect key="frame" x="0.0" y="244.00000000000003" width="393" height="60.333333333333343"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ldf-Hp-3w2">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="U17-v1-p3b"/>
                                                                <constraint firstAttribute="width" constant="4" id="U1Q-0N-UEM"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛地址" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HZH-XR-Cyd">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mmh-IM-z9o">
                                                            <rect key="frame" x="22" y="28.333333333333371" width="335.33333333333331" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="1000" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7pR-VP-V2H">
                                                            <rect key="frame" x="367.33333333333331" y="35.666666666666629" width="11.666666666666686" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="Ldf-Hp-3w2" firstAttribute="leading" secondItem="e17-4R-Ahj" secondAttribute="leading" constant="14" id="0n0-H8-QvO"/>
                                                        <constraint firstItem="Ldf-Hp-3w2" firstAttribute="top" secondItem="e17-4R-Ahj" secondAttribute="top" constant="11" id="1uK-29-NkQ"/>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="46" id="5nx-G0-BBh"/>
                                                        <constraint firstItem="Mmh-IM-z9o" firstAttribute="top" secondItem="HZH-XR-Cyd" secondAttribute="bottom" constant="8" id="6gb-Iw-Quj"/>
                                                        <constraint firstAttribute="trailing" secondItem="7pR-VP-V2H" secondAttribute="trailing" constant="14" id="Avh-96-hiK"/>
                                                        <constraint firstItem="HZH-XR-Cyd" firstAttribute="centerY" secondItem="Ldf-Hp-3w2" secondAttribute="centerY" id="GJM-8B-sO9"/>
                                                        <constraint firstItem="Mmh-IM-z9o" firstAttribute="leading" secondItem="HZH-XR-Cyd" secondAttribute="leading" id="O2f-wQ-98J"/>
                                                        <constraint firstItem="7pR-VP-V2H" firstAttribute="leading" secondItem="Mmh-IM-z9o" secondAttribute="trailing" constant="10" id="WnC-27-eRf"/>
                                                        <constraint firstAttribute="bottom" secondItem="Mmh-IM-z9o" secondAttribute="bottom" constant="3.3300000000000001" id="iUN-GV-9Dy"/>
                                                        <constraint firstItem="HZH-XR-Cyd" firstAttribute="leading" secondItem="Ldf-Hp-3w2" secondAttribute="trailing" constant="4" id="lsJ-A8-9Zs"/>
                                                        <constraint firstItem="7pR-VP-V2H" firstAttribute="centerY" secondItem="Mmh-IM-z9o" secondAttribute="centerY" id="txZ-3b-LNW"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eHe-nQ-dnr">
                                                    <rect key="frame" x="0.0" y="304.33333333333337" width="393" height="76"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="98j-P8-3ZM">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="FHF-wa-ffN"/>
                                                                <constraint firstAttribute="width" constant="4" id="G3r-RV-m7x"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛赛点" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WIP-Iv-LJH">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h8z-hN-Sq9">
                                                            <rect key="frame" x="22" y="28.333333333333258" width="285" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AgA-ET-N0O">
                                                            <rect key="frame" x="329" y="29" width="50" height="27"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="50" id="ENG-cZ-Ucn"/>
                                                            </constraints>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                            <state key="normal" title="查看更多">
                                                                <color key="titleColor" name="FE6E0D"/>
                                                            </state>
                                                        </button>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="AgA-ET-N0O" firstAttribute="leading" secondItem="h8z-hN-Sq9" secondAttribute="trailing" constant="22" id="1XR-bZ-Fbo"/>
                                                        <constraint firstItem="98j-P8-3ZM" firstAttribute="leading" secondItem="eHe-nQ-dnr" secondAttribute="leading" constant="14" id="5pu-FD-Oj7"/>
                                                        <constraint firstAttribute="bottom" secondItem="h8z-hN-Sq9" secondAttribute="bottom" constant="19" id="Ekf-hy-Z9a"/>
                                                        <constraint firstItem="WIP-Iv-LJH" firstAttribute="leading" secondItem="98j-P8-3ZM" secondAttribute="trailing" constant="4" id="HsS-4E-iwy"/>
                                                        <constraint firstItem="h8z-hN-Sq9" firstAttribute="leading" secondItem="WIP-Iv-LJH" secondAttribute="leading" id="KWd-zr-GVw"/>
                                                        <constraint firstItem="AgA-ET-N0O" firstAttribute="centerY" secondItem="h8z-hN-Sq9" secondAttribute="centerY" id="OzY-BZ-RrO"/>
                                                        <constraint firstAttribute="trailing" secondItem="AgA-ET-N0O" secondAttribute="trailing" constant="14" id="SZ7-NM-Tky"/>
                                                        <constraint firstItem="98j-P8-3ZM" firstAttribute="top" secondItem="eHe-nQ-dnr" secondAttribute="top" constant="11" id="Xlw-ba-qOQ"/>
                                                        <constraint firstItem="h8z-hN-Sq9" firstAttribute="top" secondItem="WIP-Iv-LJH" secondAttribute="bottom" constant="8" id="uPi-IY-ltN"/>
                                                        <constraint firstItem="WIP-Iv-LJH" firstAttribute="centerY" secondItem="98j-P8-3ZM" secondAttribute="centerY" id="wkO-gM-bv3"/>
                                                    </constraints>
                                                </view>
                                            </subviews>
                                        </stackView>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aGT-jP-y75">
                                            <rect key="frame" x="0.0" y="432.33333333333337" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dAY-sB-Oy6">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="Js5-Ad-H5C"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="00C-zB-N9A">
                                                    <rect key="frame" x="13" y="114" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="2Ww-G7-0ug"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="活动费用" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oPd-tE-l3b">
                                                    <rect key="frame" x="14" y="15" width="365" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="SW6-bw-VJg">
                                                    <rect key="frame" x="14" y="48" width="365" height="52"/>
                                                    <subviews>
                                                        <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="YLS-4m-YQ9">
                                                            <rect key="frame" x="0.0" y="0.0" width="365" height="20"/>
                                                            <subviews>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eMQ-rk-ufL">
                                                                    <rect key="frame" x="0.0" y="0.0" width="182.66666666666666" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="支付:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aTX-fh-UE9">
                                                                            <rect key="frame" x="0.0" y="0.0" width="43" height="20"/>
                                                                            <constraints>
                                                                                <constraint firstAttribute="width" constant="43" id="ONi-tS-0mw"/>
                                                                            </constraints>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="¥0/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="W3G-c7-g9n">
                                                                            <rect key="frame" x="43" y="0.0" width="139.66666666666666" height="20"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstItem="W3G-c7-g9n" firstAttribute="leading" secondItem="aTX-fh-UE9" secondAttribute="trailing" id="ERA-51-Asw"/>
                                                                        <constraint firstItem="W3G-c7-g9n" firstAttribute="centerY" secondItem="aTX-fh-UE9" secondAttribute="centerY" id="I3N-Uv-aAq"/>
                                                                        <constraint firstAttribute="trailing" secondItem="W3G-c7-g9n" secondAttribute="trailing" id="L2i-kI-Bij"/>
                                                                        <constraint firstItem="W3G-c7-g9n" firstAttribute="top" secondItem="eMQ-rk-ufL" secondAttribute="top" id="L5f-CK-0ye"/>
                                                                        <constraint firstAttribute="bottom" secondItem="aTX-fh-UE9" secondAttribute="bottom" id="Yms-4b-eYA"/>
                                                                        <constraint firstItem="aTX-fh-UE9" firstAttribute="leading" secondItem="eMQ-rk-ufL" secondAttribute="leading" id="cpc-Nf-nXI"/>
                                                                        <constraint firstItem="aTX-fh-UE9" firstAttribute="top" secondItem="eMQ-rk-ufL" secondAttribute="top" id="fqi-P8-x32"/>
                                                                        <constraint firstAttribute="bottom" secondItem="W3G-c7-g9n" secondAttribute="bottom" id="oJ6-0D-Sje"/>
                                                                        <constraint firstAttribute="height" constant="20" id="vW1-uu-1kl"/>
                                                                    </constraints>
                                                                </view>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wNH-nX-al9">
                                                                    <rect key="frame" x="182.66666666666663" y="0.0" width="182.33333333333337" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="玩湃币:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5zU-uC-sCE">
                                                                            <rect key="frame" x="0.0" y="1.6666666666666288" width="50.333333333333336" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0币/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cVX-U3-mzN">
                                                                            <rect key="frame" x="50.333333333333343" y="1.6666666666666288" width="47.333333333333343" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstItem="5zU-uC-sCE" firstAttribute="centerY" secondItem="wNH-nX-al9" secondAttribute="centerY" id="19D-1p-6Ss"/>
                                                                        <constraint firstItem="cVX-U3-mzN" firstAttribute="leading" secondItem="5zU-uC-sCE" secondAttribute="trailing" id="D3n-nM-LWu"/>
                                                                        <constraint firstItem="cVX-U3-mzN" firstAttribute="centerY" secondItem="5zU-uC-sCE" secondAttribute="centerY" id="MGE-O6-MU6"/>
                                                                        <constraint firstItem="5zU-uC-sCE" firstAttribute="leading" secondItem="wNH-nX-al9" secondAttribute="leading" id="gJw-6x-jRr"/>
                                                                        <constraint firstAttribute="height" constant="20" id="tad-e0-9l4"/>
                                                                    </constraints>
                                                                </view>
                                                            </subviews>
                                                        </stackView>
                                                        <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="3Dp-AY-2Wf">
                                                            <rect key="frame" x="0.0" y="32" width="365" height="20"/>
                                                            <subviews>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TGs-DL-QOC">
                                                                    <rect key="frame" x="0.0" y="0.0" width="365" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="课时:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dre-ap-xmP">
                                                                            <rect key="frame" x="0.0" y="1.6666666666666288" width="43" height="17"/>
                                                                            <constraints>
                                                                                <constraint firstAttribute="width" constant="43" id="9d0-Mx-3pc"/>
                                                                            </constraints>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0课时/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0HL-O0-GC6">
                                                                            <rect key="frame" x="43" y="1.6666666666666288" width="322" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstAttribute="height" constant="20" id="3wY-eq-tBC"/>
                                                                        <constraint firstItem="0HL-O0-GC6" firstAttribute="leading" secondItem="dre-ap-xmP" secondAttribute="trailing" id="5U5-Z8-uiP"/>
                                                                        <constraint firstItem="dre-ap-xmP" firstAttribute="leading" secondItem="TGs-DL-QOC" secondAttribute="leading" id="BgY-WU-NZU"/>
                                                                        <constraint firstItem="0HL-O0-GC6" firstAttribute="centerY" secondItem="dre-ap-xmP" secondAttribute="centerY" id="Fzc-XM-cuO"/>
                                                                        <constraint firstAttribute="trailing" secondItem="0HL-O0-GC6" secondAttribute="trailing" id="ILT-nR-rO3"/>
                                                                        <constraint firstItem="dre-ap-xmP" firstAttribute="centerY" secondItem="TGs-DL-QOC" secondAttribute="centerY" id="N3m-ZC-TY3"/>
                                                                    </constraints>
                                                                </view>
                                                            </subviews>
                                                        </stackView>
                                                    </subviews>
                                                </stackView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstAttribute="trailing" secondItem="SW6-bw-VJg" secondAttribute="trailing" constant="14" id="0A1-Bf-GR8"/>
                                                <constraint firstAttribute="trailing" secondItem="oPd-tE-l3b" secondAttribute="trailing" constant="14" id="BGx-cV-M5B"/>
                                                <constraint firstItem="oPd-tE-l3b" firstAttribute="top" secondItem="dAY-sB-Oy6" secondAttribute="bottom" constant="14" id="Bug-xi-rsJ"/>
                                                <constraint firstItem="dAY-sB-Oy6" firstAttribute="leading" secondItem="aGT-jP-y75" secondAttribute="leading" constant="13" id="OI3-Nv-pSf"/>
                                                <constraint firstAttribute="trailing" secondItem="dAY-sB-Oy6" secondAttribute="trailing" id="P4j-b8-f1D"/>
                                                <constraint firstItem="00C-zB-N9A" firstAttribute="leading" secondItem="aGT-jP-y75" secondAttribute="leading" constant="13" id="ZpW-54-jYo"/>
                                                <constraint firstItem="SW6-bw-VJg" firstAttribute="leading" secondItem="aGT-jP-y75" secondAttribute="leading" constant="14" id="doC-W6-YAq"/>
                                                <constraint firstItem="00C-zB-N9A" firstAttribute="top" secondItem="SW6-bw-VJg" secondAttribute="bottom" constant="14" id="e94-Bx-fY0"/>
                                                <constraint firstAttribute="trailing" secondItem="00C-zB-N9A" secondAttribute="trailing" id="hcX-oq-8zQ"/>
                                                <constraint firstItem="SW6-bw-VJg" firstAttribute="top" secondItem="oPd-tE-l3b" secondAttribute="bottom" constant="12" id="km2-TG-Obh"/>
                                                <constraint firstAttribute="height" constant="115" id="nnO-7y-jH3"/>
                                                <constraint firstAttribute="bottom" secondItem="00C-zB-N9A" secondAttribute="bottom" id="oM7-og-cch"/>
                                                <constraint firstItem="oPd-tE-l3b" firstAttribute="leading" secondItem="aGT-jP-y75" secondAttribute="leading" constant="14" id="soz-s5-g6q"/>
                                                <constraint firstItem="dAY-sB-Oy6" firstAttribute="top" secondItem="aGT-jP-y75" secondAttribute="top" id="uT1-3g-2a0"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Xyq-vd-5Sz">
                                            <rect key="frame" x="0.0" y="547.33333333333337" width="393" height="149.33333333333337"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ub3-DL-aH6">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="xec-5c-ydr"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事人员" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ldY-d5-HF6">
                                                    <rect key="frame" x="14" y="15" width="65.333333333333329" height="29"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="vdV-Kg-Dhx">
                                                    <rect key="frame" x="0.0" y="49.333333333333258" width="393" height="100"/>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="7Nj-Ch-Bss"/>
                                                    </constraints>
                                                </tableView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstAttribute="bottom" secondItem="vdV-Kg-Dhx" secondAttribute="bottom" id="4i6-s6-fOL"/>
                                                <constraint firstItem="vdV-Kg-Dhx" firstAttribute="leading" secondItem="Xyq-vd-5Sz" secondAttribute="leading" id="Acb-8j-W2N"/>
                                                <constraint firstAttribute="trailing" secondItem="ub3-DL-aH6" secondAttribute="trailing" id="DWP-md-W2S"/>
                                                <constraint firstItem="ub3-DL-aH6" firstAttribute="leading" secondItem="Xyq-vd-5Sz" secondAttribute="leading" constant="13" id="Vzl-fJ-G2Y"/>
                                                <constraint firstItem="vdV-Kg-Dhx" firstAttribute="top" secondItem="ldY-d5-HF6" secondAttribute="bottom" constant="5.5" id="go9-ce-gRs"/>
                                                <constraint firstItem="ub3-DL-aH6" firstAttribute="top" secondItem="Xyq-vd-5Sz" secondAttribute="top" id="icE-L6-uAK"/>
                                                <constraint firstItem="ldY-d5-HF6" firstAttribute="top" secondItem="ub3-DL-aH6" secondAttribute="bottom" constant="14" id="nzY-lw-16n"/>
                                                <constraint firstItem="ldY-d5-HF6" firstAttribute="leading" secondItem="Xyq-vd-5Sz" secondAttribute="leading" constant="14" id="vtH-NU-eJN"/>
                                                <constraint firstAttribute="trailing" secondItem="vdV-Kg-Dhx" secondAttribute="trailing" id="whK-0R-Dtm"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fch-vq-WNu">
                                            <rect key="frame" x="0.0" y="696.66666666666663" width="393" height="44"/>
                                            <subviews>
                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="q5y-in-bNV">
                                                    <rect key="frame" x="14" y="9.6666666666667425" width="25" height="25"/>
                                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                    <state key="normal" image="btn_choose"/>
                                                    <state key="selected" image="btn_choose_s"/>
                                                </button>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我已阅读并同意" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VLx-ri-X99">
                                                    <rect key="frame" x="48" y="15" width="86" height="14.333333333333336"/>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="《社区世界杯报名协议》" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="X7e-Ua-008">
                                                    <rect key="frame" x="136" y="15" width="123" height="14.333333333333336"/>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                    <color key="textColor" red="0.0" green="0.47058823529411764" blue="0.80392156862745101" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="q5y-in-bNV" firstAttribute="centerY" secondItem="fch-vq-WNu" secondAttribute="centerY" id="9Co-Iy-tMh"/>
                                                <constraint firstItem="VLx-ri-X99" firstAttribute="leading" secondItem="q5y-in-bNV" secondAttribute="trailing" constant="9" id="Fc8-qF-wG0"/>
                                                <constraint firstAttribute="height" constant="44" id="eqp-mh-FIe"/>
                                                <constraint firstItem="X7e-Ua-008" firstAttribute="centerY" secondItem="q5y-in-bNV" secondAttribute="centerY" id="hFC-ME-4lm"/>
                                                <constraint firstItem="VLx-ri-X99" firstAttribute="centerY" secondItem="fch-vq-WNu" secondAttribute="centerY" id="lwA-kp-bcm"/>
                                                <constraint firstItem="X7e-Ua-008" firstAttribute="leading" secondItem="VLx-ri-X99" secondAttribute="trailing" constant="2" id="vAK-1n-fDh"/>
                                                <constraint firstItem="q5y-in-bNV" firstAttribute="leading" secondItem="fch-vq-WNu" secondAttribute="leading" constant="14" id="xd7-B4-xVU"/>
                                            </constraints>
                                        </view>
                                    </subviews>
                                </stackView>
                            </subviews>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstItem="IJF-wN-cS1" firstAttribute="leading" secondItem="WO4-Rx-Gdq" secondAttribute="leading" id="2eY-bq-jRN"/>
                                <constraint firstAttribute="bottom" secondItem="IJF-wN-cS1" secondAttribute="bottom" id="CsF-Ry-94g"/>
                                <constraint firstItem="iHH-PB-5zL" firstAttribute="top" secondItem="WO4-Rx-Gdq" secondAttribute="top" id="Pro-dd-2Es"/>
                                <constraint firstAttribute="trailing" secondItem="iHH-PB-5zL" secondAttribute="trailing" id="ULI-tf-2YJ"/>
                                <constraint firstAttribute="trailing" secondItem="IJF-wN-cS1" secondAttribute="trailing" id="pkD-jh-N6P"/>
                                <constraint firstItem="iHH-PB-5zL" firstAttribute="leading" secondItem="WO4-Rx-Gdq" secondAttribute="leading" id="tEt-1q-mO6"/>
                                <constraint firstItem="IJF-wN-cS1" firstAttribute="top" secondItem="iHH-PB-5zL" secondAttribute="bottom" id="tv5-7T-iYm"/>
                            </constraints>
                        </view>
                    </subviews>
                    <constraints>
                        <constraint firstItem="WO4-Rx-Gdq" firstAttribute="centerX" secondItem="d0O-dD-t7J" secondAttribute="centerX" id="0Qi-Pu-73z"/>
                        <constraint firstAttribute="bottom" secondItem="WO4-Rx-Gdq" secondAttribute="bottom" constant="15" id="Prw-WG-NFe"/>
                        <constraint firstAttribute="trailing" secondItem="WO4-Rx-Gdq" secondAttribute="trailing" id="RXB-8v-eGN"/>
                        <constraint firstItem="WO4-Rx-Gdq" firstAttribute="top" secondItem="d0O-dD-t7J" secondAttribute="top" id="YLL-Qi-QPQ"/>
                        <constraint firstItem="WO4-Rx-Gdq" firstAttribute="leading" secondItem="d0O-dD-t7J" secondAttribute="leading" id="vo5-JG-jpb"/>
                    </constraints>
                </scrollView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kdj-bD-RIR">
                    <rect key="frame" x="0.0" y="770" width="393" height="48"/>
                    <color key="backgroundColor" name="FE6E0D"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="48" id="c1B-2f-SYW"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" title="立即报名"/>
                </button>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="kdj-bD-RIR" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="1co-8i-A9P"/>
                <constraint firstItem="kdj-bD-RIR" firstAttribute="trailing" secondItem="fnl-2z-Ty3" secondAttribute="trailing" id="9yt-ZO-hYa"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="kdj-bD-RIR" secondAttribute="bottom" id="S9J-V1-Yqz"/>
                <constraint firstItem="kdj-bD-RIR" firstAttribute="top" secondItem="d0O-dD-t7J" secondAttribute="bottom" id="TJb-uY-LzR"/>
                <constraint firstItem="d0O-dD-t7J" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="topMargin" id="U9h-yq-JDr"/>
                <constraint firstAttribute="trailing" secondItem="d0O-dD-t7J" secondAttribute="trailing" id="Vaf-dW-a13"/>
                <constraint firstItem="d0O-dD-t7J" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="l4X-LJ-oNR"/>
            </constraints>
            <point key="canvasLocation" x="140" y="21"/>
        </view>
    </objects>
    <resources>
        <image name="btn_choose" width="25" height="25"/>
        <image name="btn_choose_s" width="25" height="25"/>
        <image name="icon_hot_1" width="24" height="28"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/WorldCupContentApplyVC.swift
New file
@@ -0,0 +1,22 @@
//
//  WorldCupContentApplyVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
class WorldCupContentApplyVC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "社区世界杯"
    }
                @IBAction func applyAction(_ sender: UIButton) {
                                let vc = WorldCupContentApplyInputVC()
                                push(vc: vc)
                }
}
WanPai/Root/Search/VC/WorldCupContentApplyVC.xib
New file
@@ -0,0 +1,698 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WorldCupContentApplyVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kfP-hX-Uro">
                    <rect key="frame" x="0.0" y="0.0" width="393" height="770"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Znd-Yy-pV8">
                            <rect key="frame" x="0.0" y="0.0" width="393" height="1030.6666666666667"/>
                            <subviews>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rEE-UF-kCK">
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="220"/>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                    <constraints>
                                        <constraint firstAttribute="width" secondItem="rEE-UF-kCK" secondAttribute="height" multiplier="1:0.56" id="BTA-vT-ror"/>
                                    </constraints>
                                </view>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="m0C-wO-vqk">
                                    <rect key="frame" x="0.0" y="219.99999999999994" width="393" height="810.66666666666652"/>
                                    <subviews>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wcT-mn-66z">
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="52"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" horizontalCompressionResistancePriority="250" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tkR-Qw-6Qd">
                                                    <rect key="frame" x="13.999999999999998" y="14" width="16.333333333333329" height="28"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="25" id="5EP-7c-ki7"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jd8-Rb-YuY">
                                                    <rect key="frame" x="14" y="51" width="379" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="GUo-Ud-FAx"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KUT-ZO-3d1">
                                                    <rect key="frame" x="367.33333333333331" y="15.333333333333345" width="11.666666666666686" height="21.666666666666671"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                                                    <color key="textColor" name="FE6E0D"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_hot_1" translatesAutoresizingMaskIntoConstraints="NO" id="Zd4-RU-V1f">
                                                    <rect key="frame" x="344.33333333333331" y="13" width="19" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="18.859999999999999" id="KUN-xb-orE"/>
                                                        <constraint firstAttribute="height" constant="22" id="pn6-FY-Yr1"/>
                                                    </constraints>
                                                </imageView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="jd8-Rb-YuY" firstAttribute="leading" secondItem="wcT-mn-66z" secondAttribute="leading" constant="14" id="2UA-6n-26Z"/>
                                                <constraint firstAttribute="trailing" secondItem="KUT-ZO-3d1" secondAttribute="trailing" constant="14" id="4PI-h2-aon"/>
                                                <constraint firstItem="KUT-ZO-3d1" firstAttribute="leading" secondItem="Zd4-RU-V1f" secondAttribute="trailing" constant="4" id="Hrn-RJ-YMZ"/>
                                                <constraint firstItem="Zd4-RU-V1f" firstAttribute="centerY" secondItem="wcT-mn-66z" secondAttribute="centerY" constant="-2" id="K9C-5X-XbL"/>
                                                <constraint firstItem="tkR-Qw-6Qd" firstAttribute="top" secondItem="wcT-mn-66z" secondAttribute="top" constant="14" id="b37-mr-sEP"/>
                                                <constraint firstItem="jd8-Rb-YuY" firstAttribute="top" secondItem="tkR-Qw-6Qd" secondAttribute="bottom" constant="9" id="gew-Pb-eXt"/>
                                                <constraint firstItem="tkR-Qw-6Qd" firstAttribute="leading" secondItem="wcT-mn-66z" secondAttribute="leading" constant="14" id="hta-Wj-MHo"/>
                                                <constraint firstAttribute="bottom" secondItem="jd8-Rb-YuY" secondAttribute="bottom" id="itl-PF-pTN"/>
                                                <constraint firstAttribute="trailing" secondItem="jd8-Rb-YuY" secondAttribute="trailing" id="ySF-XF-orO"/>
                                                <constraint firstItem="KUT-ZO-3d1" firstAttribute="centerY" secondItem="wcT-mn-66z" secondAttribute="centerY" id="ymM-F6-A3v"/>
                                            </constraints>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="2"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </view>
                                        <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="slH-Se-Biq">
                                            <rect key="frame" x="0.0" y="52" width="393" height="380.33333333333331"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Km4-Um-isb">
                                                    <rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="91A-ng-KoK">
                                                            <rect key="frame" x="14" y="18" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="QzC-il-waT"/>
                                                                <constraint firstAttribute="height" constant="4" id="x7O-2j-Fy5"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="截止报名时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Eoi-v2-Ou9">
                                                            <rect key="frame" x="22" y="13" width="73.666666666666671" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Uw0-ht-Y4A">
                                                            <rect key="frame" x="22" y="35.333333333333314" width="11.666666666666664" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="Uw0-ht-Y4A" firstAttribute="top" secondItem="Eoi-v2-Ou9" secondAttribute="bottom" constant="8" id="D27-kr-Nl8"/>
                                                        <constraint firstItem="Eoi-v2-Ou9" firstAttribute="leading" secondItem="91A-ng-KoK" secondAttribute="trailing" constant="4" id="PWu-4D-jHC"/>
                                                        <constraint firstItem="91A-ng-KoK" firstAttribute="leading" secondItem="Km4-Um-isb" secondAttribute="leading" constant="14" id="YU3-qm-S35"/>
                                                        <constraint firstItem="91A-ng-KoK" firstAttribute="top" secondItem="Km4-Um-isb" secondAttribute="top" constant="18" id="hWt-3v-5RG"/>
                                                        <constraint firstItem="Eoi-v2-Ou9" firstAttribute="centerY" secondItem="91A-ng-KoK" secondAttribute="centerY" id="iax-Cv-dtz"/>
                                                        <constraint firstItem="Uw0-ht-Y4A" firstAttribute="leading" secondItem="Eoi-v2-Ou9" secondAttribute="leading" id="noz-P0-kCq"/>
                                                        <constraint firstAttribute="height" constant="60" id="vHm-Bd-xlX"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rWR-sH-mTs">
                                                    <rect key="frame" x="0.0" y="60" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cKk-af-RIX">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="Yfk-vl-4Y5"/>
                                                                <constraint firstAttribute="width" constant="4" id="lM3-J8-3RS"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="开始时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="E0G-QY-dCf">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bNs-tK-h0l">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="E0G-QY-dCf" firstAttribute="leading" secondItem="cKk-af-RIX" secondAttribute="trailing" constant="4" id="3CN-d2-efp"/>
                                                        <constraint firstItem="bNs-tK-h0l" firstAttribute="top" secondItem="E0G-QY-dCf" secondAttribute="bottom" constant="8" id="Bpz-70-xeB"/>
                                                        <constraint firstItem="E0G-QY-dCf" firstAttribute="centerY" secondItem="cKk-af-RIX" secondAttribute="centerY" id="K6f-HP-YO9"/>
                                                        <constraint firstItem="cKk-af-RIX" firstAttribute="top" secondItem="rWR-sH-mTs" secondAttribute="top" constant="11" id="Knf-1k-laU"/>
                                                        <constraint firstAttribute="height" constant="46" id="Z6u-OE-TMs"/>
                                                        <constraint firstItem="bNs-tK-h0l" firstAttribute="leading" secondItem="E0G-QY-dCf" secondAttribute="leading" id="bV3-AG-Mlk"/>
                                                        <constraint firstItem="cKk-af-RIX" firstAttribute="leading" secondItem="rWR-sH-mTs" secondAttribute="leading" constant="14" id="y24-5d-V2L"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iHp-bB-GhW">
                                                    <rect key="frame" x="0.0" y="106" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cQD-hW-Khv">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="OrQ-vw-gt3"/>
                                                                <constraint firstAttribute="width" constant="4" id="nq5-ci-WdA"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="y3f-Ri-Abk">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5Bo-1K-36O">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="5Bo-1K-36O" firstAttribute="top" secondItem="y3f-Ri-Abk" secondAttribute="bottom" constant="8" id="3PE-AW-fS5"/>
                                                        <constraint firstItem="y3f-Ri-Abk" firstAttribute="centerY" secondItem="cQD-hW-Khv" secondAttribute="centerY" id="D3h-yb-sUZ"/>
                                                        <constraint firstItem="5Bo-1K-36O" firstAttribute="leading" secondItem="y3f-Ri-Abk" secondAttribute="leading" id="JEu-Od-Jl4"/>
                                                        <constraint firstAttribute="height" constant="46" id="SGS-mW-EXg"/>
                                                        <constraint firstItem="y3f-Ri-Abk" firstAttribute="leading" secondItem="cQD-hW-Khv" secondAttribute="trailing" constant="4" id="WXa-g6-rYQ"/>
                                                        <constraint firstItem="cQD-hW-Khv" firstAttribute="top" secondItem="iHp-bB-GhW" secondAttribute="top" constant="11" id="WcB-KS-eyv"/>
                                                        <constraint firstItem="cQD-hW-Khv" firstAttribute="leading" secondItem="iHp-bB-GhW" secondAttribute="leading" constant="14" id="aej-iF-OKB"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NjC-YL-7dl">
                                                    <rect key="frame" x="0.0" y="152" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rqM-aB-cHp">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="WJp-K1-qQm"/>
                                                                <constraint firstAttribute="height" constant="4" id="h9Z-An-Mvo"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名年龄" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PWT-C5-wFg">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e1B-PO-EcV">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="PWT-C5-wFg" firstAttribute="centerY" secondItem="rqM-aB-cHp" secondAttribute="centerY" id="AvC-bW-DdF"/>
                                                        <constraint firstItem="PWT-C5-wFg" firstAttribute="leading" secondItem="rqM-aB-cHp" secondAttribute="trailing" constant="4" id="FCE-9l-fOy"/>
                                                        <constraint firstAttribute="height" constant="46" id="I8S-hd-Uuc"/>
                                                        <constraint firstItem="rqM-aB-cHp" firstAttribute="top" secondItem="NjC-YL-7dl" secondAttribute="top" constant="11" id="ddN-Dx-FpL"/>
                                                        <constraint firstItem="rqM-aB-cHp" firstAttribute="leading" secondItem="NjC-YL-7dl" secondAttribute="leading" constant="14" id="glX-gJ-AtH"/>
                                                        <constraint firstItem="e1B-PO-EcV" firstAttribute="leading" secondItem="PWT-C5-wFg" secondAttribute="leading" id="txc-VG-9gP"/>
                                                        <constraint firstItem="e1B-PO-EcV" firstAttribute="top" secondItem="PWT-C5-wFg" secondAttribute="bottom" constant="8" id="v8g-I0-ah6"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pIU-aG-q1y">
                                                    <rect key="frame" x="0.0" y="198" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XWM-5S-Map">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="1ar-H8-bfW"/>
                                                                <constraint firstAttribute="width" constant="4" id="ZYs-Bp-gVR"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛者性别" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="obX-YS-Mg8">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="61.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Kbi-qd-Cnt">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="obX-YS-Mg8" firstAttribute="centerY" secondItem="XWM-5S-Map" secondAttribute="centerY" id="3o6-2u-Tb8"/>
                                                        <constraint firstItem="XWM-5S-Map" firstAttribute="leading" secondItem="pIU-aG-q1y" secondAttribute="leading" constant="14" id="HdJ-7m-LIS"/>
                                                        <constraint firstAttribute="height" constant="46" id="IXF-eQ-WMI"/>
                                                        <constraint firstItem="XWM-5S-Map" firstAttribute="top" secondItem="pIU-aG-q1y" secondAttribute="top" constant="11" id="jD4-gt-auh"/>
                                                        <constraint firstItem="obX-YS-Mg8" firstAttribute="leading" secondItem="XWM-5S-Map" secondAttribute="trailing" constant="4" id="kcb-XU-hyV"/>
                                                        <constraint firstItem="Kbi-qd-Cnt" firstAttribute="leading" secondItem="obX-YS-Mg8" secondAttribute="leading" id="qnO-mV-edu"/>
                                                        <constraint firstItem="Kbi-qd-Cnt" firstAttribute="top" secondItem="obX-YS-Mg8" secondAttribute="bottom" constant="8" id="wg7-py-Lps"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jhb-G1-1OS">
                                                    <rect key="frame" x="0.0" y="244.00000000000003" width="393" height="60.333333333333343"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="G1e-j9-acv">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="jCv-QP-Xft"/>
                                                                <constraint firstAttribute="height" constant="4" id="p4x-YF-usg"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛地址" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Plw-ic-Z8D">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5zE-II-xtR">
                                                            <rect key="frame" x="22" y="28.333333333333371" width="335.33333333333331" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="1000" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ljf-wN-gW1">
                                                            <rect key="frame" x="367.33333333333331" y="35.666666666666629" width="11.666666666666686" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="5zE-II-xtR" firstAttribute="leading" secondItem="Plw-ic-Z8D" secondAttribute="leading" id="EAR-PY-Vaf"/>
                                                        <constraint firstItem="ljf-wN-gW1" firstAttribute="centerY" secondItem="5zE-II-xtR" secondAttribute="centerY" id="FNq-DC-vmE"/>
                                                        <constraint firstAttribute="trailing" secondItem="ljf-wN-gW1" secondAttribute="trailing" constant="14" id="JyQ-Pc-uVq"/>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="46" id="NsC-OO-zRO"/>
                                                        <constraint firstItem="G1e-j9-acv" firstAttribute="top" secondItem="jhb-G1-1OS" secondAttribute="top" constant="11" id="OSn-Ya-hdE"/>
                                                        <constraint firstItem="ljf-wN-gW1" firstAttribute="leading" secondItem="5zE-II-xtR" secondAttribute="trailing" constant="10" id="Xgk-p3-zVd"/>
                                                        <constraint firstItem="Plw-ic-Z8D" firstAttribute="leading" secondItem="G1e-j9-acv" secondAttribute="trailing" constant="4" id="Ygk-9c-2Mu"/>
                                                        <constraint firstAttribute="bottom" secondItem="5zE-II-xtR" secondAttribute="bottom" constant="3.3300000000000001" id="dcp-TI-tEs"/>
                                                        <constraint firstItem="G1e-j9-acv" firstAttribute="leading" secondItem="jhb-G1-1OS" secondAttribute="leading" constant="14" id="ex5-Nk-sSy"/>
                                                        <constraint firstItem="5zE-II-xtR" firstAttribute="top" secondItem="Plw-ic-Z8D" secondAttribute="bottom" constant="8" id="gVA-Gr-tWf"/>
                                                        <constraint firstItem="Plw-ic-Z8D" firstAttribute="centerY" secondItem="G1e-j9-acv" secondAttribute="centerY" id="zff-vY-gGW"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8HL-65-bBm">
                                                    <rect key="frame" x="0.0" y="304.33333333333337" width="393" height="76"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o6f-8L-c7f">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="EXK-75-kab"/>
                                                                <constraint firstAttribute="height" constant="4" id="qbc-fG-XZn"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛赛点" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2ER-s2-hpJ">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qol-d4-iqE">
                                                            <rect key="frame" x="22" y="28.333333333333258" width="285" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8A3-ba-Lfp">
                                                            <rect key="frame" x="329" y="29" width="50" height="27"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="50" id="el7-hh-FSn"/>
                                                            </constraints>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                            <state key="normal" title="查看更多">
                                                                <color key="titleColor" name="FE6E0D"/>
                                                            </state>
                                                        </button>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="o6f-8L-c7f" firstAttribute="top" secondItem="8HL-65-bBm" secondAttribute="top" constant="11" id="1V9-yZ-8pQ"/>
                                                        <constraint firstAttribute="bottom" secondItem="qol-d4-iqE" secondAttribute="bottom" constant="19" id="4l9-ow-I7n"/>
                                                        <constraint firstItem="2ER-s2-hpJ" firstAttribute="centerY" secondItem="o6f-8L-c7f" secondAttribute="centerY" id="7QP-7z-Aez"/>
                                                        <constraint firstItem="qol-d4-iqE" firstAttribute="top" secondItem="2ER-s2-hpJ" secondAttribute="bottom" constant="8" id="DcE-VO-1hB"/>
                                                        <constraint firstItem="o6f-8L-c7f" firstAttribute="leading" secondItem="8HL-65-bBm" secondAttribute="leading" constant="14" id="G2f-Zk-ERy"/>
                                                        <constraint firstItem="8A3-ba-Lfp" firstAttribute="leading" secondItem="qol-d4-iqE" secondAttribute="trailing" constant="22" id="LdQ-Ig-RbT"/>
                                                        <constraint firstAttribute="trailing" secondItem="8A3-ba-Lfp" secondAttribute="trailing" constant="14" id="Xdf-IN-1qD"/>
                                                        <constraint firstItem="8A3-ba-Lfp" firstAttribute="centerY" secondItem="qol-d4-iqE" secondAttribute="centerY" id="iCH-Lu-zhC"/>
                                                        <constraint firstItem="2ER-s2-hpJ" firstAttribute="leading" secondItem="o6f-8L-c7f" secondAttribute="trailing" constant="4" id="kaR-lT-0OA"/>
                                                        <constraint firstItem="qol-d4-iqE" firstAttribute="leading" secondItem="2ER-s2-hpJ" secondAttribute="leading" id="w9k-Zq-7FP"/>
                                                    </constraints>
                                                </view>
                                            </subviews>
                                        </stackView>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ULs-al-mjr">
                                            <rect key="frame" x="0.0" y="432.33333333333337" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wcV-Lw-oh0">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="BSK-iY-WII"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="PKp-1k-HJB">
                                                    <rect key="frame" x="13" y="114" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="pmf-vb-0Ww"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="活动费用" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="H2m-qM-cUy">
                                                    <rect key="frame" x="14" y="15" width="365" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="NtA-5U-4tc">
                                                    <rect key="frame" x="14" y="48" width="365" height="52"/>
                                                    <subviews>
                                                        <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="daA-et-L9W">
                                                            <rect key="frame" x="0.0" y="0.0" width="365" height="20"/>
                                                            <subviews>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Y2l-H5-uB9">
                                                                    <rect key="frame" x="0.0" y="0.0" width="182.66666666666666" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="支付:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VlI-h9-HoV">
                                                                            <rect key="frame" x="0.0" y="0.0" width="43" height="20"/>
                                                                            <constraints>
                                                                                <constraint firstAttribute="width" constant="43" id="GwX-MF-3nb"/>
                                                                            </constraints>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="¥0/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QgZ-yG-G8F">
                                                                            <rect key="frame" x="43" y="0.0" width="139.66666666666666" height="20"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstItem="QgZ-yG-G8F" firstAttribute="top" secondItem="Y2l-H5-uB9" secondAttribute="top" id="1LE-E0-htM"/>
                                                                        <constraint firstItem="VlI-h9-HoV" firstAttribute="top" secondItem="Y2l-H5-uB9" secondAttribute="top" id="4nH-pS-YAc"/>
                                                                        <constraint firstItem="VlI-h9-HoV" firstAttribute="leading" secondItem="Y2l-H5-uB9" secondAttribute="leading" id="Ii3-sy-Owo"/>
                                                                        <constraint firstAttribute="bottom" secondItem="VlI-h9-HoV" secondAttribute="bottom" id="Nyv-3J-SDY"/>
                                                                        <constraint firstAttribute="height" constant="20" id="PJr-3K-XWo"/>
                                                                        <constraint firstAttribute="bottom" secondItem="QgZ-yG-G8F" secondAttribute="bottom" id="UVO-CV-dKI"/>
                                                                        <constraint firstItem="QgZ-yG-G8F" firstAttribute="leading" secondItem="VlI-h9-HoV" secondAttribute="trailing" id="iVq-aD-i8o"/>
                                                                        <constraint firstAttribute="trailing" secondItem="QgZ-yG-G8F" secondAttribute="trailing" id="u3C-1b-ISw"/>
                                                                        <constraint firstItem="QgZ-yG-G8F" firstAttribute="centerY" secondItem="VlI-h9-HoV" secondAttribute="centerY" id="xaj-Mj-IL4"/>
                                                                    </constraints>
                                                                </view>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="z37-YH-24K">
                                                                    <rect key="frame" x="182.66666666666663" y="0.0" width="182.33333333333337" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="玩湃币:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xKw-Rf-QBW">
                                                                            <rect key="frame" x="0.0" y="1.6666666666666288" width="50.333333333333336" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0币/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nZE-Uv-Vd2">
                                                                            <rect key="frame" x="50.333333333333343" y="1.6666666666666288" width="47.333333333333343" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstItem="nZE-Uv-Vd2" firstAttribute="leading" secondItem="xKw-Rf-QBW" secondAttribute="trailing" id="5c1-6f-cAM"/>
                                                                        <constraint firstItem="xKw-Rf-QBW" firstAttribute="leading" secondItem="z37-YH-24K" secondAttribute="leading" id="ItV-If-Tlr"/>
                                                                        <constraint firstItem="xKw-Rf-QBW" firstAttribute="centerY" secondItem="z37-YH-24K" secondAttribute="centerY" id="JYI-fr-5xt"/>
                                                                        <constraint firstAttribute="height" constant="20" id="KoX-pb-qI3"/>
                                                                        <constraint firstItem="nZE-Uv-Vd2" firstAttribute="centerY" secondItem="xKw-Rf-QBW" secondAttribute="centerY" id="Nf4-LD-d1K"/>
                                                                    </constraints>
                                                                </view>
                                                            </subviews>
                                                        </stackView>
                                                        <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="ev4-Wc-Cfg">
                                                            <rect key="frame" x="0.0" y="32" width="365" height="20"/>
                                                            <subviews>
                                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="g9N-2R-H2H">
                                                                    <rect key="frame" x="0.0" y="0.0" width="365" height="20"/>
                                                                    <subviews>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="课时:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ywl-Uj-fDo">
                                                                            <rect key="frame" x="0.0" y="1.6666666666666288" width="43" height="17"/>
                                                                            <constraints>
                                                                                <constraint firstAttribute="width" constant="43" id="X64-cJ-0C8"/>
                                                                            </constraints>
                                                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0课时/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="H6O-v1-6wa">
                                                                            <rect key="frame" x="43" y="1.6666666666666288" width="322" height="17"/>
                                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                                            <nil key="highlightedColor"/>
                                                                        </label>
                                                                    </subviews>
                                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                                    <constraints>
                                                                        <constraint firstItem="H6O-v1-6wa" firstAttribute="leading" secondItem="ywl-Uj-fDo" secondAttribute="trailing" id="80N-wz-H3z"/>
                                                                        <constraint firstAttribute="trailing" secondItem="H6O-v1-6wa" secondAttribute="trailing" id="JFo-1M-DsK"/>
                                                                        <constraint firstItem="ywl-Uj-fDo" firstAttribute="centerY" secondItem="g9N-2R-H2H" secondAttribute="centerY" id="Kvr-b2-BlP"/>
                                                                        <constraint firstItem="H6O-v1-6wa" firstAttribute="centerY" secondItem="ywl-Uj-fDo" secondAttribute="centerY" id="RwY-3e-FpW"/>
                                                                        <constraint firstItem="ywl-Uj-fDo" firstAttribute="leading" secondItem="g9N-2R-H2H" secondAttribute="leading" id="rsY-kM-6cY"/>
                                                                        <constraint firstAttribute="height" constant="20" id="tcX-BH-HKN"/>
                                                                    </constraints>
                                                                </view>
                                                            </subviews>
                                                        </stackView>
                                                    </subviews>
                                                </stackView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="PKp-1k-HJB" firstAttribute="leading" secondItem="ULs-al-mjr" secondAttribute="leading" constant="13" id="G4S-UC-LNz"/>
                                                <constraint firstItem="NtA-5U-4tc" firstAttribute="top" secondItem="H2m-qM-cUy" secondAttribute="bottom" constant="12" id="Ik0-pv-FDV"/>
                                                <constraint firstItem="H2m-qM-cUy" firstAttribute="top" secondItem="wcV-Lw-oh0" secondAttribute="bottom" constant="14" id="IpT-vv-cD9"/>
                                                <constraint firstItem="wcV-Lw-oh0" firstAttribute="top" secondItem="ULs-al-mjr" secondAttribute="top" id="K0J-Sm-K5I"/>
                                                <constraint firstAttribute="height" constant="115" id="NHh-2F-h4t"/>
                                                <constraint firstItem="wcV-Lw-oh0" firstAttribute="leading" secondItem="ULs-al-mjr" secondAttribute="leading" constant="13" id="OEp-4S-aAg"/>
                                                <constraint firstAttribute="trailing" secondItem="wcV-Lw-oh0" secondAttribute="trailing" id="QiP-QD-VlZ"/>
                                                <constraint firstItem="H2m-qM-cUy" firstAttribute="leading" secondItem="ULs-al-mjr" secondAttribute="leading" constant="14" id="V0W-Hu-0uT"/>
                                                <constraint firstAttribute="trailing" secondItem="NtA-5U-4tc" secondAttribute="trailing" constant="14" id="Vbr-bb-TQw"/>
                                                <constraint firstAttribute="trailing" secondItem="H2m-qM-cUy" secondAttribute="trailing" constant="14" id="aek-Se-lR4"/>
                                                <constraint firstAttribute="trailing" secondItem="PKp-1k-HJB" secondAttribute="trailing" id="bKp-Bg-LV7"/>
                                                <constraint firstAttribute="bottom" secondItem="PKp-1k-HJB" secondAttribute="bottom" id="ieS-KI-C78"/>
                                                <constraint firstItem="NtA-5U-4tc" firstAttribute="leading" secondItem="ULs-al-mjr" secondAttribute="leading" constant="14" id="m0d-RS-u9R"/>
                                                <constraint firstItem="PKp-1k-HJB" firstAttribute="top" secondItem="NtA-5U-4tc" secondAttribute="bottom" constant="14" id="uDK-if-1Hg"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6sR-XB-fI3">
                                            <rect key="frame" x="0.0" y="547.33333333333337" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="93x-qG-6UH">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="OxN-OY-72P"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pHn-vF-wj0">
                                                    <rect key="frame" x="13" y="114" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="GR2-7f-CZU"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比赛简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3h0-Kf-CZk">
                                                    <rect key="frame" x="14" y="15" width="365" height="61"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3U1-AP-dtr">
                                                    <rect key="frame" x="14" y="83" width="365" height="17"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                    <color key="textColor" red="0.23921568630000001" green="0.24313725489999999" blue="0.27058823529999998" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="3U1-AP-dtr" firstAttribute="leading" secondItem="6sR-XB-fI3" secondAttribute="leading" constant="14" id="3jR-sc-1SO"/>
                                                <constraint firstItem="3U1-AP-dtr" firstAttribute="top" secondItem="3h0-Kf-CZk" secondAttribute="bottom" constant="7" id="7oP-AU-2QW"/>
                                                <constraint firstItem="93x-qG-6UH" firstAttribute="top" secondItem="6sR-XB-fI3" secondAttribute="top" id="CqC-6b-2oK"/>
                                                <constraint firstItem="93x-qG-6UH" firstAttribute="leading" secondItem="6sR-XB-fI3" secondAttribute="leading" constant="13" id="Im9-F4-ZOK"/>
                                                <constraint firstAttribute="trailing" secondItem="pHn-vF-wj0" secondAttribute="trailing" id="QYO-Gu-Mbi"/>
                                                <constraint firstAttribute="trailing" secondItem="93x-qG-6UH" secondAttribute="trailing" id="Qdi-8x-BcK"/>
                                                <constraint firstItem="pHn-vF-wj0" firstAttribute="leading" secondItem="6sR-XB-fI3" secondAttribute="leading" constant="13" id="TZn-9j-w9e"/>
                                                <constraint firstItem="3h0-Kf-CZk" firstAttribute="leading" secondItem="6sR-XB-fI3" secondAttribute="leading" constant="14" id="WIw-2s-G5i"/>
                                                <constraint firstAttribute="trailing" secondItem="3h0-Kf-CZk" secondAttribute="trailing" constant="14" id="aRN-iN-Afk"/>
                                                <constraint firstItem="pHn-vF-wj0" firstAttribute="top" secondItem="3U1-AP-dtr" secondAttribute="bottom" constant="14" id="bIR-th-ham"/>
                                                <constraint firstAttribute="bottom" secondItem="pHn-vF-wj0" secondAttribute="bottom" id="efP-SH-Wv5"/>
                                                <constraint firstItem="3h0-Kf-CZk" firstAttribute="top" secondItem="93x-qG-6UH" secondAttribute="bottom" constant="14" id="gqo-Nj-USU"/>
                                                <constraint firstAttribute="trailing" secondItem="3U1-AP-dtr" secondAttribute="trailing" constant="14" id="pqf-nY-mT8"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HLJ-GQ-sM2">
                                            <rect key="frame" x="0.0" y="662.33333333333337" width="393" height="148.33333333333337"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cmG-Np-j1p">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="zcc-ca-2tr"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比赛详情" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0hQ-02-Ba6">
                                                    <rect key="frame" x="14" y="14.999999999999998" width="365" height="19.333333333333329"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <wkWebView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sHP-li-Ukm">
                                                    <rect key="frame" x="0.0" y="48.333333333333258" width="393" height="100"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="mZW-Bo-YeJ"/>
                                                    </constraints>
                                                    <wkWebViewConfiguration key="configuration">
                                                        <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
                                                        <wkPreferences key="preferences"/>
                                                    </wkWebViewConfiguration>
                                                </wkWebView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="sHP-li-Ukm" firstAttribute="leading" secondItem="HLJ-GQ-sM2" secondAttribute="leading" id="NP9-E3-adF"/>
                                                <constraint firstAttribute="trailing" secondItem="cmG-Np-j1p" secondAttribute="trailing" id="PKa-hJ-Tvj"/>
                                                <constraint firstItem="cmG-Np-j1p" firstAttribute="leading" secondItem="HLJ-GQ-sM2" secondAttribute="leading" constant="13" id="R0h-LZ-Wum"/>
                                                <constraint firstItem="0hQ-02-Ba6" firstAttribute="leading" secondItem="HLJ-GQ-sM2" secondAttribute="leading" constant="14" id="Tfx-1N-b7s"/>
                                                <constraint firstAttribute="trailing" secondItem="sHP-li-Ukm" secondAttribute="trailing" id="alu-UO-2js"/>
                                                <constraint firstItem="cmG-Np-j1p" firstAttribute="top" secondItem="HLJ-GQ-sM2" secondAttribute="top" id="cZk-Yk-zCZ"/>
                                                <constraint firstAttribute="trailing" secondItem="0hQ-02-Ba6" secondAttribute="trailing" constant="14" id="ehn-KB-W8V"/>
                                                <constraint firstItem="0hQ-02-Ba6" firstAttribute="top" secondItem="cmG-Np-j1p" secondAttribute="bottom" constant="14" id="gpM-hK-uuj"/>
                                                <constraint firstAttribute="bottom" secondItem="sHP-li-Ukm" secondAttribute="bottom" id="jSI-jZ-Im8"/>
                                                <constraint firstItem="sHP-li-Ukm" firstAttribute="top" secondItem="0hQ-02-Ba6" secondAttribute="bottom" constant="14" id="xEp-nI-V8i"/>
                                            </constraints>
                                        </view>
                                    </subviews>
                                </stackView>
                            </subviews>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstAttribute="bottom" secondItem="m0C-wO-vqk" secondAttribute="bottom" id="0h1-9j-quY"/>
                                <constraint firstAttribute="trailing" secondItem="m0C-wO-vqk" secondAttribute="trailing" id="9wG-5o-VRI"/>
                                <constraint firstItem="rEE-UF-kCK" firstAttribute="leading" secondItem="Znd-Yy-pV8" secondAttribute="leading" id="HjA-Nr-17H"/>
                                <constraint firstItem="m0C-wO-vqk" firstAttribute="top" secondItem="rEE-UF-kCK" secondAttribute="bottom" id="Jhx-I4-0yd"/>
                                <constraint firstItem="rEE-UF-kCK" firstAttribute="top" secondItem="Znd-Yy-pV8" secondAttribute="top" id="VYk-Tk-U4I"/>
                                <constraint firstAttribute="trailing" secondItem="rEE-UF-kCK" secondAttribute="trailing" id="maR-QO-qul"/>
                                <constraint firstItem="m0C-wO-vqk" firstAttribute="leading" secondItem="Znd-Yy-pV8" secondAttribute="leading" id="wPL-Df-Os2"/>
                            </constraints>
                        </view>
                    </subviews>
                    <constraints>
                        <constraint firstAttribute="trailing" secondItem="Znd-Yy-pV8" secondAttribute="trailing" id="0vM-QA-49E"/>
                        <constraint firstItem="Znd-Yy-pV8" firstAttribute="top" secondItem="kfP-hX-Uro" secondAttribute="top" id="EoB-bs-msH"/>
                        <constraint firstItem="Znd-Yy-pV8" firstAttribute="centerX" secondItem="kfP-hX-Uro" secondAttribute="centerX" id="OoK-gu-2uj"/>
                        <constraint firstAttribute="bottom" secondItem="Znd-Yy-pV8" secondAttribute="bottom" constant="15" id="SFd-ZW-Ldd"/>
                        <constraint firstItem="Znd-Yy-pV8" firstAttribute="leading" secondItem="kfP-hX-Uro" secondAttribute="leading" id="qu4-aN-Td0"/>
                    </constraints>
                </scrollView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3aZ-G8-j6f">
                    <rect key="frame" x="0.0" y="770" width="393" height="48"/>
                    <color key="backgroundColor" name="FE6E0D"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="48" id="bgE-qi-Sge"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" title="立即报名"/>
                    <connections>
                        <action selector="applyAction:" destination="-1" eventType="touchUpInside" id="MHR-Rd-39v"/>
                    </connections>
                </button>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="3aZ-G8-j6f" firstAttribute="top" secondItem="kfP-hX-Uro" secondAttribute="bottom" id="09m-Ky-PEu"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="3aZ-G8-j6f" secondAttribute="trailing" id="H0i-X0-H1k"/>
                <constraint firstItem="3aZ-G8-j6f" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="JPi-eJ-Hb0"/>
                <constraint firstAttribute="bottomMargin" secondItem="3aZ-G8-j6f" secondAttribute="bottom" id="Vga-S6-QzE"/>
                <constraint firstAttribute="trailing" secondItem="kfP-hX-Uro" secondAttribute="trailing" id="g4e-aB-p8c"/>
                <constraint firstItem="kfP-hX-Uro" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="hL8-l4-BZV"/>
                <constraint firstItem="kfP-hX-Uro" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="jUG-Xr-tHn"/>
            </constraints>
            <point key="canvasLocation" x="83" y="21"/>
        </view>
    </objects>
    <resources>
        <image name="icon_hot_1" width="24" height="28"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/WorldCupContentDetailVC.swift
New file
@@ -0,0 +1,78 @@
//
//  WorldCupContentDetailVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
import QMUIKit
class WorldCupContentDetailVC: BaseVC {
                @IBOutlet weak var view_banner: UIView!
                @IBOutlet weak var label_storeNames: UILabel!
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var label_joinCondition: UILabel!
                @IBOutlet weak var label_address: UILabel!
                @IBOutlet weak var label_duetime: UILabel!
                @IBOutlet weak var label_starttime: UILabel!
                @IBOutlet weak var label_endtime: UILabel!
                @IBOutlet weak var label_ageScope: UILabel!
                @IBOutlet weak var label_city: UILabel!
                @IBOutlet weak var label_money: UILabel!
                @IBOutlet weak var label_coin: UILabel!
                @IBOutlet weak var label_courseNum: UILabel!
                @IBOutlet weak var label_introducion: UILabel!
                @IBOutlet weak var btn_enroll: UIButton!
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var btn_addStudent: QMUIButton!
                @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
                @IBOutlet weak var label_matchStore: UILabel!
                @IBOutlet weak var btn_moreMatchStore: UIButton!
                @IBOutlet weak var view_money: UIView!
                @IBOutlet weak var view_coin: UIView!
                @IBOutlet weak var view_courseNum: UIView!
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "社区世界杯"
                }
                override func setUI() {
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.isScrollEnabled = false
                                tableView.register(UINib(nibName: "StudentInfo_4_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_4_TCell")
                }
                override func setRx() {
                                tableView.rx.observe(CGSize.self, "contentSize")
                                                .subscribe(onNext: { [weak self] size in
                                                                self?.cons_tableHei.constant = size?.height ?? 0
                                                }).disposed(by: disposeBag)
                }
}
extension WorldCupContentDetailVC:UITableViewDelegate{
}
extension WorldCupContentDetailVC:UITableViewDataSource{
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 3
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_4_TCell", for: indexPath) as! StudentInfo_4_TCell
                                return cell
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                90
                }
}
WanPai/Root/Search/VC/WorldCupContentDetailVC.xib
New file
@@ -0,0 +1,654 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WorldCupContentDetailVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="cons_tableHei" destination="HCn-5Z-SAr" id="JPW-ED-7vP"/>
                <outlet property="tableView" destination="pGy-ry-sPB" id="9SG-OL-UF5"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dMb-17-MtC">
                    <rect key="frame" x="0.0" y="0.0" width="393" height="770"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5Sd-Ru-eG3">
                            <rect key="frame" x="0.0" y="0.0" width="393" height="1146"/>
                            <subviews>
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MmS-Eb-s2q">
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="220"/>
                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                    <constraints>
                                        <constraint firstAttribute="width" secondItem="MmS-Eb-s2q" secondAttribute="height" multiplier="1:0.56" id="Uua-36-7ac"/>
                                    </constraints>
                                </view>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="UWR-Fw-RqI">
                                    <rect key="frame" x="0.0" y="220" width="393" height="926"/>
                                    <subviews>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gQ1-8e-LnV">
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="52"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" horizontalCompressionResistancePriority="250" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MRZ-gv-FLH">
                                                    <rect key="frame" x="13.999999999999998" y="14" width="16.333333333333329" height="28"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="25" id="qJh-JF-Gau"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VM4-dH-lDE">
                                                    <rect key="frame" x="14" y="51" width="379" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="G37-OT-GLp"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6bS-Ki-Z92">
                                                    <rect key="frame" x="367.33333333333331" y="15.333333333333345" width="11.666666666666686" height="21.666666666666671"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                                                    <color key="textColor" name="FE6E0D"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_hot_1" translatesAutoresizingMaskIntoConstraints="NO" id="FHf-rj-AQj">
                                                    <rect key="frame" x="344.33333333333331" y="13" width="19" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="18.859999999999999" id="8lo-1Q-APK"/>
                                                        <constraint firstAttribute="height" constant="22" id="fIP-ka-7NJ"/>
                                                    </constraints>
                                                </imageView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="6bS-Ki-Z92" firstAttribute="leading" secondItem="FHf-rj-AQj" secondAttribute="trailing" constant="4" id="3V7-bQ-7Rt"/>
                                                <constraint firstItem="MRZ-gv-FLH" firstAttribute="leading" secondItem="gQ1-8e-LnV" secondAttribute="leading" constant="14" id="AhD-bu-gDk"/>
                                                <constraint firstAttribute="bottom" secondItem="VM4-dH-lDE" secondAttribute="bottom" id="L8G-im-Ndi"/>
                                                <constraint firstItem="VM4-dH-lDE" firstAttribute="leading" secondItem="gQ1-8e-LnV" secondAttribute="leading" constant="14" id="Nvl-K7-sNe"/>
                                                <constraint firstAttribute="trailing" secondItem="VM4-dH-lDE" secondAttribute="trailing" id="RkW-Ob-5Ek"/>
                                                <constraint firstItem="FHf-rj-AQj" firstAttribute="centerY" secondItem="gQ1-8e-LnV" secondAttribute="centerY" constant="-2" id="WOx-Qk-TRd"/>
                                                <constraint firstItem="VM4-dH-lDE" firstAttribute="top" secondItem="MRZ-gv-FLH" secondAttribute="bottom" constant="9" id="bVj-qA-Wgl"/>
                                                <constraint firstItem="6bS-Ki-Z92" firstAttribute="centerY" secondItem="gQ1-8e-LnV" secondAttribute="centerY" id="h2O-aV-f9n"/>
                                                <constraint firstItem="MRZ-gv-FLH" firstAttribute="top" secondItem="gQ1-8e-LnV" secondAttribute="top" constant="14" id="mOe-Vs-qzq"/>
                                                <constraint firstAttribute="trailing" secondItem="6bS-Ki-Z92" secondAttribute="trailing" constant="14" id="sy1-vy-l4j"/>
                                            </constraints>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                    <real key="value" value="2"/>
                                                </userDefinedRuntimeAttribute>
                                            </userDefinedRuntimeAttributes>
                                        </view>
                                        <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="u0r-q1-kZh">
                                            <rect key="frame" x="0.0" y="52" width="393" height="380.33333333333331"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2FA-uo-Nor">
                                                    <rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XW1-gp-FKT">
                                                            <rect key="frame" x="14" y="18" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="1sT-Q5-Zcg"/>
                                                                <constraint firstAttribute="width" constant="4" id="R9R-Kb-Egu"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="截止报名时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kFb-aM-ZDj">
                                                            <rect key="frame" x="22" y="13" width="73.666666666666671" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CaN-wO-hwU">
                                                            <rect key="frame" x="22" y="35.333333333333314" width="11.666666666666664" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="CaN-wO-hwU" firstAttribute="top" secondItem="kFb-aM-ZDj" secondAttribute="bottom" constant="8" id="7Wo-AX-CAm"/>
                                                        <constraint firstItem="CaN-wO-hwU" firstAttribute="leading" secondItem="kFb-aM-ZDj" secondAttribute="leading" id="DDe-vP-7SR"/>
                                                        <constraint firstAttribute="height" constant="60" id="Ky6-PL-aRr"/>
                                                        <constraint firstItem="XW1-gp-FKT" firstAttribute="leading" secondItem="2FA-uo-Nor" secondAttribute="leading" constant="14" id="OWw-1W-0l5"/>
                                                        <constraint firstItem="kFb-aM-ZDj" firstAttribute="centerY" secondItem="XW1-gp-FKT" secondAttribute="centerY" id="Ykg-vC-RR5"/>
                                                        <constraint firstItem="kFb-aM-ZDj" firstAttribute="leading" secondItem="XW1-gp-FKT" secondAttribute="trailing" constant="4" id="biR-Vu-J9X"/>
                                                        <constraint firstItem="XW1-gp-FKT" firstAttribute="top" secondItem="2FA-uo-Nor" secondAttribute="top" constant="18" id="d1Q-oz-28Q"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wyH-QP-bCP">
                                                    <rect key="frame" x="0.0" y="60" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HWI-ur-6Oe">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="5b3-y9-UJ9"/>
                                                                <constraint firstAttribute="width" constant="4" id="QyR-hD-dqB"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="开始时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6tP-Qt-kfo">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e4r-bY-CuA">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="HWI-ur-6Oe" firstAttribute="top" secondItem="wyH-QP-bCP" secondAttribute="top" constant="11" id="ASo-lk-t3p"/>
                                                        <constraint firstItem="e4r-bY-CuA" firstAttribute="leading" secondItem="6tP-Qt-kfo" secondAttribute="leading" id="HaE-ZD-xZf"/>
                                                        <constraint firstItem="HWI-ur-6Oe" firstAttribute="leading" secondItem="wyH-QP-bCP" secondAttribute="leading" constant="14" id="JDo-zI-Q4o"/>
                                                        <constraint firstItem="6tP-Qt-kfo" firstAttribute="leading" secondItem="HWI-ur-6Oe" secondAttribute="trailing" constant="4" id="JlT-XO-q1B"/>
                                                        <constraint firstItem="6tP-Qt-kfo" firstAttribute="centerY" secondItem="HWI-ur-6Oe" secondAttribute="centerY" id="dWB-7C-CUw"/>
                                                        <constraint firstAttribute="height" constant="46" id="nKz-GB-Fel"/>
                                                        <constraint firstItem="e4r-bY-CuA" firstAttribute="top" secondItem="6tP-Qt-kfo" secondAttribute="bottom" constant="8" id="rRY-df-Zwg"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GN4-c0-HZY">
                                                    <rect key="frame" x="0.0" y="106" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0wd-uf-lOX">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="Uvb-RX-CXH"/>
                                                                <constraint firstAttribute="height" constant="4" id="ojJ-fJ-yXe"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="02t-hJ-Adj">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kKl-kq-lzY">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="0wd-uf-lOX" firstAttribute="top" secondItem="GN4-c0-HZY" secondAttribute="top" constant="11" id="0Lc-xF-XhQ"/>
                                                        <constraint firstItem="02t-hJ-Adj" firstAttribute="leading" secondItem="0wd-uf-lOX" secondAttribute="trailing" constant="4" id="4wV-MS-SaO"/>
                                                        <constraint firstAttribute="height" constant="46" id="DUS-Id-ONd"/>
                                                        <constraint firstItem="02t-hJ-Adj" firstAttribute="centerY" secondItem="0wd-uf-lOX" secondAttribute="centerY" id="NNg-3s-UIB"/>
                                                        <constraint firstItem="kKl-kq-lzY" firstAttribute="leading" secondItem="02t-hJ-Adj" secondAttribute="leading" id="Wd3-6Y-Iso"/>
                                                        <constraint firstItem="kKl-kq-lzY" firstAttribute="top" secondItem="02t-hJ-Adj" secondAttribute="bottom" constant="8" id="hdY-n2-ko2"/>
                                                        <constraint firstItem="0wd-uf-lOX" firstAttribute="leading" secondItem="GN4-c0-HZY" secondAttribute="leading" constant="14" id="i5L-tQ-7Wc"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3W8-TM-GwM">
                                                    <rect key="frame" x="0.0" y="152" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6El-Xn-LDS">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="YPs-Ce-ADk"/>
                                                                <constraint firstAttribute="width" constant="4" id="v3A-g8-rgb"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名年龄" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UJt-79-ees">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ail-JE-JUS">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="UJt-79-ees" firstAttribute="centerY" secondItem="6El-Xn-LDS" secondAttribute="centerY" id="0da-pu-im9"/>
                                                        <constraint firstItem="ail-JE-JUS" firstAttribute="leading" secondItem="UJt-79-ees" secondAttribute="leading" id="BAV-ya-hdV"/>
                                                        <constraint firstAttribute="height" constant="46" id="JuA-Bu-Luy"/>
                                                        <constraint firstItem="6El-Xn-LDS" firstAttribute="leading" secondItem="3W8-TM-GwM" secondAttribute="leading" constant="14" id="MIv-5I-FIb"/>
                                                        <constraint firstItem="6El-Xn-LDS" firstAttribute="top" secondItem="3W8-TM-GwM" secondAttribute="top" constant="11" id="a7h-al-faf"/>
                                                        <constraint firstItem="ail-JE-JUS" firstAttribute="top" secondItem="UJt-79-ees" secondAttribute="bottom" constant="8" id="jj5-Qr-VLV"/>
                                                        <constraint firstItem="UJt-79-ees" firstAttribute="leading" secondItem="6El-Xn-LDS" secondAttribute="trailing" constant="4" id="kab-w5-5qY"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JVx-OZ-c4g">
                                                    <rect key="frame" x="0.0" y="198" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yoY-8o-PfM">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="4dv-8e-VPI"/>
                                                                <constraint firstAttribute="height" constant="4" id="TNR-ks-jad"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛者性别" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yS5-T7-dRQ">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="61.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w0h-nq-IIZ">
                                                            <rect key="frame" x="22" y="28.333333333333311" width="11.666666666666664" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="yS5-T7-dRQ" firstAttribute="leading" secondItem="yoY-8o-PfM" secondAttribute="trailing" constant="4" id="AsE-Wi-qf0"/>
                                                        <constraint firstItem="yoY-8o-PfM" firstAttribute="top" secondItem="JVx-OZ-c4g" secondAttribute="top" constant="11" id="CmX-Vh-sAC"/>
                                                        <constraint firstItem="yS5-T7-dRQ" firstAttribute="centerY" secondItem="yoY-8o-PfM" secondAttribute="centerY" id="DzG-1B-0eX"/>
                                                        <constraint firstItem="w0h-nq-IIZ" firstAttribute="leading" secondItem="yS5-T7-dRQ" secondAttribute="leading" id="EYV-oU-HYq"/>
                                                        <constraint firstItem="w0h-nq-IIZ" firstAttribute="top" secondItem="yS5-T7-dRQ" secondAttribute="bottom" constant="8" id="I0r-tr-XtM"/>
                                                        <constraint firstItem="yoY-8o-PfM" firstAttribute="leading" secondItem="JVx-OZ-c4g" secondAttribute="leading" constant="14" id="MHE-VQ-mBF"/>
                                                        <constraint firstAttribute="height" constant="46" id="sYF-yK-cqj"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="C0Z-aa-XZZ">
                                                    <rect key="frame" x="0.0" y="244.00000000000003" width="393" height="60.333333333333343"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Yfp-ha-gfv">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="4" id="eQ9-kP-IOL"/>
                                                                <constraint firstAttribute="height" constant="4" id="swk-hU-Wmq"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛地址" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dOO-Nr-ubq">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kYd-z9-PGb">
                                                            <rect key="frame" x="22" y="28.333333333333371" width="335.33333333333331" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="1000" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HZN-5V-0mC">
                                                            <rect key="frame" x="367.33333333333331" y="35.666666666666629" width="11.666666666666686" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="HZN-5V-0mC" firstAttribute="centerY" secondItem="kYd-z9-PGb" secondAttribute="centerY" id="0ef-9B-rXF"/>
                                                        <constraint firstItem="Yfp-ha-gfv" firstAttribute="top" secondItem="C0Z-aa-XZZ" secondAttribute="top" constant="11" id="1wj-JC-RjW"/>
                                                        <constraint firstAttribute="bottom" secondItem="kYd-z9-PGb" secondAttribute="bottom" constant="3.3300000000000001" id="7sI-fT-kk3"/>
                                                        <constraint firstItem="HZN-5V-0mC" firstAttribute="leading" secondItem="kYd-z9-PGb" secondAttribute="trailing" constant="10" id="8NH-3X-n8g"/>
                                                        <constraint firstItem="kYd-z9-PGb" firstAttribute="leading" secondItem="dOO-Nr-ubq" secondAttribute="leading" id="AN6-hy-q2k"/>
                                                        <constraint firstAttribute="trailing" secondItem="HZN-5V-0mC" secondAttribute="trailing" constant="14" id="G3S-xd-jf9"/>
                                                        <constraint firstItem="dOO-Nr-ubq" firstAttribute="centerY" secondItem="Yfp-ha-gfv" secondAttribute="centerY" id="LY9-Zx-ePp"/>
                                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="46" id="MA1-Tu-mQM"/>
                                                        <constraint firstItem="Yfp-ha-gfv" firstAttribute="leading" secondItem="C0Z-aa-XZZ" secondAttribute="leading" constant="14" id="UQd-cq-n47"/>
                                                        <constraint firstItem="kYd-z9-PGb" firstAttribute="top" secondItem="dOO-Nr-ubq" secondAttribute="bottom" constant="8" id="avG-3g-D35"/>
                                                        <constraint firstItem="dOO-Nr-ubq" firstAttribute="leading" secondItem="Yfp-ha-gfv" secondAttribute="trailing" constant="4" id="mNq-rD-GiR"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QbC-92-fCR">
                                                    <rect key="frame" x="0.0" y="304.33333333333337" width="393" height="76"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="68X-0l-htM">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
                                                            <color key="backgroundColor" name="FE6E0D"/>
                                                            <constraints>
                                                                <constraint firstAttribute="height" constant="4" id="H0U-Ky-7K8"/>
                                                                <constraint firstAttribute="width" constant="4" id="hpx-Ik-1Hc"/>
                                                            </constraints>
                                                            <userDefinedRuntimeAttributes>
                                                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                                                    <real key="value" value="2"/>
                                                                </userDefinedRuntimeAttribute>
                                                            </userDefinedRuntimeAttributes>
                                                        </view>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参赛赛点" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ewe-lt-VjJ">
                                                            <rect key="frame" x="22.000000000000004" y="6.0000000000000009" width="49.333333333333343" height="14.333333333333336"/>
                                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VXV-P0-QQ6">
                                                            <rect key="frame" x="22" y="28.333333333333258" width="285" height="28.666666666666671"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tjO-5y-Kg9">
                                                            <rect key="frame" x="329" y="29" width="50" height="27"/>
                                                            <constraints>
                                                                <constraint firstAttribute="width" constant="50" id="Igw-9w-2MO"/>
                                                            </constraints>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                                            <state key="normal" title="查看更多">
                                                                <color key="titleColor" name="FE6E0D"/>
                                                            </state>
                                                        </button>
                                                    </subviews>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstItem="tjO-5y-Kg9" firstAttribute="centerY" secondItem="VXV-P0-QQ6" secondAttribute="centerY" id="1nv-pY-JCE"/>
                                                        <constraint firstItem="68X-0l-htM" firstAttribute="leading" secondItem="QbC-92-fCR" secondAttribute="leading" constant="14" id="7VE-4h-AyN"/>
                                                        <constraint firstAttribute="trailing" secondItem="tjO-5y-Kg9" secondAttribute="trailing" constant="14" id="8dk-br-IK6"/>
                                                        <constraint firstItem="VXV-P0-QQ6" firstAttribute="top" secondItem="ewe-lt-VjJ" secondAttribute="bottom" constant="8" id="GID-nl-24P"/>
                                                        <constraint firstItem="ewe-lt-VjJ" firstAttribute="leading" secondItem="68X-0l-htM" secondAttribute="trailing" constant="4" id="KWg-lM-hts"/>
                                                        <constraint firstItem="68X-0l-htM" firstAttribute="top" secondItem="QbC-92-fCR" secondAttribute="top" constant="11" id="bce-uj-ky2"/>
                                                        <constraint firstAttribute="bottom" secondItem="VXV-P0-QQ6" secondAttribute="bottom" constant="19" id="kVT-GP-Ltl"/>
                                                        <constraint firstItem="tjO-5y-Kg9" firstAttribute="leading" secondItem="VXV-P0-QQ6" secondAttribute="trailing" constant="22" id="n5f-8o-flc"/>
                                                        <constraint firstItem="ewe-lt-VjJ" firstAttribute="centerY" secondItem="68X-0l-htM" secondAttribute="centerY" id="sgV-w6-RNZ"/>
                                                        <constraint firstItem="VXV-P0-QQ6" firstAttribute="leading" secondItem="ewe-lt-VjJ" secondAttribute="leading" id="uKl-Cs-5ug"/>
                                                    </constraints>
                                                </view>
                                            </subviews>
                                        </stackView>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kjG-RO-Dqg">
                                            <rect key="frame" x="0.0" y="432.33333333333337" width="393" height="149.33333333333337"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sW6-bF-cec">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="rrd-75-6ar"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事人员" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Wh-tH-pf6">
                                                    <rect key="frame" x="14" y="15" width="65.333333333333329" height="29"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="pGy-ry-sPB">
                                                    <rect key="frame" x="0.0" y="49.333333333333258" width="393" height="100"/>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="HCn-5Z-SAr"/>
                                                    </constraints>
                                                </tableView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="sW6-bF-cec" firstAttribute="leading" secondItem="kjG-RO-Dqg" secondAttribute="leading" constant="13" id="2EK-1f-hz4"/>
                                                <constraint firstAttribute="trailing" secondItem="sW6-bF-cec" secondAttribute="trailing" id="2W8-Iz-aRf"/>
                                                <constraint firstItem="sW6-bF-cec" firstAttribute="top" secondItem="kjG-RO-Dqg" secondAttribute="top" id="6nC-rk-1TU"/>
                                                <constraint firstItem="pGy-ry-sPB" firstAttribute="leading" secondItem="kjG-RO-Dqg" secondAttribute="leading" id="9Lz-s1-4SA"/>
                                                <constraint firstItem="pGy-ry-sPB" firstAttribute="top" secondItem="9Wh-tH-pf6" secondAttribute="bottom" constant="5.5" id="W9a-Dw-pad"/>
                                                <constraint firstAttribute="trailing" secondItem="pGy-ry-sPB" secondAttribute="trailing" id="YYd-52-Hok"/>
                                                <constraint firstAttribute="bottom" secondItem="pGy-ry-sPB" secondAttribute="bottom" id="e1Q-Nj-Q0p"/>
                                                <constraint firstItem="9Wh-tH-pf6" firstAttribute="top" secondItem="sW6-bF-cec" secondAttribute="bottom" constant="14" id="eSP-cc-xXY"/>
                                                <constraint firstItem="9Wh-tH-pf6" firstAttribute="leading" secondItem="kjG-RO-Dqg" secondAttribute="leading" constant="14" id="u1l-yd-sap"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Cs0-3x-jKV">
                                            <rect key="frame" x="0.0" y="581.66666666666663" width="393" height="81"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gq1-2k-6ZR">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="PWF-6O-8C0"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3Ew-TQ-Qh5">
                                                    <rect key="frame" x="13" y="80" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="tHp-Iy-iL5"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比赛费用" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uyq-Ch-P6f">
                                                    <rect key="frame" x="14" y="15" width="365" height="22"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="22" id="orR-tj-1vJ"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="¥0/人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YLf-xG-ZrU">
                                                    <rect key="frame" x="14.000000000000004" y="49" width="38.333333333333343" height="20"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="20" id="usn-Zs-2X2"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="合计:¥0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="328-hS-eFC">
                                                    <rect key="frame" x="318" y="49" width="61" height="20"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="20" id="4yh-8X-2uh"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="YLf-xG-ZrU" firstAttribute="leading" secondItem="Cs0-3x-jKV" secondAttribute="leading" constant="14" id="0io-kx-50g"/>
                                                <constraint firstAttribute="trailing" secondItem="3Ew-TQ-Qh5" secondAttribute="trailing" id="2sp-To-te6"/>
                                                <constraint firstAttribute="trailing" secondItem="gq1-2k-6ZR" secondAttribute="trailing" id="4jm-jd-AB0"/>
                                                <constraint firstItem="gq1-2k-6ZR" firstAttribute="top" secondItem="Cs0-3x-jKV" secondAttribute="top" id="C79-K7-RL9"/>
                                                <constraint firstItem="uyq-Ch-P6f" firstAttribute="leading" secondItem="Cs0-3x-jKV" secondAttribute="leading" constant="14" id="FhG-eo-4mV"/>
                                                <constraint firstItem="3Ew-TQ-Qh5" firstAttribute="leading" secondItem="Cs0-3x-jKV" secondAttribute="leading" constant="13" id="HrZ-My-kfa"/>
                                                <constraint firstItem="328-hS-eFC" firstAttribute="centerY" secondItem="YLf-xG-ZrU" secondAttribute="centerY" id="Nx3-Gu-PlC"/>
                                                <constraint firstItem="YLf-xG-ZrU" firstAttribute="top" secondItem="uyq-Ch-P6f" secondAttribute="bottom" constant="12" id="TzO-ef-cQP"/>
                                                <constraint firstItem="3Ew-TQ-Qh5" firstAttribute="top" secondItem="YLf-xG-ZrU" secondAttribute="bottom" constant="11" id="Z4C-Eo-mnQ"/>
                                                <constraint firstAttribute="bottom" secondItem="3Ew-TQ-Qh5" secondAttribute="bottom" id="alq-Ep-aFd"/>
                                                <constraint firstItem="gq1-2k-6ZR" firstAttribute="leading" secondItem="Cs0-3x-jKV" secondAttribute="leading" constant="13" id="bmh-OH-V1w"/>
                                                <constraint firstItem="uyq-Ch-P6f" firstAttribute="top" secondItem="gq1-2k-6ZR" secondAttribute="bottom" constant="14" id="hgN-hC-SaV"/>
                                                <constraint firstAttribute="trailing" secondItem="uyq-Ch-P6f" secondAttribute="trailing" constant="14" id="q9Q-Ta-MTP"/>
                                                <constraint firstAttribute="trailing" secondItem="328-hS-eFC" secondAttribute="trailing" constant="14" id="vFE-4F-1Ts"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7Zc-x8-X9P">
                                            <rect key="frame" x="0.0" y="662.66666666666663" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="r3X-Bd-AMv">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="JhG-hm-Te3"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QkL-SA-SZn">
                                                    <rect key="frame" x="13" y="114" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="gUd-nL-ZvK"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比赛简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NMK-fZ-WJU">
                                                    <rect key="frame" x="14" y="15" width="365" height="61"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eyp-c1-yxU">
                                                    <rect key="frame" x="14" y="83" width="365" height="17"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                    <color key="textColor" red="0.23921568630000001" green="0.24313725489999999" blue="0.27058823529999998" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="eyp-c1-yxU" firstAttribute="leading" secondItem="7Zc-x8-X9P" secondAttribute="leading" constant="14" id="77U-gD-NR0"/>
                                                <constraint firstItem="r3X-Bd-AMv" firstAttribute="leading" secondItem="7Zc-x8-X9P" secondAttribute="leading" constant="13" id="CWu-Dp-sW3"/>
                                                <constraint firstItem="NMK-fZ-WJU" firstAttribute="leading" secondItem="7Zc-x8-X9P" secondAttribute="leading" constant="14" id="GkS-3E-vgQ"/>
                                                <constraint firstItem="QkL-SA-SZn" firstAttribute="leading" secondItem="7Zc-x8-X9P" secondAttribute="leading" constant="13" id="IGQ-1u-Irt"/>
                                                <constraint firstItem="QkL-SA-SZn" firstAttribute="top" secondItem="eyp-c1-yxU" secondAttribute="bottom" constant="14" id="LUw-Gb-nkp"/>
                                                <constraint firstAttribute="trailing" secondItem="r3X-Bd-AMv" secondAttribute="trailing" id="Uhc-EI-mRz"/>
                                                <constraint firstItem="eyp-c1-yxU" firstAttribute="top" secondItem="NMK-fZ-WJU" secondAttribute="bottom" constant="7" id="ZWJ-Ff-b2F"/>
                                                <constraint firstAttribute="bottom" secondItem="QkL-SA-SZn" secondAttribute="bottom" id="eTq-zf-Ffk"/>
                                                <constraint firstAttribute="trailing" secondItem="eyp-c1-yxU" secondAttribute="trailing" constant="14" id="gPa-IG-UvI"/>
                                                <constraint firstAttribute="trailing" secondItem="QkL-SA-SZn" secondAttribute="trailing" id="hFC-gZ-wxp"/>
                                                <constraint firstItem="r3X-Bd-AMv" firstAttribute="top" secondItem="7Zc-x8-X9P" secondAttribute="top" id="hic-4e-3an"/>
                                                <constraint firstAttribute="trailing" secondItem="NMK-fZ-WJU" secondAttribute="trailing" constant="14" id="ixf-l8-82F"/>
                                                <constraint firstItem="NMK-fZ-WJU" firstAttribute="top" secondItem="r3X-Bd-AMv" secondAttribute="bottom" constant="14" id="umQ-uf-lkG"/>
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BbS-Jx-uUf">
                                            <rect key="frame" x="0.0" y="777.66666666666663" width="393" height="148.33333333333337"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="L6z-Cl-axB">
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="nVF-Mh-2rb"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="比赛详情" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="N0y-Po-mL4">
                                                    <rect key="frame" x="14" y="14.999999999999998" width="365" height="19.333333333333329"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <wkWebView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Wel-DM-IRM">
                                                    <rect key="frame" x="0.0" y="48.333333333333371" width="393" height="100"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="6az-y3-MSd"/>
                                                    </constraints>
                                                    <wkWebViewConfiguration key="configuration">
                                                        <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
                                                        <wkPreferences key="preferences"/>
                                                    </wkWebViewConfiguration>
                                                </wkWebView>
                                            </subviews>
                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                            <constraints>
                                                <constraint firstItem="L6z-Cl-axB" firstAttribute="leading" secondItem="BbS-Jx-uUf" secondAttribute="leading" constant="13" id="1r4-HO-zao"/>
                                                <constraint firstAttribute="trailing" secondItem="N0y-Po-mL4" secondAttribute="trailing" constant="14" id="41H-XR-Hq6"/>
                                                <constraint firstAttribute="bottom" secondItem="Wel-DM-IRM" secondAttribute="bottom" id="Aqk-Yo-Nqk"/>
                                                <constraint firstItem="N0y-Po-mL4" firstAttribute="top" secondItem="L6z-Cl-axB" secondAttribute="bottom" constant="14" id="G56-z8-oxg"/>
                                                <constraint firstAttribute="trailing" secondItem="Wel-DM-IRM" secondAttribute="trailing" id="Iyf-hc-feX"/>
                                                <constraint firstItem="Wel-DM-IRM" firstAttribute="leading" secondItem="BbS-Jx-uUf" secondAttribute="leading" id="Ufh-hB-jBH"/>
                                                <constraint firstItem="N0y-Po-mL4" firstAttribute="leading" secondItem="BbS-Jx-uUf" secondAttribute="leading" constant="14" id="XeM-JC-Qnt"/>
                                                <constraint firstItem="L6z-Cl-axB" firstAttribute="top" secondItem="BbS-Jx-uUf" secondAttribute="top" id="Ykz-S2-nRC"/>
                                                <constraint firstAttribute="trailing" secondItem="L6z-Cl-axB" secondAttribute="trailing" id="sdq-0T-MFr"/>
                                                <constraint firstItem="Wel-DM-IRM" firstAttribute="top" secondItem="N0y-Po-mL4" secondAttribute="bottom" constant="14" id="vP3-yF-j2f"/>
                                            </constraints>
                                        </view>
                                    </subviews>
                                </stackView>
                            </subviews>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstItem="UWR-Fw-RqI" firstAttribute="leading" secondItem="5Sd-Ru-eG3" secondAttribute="leading" id="232-dy-TDh"/>
                                <constraint firstAttribute="bottom" secondItem="UWR-Fw-RqI" secondAttribute="bottom" id="3ZH-p9-MV4"/>
                                <constraint firstItem="MmS-Eb-s2q" firstAttribute="top" secondItem="5Sd-Ru-eG3" secondAttribute="top" id="E2k-Bx-gRf"/>
                                <constraint firstItem="MmS-Eb-s2q" firstAttribute="leading" secondItem="5Sd-Ru-eG3" secondAttribute="leading" id="I1k-JB-7y0"/>
                                <constraint firstAttribute="trailing" secondItem="MmS-Eb-s2q" secondAttribute="trailing" id="NBV-WR-uMo"/>
                                <constraint firstAttribute="trailing" secondItem="UWR-Fw-RqI" secondAttribute="trailing" id="Th5-rV-cD5"/>
                                <constraint firstItem="UWR-Fw-RqI" firstAttribute="top" secondItem="MmS-Eb-s2q" secondAttribute="bottom" id="eCG-DI-Jot"/>
                            </constraints>
                        </view>
                    </subviews>
                    <constraints>
                        <constraint firstItem="5Sd-Ru-eG3" firstAttribute="centerX" secondItem="dMb-17-MtC" secondAttribute="centerX" id="6AD-vp-pCo"/>
                        <constraint firstItem="5Sd-Ru-eG3" firstAttribute="top" secondItem="dMb-17-MtC" secondAttribute="top" id="FY6-aA-8ZM"/>
                        <constraint firstAttribute="bottom" secondItem="5Sd-Ru-eG3" secondAttribute="bottom" constant="15" id="MD2-1M-jMy"/>
                        <constraint firstItem="5Sd-Ru-eG3" firstAttribute="leading" secondItem="dMb-17-MtC" secondAttribute="leading" id="WoT-0h-dLV"/>
                        <constraint firstAttribute="trailing" secondItem="5Sd-Ru-eG3" secondAttribute="trailing" id="t1u-0L-15U"/>
                    </constraints>
                </scrollView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gkg-tn-WFH">
                    <rect key="frame" x="0.0" y="770" width="393" height="48"/>
                    <color key="backgroundColor" name="FE6E0D"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="48" id="y3u-8o-eMw"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" title="取消"/>
                </button>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="Gkg-tn-WFH" secondAttribute="bottom" id="JBB-iZ-Ebd"/>
                <constraint firstAttribute="trailing" secondItem="dMb-17-MtC" secondAttribute="trailing" id="LmP-AQ-wQK"/>
                <constraint firstItem="Gkg-tn-WFH" firstAttribute="top" secondItem="dMb-17-MtC" secondAttribute="bottom" id="NDt-ki-gaj"/>
                <constraint firstItem="dMb-17-MtC" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="NOY-xw-LY1"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="Gkg-tn-WFH" secondAttribute="trailing" id="P8D-8M-TyS"/>
                <constraint firstItem="Gkg-tn-WFH" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="QM5-nq-ctA"/>
                <constraint firstItem="dMb-17-MtC" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="xWF-dl-cCp"/>
            </constraints>
            <point key="canvasLocation" x="136.64122137404578" y="20.422535211267608"/>
        </view>
    </objects>
    <resources>
        <image name="icon_hot_1" width="24" height="28"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/WorldCupContentVC.swift
New file
@@ -0,0 +1,50 @@
//
//  WorldCupContentVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
class WorldCupContentVC: BaseVC {
                private var tableView:UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
                                view.backgroundColor = .clear
    }
                override func setUI() {
                                tableView = UITableView(frame: .zero, style: .plain)
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.backgroundColor = .clear
                                tableView.register(UINib(nibName: "WorldCupTCell", bundle: nil), forCellReuseIdentifier: "_WorldCupTCell")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                }
}
extension WorldCupContentVC:UITableViewDelegate,UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                let vc = WorldCupContentDetailVC()
                                push(vc: vc)
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 20
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_WorldCupTCell") as! WorldCupTCell
                                cell.backgroundColor = .clear
                                return cell
                }
}
WanPai/Root/Search/VC/WorldCupHeaderVC.swift
New file
@@ -0,0 +1,29 @@
//
//  WorldCupHeaderVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
class WorldCupHeaderVC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
                                view.backgroundColor = .clear
    }
    /*
    // MARK: - Navigation
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */
}
WanPai/Root/Search/VC/WorldCupHeaderVC.xib
New file
@@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WorldCupHeaderVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="418"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="rC1-GG-uHG">
                    <rect key="frame" x="24.000000000000007" y="24.000000000000007" width="87.666666666666686" height="87.666666666666686"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="87.5" id="acp-fA-EI4"/>
                        <constraint firstAttribute="width" constant="87.5" id="viK-40-g8b"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="43.75"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CLm-un-lHA">
                    <rect key="frame" x="124.99999999999999" y="38.666666666666664" width="19.333333333333329" height="20.333333333333336"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="20.5" id="Qfh-Lz-vgN"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3bk-Zw-hOl" customClass="QMUIButton">
                    <rect key="frame" x="125" y="68" width="98" height="35"/>
                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" title="切换人员" image="btn_exchange">
                        <color key="titleColor" red="0.30588235294117649" green="0.85882352941176465" blue="0.74117647058823533" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </state>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="number" keyPath="spacingBetweenImageAndTitle">
                            <real key="value" value="6"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </button>
                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kqK-MA-Vfm">
                    <rect key="frame" x="282" y="29.666666666666671" width="76" height="76"/>
                    <color key="backgroundColor" systemColor="systemGray4Color"/>
                    <constraints>
                        <constraint firstAttribute="width" constant="76" id="dqa-c1-DHq"/>
                        <constraint firstAttribute="height" constant="76" id="meQ-qP-IB9"/>
                    </constraints>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="您的2024年场次排名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dho-Mk-UEo">
                    <rect key="frame" x="0.0" y="142.66666666666666" width="393" height="17"/>
                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9RA-9C-jhI">
                    <rect key="frame" x="31" y="174.33333333333334" width="331" height="52"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5bi-q0-cyM">
                            <rect key="frame" x="165" y="9" width="1" height="36"/>
                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                            <constraints>
                                <constraint firstAttribute="width" constant="1" id="Ezc-Uz-pmu"/>
                            </constraints>
                        </view>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="成都排名 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qXP-LB-xCU">
                            <rect key="frame" x="186.66666666666666" y="21" width="69.666666666666657" height="17"/>
                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="全国排名 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="06M-Qw-l20">
                            <rect key="frame" x="15" y="21" width="69.666666666666671" height="17"/>
                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                            <nil key="highlightedColor"/>
                        </label>
                    </subviews>
                    <color key="backgroundColor" name="FE6E0D"/>
                    <constraints>
                        <constraint firstAttribute="bottom" secondItem="06M-Qw-l20" secondAttribute="bottom" constant="14" id="2ja-cx-dYR"/>
                        <constraint firstItem="qXP-LB-xCU" firstAttribute="leading" secondItem="5bi-q0-cyM" secondAttribute="trailing" constant="20.5" id="74s-Mt-1uu"/>
                        <constraint firstItem="06M-Qw-l20" firstAttribute="leading" secondItem="9RA-9C-jhI" secondAttribute="leading" constant="15" id="HeM-ZB-EQV"/>
                        <constraint firstItem="5bi-q0-cyM" firstAttribute="centerX" secondItem="9RA-9C-jhI" secondAttribute="centerX" id="Jb3-h8-BVT"/>
                        <constraint firstAttribute="bottom" secondItem="qXP-LB-xCU" secondAttribute="bottom" constant="14" id="nsi-Vw-kg3"/>
                        <constraint firstItem="5bi-q0-cyM" firstAttribute="top" secondItem="9RA-9C-jhI" secondAttribute="top" constant="9" id="tIz-Dv-NHL"/>
                        <constraint firstAttribute="height" constant="52" id="tq2-g3-PeI"/>
                        <constraint firstAttribute="bottom" secondItem="5bi-q0-cyM" secondAttribute="bottom" constant="7" id="vjM-zM-z8S"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="26"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="负场次" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Peq-DE-vPX">
                    <rect key="frame" x="131" y="250.33333333333337" width="131" height="14"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="14" id="vHE-xd-QBS"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="胜率" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Tv-DA-R5E">
                    <rect key="frame" x="262" y="250.33333333333337" width="131" height="14"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="14" id="zEI-gZ-fy4"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                    <color key="textColor" red="0.34901960780000002" green="0.3411764706" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="胜场次" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="E06-bD-LoM">
                    <rect key="frame" x="0.0" y="250.33333333333337" width="131" height="14"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="14" id="zhZ-gy-Wf9"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                    <color key="textColor" red="0.34901960780000002" green="0.3411764706" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="m9A-Xb-JPg">
                    <rect key="frame" x="268" y="274.33333333333331" width="93" height="46"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="46" id="8tN-ps-bbt"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="27"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                            <color key="value" name="FE6E0D"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                            <real key="value" value="1"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="23"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rEf-8b-RAY">
                    <rect key="frame" x="32" y="274.33333333333331" width="93" height="46"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="46" id="Zh3-Gp-bHb"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="27"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                            <color key="value" name="FE6E0D"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                            <real key="value" value="1"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="23"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </label>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lO3-VT-LVU">
                    <rect key="frame" x="150" y="274.33333333333331" width="93" height="46"/>
                    <constraints>
                        <constraint firstAttribute="height" constant="46" id="Fpt-PG-81C"/>
                    </constraints>
                    <fontDescription key="fontDescription" type="system" pointSize="27"/>
                    <color key="textColor" red="0.34901960784313724" green="0.3411764705882353" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    <nil key="highlightedColor"/>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                            <color key="value" name="FE6E0D"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                            <real key="value" value="1"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="23"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </label>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="m9A-Xb-JPg" firstAttribute="top" secondItem="rEf-8b-RAY" secondAttribute="top" id="1JM-fs-BSA"/>
                <constraint firstItem="lO3-VT-LVU" firstAttribute="centerX" secondItem="Peq-DE-vPX" secondAttribute="centerX" id="40K-BC-Ska"/>
                <constraint firstItem="9RA-9C-jhI" firstAttribute="top" secondItem="dho-Mk-UEo" secondAttribute="bottom" constant="14.5" id="4H8-rg-qaV"/>
                <constraint firstItem="CLm-un-lHA" firstAttribute="leading" secondItem="rC1-GG-uHG" secondAttribute="trailing" constant="13.5" id="7KP-Up-Wjn"/>
                <constraint firstItem="9RA-9C-jhI" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="31" id="7YN-Nf-NVK"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="7Tv-DA-R5E" secondAttribute="trailing" id="97Z-Lt-Xc6"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="m9A-Xb-JPg" secondAttribute="trailing" constant="32" id="AOB-qc-e1Y"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="9RA-9C-jhI" secondAttribute="trailing" constant="31" id="Adw-GT-Y0X"/>
                <constraint firstItem="dho-Mk-UEo" firstAttribute="top" secondItem="kqK-MA-Vfm" secondAttribute="bottom" constant="37" id="ENW-DR-ptu"/>
                <constraint firstItem="kqK-MA-Vfm" firstAttribute="centerY" secondItem="rC1-GG-uHG" secondAttribute="centerY" id="H2t-1L-Swv"/>
                <constraint firstItem="rC1-GG-uHG" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="24" id="HgH-ec-6mG"/>
                <constraint firstItem="rEf-8b-RAY" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="32" id="J8r-1H-0zw"/>
                <constraint firstItem="3bk-Zw-hOl" firstAttribute="top" secondItem="CLm-un-lHA" secondAttribute="bottom" constant="9" id="NL7-24-lfZ"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="dho-Mk-UEo" secondAttribute="trailing" id="Oyo-J1-MSN"/>
                <constraint firstItem="lO3-VT-LVU" firstAttribute="leading" secondItem="rEf-8b-RAY" secondAttribute="trailing" constant="25" id="PmD-Dt-ho8"/>
                <constraint firstItem="Peq-DE-vPX" firstAttribute="top" secondItem="E06-bD-LoM" secondAttribute="top" id="QY6-Xm-ShD"/>
                <constraint firstItem="7Tv-DA-R5E" firstAttribute="leading" secondItem="Peq-DE-vPX" secondAttribute="trailing" id="Tw1-gw-DR2"/>
                <constraint firstItem="lO3-VT-LVU" firstAttribute="top" secondItem="Peq-DE-vPX" secondAttribute="bottom" constant="10" id="UVT-Su-Uiq"/>
                <constraint firstItem="CLm-un-lHA" firstAttribute="top" secondItem="rC1-GG-uHG" secondAttribute="top" constant="14.5" id="Urr-X9-Yxg"/>
                <constraint firstItem="3bk-Zw-hOl" firstAttribute="leading" secondItem="CLm-un-lHA" secondAttribute="leading" id="V1E-uQ-2x2"/>
                <constraint firstItem="lO3-VT-LVU" firstAttribute="top" secondItem="rEf-8b-RAY" secondAttribute="top" id="V79-Pc-1wJ"/>
                <constraint firstItem="Peq-DE-vPX" firstAttribute="top" secondItem="9RA-9C-jhI" secondAttribute="bottom" constant="24" id="cff-f0-lmR"/>
                <constraint firstItem="dho-Mk-UEo" firstAttribute="centerX" secondItem="fnl-2z-Ty3" secondAttribute="centerX" id="fzG-wS-Dji"/>
                <constraint firstItem="7Tv-DA-R5E" firstAttribute="top" secondItem="E06-bD-LoM" secondAttribute="top" id="gQX-Wq-R9D"/>
                <constraint firstItem="Peq-DE-vPX" firstAttribute="centerX" secondItem="fnl-2z-Ty3" secondAttribute="centerX" id="gbH-2M-vRU"/>
                <constraint firstItem="E06-bD-LoM" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="gjE-T9-KXv"/>
                <constraint firstItem="lO3-VT-LVU" firstAttribute="width" secondItem="rEf-8b-RAY" secondAttribute="width" id="ljt-w2-XRi"/>
                <constraint firstItem="m9A-Xb-JPg" firstAttribute="leading" secondItem="lO3-VT-LVU" secondAttribute="trailing" constant="25" id="msI-qw-ojx"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="kqK-MA-Vfm" secondAttribute="trailing" constant="35" id="qYf-Yz-QGa"/>
                <constraint firstItem="m9A-Xb-JPg" firstAttribute="width" secondItem="rEf-8b-RAY" secondAttribute="width" id="qda-yh-5e1"/>
                <constraint firstItem="Peq-DE-vPX" firstAttribute="leading" secondItem="E06-bD-LoM" secondAttribute="trailing" id="rNC-0l-Kxm"/>
                <constraint firstItem="7Tv-DA-R5E" firstAttribute="width" secondItem="E06-bD-LoM" secondAttribute="width" id="sGr-Co-SRW"/>
                <constraint firstItem="dho-Mk-UEo" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="uqs-Ug-h0k"/>
                <constraint firstItem="rC1-GG-uHG" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" constant="24" id="whU-9h-iS8"/>
                <constraint firstItem="Peq-DE-vPX" firstAttribute="width" secondItem="E06-bD-LoM" secondAttribute="width" id="y0w-N0-AB4"/>
            </constraints>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <point key="canvasLocation" x="81.679389312977094" y="-132.3943661971831"/>
        </view>
    </objects>
    <resources>
        <image name="btn_exchange" width="40" height="35"/>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
        <systemColor name="systemGray4Color">
            <color red="0.81960784313725488" green="0.81960784313725488" blue="0.83921568627450982" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Search/VC/WorldCupMenuVC.swift
New file
@@ -0,0 +1,52 @@
//
//  WorldCupMenuVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
import SPPageMenu
import JQTools
class WorldCupMenuVC: BaseVC {
                var pageMenu:SPPageMenu!
    override func viewDidLoad() {
        super.viewDidLoad()
                                view.backgroundColor = .clear
                                pageMenu = SPPageMenu(frame: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: 51), trackerStyle: .line)
                                view.addSubview(pageMenu)
                                pageMenu.backgroundColor = .clear
                                // 追踪线
                                pageMenu.trackerWidth = 50
                                pageMenu.setTrackerHeight(1.5, cornerRadius: 0)
                                pageMenu.tracker.backgroundColor = UIColor(hexString: "#3876F2")
                                pageMenu.trackerFollowingMode = .always
                                // 分割线
                                pageMenu.dividingLine.backgroundColor = UIColor.clear
                                pageMenu.dividingLineHeight = 1
                                // item
                                pageMenu.spacing = 20.0
                                pageMenu.permutationWay = .notScrollAdaptContent
                                pageMenu.setItems(["进行中","未开始","比赛记录","排名"], selectedItemIndex: 0)
                                // 字体
                                pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 17, weight: .medium)
                                pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 17)
                                // 颜色
                                pageMenu.selectedItemTitleColor = UIColor(hexString: "#3876F2")!
                                pageMenu.unSelectedItemTitleColor = UIColor(hexString: "#595757")!
    }
}
//extension WorldCupMenuVC:SPPageMenuDelegate{
//                func pageMenu(_ pageMenu: SPPageMenu, itemSelectedFrom fromIndex: Int, to toIndex: Int) {
//                                print("fromIndex:\(fromIndex) toIndex:\(toIndex)")
//                }
//
//}
WanPai/Root/Search/VC/WorldCupRankVC.swift
New file
@@ -0,0 +1,276 @@
//
//  WorldCupRankVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/27.
//
import UIKit
import JQTools
import QMUIKit
class WorldCupRankVC: BaseVC {
                private var tableView:UITableView!
                override func viewDidLoad() {
                                super.viewDidLoad()
                                view.backgroundColor = .clear
                }
                override func setUI() {
                                tableView = UITableView(frame: .zero, style: .plain)
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.showsVerticalScrollIndicator = false
                                tableView.showsHorizontalScrollIndicator = false
                                tableView.backgroundColor = .clear
                                tableView.separatorStyle = .none
                                if #available(iOS 15.0, *) {
                                                tableView.sectionHeaderTopPadding = 0
                                }
                                tableView.register(WorldCupRankTCell.self, forCellReuseIdentifier: "rankTCell")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.top.left.right.equalToSuperview().inset(UIEdgeInsets(top: 0, left: 14, bottom: 0, right: 14))
                                                make.bottom.equalToSuperview().offset(-69)
                                }
                                let stackView = UIStackView()
                                stackView.axis = .horizontal
                                stackView.distribution = .equalCentering
                                stackView.spacing = 20
                                view.addSubview(stackView)
                                stackView.snp.makeConstraints { make in
                                                make.centerX.equalToSuperview()
                                                make.bottom.equalTo(-16)
                                                make.height.equalTo(40)
                                }
                                let provinceBtn = UIButton(type: .custom)
                                provinceBtn.setTitle("全国", for: .normal)
                                provinceBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
                                provinceBtn.setTitleColor(UIColor(hexString: "#FE7E03"), for: .normal)
                                provinceBtn.borderColor = UIColor(hexString: "#FE7E03")
                                provinceBtn.borderWidth = 1
                                provinceBtn.cornerRadius = 20
                                provinceBtn.snp.makeConstraints { make in
                                                make.width.equalTo(144)
                                }
                                let cityBtn = UIButton(type: .custom)
                                cityBtn.setTitle("城市", for: .normal)
                                cityBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
                                cityBtn.setTitleColor(.white, for: .normal)
                                cityBtn.backgroundColor = UIColor(hexString: "#FE7E03")
                                cityBtn.cornerRadius = 20
                                cityBtn.snp.makeConstraints { make in
                                                make.width.equalTo(144)
                                }
                                stackView.addArrangedSubview(provinceBtn)
                                stackView.addArrangedSubview(cityBtn)
                }
}
extension WorldCupRankVC:UITableViewDelegate,UITableViewDataSource{
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                if section == 0{
                                                return 1
                                }
                                return 2
                }
                func numberOfSections(in tableView: UITableView) -> Int {
                                return 2
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                if indexPath.section == 0{
                                                var cell = tableView.dequeueReusableCell(withIdentifier: "topHanderView")
                                                if cell == nil{
                                                                cell = UITableViewCell(style: .default, reuseIdentifier: "topHanderView")
                                                                let label = UILabel()
                                                                label.text = "排名"
                                                                label.textAlignment = .center
                                                                label.font = UIFont.systemFont(ofSize: 12, weight: .medium)
                                                                label.textColor = .black.withAlphaComponent(0.8)
                                                                cell?.contentView.addSubview(label)
                                                                label.snp.makeConstraints { make in
                                                                                make.top.bottom.equalToSuperview()
                                                                                make.left.equalToSuperview()
                                                                                make.width.equalTo((JQ_ScreenW - 28) * 0.138)
                                                                                make.height.equalTo(32)
                                                                }
                                                                label.addLine(UIColor(hexStr: "#E1E1E1"), true, true, true, false, 0.4)
                                                                let label1 = UILabel()
                                                                label1.text = "用户"
                                                                label1.textAlignment = .center
                                                                label1.font = UIFont.systemFont(ofSize: 12, weight: .medium)
                                                                label1.textColor = .black.withAlphaComponent(0.8)
                                                                cell?.contentView.addSubview(label1)
                                                                label1.snp.makeConstraints { make in
                                                                                make.top.bottom.equalToSuperview()
                                                                                make.width.equalTo((JQ_ScreenW - 28) * 0.337)
                                                                                make.height.equalTo(32)
                                                                                make.left.equalTo(label.snp.right)
                                                                }
                                                                label1.addLine(UIColor(hexStr: "#E1E1E1"), true, true, true, false, 0.4)
                                                                let label2 = UILabel()
                                                                label2.text = "总场次"
                                                                label2.textAlignment = .center
                                                                label2.font = UIFont.systemFont(ofSize: 12, weight: .medium)
                                                                label2.textColor = .black.withAlphaComponent(0.8)
                                                                cell?.contentView.addSubview(label2)
                                                                label2.snp.makeConstraints { make in
                                                                                make.top.bottom.equalToSuperview()
                                                                                make.width.equalTo((JQ_ScreenW - 28) * 0.3314)
                                                                                make.height.equalTo(32)
                                                                                make.left.equalTo(label1.snp.right)
                                                                }
                                                                label2.addLine(UIColor(hexStr: "#E1E1E1"), true, true, true, false, 0.4)
                                                                let label3 = UILabel()
                                                                label3.text = "胜率"
                                                                label3.textAlignment = .center
                                                                label3.font = UIFont.systemFont(ofSize: 12, weight: .medium)
                                                                label3.textColor = .black.withAlphaComponent(0.8)
                                                                cell?.contentView.addSubview(label3)
                                                                label3.snp.makeConstraints { make in
                                                                                make.top.bottom.equalToSuperview()
                                                                                make.width.equalTo((JQ_ScreenW - 28) * 0.2016)
                                                                                make.height.equalTo(32)
                                                                                make.left.equalTo(label2.snp.right)
                                                                }
                                                                label3.addLine(UIColor(hexStr: "#E1E1E1"), true, true, true, true, 0.4)
                                                }
                                                return cell!
                                }
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "rankTCell") as! WorldCupRankTCell
                                                cell.addLine(UIColor(hexStr: "#E1E1E1"), false, true, false, true, 0.4)
                                                return cell
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                if indexPath.section == 0{
                                                return 32
                                }
                                return 45
                }
                func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
                                if section != 0{
                                                return nil
                                }
                                var headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
                                if headerView == nil{
                                                headerView = UITableViewHeaderFooterView(reuseIdentifier: "header")
                                                headerView?.backgroundColor = .clear
                                                headerView?.contentView.backgroundColor = .clear
                                                let label = UILabel(text: "参与年份: ")
                                                label.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
                                                label.textColor = .black.withAlphaComponent(0.8)
                                                headerView?.contentView.addSubview(label)
                                                label.snp.makeConstraints { make in
                                                                make.left.equalTo(14)
                                                                make.centerY.equalToSuperview()
                                                }
                                                let btn = QMUIButton(type: .custom)
                                                btn.setTitle("全部", for: .normal)
                                                btn.setTitleColor(.black.withAlphaComponent(0.74), for: .normal)
                                                btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
                                                btn.borderColor = UIColor(hexString: "#D9D9D9")
                                                btn.borderWidth = 1
                                                btn.setImage(UIImage(named: "icon_down_arrow"), for: .normal)
                                                btn.spacingBetweenImageAndTitle = 20
                                                btn.imagePosition = .right
                                                btn.jq_cornerRadius = 5
                                                headerView?.contentView.addSubview(btn)
                                                btn.snp.makeConstraints { make in
                                                                make.left.equalTo(label.snp.right).offset(2)
                                                                make.centerY.equalToSuperview()
                                                                make.width.greaterThanOrEqualTo(88)
                                                                make.height.equalTo(35)
                                                }
                                                let btn1 = QMUIButton(type: .custom)
                                                btn1.setTitle("按胜率排名", for: .normal)
                                                btn1.setTitleColor(UIColor(hexString: "#3876F2"), for: .normal)
                                                btn1.titleLabel?.font = UIFont.systemFont(ofSize: 16,weight: .medium)
                                                btn1.setImage(UIImage(named: "icon_reset"), for: .normal)
                                                btn1.spacingBetweenImageAndTitle = 5
                                                btn1.imagePosition = .right
                                                headerView?.contentView.addSubview(btn1)
                                                btn1.snp.makeConstraints { make in
                                                                make.right.equalToSuperview().offset(-14)
                                                                make.centerY.equalToSuperview()
                                                                make.height.equalTo(22)
                                                }
                                }
                                return headerView
                }
                func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
                                if section != 0{
                                                return 0.0001
                                }
                                return 85
                }
}
extension UIView{
                //给当前的view边界换上线,可以任意设置4个边
                func addLine(_ color:UIColor = UIColor.lightGray.withAlphaComponent(0.3),_ top:Bool = false,_ left:Bool = false,_ bottom:Bool = false,_ right:Bool = false,_ width:CGFloat = 0.5){
                                if top{
                                                let line = UIView()
                                                line.backgroundColor = color
                                                addSubview(line)
                                                line.snp.makeConstraints { make in
                                                                make.top.left.right.equalToSuperview()
                                                                make.height.equalTo(width)
                                                }
                                }
                                if left{
                                                let line = UIView()
                                                line.backgroundColor = color
                                                addSubview(line)
                                                line.snp.makeConstraints { make in
                                                                make.top.left.bottom.equalToSuperview()
                                                                make.width.equalTo(width)
                                                }
                                }
                                if bottom{
                                                let line = UIView()
                                                line.backgroundColor = color
                                                addSubview(line)
                                                line.snp.makeConstraints { make in
                                                                make.bottom.left.right.equalToSuperview()
                                                                make.height.equalTo(width)
                                                }
                                }
                                if right{
                                                let line = UIView()
                                                line.backgroundColor = color
                                                addSubview(line)
                                                line.snp.makeConstraints { make in
                                                                make.top.bottom.equalToSuperview()
                                                                make.right.equalToSuperview().offset(-0.4)
                                                                make.width.equalTo(width)
                                                }
                                }
                }
}
WanPai/Root/Search/VC/WorldCupRecordVC.swift
New file
@@ -0,0 +1,75 @@
//
//  WorldCupRecordVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/27.
//
import UIKit
class WorldCupRecordVC: BaseVC {
                private var tableView:UITableView!
                override func viewDidLoad() {
                                super.viewDidLoad()
                                view.backgroundColor = .clear
                }
                override func setUI() {
                                tableView = UITableView(frame: .zero, style: .grouped)
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.backgroundColor = .clear
                                if #available(iOS 15.0, *) {
                                                tableView.sectionHeaderTopPadding = 0
                                }
                                tableView.register(UINib(nibName: "WorldCupRecordTCell", bundle: nil), forCellReuseIdentifier: "_WorldCupRecordTCell")
                                view.addSubview(tableView)
                                tableView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                }
}
extension WorldCupRecordVC:UITableViewDelegate,UITableViewDataSource{
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 20
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_WorldCupRecordTCell") as! WorldCupRecordTCell
                                cell.backgroundColor = .clear
                                return cell
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                return 102
                }
                func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
                                var headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
                                if headerView == nil{
                                                headerView = UITableViewHeaderFooterView(reuseIdentifier: "header")
                                                headerView?.backgroundColor = .clear
                                                headerView?.contentView.backgroundColor = .clear
                                            let label    = UILabel()
                                                label.text = "总场次:0场"
                                                label.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
                                                label.textColor = .black.withAlphaComponent(0.8)
                                                headerView?.contentView.addSubview(label)
                                                label.snp.makeConstraints { make in
                                                                make.left.equalTo(14)
                                                                make.height.equalTo(22)
                                                                make.bottom.equalToSuperview().offset(-6.5)
                                                }
                                }
                                return headerView
                }
                func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
                                return 54
                }
}
WanPai/Root/Search/VC/WorldCupVC.swift
New file
@@ -0,0 +1,108 @@
//
//  WorldCupVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
import SPPageMenu
import FFPage
import JQTools
class WorldCupVC: BaseVC {
                lazy var headerVC:WorldCupHeaderVC = {
                                let vc = WorldCupHeaderVC()
                                return vc
                }()
                lazy var menuVC:WorldCupMenuVC = {
                                let vc = WorldCupMenuVC()
                                return vc
                }()
                lazy var adapterVC:FFAdapterViewController = {
                                let vc = FFAdapterViewController()
                                vc.headViewController = headerVC
                                vc.menuViewController = menuVC
                                vc.pageViewController = pageVC
                                vc.headHeight = 350
                                vc.menuHeight = 50
                                vc.style = .subRefresh
                                return vc
                }()
                lazy var pageVC:FFPageViewController = {
                                let pageViewController = FFPageViewController()
                                pageViewController.view.backgroundColor = .clear
                                pageViewController.delegate = self
                                pageViewController.scrollview.backgroundColor = .clear
                                return pageViewController
                }()
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "我的报名"
                                let bgImg = UIImageView(image: UIImage(named: "bg_long"))
                                bgImg.contentMode = .scaleAspectFill
                                view.addSubview(bgImg)
                                bgImg.snp.makeConstraints { make in
                                                make.top.equalTo(200)
                                                make.left.right.bottom.equalToSuperview()
                                }
                                addChild(adapterVC)
                                adapterVC.view.backgroundColor = .clear
                                view.addSubview(adapterVC.view)
                                adapterVC.view.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide)
                                                make.left.right.bottom.equalToSuperview()
                                }
                                menuVC.pageMenu.delegate = self
    }
                override func setUI() {
                }
}
extension WorldCupVC:FFPageViewControllerDelegate{
                func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                                return 4
                }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                if page <= 1{
                                                return WorldCupContentVC()
                                }else if page == 2{
                                                return WorldCupRecordVC()
                                }else{
                                                return WorldCupRankVC()
                                }
                }
                func pageViewController(_ pageViewController: FFPageViewController, didScrollTo index: Int) {
                }
}
extension WorldCupVC:SPPageMenuDelegate{
                func pageMenu(_ pageMenu: SPPageMenu, didSelectedItem index: Int) {
                                pageVC.scroll(toPage: index, animation: true)
                }
                func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
                }
                func pageMenu(_ pageMenu: SPPageMenu, itemSelectedFrom fromIndex: Int, to toIndex: Int) {
                                pageVC.scroll(toPage: toIndex, animation: true)
                }
}
WanPai/Root/Welfare/CCell/FindItemCCell.swift
New file
@@ -0,0 +1,18 @@
//
//  FindItemCCell.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/26.
//
import UIKit
class FindItemCCell: UICollectionViewCell {
                @IBOutlet weak var label_title: UILabel!
                override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
}
WanPai/Root/Welfare/CCell/FindItemCCell.xib
New file
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="_FindItemCCell" id="gTV-IL-0wX" customClass="FindItemCCell" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="145" height="187"/>
            <autoresizingMask key="autoresizingMask"/>
            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
                <rect key="frame" x="0.0" y="0.0" width="145" height="187"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <subviews>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="A0h-c2-sMH">
                        <rect key="frame" x="47.666666666666657" y="0.0" width="50" height="50"/>
                        <color key="backgroundColor" red="0.98039215690000003" green="0.57254901960000004" blue="0.23529411759999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="width" constant="50" id="MnY-6I-gT0"/>
                            <constraint firstAttribute="height" constant="50" id="vg3-hc-JPZ"/>
                        </constraints>
                    </imageView>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5ma-Jk-HRg">
                        <rect key="frame" x="51.666666666666657" y="60" width="42" height="21"/>
                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
                        <nil key="textColor"/>
                        <nil key="highlightedColor"/>
                    </label>
                </subviews>
            </view>
            <constraints>
                <constraint firstItem="5ma-Jk-HRg" firstAttribute="top" secondItem="A0h-c2-sMH" secondAttribute="bottom" constant="10" id="54e-B1-BJk"/>
                <constraint firstItem="5ma-Jk-HRg" firstAttribute="centerX" secondItem="A0h-c2-sMH" secondAttribute="centerX" id="JMK-wR-iZ7"/>
                <constraint firstItem="A0h-c2-sMH" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="j7b-lP-gGO"/>
                <constraint firstItem="A0h-c2-sMH" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="p3Y-S2-EJ3"/>
            </constraints>
            <size key="customSize" width="145" height="187"/>
            <connections>
                <outlet property="label_title" destination="5ma-Jk-HRg" id="zUy-fV-rdb"/>
            </connections>
            <point key="canvasLocation" x="112.21374045801527" y="68.661971830985919"/>
        </collectionViewCell>
    </objects>
</document>
WanPai/Root/Welfare/VC/WelfareFreeVC.swift
@@ -12,39 +12,39 @@
class WelfareFreeVC: BaseVC {
    var storeWalfareModel:StoreWalfareModel?
    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var btn_call: QMUIButton!
                var storeWalfareModel:StoreWalfareModel?
                @IBOutlet weak var webView: WKWebView!
                @IBOutlet weak var btn_call: QMUIButton!
    init(_ model:StoreWalfareModel) {
        super.init(nibName: nil, bundle: nil)
        self.storeWalfareModel = model
    }
                init(_ model:StoreWalfareModel) {
                                super.init(nibName: nil, bundle: nil)
                                self.storeWalfareModel = model
                }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "免费福利"
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "免费福利"
                                if let m = storeWalfareModel{
                                                let html = "<img src='\(m.img)' width='\(JQ_ScreenW)' loading=eager/>"
                                                self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
                                                self.btn_call.isHidden = m.phone.isEmpty
                                }
                }
        if let m = storeWalfareModel{
            let html = "<img src='\(m.img)' width='\(JQ_ScreenW)' loading=eager/>"
            self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
            self.btn_call.isHidden = m.phone.isEmpty
        }
    }
                override func setUI() {
                                btn_call.imagePosition = .left
                                btn_call.spacingBetweenImageAndTitle = 13
                }
    override func setUI() {
        btn_call.imagePosition = .left
        btn_call.spacingBetweenImageAndTitle = 13
    }
    @IBAction func callPhoneAction(_ sender: UIButton) {
        if let phone = storeWalfareModel?.phone{
            UIApplication.shared.open(URL(string: "tel://\(phone)")!, options: [:], completionHandler: nil)
        }
    }
                @IBAction func callPhoneAction(_ sender: UIButton) {
                                if let phone = storeWalfareModel?.phone{
                                                UIApplication.shared.open(URL(string: "tel://\(phone)")!, options: [:], completionHandler: nil)
                                }
                }
}
WanPai/Root/Welfare/VC/WelfareVC.swift
@@ -13,167 +13,167 @@
class WelfareVC: BaseVC {
    @IBOutlet weak var img_userProfile: UIImageView!
    @IBOutlet weak var label_username: UILabel!
    @IBOutlet weak var btn_vip: QMUIButton!
    @IBOutlet weak var label_coin: UILabel!
    @IBOutlet weak var label_score: UILabel!
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var coinCollectionView: UICollectionView!
    @IBOutlet weak var btn_coupon: UIButton!
//    @IBOutlet weak var btn_shoppping: UIButton!
//    @IBOutlet weak var btn_weekly: UIButton!
//    @IBOutlet weak var btn_todayFree: UIButton!
                @IBOutlet weak var img_userProfile: UIImageView!
                @IBOutlet weak var label_username: UILabel!
                @IBOutlet weak var btn_vip: QMUIButton!
                @IBOutlet weak var label_coin: UILabel!
                @IBOutlet weak var label_score: UILabel!
                @IBOutlet weak var scrollView: UIScrollView!
                @IBOutlet weak var coinCollectionView: UICollectionView!
                @IBOutlet weak var btn_coupon: UIButton!
                //    @IBOutlet weak var btn_shoppping: UIButton!
                //    @IBOutlet weak var btn_weekly: UIButton!
                //    @IBOutlet weak var btn_todayFree: UIButton!
    private var timerOffsetX:Double = 0
    private let cellW = 144.0
    private var benefitHomeModel:BenefitHomeModel?
    private var updateProdDate:Date?
                private var timerOffsetX:Double = 0
                private let cellW = 144.0
                private var benefitHomeModel:BenefitHomeModel?
                private var updateProdDate:Date?
    override func viewDidLoad() {
        super.viewDidLoad()
        getData()
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let date = updateProdDate{
                //防止反复切换,15秒
            if Date().timeIntervalSince1970 - date.timeIntervalSince1970 > 15{
                getData()
            }
        }
    }
    override func setUI() {
        scrollView.contentInsetAdjustmentBehavior = .never
        coinCollectionView.delegate  = self
        coinCollectionView.dataSource = self
        coinCollectionView.register(UINib(nibName: "WelfareCoinCCell", bundle: nil), forCellWithReuseIdentifier: "_WelfareCoinCCell")
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(UpdateWelfare_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti  in
            self?.getData()
        }).disposed(by: disposeBag)
    }
    private func getData(){
        Services.benefitHome().subscribe(onNext: {[weak self] data in
            if let model = data.data{
                self?.benefitHomeModel = model
                self?.img_userProfile.sd_setImage(with: URL(string: model.userHeadImg))
                self?.label_username.text = model.userName.isEmpty ? "未命名":model.userName
                self?.btn_vip.isHidden = model.isMember != "年度会员"
                self?.label_coin.text = model.wpCoin.currencyNotPrefix()
                self?.label_score.text = "\(model.userIntegral)"
                self?.coinCollectionView.reloadData()
                if let coupon = model.image?.myConpons{
                    self?.btn_coupon.sd_setImage(with: URL(string: coupon), for: .normal, placeholderImage: nil,context: nil)
                override func viewDidLoad() {
                                super.viewDidLoad()
                                getData()
                }
                if let weeksBenefit = model.image?.weeksBenefit{
//                    self?.btn_weekly.sd_setImage(with: URL(string: weeksBenefit), for: .normal, placeholderImage: nil, context: nil)
                override func viewDidAppear(_ animated: Bool) {
                                super.viewDidAppear(animated)
                                if let date = updateProdDate{
                                                //防止反复切换,15秒
                                                if Date().timeIntervalSince1970 - date.timeIntervalSince1970 > 15{
                                                                getData()
                                                }
                                }
                }
                if let todayFree = model.image?.todayFree{
//                    self?.btn_todayFree.sd_setImage(with: URL(string: todayFree), for: .normal, placeholderImage: nil, context: nil)
                override func setUI() {
                                scrollView.contentInsetAdjustmentBehavior = .never
                                coinCollectionView.delegate  = self
                                coinCollectionView.dataSource = self
                                coinCollectionView.register(UINib(nibName: "WelfareCoinCCell", bundle: nil), forCellWithReuseIdentifier: "_WelfareCoinCCell")
                }
            }
        }) { error in
        }.disposed(by: disposeBag)
    }
                override func setRx() {
                                NotificationCenter.default.rx.notification(UpdateWelfare_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti  in
                                                self?.getData()
                                }).disposed(by: disposeBag)
                }
    @IBAction func userProfileAction(_ sender: UIButton) {
        let vc = ProfileVC()
        push(vc: vc)
    }
                private func getData(){
                                Services.benefitHome().subscribe(onNext: {[weak self] data in
                                                if let model = data.data{
                                                                self?.benefitHomeModel = model
                                                                self?.img_userProfile.sd_setImage(with: URL(string: model.userHeadImg))
                                                                self?.label_username.text = model.userName.isEmpty ? "未命名":model.userName
                                                                self?.btn_vip.isHidden = model.isMember != "年度会员"
                                                                self?.label_coin.text = model.wpCoin.currencyNotPrefix()
                                                                self?.label_score.text = "\(model.userIntegral)"
                                                                self?.coinCollectionView.reloadData()
    @IBAction func billAction(_ sender: UIButton) {
        let vc = WelfareBillListVC()
        push(vc: vc)
    }
                                                                if let coupon = model.image?.myConpons{
                                                                                self?.btn_coupon.sd_setImage(with: URL(string: coupon), for: .normal, placeholderImage: nil,context: nil)
                                                                }
    @IBAction func couponsAction(_ sender: UIButton) {
        let vc = WelfareCouponsListVC()
        push(vc: vc)
    }
                                                                if let weeksBenefit = model.image?.weeksBenefit{
                                                                                //                    self?.btn_weekly.sd_setImage(with: URL(string: weeksBenefit), for: .normal, placeholderImage: nil, context: nil)
                                                                }
    @IBAction func rechargeAction(_ sender: UIButton) {
        let vc = RechargeRecordVC(coin: benefitHomeModel?.wpCoin ?? 0,subtype: .coin)
        push(vc: vc)
    }
                                                                if let todayFree = model.image?.todayFree{
                                                                                //                    self?.btn_todayFree.sd_setImage(with: URL(string: todayFree), for: .normal, placeholderImage: nil, context: nil)
                                                                }
                                                }
                                }) { error in
    @IBAction func welfareWeeklyAction(_ sender: UIButton) {
        let vc = WelfareWeeklyListVC()
        push(vc: vc)
    }
    @IBAction func freeTodayAction(_ sender: UIButton) {
        if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
            if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                Services.queryStoreFreeBenefit(id: deserModel.storeId).subscribe(onNext: {[weak self] data in
                    if let m = data.data{
                        let vc = WelfareFreeVC(m)
                        self?.push(vc: vc)
                    }
                }).disposed(by: disposeBag)
            }else{
                alert(msg: "门店获取失败")
            }
        }else{
            alert(msg: "门店获取失败")
        }
    }
                                }.disposed(by: disposeBag)
                }
    @IBAction func storeAction(_ sender: Any) {
        let vc = CoinStoreCenterVC()
        vc.benefitHomeModel = benefitHomeModel
        push(vc: vc)
    }
                @IBAction func userProfileAction(_ sender: UIButton) {
                                let vc = ProfileVC()
                                push(vc: vc)
                }
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .lightContent
    }
                @IBAction func billAction(_ sender: UIButton) {
                                let vc = WelfareBillListVC()
                                push(vc: vc)
                }
                @IBAction func couponsAction(_ sender: UIButton) {
                                let vc = WelfareCouponsListVC()
                                push(vc: vc)
                }
                @IBAction func rechargeAction(_ sender: UIButton) {
                                let vc = RechargeRecordVC(coin: benefitHomeModel?.wpCoin ?? 0,subtype: .coin)
                                push(vc: vc)
                }
                @IBAction func welfareWeeklyAction(_ sender: UIButton) {
                                let vc = WelfareWeeklyListVC()
                                push(vc: vc)
                }
                @IBAction func freeTodayAction(_ sender: UIButton) {
                                if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
                                                if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                                                                Services.queryStoreFreeBenefit(id: deserModel.storeId).subscribe(onNext: {[weak self] data in
                                                                                if let m = data.data{
                                                                                                let vc = WelfareFreeVC(m)
                                                                                                self?.push(vc: vc)
                                                                                }
                                                                }).disposed(by: disposeBag)
                                                }else{
                                                                alert(msg: "门店获取失败")
                                                }
                                }else{
                                                alert(msg: "门店获取失败")
                                }
                }
                @IBAction func storeAction(_ sender: Any) {
                                let vc = CoinStoreCenterVC()
                                vc.benefitHomeModel = benefitHomeModel
                                push(vc: vc)
                }
                override var preferredStatusBarStyle: UIStatusBarStyle{
                                return .lightContent
                }
}
extension WelfareVC:UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let model = benefitHomeModel!.commodities[indexPath.row]
        let vc = WelfareRedeemGoodsDetailVC(commodityId: model.commodityId, goodsType: model.goodsType)
        push(vc: vc)
    }
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                let model = benefitHomeModel!.commodities[indexPath.row]
                                let vc = WelfareRedeemGoodsDetailVC(commodityId: model.commodityId, goodsType: model.goodsType)
                                push(vc: vc)
                }
}
extension WelfareVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        let resultCount = min(5,benefitHomeModel?.commodities.count ?? 0)
        return resultCount
    }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                let resultCount = min(5,benefitHomeModel?.commodities.count ?? 0)
                                return resultCount
                }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
       let model = benefitHomeModel!.commodities[indexPath.row]
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_WelfareCoinCCell", for: indexPath) as! WelfareCoinCCell
        cell.label_name.text = model.commodityName
        cell.label_price.text = model.commodityPrice.currency()
        cell.img_cover.sd_setImage(with: URL(string: model.commodityImg), placeholderImage: nil)
        return cell
    }
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let model = benefitHomeModel!.commodities[indexPath.row]
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_WelfareCoinCCell", for: indexPath) as! WelfareCoinCCell
                                cell.label_name.text = model.commodityName
                                cell.label_price.text = model.commodityPrice.currency()
                                cell.img_cover.sd_setImage(with: URL(string: model.commodityImg), placeholderImage: nil)
                                return cell
                }
}
extension WelfareVC:UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
                                return 0
                }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
                                return 0
                }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: cellW, height: 178)
    }
                                return CGSize(width: cellW, height: 178)
                }
}
WanPai/Root/Welfare/VC/WorldCupIntroVC.swift
New file
@@ -0,0 +1,61 @@
//
//  WorldCupIntroVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2024/2/28.
//
import UIKit
import WebKit
import JQTools
class WorldCupIntroVC: BaseVC {
                private var webView: WKWebView!
                private var btn:UIButton!
                private var model:BannerModel?
                override func viewDidLoad() {
                                super.viewDidLoad()
                                Services.getHomeModule().subscribe(onNext: {data in
                                                if let data = data.data{
                                                                self.title = data.title
                                                                self.btn.sd_setBackgroundImage(with: URL(string: data.buttonImage), for: .normal)
                                                                self.btn.imageView?.contentMode = .scaleAspectFit
                                                                self.btn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
                                                                self.webView.loadHTMLString(data.content.jq_wrapHtml(), baseURL: nil)
                                                                self.model = data
                                                }
                                }).disposed(by: disposeBag)
                }
                override func setUI() {
                                webView = WKWebView(frame: .zero)
                                view.addSubview(webView)
                                webView.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                btn = UIButton(type: .custom)
                                btn.backgroundColor = Def_ThemeColor
                                btn.addTarget(self, action: #selector(jumpAction), for: .touchUpInside)
                                btn.setTitle("查看详情", for: .normal)
                                btn.setTitleColor(.white, for: .normal)
                                btn.cornerRadius = 20
                                view.addSubview(btn)
                                btn.snp.makeConstraints { make in
                                                make.left.equalTo(64)
                                                make.right.equalTo(-64)
                                                make.height.equalTo(40)
                                                make.bottom.equalToSuperview().offset(-23)
                                }
                }
                @objc func jumpAction(){
                                if let m = model{
                                                jumpPage(model: m.model, page: m.page, type: m.type, id: m.id)
                                }
                }
}
WanPai/Root/Yard/VC/YardDetailVC.swift
@@ -1,9 +1,9 @@
    //
    //  YardDetailVC.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/6/19.
    //
//
//  YardDetailVC.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/6/19.
//
import UIKit
import QMUIKit
@@ -15,620 +15,620 @@
class YardDetailDateManager {
    private static var _sharedInstance: YardDetailDateManager?
                private static var _sharedInstance: YardDetailDateManager?
    class func shared() -> YardDetailDateManager {
        guard let instance = _sharedInstance else {
            _sharedInstance = YardDetailDateManager()
            return _sharedInstance!
        }
        return instance
    }
                class func shared() -> YardDetailDateManager {
                                guard let instance = _sharedInstance else {
                                                _sharedInstance = YardDetailDateManager()
                                                return _sharedInstance!
                                }
                                return instance
                }
    private init() {} // 私有化init方法
                private init() {} // 私有化init方法
    var dates = BehaviorRelay<[String:[SiteDetailDateTimeModel]]>(value: [:])
                var dates = BehaviorRelay<[String:[SiteDetailDateTimeModel]]>(value: [:])
        //销毁单例对象
    class func destroy() {
        _sharedInstance = nil
    }
                //销毁单例对象
                class func destroy() {
                                _sharedInstance = nil
                }
}
class YardDetailVC: BaseVC {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var view_banner: CommonBannerView!
    @IBOutlet weak var btn_calendar: QMUIButton!
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var view_pages: UIView!
    @IBOutlet weak var cons_pagesHei: NSLayoutConstraint!
    @IBOutlet weak var view_coupon: UIView!
    @IBOutlet weak var label_name: UILabel!
    @IBOutlet weak var label_typeName: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_cashPrice: UILabel!
    @IBOutlet weak var label_coinPrice: UILabel!
    @IBOutlet weak var label_datetime: UILabel!
    @IBOutlet weak var tf_person: UITextField!
    @IBOutlet weak var tf_phone: QMUITextField!
    @IBOutlet weak var label_selectTimes: UILabel!
    @IBOutlet weak var label_totalHours: UILabel!
    @IBOutlet weak var label_price: UILabel!
    @IBOutlet weak var btn_coupon: UIButton!
    @IBOutlet weak var btn_fullYard: QMUIButton!
    @IBOutlet weak var btn_halfYard: QMUIButton!
    @IBOutlet weak var collection_halfYard: UICollectionView!
    @IBOutlet weak var collection_yardType: UICollectionView!
    @IBOutlet weak var view_yardType: UIView!
    @IBOutlet weak var cons_halfYardHei: NSLayoutConstraint!
    @IBOutlet weak var cons_yardTypeHei: NSLayoutConstraint!
    @IBOutlet weak var view_halfYard: UIView!
    @IBOutlet weak var view_selectYardType: UIView!
    @IBOutlet weak var web_introduce: WKWebView!
    @IBOutlet weak var cons_webHei: NSLayoutConstraint!
    @IBOutlet weak var btn_booking: UIButton!
    @IBOutlet weak var label_conponInfo: UILabel!
    private var coupons = [CouponInfoModel]()
    private var selectCouponModel:CouponInfoModel?
    private let yardCellW = (JQ_ScreenW  - 144) / 3
    private var halfIndex:Int?
    private var yardIndex:Int = 0 //场地
                @IBOutlet weak var scrollView: UIScrollView!
                @IBOutlet weak var view_banner: CommonBannerView!
                @IBOutlet weak var btn_calendar: QMUIButton!
                @IBOutlet weak var collectionView: UICollectionView!
                @IBOutlet weak var view_pages: UIView!
                @IBOutlet weak var cons_pagesHei: NSLayoutConstraint!
                @IBOutlet weak var view_coupon: UIView!
                @IBOutlet weak var label_name: UILabel!
                @IBOutlet weak var label_typeName: UILabel!
                @IBOutlet weak var label_address: UILabel!
                @IBOutlet weak var label_cashPrice: UILabel!
                @IBOutlet weak var label_coinPrice: UILabel!
                @IBOutlet weak var label_datetime: UILabel!
                @IBOutlet weak var tf_person: UITextField!
                @IBOutlet weak var tf_phone: QMUITextField!
                @IBOutlet weak var label_selectTimes: UILabel!
                @IBOutlet weak var label_totalHours: UILabel!
                @IBOutlet weak var label_price: UILabel!
                @IBOutlet weak var btn_coupon: UIButton!
                @IBOutlet weak var btn_fullYard: QMUIButton!
                @IBOutlet weak var btn_halfYard: QMUIButton!
                @IBOutlet weak var collection_halfYard: UICollectionView!
                @IBOutlet weak var collection_yardType: UICollectionView!
                @IBOutlet weak var view_yardType: UIView!
                @IBOutlet weak var cons_halfYardHei: NSLayoutConstraint!
                @IBOutlet weak var cons_yardTypeHei: NSLayoutConstraint!
                @IBOutlet weak var view_halfYard: UIView!
                @IBOutlet weak var view_selectYardType: UIView!
                @IBOutlet weak var web_introduce: WKWebView!
                @IBOutlet weak var cons_webHei: NSLayoutConstraint!
                @IBOutlet weak var btn_booking: UIButton!
                @IBOutlet weak var label_conponInfo: UILabel!
                private var coupons = [CouponInfoModel]()
                private var selectCouponModel:CouponInfoModel?
                private let yardCellW = (JQ_ScreenW  - 144) / 3
                private var halfIndex:Int?
                private var yardIndex:Int = 0 //场地
    lazy var pageViewController:FFPageViewController = {
        let pageVC = FFPageViewController()
        pageVC.view.backgroundColor = .clear
        pageVC.scrollview.backgroundColor = .clear
        pageVC.prePages = 2
        pageVC.scrollview.bounces = false
        return pageVC
    }()
                lazy var pageViewController:FFPageViewController = {
                                let pageVC = FFPageViewController()
                                pageVC.view.backgroundColor = .clear
                                pageVC.scrollview.backgroundColor = .clear
                                pageVC.prePages = 2
                                pageVC.scrollview.bounces = false
                                return pageVC
                }()
    private var siteDetailModel:SiteDetailModel!
    private var siteDetailDateTimeModel:SiteDetailDateTimeModel!
    private let banner = CommonBannerView()
                private var siteDetailModel:SiteDetailModel!
                private var siteDetailDateTimeModel:SiteDetailDateTimeModel!
                private let banner = CommonBannerView()
    private var id:Int!
    private var cellW:Double!
    private var selectIndex = 0
    private var weeklys = [Date]()
    private var currentDate:Date?{
        didSet{
            if let d = currentDate{
                selectIndex = currentDate?.jq_nowWeekDay(identifier: .republicOfChina).index ?? 0
                weeklys = d.jq_currentWeekDates
                collectionView.reloadData()
            }
        }
    }
    required init(id:Int){
        super.init(nibName: nil, bundle: nil)
        self.id = id
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "预约场地"
        Services.querySiteDetail(id: id).subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            if let model = data.data{
                weakSelf.siteDetailModel = model
                weakSelf.label_name.text = model.name
                weakSelf.label_typeName.text = model.siteTypeName
                weakSelf.label_address.text = String(format: "%@(%@)",model.storeName, model.storeAddress)
                weakSelf.changePrice(cashPrice: model.cashPrice, coin: model.playPaiCoin, typeName: model.typeName)
                weakSelf.view_yardType.isHidden = model.nextName.count == 0
                weakSelf.view_selectYardType.isHidden = model.ishalf == 2
                let c:Double = Double(model.halfName.count)
                let h:Double = weakSelf.yardCellW * 0.439
                weakSelf.cons_halfYardHei.constant = ceil(c / 3.0) * h + floor(c / 3.0) * 21
                let c1:Double = Double(model.nextName.count)
                weakSelf.cons_yardTypeHei.constant = ceil(c1 / 3.0) * h + floor(c1 / 3.0) * 21
                weakSelf.collection_halfYard.reloadData()
                weakSelf.collection_yardType.reloadData()
                weakSelf.web_introduce.loadHTMLString(model.introduce.jq_wrapHtml(), baseURL: nil)
                weakSelf.view_banner.frame = CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW, height: JQ_ScreenW * 0.56))
                let imgs = model.imgs.components(separatedBy: ",")
                var items = [CommonBannerModel]()
                for (index,img) in imgs.enumerated(){
                    items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                }
                weakSelf.view_banner.setItems(items: items)
                weakSelf.view_yardType.isHidden = model.nextName.filter({!$0.isEmpty}).count == 0
                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                    weakSelf.pageViewController.reloadData()
                    if let currentVC = weakSelf.pageViewController.currentController as? YardDetailDateTimeVC{
                        currentVC.querySiteTimes(halfName: nil, siteName: nil)
                    }
                }
            }
        }).disposed(by: disposeBag)
    }
    override func setRx() {
        YardDetailDateManager.shared().dates.subscribe(onNext: { [weak self] dict in
            guard let weakSelf = self else { return }
            guard weakSelf.siteDetailModel != nil else {return}
            if let a = dict.values.first,a.count > 0{
                var cashPrice:Double = 0
                var coinPrice:Int = 0
                if weakSelf.btn_halfYard.isSelected{
                    cashPrice = weakSelf.siteDetailModel.cashPriceOne
                    coinPrice = weakSelf.siteDetailModel.playPaiCoinOne
                }else{
                    cashPrice = weakSelf.siteDetailModel.cashPrice
                    coinPrice = weakSelf.siteDetailModel.playPaiCoin
                private var id:Int!
                private var cellW:Double!
                private var selectIndex = 0
                private var weeklys = [Date]()
                private var currentDate:Date?{
                                didSet{
                                                if let d = currentDate{
                                                                selectIndex = currentDate?.jq_nowWeekDay(identifier: .republicOfChina).index ?? 0
                                                                weeklys = d.jq_currentWeekDates
                                                                collectionView.reloadData()
                                                }
                                }
                }
                let key = dict.keys.first!
                weakSelf.label_price.text = String(format: "%@/%ld币", (Double(a.count) * cashPrice - (weakSelf.selectCouponModel?.favorable ?? 0)).currency(),a.count * coinPrice)
                let prefix = a.first?.time.components(separatedBy: "-").first
                let suffix = a.last?.time.components(separatedBy: "-").last
                weakSelf.label_selectTimes.text = String(format: "%@ %@-%@",key,prefix ?? "",suffix ?? "")
                weakSelf.label_totalHours.text = String(format: "(合计%.1lf小时)", Double(a.count) * 0.5)
                weakSelf.queryCoupon(price: (Double(a.count) * cashPrice))
            }else{
                weakSelf.label_selectTimes.text = "未选择"
                weakSelf.label_totalHours.text = "(合计0小时)"
                weakSelf.label_price.text = "¥-/-币"
            }
        }).disposed(by: disposeBag)
                required init(id:Int){
                                super.init(nibName: nil, bundle: nil)
                                self.id = id
                }
        web_introduce.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in
            if let size = size{
                return size.height
            }
            return nil
        }.subscribe(onNext: { [unowned self](height) in
            if let height = height{
                self.cons_webHei.constant = height
            }
        }).disposed(by: disposeBag)
    }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func setUI() {
        view_coupon.isHidden = true
        cellW = (JQ_ScreenW - 68.0) / 7.0
        btn_calendar.imagePosition = .top
        btn_calendar.spacingBetweenImageAndTitle = 3
        cons_pagesHei.constant = 150
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "预约场地"
                                Services.querySiteDetail(id: id).subscribe(onNext: {[weak self] data in
                                                guard let weakSelf = self else { return }
                                                if let model = data.data{
                                                                weakSelf.siteDetailModel = model
                                                                weakSelf.label_name.text = model.name
                                                                weakSelf.label_typeName.text = model.siteTypeName
                                                                weakSelf.label_address.text = String(format: "%@(%@)",model.storeName, model.storeAddress)
                                                                weakSelf.changePrice(cashPrice: model.cashPrice, coin: model.playPaiCoin, typeName: model.typeName)
                                                                weakSelf.view_yardType.isHidden = model.nextName.count == 0
                                                                weakSelf.view_selectYardType.isHidden = model.ishalf == 2
        collectionView.register(UINib(nibName: "CalendarItemCCell", bundle: nil), forCellWithReuseIdentifier: "_CalendarItemCCell")
        collectionView.delegate = self
        collectionView.dataSource = self
                                                                let c:Double = Double(model.halfName.count)
                                                                let h:Double = weakSelf.yardCellW * 0.439
                                                                weakSelf.cons_halfYardHei.constant = ceil(c / 3.0) * h + floor(c / 3.0) * 21
        addChild(pageViewController)
        view_pages.insertSubview(pageViewController.view, at: 0)
        pageViewController.didMove(toParent: self)
                                                                let c1:Double = Double(model.nextName.count)
                                                                weakSelf.cons_yardTypeHei.constant = ceil(c1 / 3.0) * h + floor(c1 / 3.0) * 21
        pageViewController.view.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        pageViewController.delegate = self
                                                                weakSelf.collection_halfYard.reloadData()
                                                                weakSelf.collection_yardType.reloadData()
        btn_fullYard.spacingBetweenImageAndTitle = 13
        btn_halfYard.spacingBetweenImageAndTitle = 13
                                                                weakSelf.web_introduce.loadHTMLString(model.introduce.jq_wrapHtml(), baseURL: nil)
                                                                weakSelf.view_banner.frame = CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW, height: JQ_ScreenW * 0.56))
        collection_halfYard.delegate = self
        collection_halfYard.dataSource = self
        collection_halfYard.register(UINib(nibName: "Common_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_1_CCell")
                                                                let imgs = model.imgs.components(separatedBy: ",")
                                                                var items = [CommonBannerModel]()
                                                                for (index,img) in imgs.enumerated(){
                                                                                items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                                                                }
                                                                weakSelf.view_banner.setItems(items: items)
        collection_yardType.delegate = self
        collection_yardType.dataSource = self
        collection_yardType.register(UINib(nibName: "Common_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_1_CCell")
                                                                weakSelf.view_yardType.isHidden = model.nextName.filter({!$0.isEmpty}).count == 0
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                                weakSelf.pageViewController.reloadData()
                                                                                if let currentVC = weakSelf.pageViewController.currentController as? YardDetailDateTimeVC{
                                                                                                currentVC.querySiteTimes(halfName: nil, siteName: nil)
                                                                                }
                                                                }
                                                }
                                }).disposed(by: disposeBag)
                }
        view_halfYard.isHidden = true
        view_yardType.isHidden = true
        view_selectYardType.isHidden = true
                override func setRx() {
                                YardDetailDateManager.shared().dates.subscribe(onNext: { [weak self] dict in
                                                guard let weakSelf = self else { return }
                                                guard weakSelf.siteDetailModel != nil else {return}
        scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 75, right: 0)
                                                if let a = dict.values.first,a.count > 0{
                                                                var cashPrice:Double = 0
                                                                var coinPrice:Int = 0
        tf_person.text = UserInfoModel.get()?.userName ?? ""
        tf_phone.text = UserInfoModel.get()?.userPhone ?? ""
    }
                                                                if weakSelf.btn_halfYard.isSelected{
                                                                                cashPrice = weakSelf.siteDetailModel.cashPriceOne
                                                                                coinPrice = weakSelf.siteDetailModel.playPaiCoinOne
                                                                }else{
                                                                                cashPrice = weakSelf.siteDetailModel.cashPrice
                                                                                coinPrice = weakSelf.siteDetailModel.playPaiCoin
                                                                }
        /// 查询优惠券
    private func queryCoupon(price:Double){
        Services.querySiteCouponList(price: price, siteId: siteDetailModel.id).subscribe(onNext: {[weak self] data in
            if let models = data.data{
                self?.view_coupon.isHidden = models.count == 0
                self?.coupons = models
                self?.label_conponInfo.isHidden = models.count == 0
                self?.label_conponInfo.text = String(format: "(%ld张可用)",models.count)
            }
        }).disposed(by: disposeBag)
    }
                                                                let key = dict.keys.first!
                                                                weakSelf.label_price.text = String(format: "%@/%ld币", (Double(a.count) * cashPrice - (weakSelf.selectCouponModel?.favorable ?? 0)).currency(),a.count * coinPrice)
                                                                let prefix = a.first?.time.components(separatedBy: "-").first
                                                                let suffix = a.last?.time.components(separatedBy: "-").last
                                                                weakSelf.label_selectTimes.text = String(format: "%@ %@-%@",key,prefix ?? "",suffix ?? "")
                                                                weakSelf.label_totalHours.text = String(format: "(合计%.1lf小时)", Double(a.count) * 0.5)
                                                                weakSelf.queryCoupon(price: (Double(a.count) * cashPrice))
                                                }else{
                                                                weakSelf.label_selectTimes.text = "未选择"
                                                                weakSelf.label_totalHours.text = "(合计0小时)"
                                                                weakSelf.label_price.text = "¥-/-币"
                                                }
                                }).disposed(by: disposeBag)
    private func changePrice(cashPrice:Double,coin:Int,typeName:String){
        let att = AttributedStringbuilder.build()
        att.add(string: "\(cashPrice.currency())/", withFont: UIFont.systemFont(ofSize: 18, weight: .medium), withColor: UIColor(hexStr: "#EC0808"))
        if  typeName == "智慧场地"{
            att.add(string: "15分钟", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
        }else{
            att.add(string: "半小时", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
        }
        label_cashPrice.attributedText = att.mutableAttributedString
                                web_introduce.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in
                                                if let size = size{
                                                                return size.height
                                                }
                                                return nil
                                }.subscribe(onNext: { [unowned self](height) in
                                                if let height = height{
                                                                self.cons_webHei.constant = height
                                                }
                                }).disposed(by: disposeBag)
                }
        let att1 = AttributedStringbuilder.build()
        att1.add(string: "\(coin)币/", withFont: UIFont.systemFont(ofSize: 18, weight: .medium), withColor: UIColor(hexStr: "#EC0808"))
        if  typeName == "智慧场地"{
            att1.add(string: "15分钟", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
        }else{
            att1.add(string: "半小时", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
        }
        label_coinPrice.attributedText = att1.mutableAttributedString
    }
                override func setUI() {
                                view_coupon.isHidden = true
                                cellW = (JQ_ScreenW - 68.0) / 7.0
                                btn_calendar.imagePosition = .top
                                btn_calendar.spacingBetweenImageAndTitle = 3
                                cons_pagesHei.constant = 150
    @IBAction func halfYardTypeAction(_ sender: QMUIButton) {
        btn_fullYard.isSelected = sender.tag == 200
        btn_halfYard.isSelected = sender.tag == 201
        selectCouponModel = nil
        btn_coupon.setTitle("去选择", for: .normal)
        if btn_fullYard.isSelected{
            halfIndex = nil
        }else{
            halfIndex = 0
        }
                                collectionView.register(UINib(nibName: "CalendarItemCCell", bundle: nil), forCellWithReuseIdentifier: "_CalendarItemCCell")
                                collectionView.delegate = self
                                collectionView.dataSource = self
        collection_halfYard.reloadData()
                                addChild(pageViewController)
                                view_pages.insertSubview(pageViewController.view, at: 0)
                                pageViewController.didMove(toParent: self)
        UIView.animate(withDuration: 0.5) {
            self.view_halfYard.isHidden = self.btn_fullYard.isSelected
            self.view_halfYard.alpha = (self.view_halfYard.isHidden ? 0:1)
        }
                                pageViewController.view.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                pageViewController.delegate = self
        if btn_halfYard.isSelected{
            changePrice(cashPrice: siteDetailModel.cashPriceOne, coin: siteDetailModel.playPaiCoinOne, typeName: siteDetailModel.typeName)
        }else{
            changePrice(cashPrice: siteDetailModel.cashPrice, coin: siteDetailModel.playPaiCoin, typeName: siteDetailModel.typeName)
        }
                                btn_fullYard.spacingBetweenImageAndTitle = 13
                                btn_halfYard.spacingBetweenImageAndTitle = 13
        //为了计算价格 【半场/全场】切换
        var val = YardDetailDateManager.shared().dates.value
        val.removeAll()
        YardDetailDateManager.shared().dates.accept(val)
        clearAll()
    }
                                collection_halfYard.delegate = self
                                collection_halfYard.dataSource = self
                                collection_halfYard.register(UINib(nibName: "Common_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_1_CCell")
    private func clearAll(){
        if let currentVC = pageViewController.currentController as? YardDetailDateTimeVC{
            currentVC.clearALL()
            var halfName:String?
            var nextName:String?
                                collection_yardType.delegate = self
                                collection_yardType.dataSource = self
                                collection_yardType.register(UINib(nibName: "Common_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_1_CCell")
            if halfIndex != nil{
                halfName = siteDetailModel.halfName[halfIndex!]
            }
                                view_halfYard.isHidden = true
                                view_yardType.isHidden = true
                                view_selectYardType.isHidden = true
            if siteDetailModel.nextName.count > 0{
                nextName = siteDetailModel.nextName[yardIndex]
            }
            currentVC.querySiteTimes(halfName: halfName, siteName: nextName)
        }
    }
                                scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 75, right: 0)
                                tf_person.text = UserInfoModel.get()?.userName ?? ""
                                tf_phone.text = UserInfoModel.get()?.userPhone ?? ""
                }
    @IBAction func callPhoneAction(_ sender: UIButton) {
        UIApplication.shared.open(URL(string: "tel://\(siteDetailModel.storePhone)")!)
    }
                /// 查询优惠券
                private func queryCoupon(price:Double){
                                Services.querySiteCouponList(price: price, siteId: siteDetailModel.id).subscribe(onNext: {[weak self] data in
                                                if let models = data.data{
                                                                self?.view_coupon.isHidden = models.count == 0
                                                                self?.coupons = models
                                                                self?.label_conponInfo.isHidden = models.count == 0
                                                                self?.label_conponInfo.text = String(format: "(%ld张可用)",models.count)
                                                }
                                }).disposed(by: disposeBag)
                }
    @IBAction func couponAction(_ sender: UIButton) {
        CouponChooseView.show(coupons, defaultModel: selectCouponModel) { [weak self] m in
            self?.selectCouponModel = m
            let string = m == nil ? "去选择":"-\(m!.favorable.currency())"
            self?.btn_coupon.setTitle(string, for: .normal)
            let temp = YardDetailDateManager.shared().dates.value
            YardDetailDateManager.shared().dates.accept(temp)
        }
    }
                private func changePrice(cashPrice:Double,coin:Int,typeName:String){
                                let att = AttributedStringbuilder.build()
                                att.add(string: "\(cashPrice.currency())/", withFont: UIFont.systemFont(ofSize: 18, weight: .medium), withColor: UIColor(hexStr: "#EC0808"))
                                if  typeName == "智慧场地"{
                                                att.add(string: "15分钟", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
                                }else{
                                                att.add(string: "半小时", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
                                }
                                label_cashPrice.attributedText = att.mutableAttributedString
    @IBAction func calendarAction(_ sender: QMUIButton) {
        CalendarPickerView.show(selectDate: currentDate) { [weak self] date in
            let offsetDay = Date.jq_CalByDays(startDate: Date().jq_clearTimes(), endDate: date)
            self?.pageViewController.scroll(toPage: offsetDay, animation: true)
            self?.collectionView.reloadData()
        }
    }
                                let att1 = AttributedStringbuilder.build()
                                att1.add(string: "\(coin)币/", withFont: UIFont.systemFont(ofSize: 18, weight: .medium), withColor: UIColor(hexStr: "#EC0808"))
                                if  typeName == "智慧场地"{
                                                att1.add(string: "15分钟", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
                                }else{
                                                att1.add(string: "半小时", withFont: UIFont.systemFont(ofSize: 14, weight: .medium), withColor: UIColor(hexStr: "#535353"))
                                }
                                label_coinPrice.attributedText = att1.mutableAttributedString
                }
    @IBAction func bookingAction(_ sender: UIButton) {
                @IBAction func halfYardTypeAction(_ sender: QMUIButton) {
                                btn_fullYard.isSelected = sender.tag == 200
                                btn_halfYard.isSelected = sender.tag == 201
                                selectCouponModel = nil
                                btn_coupon.setTitle("去选择", for: .normal)
                                if btn_fullYard.isSelected{
                                                halfIndex = nil
                                }else{
                                                halfIndex = 0
                                }
        guard !YardDetailDateManager.shared().dates.value.isEmpty else {alertError(msg: "请选择预约时间");return}
        guard YardDetailDateManager.shared().dates.value.values.first!.count != 0 else {alertError(msg: "请选择预约时间");return}
        guard !tf_person.isEmpty else {alertError(msg: "请输入预约人");tf_person.becomeFirstResponder();return}
        guard !tf_phone.isEmpty else {alertError(msg: "请输入联系方式");tf_phone.becomeFirstResponder();return}
        guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的联系方式");return}
        if btn_halfYard.isSelected && halfIndex == nil{
            alert(msg: "请选择半场");return
        }
                                collection_halfYard.reloadData()
        var halfName:String?
        var isHalf:Int = 2
        var nextName:String?
                                UIView.animate(withDuration: 0.5) {
                                                self.view_halfYard.isHidden = self.btn_fullYard.isSelected
                                                self.view_halfYard.alpha = (self.view_halfYard.isHidden ? 0:1)
                                }
        if halfIndex != nil{
            halfName = siteDetailModel.halfName[halfIndex!]
        }
                                if btn_halfYard.isSelected{
                                                changePrice(cashPrice: siteDetailModel.cashPriceOne, coin: siteDetailModel.playPaiCoinOne, typeName: siteDetailModel.typeName)
                                }else{
                                                changePrice(cashPrice: siteDetailModel.cashPrice, coin: siteDetailModel.playPaiCoin, typeName: siteDetailModel.typeName)
                                }
        if siteDetailModel.ishalf == 1 && btn_halfYard.isSelected{
            isHalf = 1
        }
                                //为了计算价格 【半场/全场】切换
                                var val = YardDetailDateManager.shared().dates.value
                                val.removeAll()
                                YardDetailDateManager.shared().dates.accept(val)
                                clearAll()
                }
        if siteDetailModel.nextName.count > 0{
            nextName = siteDetailModel.nextName[yardIndex]
        }
                private func clearAll(){
                                if let currentVC = pageViewController.currentController as? YardDetailDateTimeVC{
                                                currentVC.clearALL()
                                                var halfName:String?
                                                var nextName:String?
                                                if halfIndex != nil{
                                                                halfName = siteDetailModel.halfName[halfIndex!]
                                                }
        StoresInfoView.show(siteDetailModel) { [weak self] status in
            guard let weakSelf = self else { return }
            if status{
                let a = YardDetailDateManager.shared().dates.value.values.first!
                let cashPrice = weakSelf.btn_halfYard.isSelected ? weakSelf.siteDetailModel.cashPriceOne:weakSelf.siteDetailModel.cashPrice
                let coinPrice = weakSelf.btn_halfYard.isSelected ? weakSelf.siteDetailModel.playPaiCoinOne : weakSelf.siteDetailModel.playPaiCoin
                let price = Double(a.count) * cashPrice - (weakSelf.selectCouponModel?.favorable ?? 0)
                let coin = a.count * coinPrice
                var datetimes = [String]()
                let key = YardDetailDateManager.shared().dates.value.keys.first!
                for value in YardDetailDateManager.shared().dates.value.values.first!{
                    datetimes.append(String(format: "%@ %@", key,value.time))
                                                if siteDetailModel.nextName.count > 0{
                                                                nextName = siteDetailModel.nextName[yardIndex]
                                                }
                                                currentVC.querySiteTimes(halfName: halfName, siteName: nextName)
                                }
                }
                PaymentView.show(enumType: .yard, money: (ali:price,wx:price,coin:coin,course:nil,integral:nil)) { [weak self] type in
                    guard let weakSelf = self else { return }
                    Services.reservationSite(booker: weakSelf.tf_person.text!, couponId: weakSelf.selectCouponModel?.id, id: weakSelf.siteDetailModel.id, payType: type, phone: weakSelf.tf_phone.text!, times: datetimes.joined(separator: ";"),halfName:halfName,isHalf:isHalf,nextName:nextName).subscribe(onNext: { data in
                        if let m = data.data{
                            weakSelf.selectCouponModel = nil
                            weakSelf.btn_coupon.setTitle("去选择", for: .normal)
                            weakSelf.queryCoupon(price: Double(a.count) * cashPrice)
                            switch type {
                                case .aliPay:
                                    YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in
                                        switch result {
                                            case .success:
                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                                    weakSelf.push(vc: vc)
                                            case .cancel:
                                                alert(msg: "交易取消")
                                                let vc = YardBookingListVC(page: 5)
                                                weakSelf.push(vc: vc)
                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                            case .failure(_):
                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .yard,handleVC: nil)
                                                weakSelf.push(vc: vc)
                                        }
                                    }
                                case .wechat,.integral:break
                                case .coin,.free:
                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                    let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                    weakSelf.push(vc: vc)
                                case .courseNum:break
                            }
                        }
                    },onError: { error in
                        if let er = error as? NetworkRequest.NetRequestError{
                            switch er {
                                case .Other(let code,let string):
//                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                    let vc = PaymentResultVC(result: .fail(string,code), objType: .yard){[weak self] in
                                        let vc1 = YardBookingListVC(page: 5)
                                        self?.push(vc: vc1)
                                    }
                                    self?.push(vc: vc)
                                default:
//                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                    let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .yard){[weak self] in
                                        let vc1 = YardBookingListVC(page: 5)
                                        self?.push(vc: vc1)
                                    }
                                    self?.push(vc: vc)
                            }
                        }
                    }).disposed(by: weakSelf.disposeBag)
                @IBAction func callPhoneAction(_ sender: UIButton) {
                                UIApplication.shared.open(URL(string: "tel://\(siteDetailModel.storePhone)")!)
                }
            }else{
                weakSelf.navigationController?.popToRootViewController(animated: true)
                NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
            }
        }
    }
    private func showPaymentView(){
                @IBAction func couponAction(_ sender: UIButton) {
                                CouponChooseView.show(coupons, defaultModel: selectCouponModel) { [weak self] m in
                                                self?.selectCouponModel = m
                                                let string = m == nil ? "去选择":"-\(m!.favorable.currency())"
                                                self?.btn_coupon.setTitle(string, for: .normal)
                                                let temp = YardDetailDateManager.shared().dates.value
                                                YardDetailDateManager.shared().dates.accept(temp)
                                }
                }
    }
                @IBAction func calendarAction(_ sender: QMUIButton) {
                                CalendarPickerView.show(selectDate: currentDate) { [weak self] date in
                                                let offsetDay = Date.jq_CalByDays(startDate: Date().jq_clearTimes(), endDate: date)
                                                self?.pageViewController.scroll(toPage: offsetDay, animation: true)
                                                self?.collectionView.reloadData()
                                }
                }
    deinit{
        YardDetailDateManager.destroy()
    }
                @IBAction func bookingAction(_ sender: UIButton) {
                                guard !YardDetailDateManager.shared().dates.value.isEmpty else {alertError(msg: "请选择预约时间");return}
                                guard YardDetailDateManager.shared().dates.value.values.first!.count != 0 else {alertError(msg: "请选择预约时间");return}
                                guard !tf_person.isEmpty else {alertError(msg: "请输入预约人");tf_person.becomeFirstResponder();return}
                                guard !tf_phone.isEmpty else {alertError(msg: "请输入联系方式");tf_phone.becomeFirstResponder();return}
                                guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的联系方式");return}
                                if btn_halfYard.isSelected && halfIndex == nil{
                                                alert(msg: "请选择半场");return
                                }
                                var halfName:String?
                                var isHalf:Int = 2
                                var nextName:String?
                                if halfIndex != nil{
                                                halfName = siteDetailModel.halfName[halfIndex!]
                                }
                                if siteDetailModel.ishalf == 1 && btn_halfYard.isSelected{
                                                isHalf = 1
                                }
                                if siteDetailModel.nextName.count > 0{
                                                nextName = siteDetailModel.nextName[yardIndex]
                                }
                                StoresInfoView.show(siteDetailModel) { [weak self] status in
                                                guard let weakSelf = self else { return }
                                                if status{
                                                                let a = YardDetailDateManager.shared().dates.value.values.first!
                                                                let cashPrice = weakSelf.btn_halfYard.isSelected ? weakSelf.siteDetailModel.cashPriceOne:weakSelf.siteDetailModel.cashPrice
                                                                let coinPrice = weakSelf.btn_halfYard.isSelected ? weakSelf.siteDetailModel.playPaiCoinOne : weakSelf.siteDetailModel.playPaiCoin
                                                                let price = Double(a.count) * cashPrice - (weakSelf.selectCouponModel?.favorable ?? 0)
                                                                let coin = a.count * coinPrice
                                                                var datetimes = [String]()
                                                                let key = YardDetailDateManager.shared().dates.value.keys.first!
                                                                for value in YardDetailDateManager.shared().dates.value.values.first!{
                                                                                datetimes.append(String(format: "%@ %@", key,value.time))
                                                                }
                                                                PaymentView.show(enumType: .yard, money: (ali:price,wx:price,coin:coin,course:nil,integral:nil)) { [weak self] type in
                                                                                guard let weakSelf = self else { return }
                                                                                Services.reservationSite(booker: weakSelf.tf_person.text!, couponId: weakSelf.selectCouponModel?.id, id: weakSelf.siteDetailModel.id, payType: type, phone: weakSelf.tf_phone.text!, times: datetimes.joined(separator: ";"),halfName:halfName,isHalf:isHalf,nextName:nextName).subscribe(onNext: { data in
                                                                                                if let m = data.data{
                                                                                                                weakSelf.selectCouponModel = nil
                                                                                                                weakSelf.btn_coupon.setTitle("去选择", for: .normal)
                                                                                                                weakSelf.queryCoupon(price: Double(a.count) * cashPrice)
                                                                                                                switch type {
                                                                                                                                case .aliPay:
                                                                                                                                                YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in
                                                                                                                                                                switch result {
                                                                                                                                                                                case .success:
                                                                                                                                                                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                                                                let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                                                case .cancel:
                                                                                                                                                                                                alert(msg: "交易取消")
                                                                                                                                                                                                let vc = YardBookingListVC(page: 5)
                                                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                                                case .failure(_):
                                                                                                                                                                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                                                                let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .yard,handleVC: nil)
                                                                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                                                }
                                                                                                                                                }
                                                                                                                                case .wechat,.integral:break
                                                                                                                                case .coin,.free:
                                                                                                                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                                                                                                                                weakSelf.push(vc: vc)
                                                                                                                                case .courseNum:break
                                                                                                                }
                                                                                                }
                                                                                },onError: { error in
                                                                                                if let er = error as? NetworkRequest.NetRequestError{
                                                                                                                switch er {
                                                                                                                                case .Other(let code,let string):
                                                                                                                                                //                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                let vc = PaymentResultVC(result: .fail(string,code), objType: .yard){[weak self] in
                                                                                                                                                                let vc1 = YardBookingListVC(page: 5)
                                                                                                                                                                self?.push(vc: vc1)
                                                                                                                                                }
                                                                                                                                                self?.push(vc: vc)
                                                                                                                                default:
                                                                                                                                                //                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                                                                                                                let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .yard){[weak self] in
                                                                                                                                                                let vc1 = YardBookingListVC(page: 5)
                                                                                                                                                                self?.push(vc: vc1)
                                                                                                                                                }
                                                                                                                                                self?.push(vc: vc)
                                                                                                                }
                                                                                                }
                                                                                }).disposed(by: weakSelf.disposeBag)
                                                                }
                                                }else{
                                                                weakSelf.navigationController?.popToRootViewController(animated: true)
                                                                NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                                                }
                                }
                }
                private func showPaymentView(){
                }
                deinit{
                                YardDetailDateManager.destroy()
                }
}
extension YardDetailVC:FFPageViewControllerDelegate{
    func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
        if let vc = pageViewController.currentController as? YardDetailDateTimeVC{
            currentDate = vc.date
            label_datetime.text = vc.date.jq_format("yyyy年MM月dd日")
            cons_pagesHei.constant = vc.innerHeight
            UIView.animate(withDuration: 0.5) {
                self.view.layoutIfNeeded()
            }
                func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
                                if let vc = pageViewController.currentController as? YardDetailDateTimeVC{
                                                currentDate = vc.date
                                                label_datetime.text = vc.date.jq_format("yyyy年MM月dd日")
                                                cons_pagesHei.constant = vc.innerHeight
                                                UIView.animate(withDuration: 0.5) {
                                                                self.view.layoutIfNeeded()
                                                }
            var halfName:String?
            var nextName:String?
            if halfIndex != nil{
                halfName = siteDetailModel.halfName[halfIndex!]
            }
                                                var halfName:String?
                                                var nextName:String?
                                                if halfIndex != nil{
                                                                halfName = siteDetailModel.halfName[halfIndex!]
                                                }
            if siteDetailModel.nextName.count > 0{
                nextName = siteDetailModel.nextName[yardIndex]
            }
            vc.querySiteTimes(halfName: halfName, siteName: nextName)
        }
    }
    func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
        guard siteDetailModel != nil else {return 0}
        return 11
    }
    func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
        let date = Date().jq_add(day: page)
        var halfName:String?
        var nextName:String?
        if halfIndex != nil{
            halfName = siteDetailModel.halfName[halfIndex!]
        }
        if (siteDetailModel?.nextName.count ?? 0) > 0{
            nextName = siteDetailModel.nextName[yardIndex]
        }
        let vc = YardDetailDateTimeVC(id:id,date: date!,currentPage: page,halfName: halfName,siteName: nextName)
        vc.updateInnerHeight { [weak self] (height, currentPage) in
            if currentPage == self?.pageViewController.currentPage{
                self?.cons_pagesHei.constant = height
                UIView.animate(withDuration: 0.3) {
                    self?.view.layoutIfNeeded()
                                                if siteDetailModel.nextName.count > 0{
                                                                nextName = siteDetailModel.nextName[yardIndex]
                                                }
                                                vc.querySiteTimes(halfName: halfName, siteName: nextName)
                                }
                }
            }
        }
        return vc
    }
                func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                                guard siteDetailModel != nil else {return 0}
                                return 11
                }
                func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                                let date = Date().jq_add(day: page)
                                var halfName:String?
                                var nextName:String?
                                if halfIndex != nil{
                                                halfName = siteDetailModel.halfName[halfIndex!]
                                }
                                if (siteDetailModel?.nextName.count ?? 0) > 0{
                                                nextName = siteDetailModel.nextName[yardIndex]
                                }
                                let vc = YardDetailDateTimeVC(id:id,date: date!,currentPage: page,halfName: halfName,siteName: nextName)
                                vc.updateInnerHeight { [weak self] (height, currentPage) in
                                                if currentPage == self?.pageViewController.currentPage{
                                                                self?.cons_pagesHei.constant = height
                                                                UIView.animate(withDuration: 0.3) {
                                                                                self?.view.layoutIfNeeded()
                                                                }
                                                }
                                }
                                return vc
                }
}
extension YardDetailVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if self.collectionView == collectionView{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_CalendarItemCCell", for: indexPath) as! CalendarItemCCell
            let date = weeklys[indexPath.row]
            cell.label_weekly.text = weeklys[indexPath.row].jq_nowWeekDay(identifier: .republicOfChina).weekName
            cell.label_date.text = weeklys[indexPath.row].jq_format("MM.dd")
                                if self.collectionView == collectionView{
                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_CalendarItemCCell", for: indexPath) as! CalendarItemCCell
                                                let date = weeklys[indexPath.row]
                                                cell.label_weekly.text = weeklys[indexPath.row].jq_nowWeekDay(identifier: .republicOfChina).weekName
                                                cell.label_date.text = weeklys[indexPath.row].jq_format("MM.dd")
            if date.jq_nowDay() == currentDate?.jq_nowDay(){
                cell.label_weekly.textColor = .white
                cell.label_date.textColor = .white
                cell.view_bg.backgroundColor = Def_ThemeColor
            }else{
                cell.label_weekly.textColor = .black.withAlphaComponent(0.6)
                cell.label_date.textColor = .black.withAlphaComponent(0.6)
                cell.view_bg.backgroundColor = .clear
            }
            return cell
        }
                                                if date.jq_nowDay() == currentDate?.jq_nowDay(){
                                                                cell.label_weekly.textColor = .white
                                                                cell.label_date.textColor = .white
                                                                cell.view_bg.backgroundColor = Def_ThemeColor
                                                }else{
                                                                cell.label_weekly.textColor = .black.withAlphaComponent(0.6)
                                                                cell.label_date.textColor = .black.withAlphaComponent(0.6)
                                                                cell.view_bg.backgroundColor = .clear
                                                }
                                                return cell
                                }
        if collection_yardType == collectionView{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_1_CCell", for: indexPath) as! Common_1_CCell
            cell.label_content.text = siteDetailModel.nextName[indexPath.row]
            cell.label_content.backgroundColor = yardIndex == indexPath.row ? Def_ThemeColor : .white
            cell.label_content.textColor = yardIndex == indexPath.row ? .white : UIColor(hexStr: "#898989")
            cell.label_content.borderWidth = yardIndex == indexPath.row ? 0:1
            return cell
        }
                                if collection_yardType == collectionView{
                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_1_CCell", for: indexPath) as! Common_1_CCell
                                                cell.label_content.text = siteDetailModel.nextName[indexPath.row]
                                                cell.label_content.backgroundColor = yardIndex == indexPath.row ? Def_ThemeColor : .white
                                                cell.label_content.textColor = yardIndex == indexPath.row ? .white : UIColor(hexStr: "#898989")
                                                cell.label_content.borderWidth = yardIndex == indexPath.row ? 0:1
                                                return cell
                                }
            //选择半场:
        if collection_halfYard == collectionView{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_1_CCell", for: indexPath) as! Common_1_CCell
            cell.label_content.text = siteDetailModel.halfName[indexPath.row]
            cell.label_content.backgroundColor = halfIndex == indexPath.row ? Def_ThemeColor : .white
            cell.label_content.textColor = halfIndex == indexPath.row ? .white : UIColor(hexStr: "#898989")
            cell.label_content.borderWidth = halfIndex == indexPath.row ? 0:1
            return cell
        }
        return UICollectionViewCell()
    }
                                //选择半场:
                                if collection_halfYard == collectionView{
                                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_1_CCell", for: indexPath) as! Common_1_CCell
                                                cell.label_content.text = siteDetailModel.halfName[indexPath.row]
                                                cell.label_content.backgroundColor = halfIndex == indexPath.row ? Def_ThemeColor : .white
                                                cell.label_content.textColor = halfIndex == indexPath.row ? .white : UIColor(hexStr: "#898989")
                                                cell.label_content.borderWidth = halfIndex == indexPath.row ? 0:1
                                                return cell
                                }
                                return UICollectionViewCell()
                }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if self.collectionView == collectionView{
            return weeklys.count
        }
                                if self.collectionView == collectionView{
                                                return weeklys.count
                                }
        guard siteDetailModel != nil else {
            return 0
        }
                                guard siteDetailModel != nil else {
                                                return 0
                                }
        if collection_yardType == collectionView{
            return siteDetailModel.nextName.count
        }
                                if collection_yardType == collectionView{
                                                return siteDetailModel.nextName.count
                                }
        if collection_halfYard == collectionView{
            return siteDetailModel.halfName.count
        }
                                if collection_halfYard == collectionView{
                                                return siteDetailModel.halfName.count
                                }
        return 0
    }
                                return 0
                }
}
extension YardDetailVC:UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if self.collectionView == collectionView{
            let date = weeklys[indexPath.row]
            let offsetDay = Date.jq_CalByDays(startDate: Date().jq_clearTimes(), endDate: date)
            if (date.jq_isToday() || date.isInFuture) && offsetDay <= 10{
                currentDate = weeklys[indexPath.row]
                collectionView.reloadData()
                pageViewController.scroll(toPage: offsetDay, animation: true)
            }
        }
                                if self.collectionView == collectionView{
                                                let date = weeklys[indexPath.row]
                                                let offsetDay = Date.jq_CalByDays(startDate: Date().jq_clearTimes(), endDate: date)
                                                if (date.jq_isToday() || date.isInFuture) && offsetDay <= 10{
                                                                currentDate = weeklys[indexPath.row]
                                                                collectionView.reloadData()
                                                                pageViewController.scroll(toPage: offsetDay, animation: true)
                                                }
                                }
        if self.collection_yardType == collectionView{
            yardIndex = indexPath.row
            collectionView.reloadData()
            clearAll()
        }
                                if self.collection_yardType == collectionView{
                                                yardIndex = indexPath.row
                                                collectionView.reloadData()
                                                clearAll()
                                }
        if self.collection_halfYard == collectionView{
            halfIndex = indexPath.row
            collectionView.reloadData()
            clearAll()
        }
    }
                                if self.collection_halfYard == collectionView{
                                                halfIndex = indexPath.row
                                                collectionView.reloadData()
                                                clearAll()
                                }
                }
}
extension YardDetailVC:UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        if self.collectionView == collectionView{
            return CGSize(width: cellW, height: 50)
        }
                                if self.collectionView == collectionView{
                                                return CGSize(width: cellW, height: 50)
                                }
        return CGSize(width: yardCellW, height: yardCellW * 0.439)
    }
                                return CGSize(width: yardCellW, height: yardCellW * 0.439)
                }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        if self.collectionView == collectionView{
            return 0
        }
        return 21
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
                                if self.collectionView == collectionView{
                                                return 0
                                }
                                return 21
                }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        if self.collectionView == collectionView{
            return 0
        }
        return 21
    }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
                                if self.collectionView == collectionView{
                                                return 0
                                }
                                return 21
                }
}
WanPai/SceneDelegate.swift
@@ -10,100 +10,100 @@
import JQTools
class SceneDelegate: UIResponder, UIWindowSceneDelegate,WXApiDelegate {
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: windowScene)
        window?.frame = windowScene.coordinateSpace.bounds
                var window: UIWindow?
                func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
                                guard let windowScene = (scene as? UIWindowScene) else { return }
                                window = UIWindow(windowScene: windowScene)
                                window?.frame = windowScene.coordinateSpace.bounds
        if UserViewModel.getToken() != nil{
            app.registerAndLoginSuccess()
        }else{
            let loginNav = LoginNav(rootViewController: LoginVC())
            window?.rootViewController = loginNav
            window?.makeKeyAndVisible()
        }
                                if UserViewModel.getToken() != nil{
                                                app.registerAndLoginSuccess()
                                }else{
                                                let loginNav = LoginNav(rootViewController: LoginVC())
                                                window?.rootViewController = loginNav
                                                window?.makeKeyAndVisible()
                                }
        SVProgressHUD.setContainerView(window)
        SVProgressHUD.setDefaultStyle(.dark)
        SVProgressHUD.setDefaultMaskType(.custom) //禁止交互
        SVProgressHUD.setMinimumDismissTimeInterval(1.5)
        SVProgressHUD.setMaximumDismissTimeInterval(30.0)
        if #available(iOS 13.0, *) {
            window?.overrideUserInterfaceStyle = .light
        }
    }
                                SVProgressHUD.setContainerView(window)
                                SVProgressHUD.setDefaultStyle(.dark)
                                SVProgressHUD.setDefaultMaskType(.custom) //禁止交互
                                SVProgressHUD.setMinimumDismissTimeInterval(1.5)
                                SVProgressHUD.setMaximumDismissTimeInterval(30.0)
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        print("---->4")
        YYPaymentManager.shared.handleApplication(userActivity)
    }
                                if #available(iOS 13.0, *) {
                                                window?.overrideUserInterfaceStyle = .light
                                }
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let code = URLContexts.first?.url.jq_params?["code"]{
            DispatchQueue.main.async {
                hiddenHUD()
                let resp = SendAuthResp()
                resp.code = code
                WeChatTools.getAccessToken(resp) { model in
                    if let m = model{
                        WeChatTools.getUserInfo(access_token: m.access_token, openId: m.openid) { userInfoModel in
                            if let u = userInfoModel{
                                Services.wxLogin(openId: u.openid, nickname: u.nickname, headimgurl: u.headimgurl, sex: u.sex).subscribe(onNext: { data in
                                    if let m = data.data{
                                        if m.isBind == 0{
                                            let vc = BindPhoneVC(wxUserInfoModel: u,token: m.token)
                                            JQ_currentViewController().jq_push(vc: vc)
                                        }else{
                                            UserViewModel.saveToken(m.token)
                                            app.registerAndLoginSuccess()
                                        }
                                    }
                                }) { error in
                                    alertError(msg: error.localizedDescription)
                                }.disposed(by: JQ_disposeBag)
                            }else{
                                alertError(msg: "获取信息失败")
                            }
                        }
                    }
                }
            }
        }
        if ((URLContexts.first?.url.absoluteString.contains("weparklife://safepay")) != nil){
            let url = URLContexts.first!.url
            YYPaymentManager.shared.handleApplication(UIApplication.shared, open: url, options: [:])
        }
                func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
                                print("---->4")
                                YYPaymentManager.shared.handleApplication(userActivity)
                }
        if URLContexts.first!.url.host == "resendContextReqByScheme"{
            WXApi.handleOpen(URLContexts.first!.url, delegate: YYPaymentManager.shared)
        }
    }
                func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
                                if let code = URLContexts.first?.url.jq_params?["code"]{
                                                DispatchQueue.main.async {
                                                                hiddenHUD()
                                                                let resp = SendAuthResp()
                                                                resp.code = code
                                                                WeChatTools.getAccessToken(resp) { model in
                                                                                if let m = model{
                                                                                                WeChatTools.getUserInfo(access_token: m.access_token, openId: m.openid) { userInfoModel in
                                                                                                                if let u = userInfoModel{
                                                                                                                                Services.wxLogin(openId: u.openid, nickname: u.nickname, headimgurl: u.headimgurl, sex: u.sex).subscribe(onNext: { data in
                                                                                                                                                if let m = data.data{
                                                                                                                                                                if m.isBind == 0{
                                                                                                                                                                                let vc = BindPhoneVC(wxUserInfoModel: u,token: m.token)
                                                                                                                                                                                JQ_currentViewController().jq_push(vc: vc)
                                                                                                                                                                }else{
                                                                                                                                                                                UserViewModel.saveToken(m.token)
                                                                                                                                                                                app.registerAndLoginSuccess()
                                                                                                                                                                }
                                                                                                                                                }
                                                                                                                                }) { error in
                                                                                                                                                alertError(msg: error.localizedDescription)
                                                                                                                                }.disposed(by: JQ_disposeBag)
                                                                                                                }else{
                                                                                                                                alertError(msg: "获取信息失败")
                                                                                                                }
                                                                                                }
                                                                                }
                                                                }
                                                }
                                }
    func sceneDidDisconnect(_ scene: UIScene) {
    }
    func sceneDidBecomeActive(_ scene: UIScene) {
                                if ((URLContexts.first?.url.absoluteString.contains("weparklife://safepay")) != nil){
                                                let url = URLContexts.first!.url
                                                YYPaymentManager.shared.handleApplication(UIApplication.shared, open: url, options: [:])
                                }
    }
    func sceneWillResignActive(_ scene: UIScene) {
    }
    func sceneWillEnterForeground(_ scene: UIScene) {
    }
    func sceneDidEnterBackground(_ scene: UIScene) {
    }
                                if URLContexts.first!.url.host == "resendContextReqByScheme"{
                                                WXApi.handleOpen(URLContexts.first!.url, delegate: YYPaymentManager.shared)
                                }
                }
                func sceneDidDisconnect(_ scene: UIScene) {
                }
                func sceneDidBecomeActive(_ scene: UIScene) {
                }
                func sceneWillResignActive(_ scene: UIScene) {
                }
                func sceneWillEnterForeground(_ scene: UIScene) {
                }
                func sceneDidEnterBackground(_ scene: UIScene) {
                }
}