Browse Source

VIP定制课交互结构

Steven 5 tháng trước cách đây
mục cha
commit
9ebf6bd7a4
35 tập tin đã thay đổi với 1178 bổ sung245 xóa
  1. 61 61
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForStudent/KulexiuForStudent.xcodeproj/xcshareddata/xcschemes/KulexiuForStudent.xcscheme
  3. 0 42
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcshareddata/swiftpm/Package.resolved
  4. 18 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/Controller/AccompanyCourseGroupViewController.h
  5. 124 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/Controller/AccompanyCourseGroupViewController.m
  6. 18 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/MusicRoom/Controller/MusicRoomGroupViewController.h
  7. 126 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/MusicRoom/Controller/MusicRoomGroupViewController.m
  8. 23 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VIPCourseGroupViewController.h
  9. 121 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VIPCourseGroupViewController.m
  10. 26 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VipCouseDetailViewController.h
  11. 535 0
      KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VipCouseDetailViewController.m
  12. 102 118
      KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj
  13. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/AFNetworking.xcscheme
  14. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Bugly.xcscheme
  15. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/CHIPageControl.xcscheme
  16. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme
  17. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JCore.xcscheme
  18. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JPush.xcscheme
  19. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXCategoryView.xcscheme
  20. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXPagingView.xcscheme
  21. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MBProgressHUD.xcscheme
  22. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJExtension.xcscheme
  23. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJRefresh.xcscheme
  24. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Masonry.xcscheme
  25. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent-KulexiuForStudentUITests.xcscheme
  26. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent.xcscheme
  27. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudentTests.xcscheme
  28. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/RSKImageCropper.xcscheme
  29. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Reachability.xcscheme
  30. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SDWebImage.xcscheme
  31. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SSZipArchive.xcscheme
  32. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SocketRocket.xcscheme
  33. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard-Whiteboard.xcscheme
  34. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard.xcscheme
  35. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/YYModel.xcscheme

+ 61 - 61
KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj

@@ -863,7 +863,6 @@
 		BCD457AB286469600010B493 /* PublicNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD457A92864695F0010B493 /* PublicNoticeView.m */; };
 		BCD457AC286469600010B493 /* PublicNoticeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCD457AA286469600010B493 /* PublicNoticeView.xib */; };
 		BCD457AF28646B580010B493 /* NoticeSourceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD457AE28646B580010B493 /* NoticeSourceModel.m */; };
-		BCD9294F28F8FCA4006793E4 /* AudioKit in Frameworks */ = {isa = PBXBuildFile; productRef = BCD9294E28F8FCA4006793E4 /* AudioKit */; };
 		BCD959C928DB071B00B70314 /* MusicTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD959C828DB071B00B70314 /* MusicTagView.m */; };
 		BCD959CC28DB0BAB00B70314 /* KSImageShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD959CB28DB0BAB00B70314 /* KSImageShareViewController.m */; };
 		BCDE358E289A7D8700A9A560 /* KSGroupTagImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCDE358D289A7D8700A9A560 /* KSGroupTagImageView.m */; };
@@ -891,6 +890,10 @@
 		BCF425F72AB991E600BCD942 /* TenantAlbumModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF425F62AB991E600BCD942 /* TenantAlbumModel.m */; };
 		BCF472E72AB019CD0032BE16 /* TenantDarkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF472E62AB019CD0032BE16 /* TenantDarkViewController.m */; };
 		BCF472EA2AB01AEB0032BE16 /* TenantMoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF472E92AB01AEB0032BE16 /* TenantMoreViewController.m */; };
+		BCFB9B9E2CE4A04000B66BC0 /* VIPCourseGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB9B9D2CE4A03F00B66BC0 /* VIPCourseGroupViewController.m */; };
+		BCFB9BA12CE4A07900B66BC0 /* VipCouseDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB9BA02CE4A07900B66BC0 /* VipCouseDetailViewController.m */; };
+		BCFB9BA42CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB9BA32CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.m */; };
+		BCFB9BA72CE58C5400B66BC0 /* MusicRoomGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB9BA62CE58C5400B66BC0 /* MusicRoomGroupViewController.m */; };
 		BCFC09D12C48B3D7009A727F /* KSAccompanyDraftViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC09D02C48B3D7009A727F /* KSAccompanyDraftViewController.m */; };
 		BCFC09DA2C48C8DE009A727F /* UserVip.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC09D82C48C8DD009A727F /* UserVip.m */; };
 		BCFCE44E28DD5C000051FED8 /* Low.wav in Resources */ = {isa = PBXBuildFile; fileRef = BCFCE44C28DD5C000051FED8 /* Low.wav */; };
@@ -940,8 +943,6 @@
 		BCFE54002814E1BE00AD6786 /* HomeVideoGroupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE53FE2814E1BE00AD6786 /* HomeVideoGroupModel.m */; };
 		BCFE540328152A8500AD6786 /* KSOrderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE540228152A8500AD6786 /* KSOrderManager.m */; };
 		BCFE5406281545C600AD6786 /* HomeAlbumModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE5405281545C500AD6786 /* HomeAlbumModel.m */; };
-		BCFEE18D2AD15BD4000E888F /* AudioKitEX in Frameworks */ = {isa = PBXBuildFile; productRef = BCFEE18C2AD15BD4000E888F /* AudioKitEX */; };
-		BCFEE1932AD15C0E000E888F /* SoundpipeAudioKit in Frameworks */ = {isa = PBXBuildFile; productRef = BCFEE1922AD15C0E000E888F /* SoundpipeAudioKit */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -2426,6 +2427,14 @@
 		BCF880DD2B91C4FA0007B8F0 /* Config-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Config-debug.xcconfig"; sourceTree = "<group>"; };
 		BCF880DF2B91C5090007B8F0 /* Config-test.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Config-test.xcconfig"; sourceTree = "<group>"; };
 		BCF880E02B91C5150007B8F0 /* Config-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Config-release.xcconfig"; sourceTree = "<group>"; };
+		BCFB9B9C2CE4A03F00B66BC0 /* VIPCourseGroupViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VIPCourseGroupViewController.h; sourceTree = "<group>"; };
+		BCFB9B9D2CE4A03F00B66BC0 /* VIPCourseGroupViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VIPCourseGroupViewController.m; sourceTree = "<group>"; };
+		BCFB9B9F2CE4A07900B66BC0 /* VipCouseDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VipCouseDetailViewController.h; sourceTree = "<group>"; };
+		BCFB9BA02CE4A07900B66BC0 /* VipCouseDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VipCouseDetailViewController.m; sourceTree = "<group>"; };
+		BCFB9BA22CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccompanyCourseGroupViewController.h; sourceTree = "<group>"; };
+		BCFB9BA32CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccompanyCourseGroupViewController.m; sourceTree = "<group>"; };
+		BCFB9BA52CE58C5400B66BC0 /* MusicRoomGroupViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicRoomGroupViewController.h; sourceTree = "<group>"; };
+		BCFB9BA62CE58C5400B66BC0 /* MusicRoomGroupViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MusicRoomGroupViewController.m; sourceTree = "<group>"; };
 		BCFC09CF2C48B3D7009A727F /* KSAccompanyDraftViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSAccompanyDraftViewController.h; sourceTree = "<group>"; };
 		BCFC09D02C48B3D7009A727F /* KSAccompanyDraftViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSAccompanyDraftViewController.m; sourceTree = "<group>"; };
 		BCFC09D82C48C8DD009A727F /* UserVip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserVip.m; sourceTree = "<group>"; };
@@ -2508,11 +2517,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				BCA1136828A3A5CF007FAFB9 /* Accelerate.framework in Frameworks */,
-				BCFEE1932AD15C0E000E888F /* SoundpipeAudioKit in Frameworks */,
-				BCFEE18D2AD15BD4000E888F /* AudioKitEX in Frameworks */,
 				BC8B6E152856E20800866917 /* WebKit.framework in Frameworks */,
 				BC8A45CB283DDEA100094BBB /* AVFoundation.framework in Frameworks */,
-				BCD9294F28F8FCA4006793E4 /* AudioKit in Frameworks */,
 				BC71D1042881A2420010F14B /* libSocialQQ.a in Frameworks */,
 				BC71D0FC2881A2420010F14B /* UMShare.framework in Frameworks */,
 				BC71D0F92881A2420010F14B /* UMDevice.framework in Frameworks */,
@@ -2927,6 +2933,7 @@
 		275FA1F727E7356A00CFEA2E /* Course */ = {
 			isa = PBXGroup;
 			children = (
+				BCFB9B9B2CE49F7A00B66BC0 /* VipCourse */,
 				BC494A73286952A200CCD343 /* MusicRoom */,
 				BC11923B280ED9CC00A716F7 /* AccompanyCourse */,
 				275FA1F827E7356A00CFEA2E /* Controller */,
@@ -3860,6 +3867,8 @@
 		BC11923C280ED9CC00A716F7 /* Controller */ = {
 			isa = PBXGroup;
 			children = (
+				BCFB9BA22CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.h */,
+				BCFB9BA32CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.m */,
 				BC11923F280ED9E000A716F7 /* AccompanyDetailViewController.h */,
 				BC119240280ED9E000A716F7 /* AccompanyDetailViewController.m */,
 			);
@@ -4695,6 +4704,8 @@
 		BC494A74286952A200CCD343 /* Controller */ = {
 			isa = PBXGroup;
 			children = (
+				BCFB9BA52CE58C5400B66BC0 /* MusicRoomGroupViewController.h */,
+				BCFB9BA62CE58C5400B66BC0 /* MusicRoomGroupViewController.m */,
 				BC494A75286952B500CCD343 /* MusicRoomDetailViewController.h */,
 				BC494A76286952B500CCD343 /* MusicRoomDetailViewController.m */,
 			);
@@ -5945,6 +5956,41 @@
 			path = configuration;
 			sourceTree = "<group>";
 		};
+		BCFB9B982CE49F7A00B66BC0 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BCFB9B9C2CE4A03F00B66BC0 /* VIPCourseGroupViewController.h */,
+				BCFB9B9D2CE4A03F00B66BC0 /* VIPCourseGroupViewController.m */,
+				BCFB9B9F2CE4A07900B66BC0 /* VipCouseDetailViewController.h */,
+				BCFB9BA02CE4A07900B66BC0 /* VipCouseDetailViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BCFB9B992CE49F7A00B66BC0 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BCFB9B9A2CE49F7A00B66BC0 /* View */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BCFB9B9B2CE49F7A00B66BC0 /* VipCourse */ = {
+			isa = PBXGroup;
+			children = (
+				BCFB9B982CE49F7A00B66BC0 /* Controller */,
+				BCFB9B992CE49F7A00B66BC0 /* Model */,
+				BCFB9B9A2CE49F7A00B66BC0 /* View */,
+			);
+			path = VipCourse;
+			sourceTree = "<group>";
+		};
 		BCFDA62128BC94250022B497 /* HomeNav */ = {
 			isa = PBXGroup;
 			children = (
@@ -6069,9 +6115,6 @@
 			);
 			name = KulexiuForStudent;
 			packageProductDependencies = (
-				BCD9294E28F8FCA4006793E4 /* AudioKit */,
-				BCFEE18C2AD15BD4000E888F /* AudioKitEX */,
-				BCFEE1922AD15C0E000E888F /* SoundpipeAudioKit */,
 			);
 			productName = KulexiuForStudent;
 			productReference = 275E8AA527E18F8800DD3F6E /* KulexiuForStudent.app */;
@@ -6124,7 +6167,7 @@
 			isa = PBXProject;
 			attributes = {
 				BuildIndependentTargetsInParallel = 1;
-				LastUpgradeCheck = 1540;
+				LastUpgradeCheck = 1610;
 				TargetAttributes = {
 					275E8AA427E18F8800DD3F6E = {
 						CreatedOnToolsVersion = 13.2.1;
@@ -6151,9 +6194,6 @@
 			);
 			mainGroup = 275E8A9C27E18F8800DD3F6E;
 			packageReferences = (
-				BCD9294D28F8FCA4006793E4 /* XCRemoteSwiftPackageReference "AudioKit" */,
-				BCFEE18B2AD15BD4000E888F /* XCRemoteSwiftPackageReference "AudioKitEX" */,
-				BCFEE1912AD15C0E000E888F /* XCRemoteSwiftPackageReference "SoundpipeAudioKit" */,
 			);
 			productRefGroup = 275E8AA627E18F8800DD3F6E /* Products */;
 			projectDirPath = "";
@@ -6762,6 +6802,7 @@
 				BC5F765029001C8D00B433E0 /* HomeDragButton.m in Sources */,
 				BC2888802A8102A20064B773 /* KSChatConversationViewController.m in Sources */,
 				BC40BA23281255F700DEC0D1 /* HomeCourseTipsView.m in Sources */,
+				BCFB9BA72CE58C5400B66BC0 /* MusicRoomGroupViewController.m in Sources */,
 				BC12636D28FEA20100509E90 /* RecentMusicView.m in Sources */,
 				BC8C2C5F2823F57100FBA5D5 /* MyAddressListCell.m in Sources */,
 				275FA22C27E7356B00CFEA2E /* CourseViewController.m in Sources */,
@@ -6769,6 +6810,7 @@
 				BC84183F2AC2D96600D8F90E /* PasswordCheckBodyView.m in Sources */,
 				BCD457A1286313D70010B493 /* NotiferNavView.m in Sources */,
 				2723B62C27F157D500E0B90B /* ApplyBottomView.m in Sources */,
+				BCFB9B9E2CE4A04000B66BC0 /* VIPCourseGroupViewController.m in Sources */,
 				BCC0F6A62A8CDD3F00C4EFA4 /* InputBarControl.m in Sources */,
 				277935BA27E324A90010E277 /* FSCalendarWeekdayView.m in Sources */,
 				2723B66C27F15CFC00E0B90B /* SettingBodyView.m in Sources */,
@@ -6789,6 +6831,7 @@
 				BC27A071280FF56C00F91E27 /* AccompanyEvaluateCell.m in Sources */,
 				BC119241280ED9E000A716F7 /* AccompanyDetailViewController.m in Sources */,
 				BCB6346F27F6D29600ACFDCF /* LiveroomTimeManager.m in Sources */,
+				BCFB9BA12CE4A07900B66BC0 /* VipCouseDetailViewController.m in Sources */,
 				27F9033627E87C8B00C08A19 /* MineNavView.m in Sources */,
 				BCED0AF72C4651F800369AED /* KSMergeEnginePlayer.m in Sources */,
 				BC50171527FC0D8300F8BCBC /* SubjectChooseBodyView.m in Sources */,
@@ -7083,6 +7126,7 @@
 				BC02381528685064005560CA /* KSLiveBadNetView.m in Sources */,
 				BC119218280ED6A900A716F7 /* MyLessonSearchView.m in Sources */,
 				BC802DB228BC70370079E350 /* HomeHotTalentCell.m in Sources */,
+				BCFB9BA42CE58C0B00B66BC0 /* AccompanyCourseGroupViewController.m in Sources */,
 				BC38C4522AFA095D00ABFCC2 /* MineWorksViewController.m in Sources */,
 				BCC0F6062A8CD86C00C4EFA4 /* TXClassroomDisplayMsg.m in Sources */,
 				BC2888752A8101C80064B773 /* KSSearchResultListController.m in Sources */,
@@ -7330,6 +7374,7 @@
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -7391,6 +7436,7 @@
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -7825,7 +7871,6 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 04AE318E8988C2AC148D551B /* Pods-KulexiuForStudent-KulexiuForStudentUITests.debug.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = P664H7S5LL;
@@ -7902,6 +7947,7 @@
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -8135,7 +8181,6 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 27D80AB506D2600940ACA6C6 /* Pods-KulexiuForStudent-KulexiuForStudentUITests.dev.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = P664H7S5LL;
@@ -8191,6 +8236,7 @@
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -8424,7 +8470,6 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 898B9EE400ADCCF44DE1C3BE /* Pods-KulexiuForStudent-KulexiuForStudentUITests.test.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = P664H7S5LL;
@@ -8489,51 +8534,6 @@
 			defaultConfigurationName = Release;
 		};
 /* End XCConfigurationList section */
-
-/* Begin XCRemoteSwiftPackageReference section */
-		BCD9294D28F8FCA4006793E4 /* XCRemoteSwiftPackageReference "AudioKit" */ = {
-			isa = XCRemoteSwiftPackageReference;
-			repositoryURL = "https://github.com/AudioKit/AudioKit.git";
-			requirement = {
-				kind = exactVersion;
-				version = 5.4.4;
-			};
-		};
-		BCFEE18B2AD15BD4000E888F /* XCRemoteSwiftPackageReference "AudioKitEX" */ = {
-			isa = XCRemoteSwiftPackageReference;
-			repositoryURL = "https://github.com/AudioKit/AudioKitEX.git";
-			requirement = {
-				kind = exactVersion;
-				version = 5.4.1;
-			};
-		};
-		BCFEE1912AD15C0E000E888F /* XCRemoteSwiftPackageReference "SoundpipeAudioKit" */ = {
-			isa = XCRemoteSwiftPackageReference;
-			repositoryURL = "https://github.com/AudioKit/SoundpipeAudioKit.git";
-			requirement = {
-				kind = exactVersion;
-				version = 5.4.1;
-			};
-		};
-/* End XCRemoteSwiftPackageReference section */
-
-/* Begin XCSwiftPackageProductDependency section */
-		BCD9294E28F8FCA4006793E4 /* AudioKit */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = BCD9294D28F8FCA4006793E4 /* XCRemoteSwiftPackageReference "AudioKit" */;
-			productName = AudioKit;
-		};
-		BCFEE18C2AD15BD4000E888F /* AudioKitEX */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = BCFEE18B2AD15BD4000E888F /* XCRemoteSwiftPackageReference "AudioKitEX" */;
-			productName = AudioKitEX;
-		};
-		BCFEE1922AD15C0E000E888F /* SoundpipeAudioKit */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = BCFEE1912AD15C0E000E888F /* XCRemoteSwiftPackageReference "SoundpipeAudioKit" */;
-			productName = SoundpipeAudioKit;
-		};
-/* End XCSwiftPackageProductDependency section */
 	};
 	rootObject = 275E8A9D27E18F8800DD3F6E /* Project object */;
 }

+ 1 - 1
KulexiuForStudent/KulexiuForStudent.xcodeproj/xcshareddata/xcschemes/KulexiuForStudent.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1600"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 0 - 42
KulexiuForStudent/KulexiuForStudent.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -1,42 +0,0 @@
-{
-  "originHash" : "a837f8bf89850bead33f45d5daae366332606889619596429a3c91b8a957e646",
-  "pins" : [
-    {
-      "identity" : "audiokit",
-      "kind" : "remoteSourceControl",
-      "location" : "https://github.com/AudioKit/AudioKit.git",
-      "state" : {
-        "revision" : "576528c7618838ed3bdb967b4e176841994aa01d",
-        "version" : "5.4.4"
-      }
-    },
-    {
-      "identity" : "audiokitex",
-      "kind" : "remoteSourceControl",
-      "location" : "https://github.com/AudioKit/AudioKitEX.git",
-      "state" : {
-        "revision" : "ab5b5623e70b2f3c578a5e64ce23d3aea709bb41",
-        "version" : "5.4.1"
-      }
-    },
-    {
-      "identity" : "kissfft",
-      "kind" : "remoteSourceControl",
-      "location" : "https://github.com/AudioKit/KissFFT",
-      "state" : {
-        "revision" : "dd0636e151724b8ba2e0908eba4d99a6ff24d00c",
-        "version" : "1.0.0"
-      }
-    },
-    {
-      "identity" : "soundpipeaudiokit",
-      "kind" : "remoteSourceControl",
-      "location" : "https://github.com/AudioKit/SoundpipeAudioKit.git",
-      "state" : {
-        "revision" : "3be2802b20088de37f34f993966d918b65401a60",
-        "version" : "5.4.1"
-      }
-    }
-  ],
-  "version" : 3
-}

+ 18 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/Controller/AccompanyCourseGroupViewController.h

@@ -0,0 +1,18 @@
+//
+//  AccompanyCourseGroupViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/14.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+// 趣纠课--课程组
+@interface AccompanyCourseGroupViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *courseGroupId; // 课程组ID
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 124 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/Controller/AccompanyCourseGroupViewController.m

@@ -0,0 +1,124 @@
+//
+//  AccompanyCourseGroupViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/14.
+//
+
+#import "AccompanyCourseGroupViewController.h"
+#import <RecordCheckManager.h>
+#import "KSPremissionAlert.h"
+#import "OnlineClassManager.h"
+#import "HomeworkDetailModel.h"
+
+@interface AccompanyCourseGroupViewController ()
+
+@property (nonatomic, strong) NSString *courseId;
+
+@property (nonatomic, strong) NSString *studentId;
+
+@property (nonatomic, assign) NSInteger joinRoomBeforeTime; // 上课开始时间
+
+@property (nonatomic, assign) NSInteger quitRomeEndTime;    // 下课截止时间
+
+@property (nonatomic, strong) HomeworkDetailModel *homeworkModel;
+
+@property (nonatomic, strong) OnlineClassManager *classManager;
+
+@end
+
+@implementation AccompanyCourseGroupViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+- (void)tryJoinRoom {
+    
+    NSDateFormatter *dateFormatter = [NSObject getDateformatter];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *beginDate = [dateFormatter dateFromString:self.homeworkModel.startTime];
+    NSDate *endDate = [dateFormatter dateFromString:self.homeworkModel.endTime];
+    NSDate *currentDate = [NSDate date];
+    NSTimeInterval beginTimeInterval = [beginDate timeIntervalSinceDate:currentDate];
+    NSTimeInterval endTimeInterval = [currentDate timeIntervalSinceDate:endDate];
+    if (beginTimeInterval <= self.joinRoomBeforeTime * 60 && endTimeInterval < 0) {
+        [self joinClassRoom];
+    }
+    else if (endTimeInterval > 0) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"该课程已结束"];
+    }
+    else {
+        NSString *tipsString = [NSString stringWithFormat:@"课程还未开始,请在上课前%zd分钟进入", self.joinRoomBeforeTime];
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:tipsString];
+    }
+}
+
+// 加入房间
+- (void)joinClassRoom {
+    
+    // 加入房间前判断摄像头和麦克风逻辑
+    [RecordCheckManager checkCameraPremissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        [self afterCheckCameraCheckMic:type];
+    }];
+}
+
+- (void)afterCheckCameraCheckMic:(PREMISSIONTYPE)cameraType {
+    [RecordCheckManager checkMicPermissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        if (type == PREMISSIONTYPE_YES && cameraType == PREMISSIONTYPE_YES) {
+            // 判断是否进行课前检测
+            [self.classManager joinRoomWithId:self.courseId subjectName:self.homeworkModel.subjectName classEndTime:self.homeworkModel.endTime inViewController:self];
+        }
+        else {
+            NSString *content = @"";
+            CHECKDEVICETYPE checkType = CHECKDEVICETYPE_BOTH;
+            if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_NO) {
+                content = @"请开启相机和麦克风访问权限";
+                checkType = CHECKDEVICETYPE_BOTH;
+            }
+            else if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_YES) {
+                content =  @"请开启相机访问权限";
+                checkType = CHECKDEVICETYPE_CAMREA;
+            }
+            else if (cameraType == PREMISSIONTYPE_YES && type == PREMISSIONTYPE_NO) {
+                content = @"请开启麦克风访问权限";
+                checkType = CHECKDEVICETYPE_MIC;
+            }
+            [self showAlertWithMessage:content type:checkType];
+        }
+    }];
+    
+}
+
+- (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
+    [KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
+        
+    } confirm:^{
+        [self openSettingView];
+    }];
+    
+}
+
+- (void)openSettingView {
+    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
+}
+
+#pragma mark ----- lazying
+- (OnlineClassManager *)classManager {
+    if (!_classManager) {
+        _classManager = [[OnlineClassManager alloc] init];
+    }
+    return _classManager;
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 18 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/MusicRoom/Controller/MusicRoomGroupViewController.h

@@ -0,0 +1,18 @@
+//
+//  MusicRoomGroupViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/14.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+// 琴房课--课程组
+@interface MusicRoomGroupViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *courseGroupId; // 课程组ID
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 126 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/MusicRoom/Controller/MusicRoomGroupViewController.m

@@ -0,0 +1,126 @@
+//
+//  MusicRoomGroupViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/14.
+//
+
+#import "MusicRoomGroupViewController.h"
+#import <RecordCheckManager.h>
+#import "KSPremissionAlert.h"
+#import "OnlineClassManager.h"
+#import "HomeworkDetailModel.h"
+
+
+@interface MusicRoomGroupViewController ()
+
+@property (nonatomic, strong) NSString *courseId;
+
+@property (nonatomic, strong) NSString *studentId;
+
+@property (nonatomic, assign) NSInteger joinRoomBeforeTime; // 上课开始时间
+
+@property (nonatomic, assign) NSInteger quitRomeEndTime;    // 下课截止时间
+
+@property (nonatomic, strong) HomeworkDetailModel *homeworkModel;
+
+@property (nonatomic, strong) OnlineClassManager *classManager;
+
+
+@end
+
+@implementation MusicRoomGroupViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+- (void)tryJoinRoom {
+    
+    NSDateFormatter *dateFormatter = [NSObject getDateformatter];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *beginDate = [dateFormatter dateFromString:self.homeworkModel.startTime];
+    NSDate *endDate = [dateFormatter dateFromString:self.homeworkModel.endTime];
+    NSDate *currentDate = [NSDate date];
+    NSTimeInterval beginTimeInterval = [beginDate timeIntervalSinceDate:currentDate];
+    NSTimeInterval endTimeInterval = [currentDate timeIntervalSinceDate:endDate];
+    if (beginTimeInterval <= self.joinRoomBeforeTime * 60 && endTimeInterval < 0) {
+        [self joinClassRoom];
+    }
+    else if (endTimeInterval > 0) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"该课程已结束"];
+    }
+    else {
+        NSString *tipsString = [NSString stringWithFormat:@"课程还未开始,请在上课前%zd分钟进入", self.joinRoomBeforeTime];
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:tipsString];
+    }
+}
+
+// 加入房间
+- (void)joinClassRoom {
+    
+    // 加入房间前判断摄像头和麦克风逻辑
+    [RecordCheckManager checkCameraPremissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        [self afterCheckCameraCheckMic:type];
+    }];
+}
+
+- (void)afterCheckCameraCheckMic:(PREMISSIONTYPE)cameraType {
+    [RecordCheckManager checkMicPermissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        if (type == PREMISSIONTYPE_YES && cameraType == PREMISSIONTYPE_YES) {
+            // 判断是否进行课前检测
+            [self.classManager joinRoomWithId:self.courseId subjectName:self.homeworkModel.subjectName classEndTime:self.homeworkModel.endTime inViewController:self];
+        }
+        else {
+            NSString *content = @"";
+            CHECKDEVICETYPE checkType = CHECKDEVICETYPE_BOTH;
+            if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_NO) {
+                content = @"请开启相机和麦克风访问权限";
+                checkType = CHECKDEVICETYPE_BOTH;
+            }
+            else if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_YES) {
+                content =  @"请开启相机访问权限";
+                checkType = CHECKDEVICETYPE_CAMREA;
+            }
+            else if (cameraType == PREMISSIONTYPE_YES && type == PREMISSIONTYPE_NO) {
+                content = @"请开启麦克风访问权限";
+                checkType = CHECKDEVICETYPE_MIC;
+            }
+            [self showAlertWithMessage:content type:checkType];
+        }
+    }];
+    
+}
+
+- (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
+    [KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
+        
+    } confirm:^{
+        [self openSettingView];
+    }];
+    
+}
+
+- (void)openSettingView {
+    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
+}
+
+#pragma mark ----- lazying
+- (OnlineClassManager *)classManager {
+    if (!_classManager) {
+        _classManager = [[OnlineClassManager alloc] init];
+    }
+    return _classManager;
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 23 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VIPCourseGroupViewController.h

@@ -0,0 +1,23 @@
+//
+//  VIPCourseGroupViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/13.
+//
+
+#import "KSBaseViewController.h"
+#import <RecordCheckManager.h>
+#import "KSPremissionAlert.h"
+#import "OnlineClassManager.h"
+#import "HomeworkDetailModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+// VIP定制课--课程组
+@interface VIPCourseGroupViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *courseGroupId; // 课程组ID
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 121 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VIPCourseGroupViewController.m

@@ -0,0 +1,121 @@
+//
+//  VIPCourseGroupViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/13.
+//
+
+#import "VIPCourseGroupViewController.h"
+
+@interface VIPCourseGroupViewController ()
+
+@property (nonatomic, strong) NSString *courseId;
+
+@property (nonatomic, strong) NSString *studentId;
+
+@property (nonatomic, assign) NSInteger joinRoomBeforeTime; // 上课开始时间
+
+@property (nonatomic, assign) NSInteger quitRomeEndTime;    // 下课截止时间
+
+@property (nonatomic, strong) HomeworkDetailModel *homeworkModel;
+
+@property (nonatomic, strong) OnlineClassManager *classManager;
+
+@end
+
+@implementation VIPCourseGroupViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+- (void)tryJoinRoom {
+    
+    NSDateFormatter *dateFormatter = [NSObject getDateformatter];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *beginDate = [dateFormatter dateFromString:self.homeworkModel.startTime];
+    NSDate *endDate = [dateFormatter dateFromString:self.homeworkModel.endTime];
+    NSDate *currentDate = [NSDate date];
+    NSTimeInterval beginTimeInterval = [beginDate timeIntervalSinceDate:currentDate];
+    NSTimeInterval endTimeInterval = [currentDate timeIntervalSinceDate:endDate];
+    if (beginTimeInterval <= self.joinRoomBeforeTime * 60 && endTimeInterval < 0) {
+        [self joinClassRoom];
+    }
+    else if (endTimeInterval > 0) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"该课程已结束"];
+    }
+    else {
+        NSString *tipsString = [NSString stringWithFormat:@"课程还未开始,请在上课前%zd分钟进入", self.joinRoomBeforeTime];
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:tipsString];
+    }
+}
+
+// 加入房间
+- (void)joinClassRoom {
+    
+    // 加入房间前判断摄像头和麦克风逻辑
+    [RecordCheckManager checkCameraPremissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        [self afterCheckCameraCheckMic:type];
+    }];
+}
+
+- (void)afterCheckCameraCheckMic:(PREMISSIONTYPE)cameraType {
+    [RecordCheckManager checkMicPermissionAvaiableCallback:^(PREMISSIONTYPE type) {
+        if (type == PREMISSIONTYPE_YES && cameraType == PREMISSIONTYPE_YES) {
+            // 判断是否进行课前检测
+            [self.classManager joinRoomWithId:self.courseId subjectName:self.homeworkModel.subjectName classEndTime:self.homeworkModel.endTime inViewController:self];
+        }
+        else {
+            NSString *content = @"";
+            CHECKDEVICETYPE checkType = CHECKDEVICETYPE_BOTH;
+            if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_NO) {
+                content = @"请开启相机和麦克风访问权限";
+                checkType = CHECKDEVICETYPE_BOTH;
+            }
+            else if (cameraType == PREMISSIONTYPE_NO && type == PREMISSIONTYPE_YES) {
+                content =  @"请开启相机访问权限";
+                checkType = CHECKDEVICETYPE_CAMREA;
+            }
+            else if (cameraType == PREMISSIONTYPE_YES && type == PREMISSIONTYPE_NO) {
+                content = @"请开启麦克风访问权限";
+                checkType = CHECKDEVICETYPE_MIC;
+            }
+            [self showAlertWithMessage:content type:checkType];
+        }
+    }];
+    
+}
+
+- (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
+    [KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
+        
+    } confirm:^{
+        [self openSettingView];
+    }];
+    
+}
+
+- (void)openSettingView {
+    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
+}
+
+#pragma mark ----- lazying
+- (OnlineClassManager *)classManager {
+    if (!_classManager) {
+        _classManager = [[OnlineClassManager alloc] init];
+    }
+    return _classManager;
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 26 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VipCouseDetailViewController.h

@@ -0,0 +1,26 @@
+//
+//  VipCouseDetailViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/13.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+// VIP定制课详情
+@interface VipCouseDetailViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *courseId;
+
+@property (nonatomic, strong) NSString *courseGroupId;
+
+@property (nonatomic, strong) NSString *studentId;
+
+@property (nonatomic, assign) NSInteger joinRoomBeforeTime; // 上课开始时间
+
+@property (nonatomic, assign) NSInteger quitRomeEndTime;    // 下课截止时间
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 535 - 0
KulexiuForStudent/KulexiuForStudent/Module/Course/VipCourse/Controller/VipCouseDetailViewController.m

@@ -0,0 +1,535 @@
+//
+//  VipCouseDetailViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/13.
+//
+
+#import "VipCouseDetailViewController.h"
+#import "AccompanyCourseInfoCell.h"
+#import "AccompanyArrangeCell.h"
+#import "AccompanyHomeworkCell.h"
+#import "AccompanyRemarkCell.h"
+#import "AccompanyEvaluateCell.h"
+#import "AccompanyStudentEvaCell.h"
+#import "HomeworkDetailModel.h"
+#import "EvaluateDetailModel.h"
+#import "AccompanyAlertView.h"
+#import <WMPlayer.h>
+#import <RecordCheckManager.h>
+#import "KSPremissionAlert.h"
+#import "KSMediaManager.h"
+#import "OnlineClassManager.h"
+#import "HomeworkDetailViewController.h"
+#import "KSChatConversationViewController.h"
+
+
+@interface VipCouseDetailViewController ()<UITableViewDelegate,UITableViewDataSource,WMPlayerDelegate>
+{
+    WMPlayer *_wmPlayer;
+    CGRect _playerFrame;
+}
+@property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, assign) BOOL isRatation;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, strong) AccompanyAlertView *alertView;
+
+@property (nonatomic, strong) NSMutableArray *fileArray;
+
+@property (nonatomic, strong) KSMediaManager *mediaManager;
+
+@property (nonatomic, strong) HomeworkDetailModel *homeworkModel;
+
+@property (nonatomic, strong) EvaluateDetailModel *evaluateModel;
+
+@property (strong, nonatomic) MBProgressHUD *HUD;
+
+
+@property (nonatomic, strong) OnlineClassManager *classManager;
+
+@property (nonatomic, assign) BOOL canModify;
+
+@property (nonatomic, assign) BOOL isModify; // 是否修改作业
+
+@end
+
+@implementation VipCouseDetailViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"课程详情"];
+    [self configUI];
+    self.isModify = NO;
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self requestCourseInfoMessage];
+}
+
+- (void)requestCourseInfoMessage {
+    [self requestHomeworkMessage];
+    [self requestEvaluateMessage];
+    [self requestRoomConfig];
+}
+
+- (void)requestRoomConfig {
+    [KSNetworkingManager selectRoomConfigRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSDictionary *result = [dic ks_dictionaryValueForKey:@"data"];
+            self.joinRoomBeforeTime = [result ks_integerValueForKey:@"practiceStartTime"];
+            self.quitRomeEndTime = [result ks_integerValueForKey:@"practiceEndTime"];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)requestHomeworkMessage {
+    [KSNetworkingManager homeworkDetailRequest:KS_GET courseId:self.courseId success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            self.homeworkModel = [[HomeworkDetailModel alloc] initWithDictionary:[dic ks_dictionaryValueForKey:@"data"]];
+            if (self.homeworkModel.submitHomework == 1) {
+                if (![NSString isEmptyString:self.homeworkModel.studentAttachments]) {
+                    self.fileArray = [NSMutableArray arrayWithArray:[self.homeworkModel.studentAttachments componentsSeparatedByString:@","]];
+                }
+                else {
+                    self.fileArray = [NSMutableArray array];
+                }
+            }
+            else {
+                self.fileArray = [NSMutableArray array];
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self evaluateViewDisplay];
+        [self.tableView reloadData];
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)evaluateViewDisplay {
+    // 老师布置过作业且没有点评 可以点击
+    if (self.homeworkModel.reviewHomework == 1 || self.homeworkModel.decorateHomework == 0) {
+        self.canModify = NO;
+
+    }
+    else {
+        self.canModify = YES;
+    }
+}
+
+
+- (void)requestEvaluateMessage {
+    [KSNetworkingManager selectRepliedRequest:KS_POST courseGroupId:self.courseGroupId courseScheduleId:self.courseId success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            self.evaluateModel = [[EvaluateDetailModel alloc] initWithDictionary:[dic ks_dictionaryValueForKey:@"data"]];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.tableView reloadData];
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.view.mas_top);
+        make.bottom.mas_equalTo(self.view.mas_bottom).offset(-iPhoneXSafeBottomMargin);
+    }];
+}
+
+- (void)evaluateWithStatusLabel:(UILabel *)statusLabel {
+    if ([self.homeworkModel.courseStatus isEqualToString:@"COMPLETE"]) {
+        statusLabel.text = @"已结束";
+        statusLabel.textColor = HexRGB(0x999999);
+    }
+    else if ([self.homeworkModel.courseStatus isEqualToString:@"ING"]) {
+        statusLabel.text = @"进行中";
+        statusLabel.textColor = THEMECOLOR;
+    }
+    else {
+        statusLabel.text = @"未开始";
+        statusLabel.textColor = HexRGB(0xff802c);
+    }
+}
+
+#pragma mark --- table data source
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return 6;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.row == 0) {
+        AccompanyCourseInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AccompanyCourseInfoCell"];
+        cell.statusLabel.textColor = HexRGB(0x999999);
+        [self evaluateWithStatusLabel:cell.statusLabel];
+        [cell configWithStartTime:self.homeworkModel.startTime endTime:self.homeworkModel.endTime teacherAvatar:self.homeworkModel.teacherAvatar teacherName:self.homeworkModel.teacherName teacherId:self.homeworkModel.teacherId courseSubject:self.homeworkModel.subjectName isMusicRoom:NO];
+        MJWeakSelf;
+        [cell chatCalkback:^{
+            [weakSelf chatAction];
+        }];
+        return cell;
+    }
+    else if (indexPath.row == 1) {
+        AccompanyEvaluateCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AccompanyEvaluateCell"];
+        NSString *message = self.evaluateModel.teacherReplied;
+        BOOL hasEvaluate = [NSString isEmptyString:self.evaluateModel.teacherReplied] ? NO : YES;
+        [cell configWithEvaluateMessage:message hasEvaluate:hasEvaluate];
+        return cell;
+    }
+    else if (indexPath.row == 2) {
+        AccompanyStudentEvaCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AccompanyStudentEvaCell"];
+        NSString *message = self.evaluateModel.studentReplied;
+        BOOL hasEvaluate = [NSString isEmptyString:self.evaluateModel.studentReplied] ? NO : YES;
+        MJWeakSelf;
+        [cell configWithEvaluateMessage:message starNum:self.evaluateModel.score hasEvaluate:hasEvaluate callback:^{
+            [weakSelf evaluateCourse];
+        }];
+        return cell;
+    }
+    else if (indexPath.row == 3) {
+        AccompanyArrangeCell *cell  = [tableView dequeueReusableCellWithIdentifier:@"AccompanyArrangeCell"];
+        BOOL hasArrange = self.homeworkModel.decorateHomework == 1 ? YES : NO;
+        [cell configWithHomeworkContent:self.homeworkModel.content hasArrangeHomework:hasArrange];
+        return cell;
+    }
+    else if (indexPath.row == 4) {
+        // studentAttachments
+        BOOL canDisplay = self.homeworkModel.decorateHomework == 1 ? YES : NO;
+        BOOL isExpired = self.homeworkModel.homeworkExpire == 1 ? YES : NO;
+        AccompanyHomeworkCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AccompanyHomeworkCell"];
+        cell.canSubmit = NO;
+        cell.showSubmitButton = self.canModify;
+        MJWeakSelf;
+        [cell configWithAttachmentArray:self.fileArray canDisplaySubmitView:canDisplay isExpired:isExpired callback:^(HOMEWORKACTION action, NSInteger viewIndex) {
+            [weakSelf operationActionWithType:action index:viewIndex];
+        }];
+        
+        return cell;
+    }
+    else {
+        AccompanyRemarkCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AccompanyRemarkCell"];
+        BOOL hasEvaluate = self.homeworkModel.reviewHomework == 1? YES : NO;
+        [cell configWithRemarkMessage:self.homeworkModel.teacherReplied hasEvaluate:hasEvaluate];
+        return cell;
+    }
+}
+
+- (void)chatAction {
+    if (self.homeworkModel && ![NSString isEmptyString:self.homeworkModel.imUserId]) {
+        TUIChatConversationModel *model = [[TUIChatConversationModel alloc] init];
+        model.userID = self.homeworkModel.imUserId;
+        KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+        ctrl.conversation = model;
+        [self.navigationController pushViewController:ctrl animated:YES];
+    }
+}
+
+// 课程评价
+- (void)evaluateCourse {
+    
+    if (![self.homeworkModel.courseStatus isEqualToString:@"COMPLETE"]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"课程结束之后才可以评价哦~"];
+        return;
+    }
+    self.alertView = [AccompanyAlertView shareInstance];
+    self.alertView.alertTitle.text = @"课程评价";
+    self.alertView.tipsLabel.text = @"请输入您对本次课程的评价~";
+    self.alertView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
+    [self.alertView showInView:[UIApplication sharedApplication].keyWindow showStarView:YES];
+    MJWeakSelf;
+    [self.alertView sureCallback:^(NSString * _Nonnull content, NSInteger starNum) {
+        [weakSelf evaluateAction:content starNum:starNum];
+    }];
+}
+
+- (void)evaluateAction:(NSString *)content starNum:(NSInteger)starNum {
+    if ([NSString isEmptyString:content]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入评价内容"];
+        return;
+    }
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager accompanyCourseRepliedRequest:KS_POST courseScheduleId:self.courseId courseGroupId:self.courseGroupId studentReplied:content score:starNum success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:@"评价成功"];
+            [self requestCourseInfoMessage];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+- (void)operationActionWithType:(HOMEWORKACTION)action index:(NSInteger)viewIndex {
+    switch (action) {
+        case HOMEWORKACTION_PLAY:
+        {
+            [self playVideoIndex:viewIndex];
+        }
+            break;
+        case HOMEWORKACTION_DELETE:
+        {
+            [self deleteVideoIndex:viewIndex];
+        }
+            break;
+        case HOMEWORKACTION_ADD: // 选择视频作业
+        {
+            // 调用相册
+            self.mediaManager = [[KSMediaManager alloc] init];
+            self.mediaManager.mediaType = MEDIATYPE_VIDEO;
+            self.mediaManager.maxPhotoNumber = 1;
+            self.mediaManager.baseCtrl = self;
+            self.mediaManager.needCropImage = NO;
+            MJWeakSelf;
+            [self.mediaManager noAlertCallback:^(NSString * _Nullable videoUrl, NSMutableArray * _Nullable imageArray, NSMutableArray * _Nullable imageAsset) {
+                NSLog(@"%@", videoUrl);
+                // 上传视频
+                [weakSelf uploadVideoWithUrl:videoUrl];
+            }];
+            [self.mediaManager pushImagePickerController];
+        }
+        case HOMEWORKACTION_HOMEWOEKPAGE:
+        {
+            HomeworkDetailViewController *detalVC = [[HomeworkDetailViewController alloc] init];
+            detalVC.courseId = self.courseId;
+            MJWeakSelf;
+            [detalVC backRefreshAction:^{
+                [weakSelf requestCourseInfoMessage];
+            }];
+            [self.navigationController pushViewController:detalVC animated:YES];
+        }
+        default:
+            break;
+    }
+}
+
+#pragma mark --- 上传视频文件
+- (void)uploadVideoWithUrl:(NSString *)videoUrl {
+    [self hudTipWillShow:YES];
+    
+    NSURL *uploadFileUrl = [NSURL fileURLWithPath:videoUrl];
+    NSData *fileData = [NSData dataWithContentsOfURL:uploadFileUrl];
+    NSString *suffix = [NSString stringWithFormat:@".%@",[uploadFileUrl pathExtension]];
+    [UPLOAD_MANAGER configWithfilePath:@"homework"];
+    [UPLOAD_MANAGER videoUpload:fileData fileName:@"video" fileSuffix:suffix progress:^(int64_t bytesWritten, int64_t totalBytes) {
+        dispatch_main_async_safe(^{
+            // 显示进度
+            if (self.HUD) {
+                self.HUD.progress = bytesWritten / totalBytes;// progress是回调进度
+            }
+        });
+    } successCallback:^(NSMutableArray * _Nonnull fileUrlArray) {
+        [self hudTipWillShow:NO];
+        NSString *fileUrl = [fileUrlArray lastObject];
+        self.isModify = YES;
+        // 删除文件
+        [self removeVideoWithPath:videoUrl];
+        [self.fileArray addObject:fileUrl];
+        [self.tableView reloadData];
+    } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
+        [self hudTipWillShow:NO];
+        if (![NSString isEmptyString:descMessaeg]) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:descMessaeg];
+        }
+    }];
+}
+
+- (void)removeVideoWithPath:(NSString *)videoUrl {
+    NSFileManager *fileMamager = [NSFileManager defaultManager];
+    if ([fileMamager fileExistsAtPath:videoUrl]) {
+        [fileMamager removeItemAtPath:videoUrl error:nil];
+    }
+}
+
+// 播放
+- (void)playVideoIndex:(NSInteger)index {
+    if (self.fileArray.count > index) {
+        NSString *fileUrl = self.fileArray[index];
+        [self playVideoWithUrl:fileUrl];
+    }
+}
+// 删除
+- (void)deleteVideoIndex:(NSInteger)index {
+    if (self.fileArray.count > index) {
+        [self.fileArray removeObjectAtIndex:index];
+        [self.tableView reloadData];
+    }
+    self.isModify = YES;
+}
+
+#pragma mark ------ WMPlayer
+- (void)playVideoWithUrl:(NSString *)fileUrl {
+    fileUrl = [fileUrl getUrlEndcodeString];
+    _playerFrame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+    _wmPlayer = [[WMPlayer alloc] initWithFrame:_playerFrame];
+    WMPlayerModel *playModel = [[WMPlayerModel alloc] init];
+    playModel.videoURL = [NSURL URLWithString:fileUrl];
+    _wmPlayer.playerModel = playModel;
+    _wmPlayer.delegate = self;
+    _bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
+    _bgView.backgroundColor = [UIColor blackColor];
+    [[UIApplication sharedApplication].keyWindow addSubview:_bgView];
+    [[UIApplication sharedApplication].keyWindow addSubview:_wmPlayer];
+    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:_wmPlayer];
+    
+    [_wmPlayer play];
+}
+
+- (void)wmplayer:(WMPlayer *)wmplayer clickedCloseButton:(UIButton *)backBtn {
+    [wmplayer removePlayer];
+    [_bgView removeFromSuperview];
+    [self setNeedsStatusBarAppearanceUpdate];
+}
+
+- (void)wmplayer:(WMPlayer *)wmplayer clickedFullScreenButton:(UIButton *)fullScreenBtn {
+    self.isRatation = !self.isRatation;
+    
+    if (self.isRatation) {
+        [wmplayer removeFromSuperview];
+        [UIView animateWithDuration:1.0f animations:^{
+            wmplayer.transform = CGAffineTransformMakeRotation(M_PI_2);
+            
+        } completion:^(BOOL finished) {
+            wmplayer.frame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+            [[UIApplication sharedApplication].keyWindow addSubview:wmplayer];
+            [[UIApplication sharedApplication].keyWindow bringSubviewToFront:wmplayer];
+        }];
+    }
+    else {
+        [wmplayer removeFromSuperview];
+        
+        [UIView animateWithDuration:1.0f animations:^{
+            //        复原
+            wmplayer.transform = CGAffineTransformIdentity;
+            
+        } completion:^(BOOL finished) {
+            wmplayer.frame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+            [[UIApplication sharedApplication].keyWindow addSubview:wmplayer];
+            [[UIApplication sharedApplication].keyWindow bringSubviewToFront:wmplayer];
+        }];
+    }
+}
+
+- (void)bottomButtonAction {
+    // 判断
+    if ([self.homeworkModel.courseStatus isEqualToString:@"COMPLETE"]) { // 判断是否能提交作业
+        if (self.fileArray.count == 0 || self.homeworkModel.reviewHomework == 1 || self.homeworkModel.decorateHomework == 0) {
+            return;
+        }
+        else { // 提交作业
+            [self submitHomeworkAction];
+        }
+    }
+}
+
+- (void)submitHomeworkAction {
+    if (self.homeworkModel.homeworkExpire == 1) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"作业已过期无法提交和查看!"];
+        return;
+    }
+    if (self.isModify == NO) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请先选择视频文件"];
+        return;
+    }
+    if (self.fileArray.count == 0) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请选择作业视频"];
+        return;
+    }
+    NSString *attachment = [self.fileArray componentsJoinedByString:@","];
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager homeSubmitAction:KS_POST courseScheduleId:self.courseId attachment:attachment success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:@"作业提交成功"];
+            [self requestCourseInfoMessage];
+            self.isModify = NO;
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+#pragma mark --- lazying
+
+- (OnlineClassManager *)classManager {
+    if (!_classManager) {
+        _classManager = [[OnlineClassManager alloc] init];
+    }
+    return _classManager;
+}
+
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.backgroundColor = [UIColor clearColor];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        _tableView.showsHorizontalScrollIndicator = NO;
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.rowHeight = UITableViewAutomaticDimension;
+        _tableView.estimatedRowHeight = 136.0f;
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyCourseInfoCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyCourseInfoCell"];
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyEvaluateCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyEvaluateCell"];
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyStudentEvaCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyStudentEvaCell"];
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyArrangeCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyArrangeCell"];
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyHomeworkCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyHomeworkCell"];
+        [_tableView registerNib:[UINib nibWithNibName:@"AccompanyRemarkCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AccompanyRemarkCell"];
+    }
+    return _tableView;
+}
+
+- (void)hudTipWillShow:(BOOL)willShow{
+    if (willShow) {
+        [self resignFirstResponder];
+        UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
+        if (!_HUD) {
+            _HUD = [MBProgressHUD showHUDAddedTo:keyWindow animated:YES];
+            _HUD.removeFromSuperViewOnHide = YES;
+            _HUD.mode = MBProgressHUDModeDeterminateHorizontalBar;
+            _HUD.label.text = @"正在上传视频文件...";
+            _HUD.contentColor = [UIColor whiteColor];
+            _HUD.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
+            _HUD.bezelView.backgroundColor = HexRGBAlpha(0x000000, 0.8);
+        }else{
+            _HUD.progress = 0;
+            [keyWindow addSubview:_HUD];
+            [_HUD showAnimated:YES];
+        }
+    }else{
+        [_HUD hideAnimated:YES];
+    }
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 102 - 118
KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj


+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/AFNetworking.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Bugly.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/CHIPageControl.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JCore.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JPush.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXCategoryView.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXPagingView.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MBProgressHUD.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJExtension.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJRefresh.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Masonry.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent-KulexiuForStudentUITests.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudentTests.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/RSKImageCropper.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Reachability.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SDWebImage.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SSZipArchive.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SocketRocket.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard-Whiteboard.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/YYModel.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1500"
+   LastUpgradeVersion = "1610"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác