浏览代码

小组课列表

Steven 2 月之前
父节点
当前提交
f7870d1a58
共有 46 个文件被更改,包括 2333 次插入81 次删除
  1. 92 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/Contents.json
  3. 二进制
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/tool_myGroupCourse@2x.png
  4. 二进制
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/tool_myGroupCourse@3x.png
  5. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/Contents.json
  6. 二进制
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/mine_info_create_groupCourse@2x.png
  7. 二进制
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/mine_info_create_groupCourse@3x.png
  8. 6 4
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  9. 8 4
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  10. 19 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Controller/MyCourseViewController.m
  11. 2 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Model/LiveLessonModel.h
  12. 7 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Model/LiveLessonModel.m
  13. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/CourseGroupAlertView/CourseDescAlertView.h
  14. 0 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/CourseGroupAlertView/CourseDescAlertView.m
  15. 19 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.h
  16. 96 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.m
  17. 209 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.xib
  18. 18 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupView.h
  19. 368 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupView.m
  20. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/LiveCourseGroup/MyLiveCourseGroupView.m
  21. 4 11
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m
  22. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/Controller/MyGroupCourseViewController.h
  23. 174 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/Controller/MyGroupCourseViewController.m
  24. 18 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/View/MyGroupCourseBodyView.h
  25. 366 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/View/MyGroupCourseBodyView.m
  26. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Controller/MyLiveCourseViewController.m
  27. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Model/LiveCourseModel.h
  28. 7 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Model/LiveCourseModel.m
  29. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/View/MyLiveCourseBodyView.m
  30. 15 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MinePageViewController.m
  31. 18 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseBodyView.h
  32. 382 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseBodyView.m
  33. 28 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.h
  34. 138 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.m
  35. 240 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.xib
  36. 7 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.m
  37. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.xib
  38. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.m
  39. 1 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MineLiveCourseGroupCell.m
  40. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MinePageLiveCourseView.m
  41. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageTipsView/MineCourseSettingView.h
  42. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageTipsView/MineCourseSettingView.m
  43. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineActionView.h
  44. 0 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineHeadView.m
  45. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineTeachToolView.m
  46. 5 36
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/TenantMineHeadView.m

+ 92 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -910,6 +910,14 @@
 		BCA724052806AFF100DA0D0D /* AccompanyCourseInfoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA724032806AFF100DA0D0D /* AccompanyCourseInfoCell.xib */; };
 		BCA7C34328476533009D20EC /* KSBoardAddStaffView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA7C34028476532009D20EC /* KSBoardAddStaffView.m */; };
 		BCA7C34428476533009D20EC /* KSBoardAddStaffView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA7C34228476532009D20EC /* KSBoardAddStaffView.xib */; };
+		BCA9A5B52D18F73800C7CC9D /* MineGroupCourseBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5B42D18F73800C7CC9D /* MineGroupCourseBodyView.m */; };
+		BCA9A5B92D18F84E00C7CC9D /* MineGroupCourseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5B72D18F84E00C7CC9D /* MineGroupCourseCell.m */; };
+		BCA9A5BA2D18F84E00C7CC9D /* MineGroupCourseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9A5B82D18F84E00C7CC9D /* MineGroupCourseCell.xib */; };
+		BCA9A5C12D1907E600C7CC9D /* MyGroupCourseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5C02D1907E600C7CC9D /* MyGroupCourseViewController.m */; };
+		BCA9A5C42D19083200C7CC9D /* MyGroupCourseBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5C32D19083200C7CC9D /* MyGroupCourseBodyView.m */; };
+		BCA9A5C82D190E5F00C7CC9D /* MyGroupCourseGroupView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5C72D190E5F00C7CC9D /* MyGroupCourseGroupView.m */; };
+		BCA9A5CC2D1910D200C7CC9D /* MyGroupCourseGroupListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9A5CA2D1910D200C7CC9D /* MyGroupCourseGroupListCell.m */; };
+		BCA9A5CD2D1910D200C7CC9D /* MyGroupCourseGroupListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9A5CB2D1910D200C7CC9D /* MyGroupCourseGroupListCell.xib */; };
 		BCA9AC442CED91F200047BFA /* MyLiveCourseGroupListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9AC422CED91F200047BFA /* MyLiveCourseGroupListCell.m */; };
 		BCA9AC452CED91F200047BFA /* MyLiveCourseGroupListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9AC432CED91F200047BFA /* MyLiveCourseGroupListCell.xib */; };
 		BCA9AC492CED921100047BFA /* MyVideoGroupListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9AC482CED921100047BFA /* MyVideoGroupListCell.xib */; };
@@ -2741,6 +2749,20 @@
 		BCA7C34028476532009D20EC /* KSBoardAddStaffView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSBoardAddStaffView.m; sourceTree = "<group>"; };
 		BCA7C34128476532009D20EC /* KSBoardAddStaffView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSBoardAddStaffView.h; sourceTree = "<group>"; };
 		BCA7C34228476532009D20EC /* KSBoardAddStaffView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSBoardAddStaffView.xib; sourceTree = "<group>"; };
+		BCA9A5B32D18F73800C7CC9D /* MineGroupCourseBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineGroupCourseBodyView.h; sourceTree = "<group>"; };
+		BCA9A5B42D18F73800C7CC9D /* MineGroupCourseBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineGroupCourseBodyView.m; sourceTree = "<group>"; };
+		BCA9A5B62D18F84E00C7CC9D /* MineGroupCourseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineGroupCourseCell.h; sourceTree = "<group>"; };
+		BCA9A5B72D18F84E00C7CC9D /* MineGroupCourseCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineGroupCourseCell.m; sourceTree = "<group>"; };
+		BCA9A5B82D18F84E00C7CC9D /* MineGroupCourseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineGroupCourseCell.xib; sourceTree = "<group>"; };
+		BCA9A5BF2D1907E600C7CC9D /* MyGroupCourseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyGroupCourseViewController.h; sourceTree = "<group>"; };
+		BCA9A5C02D1907E600C7CC9D /* MyGroupCourseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyGroupCourseViewController.m; sourceTree = "<group>"; };
+		BCA9A5C22D19083200C7CC9D /* MyGroupCourseBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyGroupCourseBodyView.h; sourceTree = "<group>"; };
+		BCA9A5C32D19083200C7CC9D /* MyGroupCourseBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyGroupCourseBodyView.m; sourceTree = "<group>"; };
+		BCA9A5C62D190E5F00C7CC9D /* MyGroupCourseGroupView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyGroupCourseGroupView.h; sourceTree = "<group>"; };
+		BCA9A5C72D190E5F00C7CC9D /* MyGroupCourseGroupView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyGroupCourseGroupView.m; sourceTree = "<group>"; };
+		BCA9A5C92D1910D200C7CC9D /* MyGroupCourseGroupListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyGroupCourseGroupListCell.h; sourceTree = "<group>"; };
+		BCA9A5CA2D1910D200C7CC9D /* MyGroupCourseGroupListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyGroupCourseGroupListCell.m; sourceTree = "<group>"; };
+		BCA9A5CB2D1910D200C7CC9D /* MyGroupCourseGroupListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyGroupCourseGroupListCell.xib; sourceTree = "<group>"; };
 		BCA9AC412CED91F200047BFA /* MyLiveCourseGroupListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLiveCourseGroupListCell.h; sourceTree = "<group>"; };
 		BCA9AC422CED91F200047BFA /* MyLiveCourseGroupListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLiveCourseGroupListCell.m; sourceTree = "<group>"; };
 		BCA9AC432CED91F200047BFA /* MyLiveCourseGroupListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyLiveCourseGroupListCell.xib; sourceTree = "<group>"; };
@@ -3501,6 +3523,7 @@
 				BC4766252CE72ED8002574E5 /* VIPProgramCreate */,
 				BC433E5D2CE6F7D8002870EC /* VipCourse */,
 				BC4766192CE72150002574E5 /* AccompanyCourse */,
+				BCA9A5B22D18F67500C7CC9D /* GroupCourse */,
 				BCAF36F12CEAE54E009434AD /* MinePageLiveCourse */,
 				BCAF36F52CEAE5CD009434AD /* MineVideoCourse */,
 				BC2B716A2CEB133800A90AFF /* MineMusic */,
@@ -4027,6 +4050,7 @@
 				BC7CFFBF2817F1EE00CAEB21 /* BankCard */,
 				BC5EB5AC2804016200B4A3B0 /* CreateStyle */,
 				BCA9CE1827FD5EBF00D558C6 /* LiveCourse */,
+				BCA9A5BE2D1907CB00C7CC9D /* CroupCourse */,
 				275FA55927F31A7400EB6240 /* MinePage */,
 				27FC2F6727F1BE3600FCC239 /* VideoCourse */,
 				27F9030327E86CAE00C08A19 /* DeviceCheck */,
@@ -4699,6 +4723,7 @@
 				BCD160492CED7F1A00A78B43 /* MyCourseSortView */,
 				BCD1604F2CED83D400A78B43 /* VIPCourseGroup */,
 				BCD160502CED83EB00A78B43 /* AccompanyCourseGroup */,
+				BCA9A5C52D190E3300C7CC9D /* GroupCourseGroup */,
 				BCD160512CED83FD00A78B43 /* LiveCourseGroup */,
 				BCD160522CED841000A78B43 /* VideoCourseGroup */,
 				BCD160542CED844000A78B43 /* MusicRoomCourseGroup */,
@@ -6996,6 +7021,65 @@
 			path = BanList;
 			sourceTree = "<group>";
 		};
+		BCA9A5B22D18F67500C7CC9D /* GroupCourse */ = {
+			isa = PBXGroup;
+			children = (
+				BCA9A5B32D18F73800C7CC9D /* MineGroupCourseBodyView.h */,
+				BCA9A5B42D18F73800C7CC9D /* MineGroupCourseBodyView.m */,
+				BCA9A5B62D18F84E00C7CC9D /* MineGroupCourseCell.h */,
+				BCA9A5B72D18F84E00C7CC9D /* MineGroupCourseCell.m */,
+				BCA9A5B82D18F84E00C7CC9D /* MineGroupCourseCell.xib */,
+			);
+			path = GroupCourse;
+			sourceTree = "<group>";
+		};
+		BCA9A5BB2D1907CB00C7CC9D /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BCA9A5BF2D1907E600C7CC9D /* MyGroupCourseViewController.h */,
+				BCA9A5C02D1907E600C7CC9D /* MyGroupCourseViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BCA9A5BC2D1907CB00C7CC9D /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BCA9A5BD2D1907CB00C7CC9D /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BCA9A5C22D19083200C7CC9D /* MyGroupCourseBodyView.h */,
+				BCA9A5C32D19083200C7CC9D /* MyGroupCourseBodyView.m */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BCA9A5BE2D1907CB00C7CC9D /* CroupCourse */ = {
+			isa = PBXGroup;
+			children = (
+				BCA9A5BB2D1907CB00C7CC9D /* Controller */,
+				BCA9A5BC2D1907CB00C7CC9D /* Model */,
+				BCA9A5BD2D1907CB00C7CC9D /* View */,
+			);
+			path = CroupCourse;
+			sourceTree = "<group>";
+		};
+		BCA9A5C52D190E3300C7CC9D /* GroupCourseGroup */ = {
+			isa = PBXGroup;
+			children = (
+				BCA9A5C62D190E5F00C7CC9D /* MyGroupCourseGroupView.h */,
+				BCA9A5C72D190E5F00C7CC9D /* MyGroupCourseGroupView.m */,
+				BCA9A5C92D1910D200C7CC9D /* MyGroupCourseGroupListCell.h */,
+				BCA9A5CA2D1910D200C7CC9D /* MyGroupCourseGroupListCell.m */,
+				BCA9A5CB2D1910D200C7CC9D /* MyGroupCourseGroupListCell.xib */,
+			);
+			path = GroupCourseGroup;
+			sourceTree = "<group>";
+		};
 		BCA9CE1827FD5EBF00D558C6 /* LiveCourse */ = {
 			isa = PBXGroup;
 			children = (
@@ -8335,6 +8419,7 @@
 				BC31BFA52B219C5700F7D538 /* WidgetBottomButtonView.xib in Resources */,
 				BC71D2012887FDD40010F14B /* img_18.png in Resources */,
 				BC106BA62A8F45AA000759A9 /* TXLiveDownSeatView.xib in Resources */,
+				BCA9A5BA2D18F84E00C7CC9D /* MineGroupCourseCell.xib in Resources */,
 				BC1263A528FF98BB00509E90 /* HomeNewMusicView.xib in Resources */,
 				BCE6A08727F81B4D00C97704 /* MinePageSubmitView.xib in Resources */,
 				BC71DF0D2A89F470003F165E /* NewTXMetronomeAlertView.xib in Resources */,
@@ -8417,6 +8502,7 @@
 				BC86CB192AC2E72500450EED /* KSNewConfirmAlertView.xib in Resources */,
 				BCECE21E2B3D5F0800C0D555 /* FeedbackListNavView.xib in Resources */,
 				BC9070A928C71C8E00237958 /* MyCreateGroupHeadView.xib in Resources */,
+				BCA9A5CD2D1910D200C7CC9D /* MyGroupCourseGroupListCell.xib in Resources */,
 				BCC583F828A9FA8100BAB4CF /* cloud_animation_23.png in Resources */,
 				BC31BF9E2B219C5700F7D538 /* WidgetNavView.xib in Resources */,
 				BC71DF042A89F470003F165E /* TXFullVideoCell.xib in Resources */,
@@ -8564,6 +8650,7 @@
 				BC106B822A8F4586000759A9 /* TXLiveMessageUserQuit.m in Sources */,
 				BC4766242CE72EBA002574E5 /* MineVipProgramViewController.m in Sources */,
 				BC0A22A6284751F80065C1AB /* DownloadStatusCell.m in Sources */,
+				BCA9A5C42D19083200C7CC9D /* MyGroupCourseBodyView.m in Sources */,
 				2779326F27E30FD80010E277 /* FSCalendarHeaderView.m in Sources */,
 				275E3DF727F467ED0010EC30 /* LiveRoomLikeLayer.m in Sources */,
 				BC7003232CE74F52008D041E /* ProgramAddButton.m in Sources */,
@@ -8764,6 +8851,7 @@
 				277935E227E327F00010E277 /* KSTabBarViewController.m in Sources */,
 				BC106B322A8F4541000759A9 /* TXLiveMessageModel.m in Sources */,
 				BC31BF8E2B219C5700F7D538 /* TuningNavView.m in Sources */,
+				BCA9A5CC2D1910D200C7CC9D /* MyGroupCourseGroupListCell.m in Sources */,
 				BC71D293288811BF0010F14B /* AnimationHelper.m in Sources */,
 				BC60E3C0287D447F00B05441 /* DeleteAccountBodyView.m in Sources */,
 				BCD160662CED84B000A78B43 /* MyMusicRoomCourseGroupView.m in Sources */,
@@ -8954,6 +9042,7 @@
 				BC71DEFD2A89F470003F165E /* TXClassroomMainContainer.m in Sources */,
 				BC3ACD972890D61400060E97 /* NoRecordViewController.m in Sources */,
 				BC38C4862AFA1F4B00ABFCC2 /* MineWorksBottomView.m in Sources */,
+				BCA9A5B92D18F84E00C7CC9D /* MineGroupCourseCell.m in Sources */,
 				BC4BCE7A2823AB6500522C8B /* KSAddressPickerView.m in Sources */,
 				BCC9F42727F69BD200647449 /* KSWhiteboardControl.m in Sources */,
 				BC000D8A2A848468006C5A89 /* KSChatConversationViewController.m in Sources */,
@@ -8995,6 +9084,7 @@
 				27F9CB0027EC3D42003E0FE4 /* GroupListViewCell.m in Sources */,
 				BC8B6DC028532DB800866917 /* MusicShareModel.m in Sources */,
 				2780C91C27E48A0700A95A4F /* PasswordLoginController.m in Sources */,
+				BCA9A5C82D190E5F00C7CC9D /* MyGroupCourseGroupView.m in Sources */,
 				BC0A22A7284751F80065C1AB /* AccompanyProgressView.m in Sources */,
 				BC000D9B2A84E49E006C5A89 /* KSTXBaseChatViewController.m in Sources */,
 				BC71DEF82A89F470003F165E /* TxClassroomChatMineCell.m in Sources */,
@@ -9048,6 +9138,7 @@
 				275E3DEC27F467B20010EC30 /* LiveRoomBottomView.m in Sources */,
 				2780A06427E81E4900447CFD /* MineNavView.m in Sources */,
 				2779326E27E30FD80010E277 /* FSCalendarCalculator.m in Sources */,
+				BCA9A5C12D1907E600C7CC9D /* MyGroupCourseViewController.m in Sources */,
 				BC9AA0C82ABC3C7B00CD954D /* KSPhotoChooseView.m in Sources */,
 				BCDF821F2A8A2F36005F8B82 /* KSSliderView.m in Sources */,
 				BC2B71702CEB158400A90AFF /* MinePageMusicSortView.m in Sources */,
@@ -9214,6 +9305,7 @@
 				BC47661F2CE727FC002574E5 /* MineEmptyIntroduceView.m in Sources */,
 				BCFB9B892CE4883100B66BC0 /* VipCouseDetailViewController.m in Sources */,
 				BCB399AC27F946A200AFF376 /* CourseNavView.m in Sources */,
+				BCA9A5B52D18F73800C7CC9D /* MineGroupCourseBodyView.m in Sources */,
 				BCE06F2B2818146700234817 /* KSConfirmAlertView.m in Sources */,
 				275B16FA27EB08230081FDEF /* CreateFansGroupViewController.m in Sources */,
 				27F9030227E864AE00C08A19 /* KSNetworkAlert.m in Sources */,

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/Contents.json

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

二进制
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/tool_myGroupCourse@2x.png


二进制
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_myGroupCourse.imageset/tool_myGroupCourse@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/Contents.json

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

二进制
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/mine_info_create_groupCourse@2x.png


二进制
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_info_create_groupCourse.imageset/mine_info_create_groupCourse@3x.png


+ 6 - 4
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -763,17 +763,18 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)destroyLiveRoomRequest:(NSString *)get roomUid:(NSString *)roomUid success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
-// 直播课程组查询
+// 直播/小组课程组查询
 // /api-teacher/courseGroup/queryPageCourseGroup
 
 /// 直播课程组查询
 /// @param post post
+/// @param courseType 课程类型
 /// @param groupStatus 课程组状态 ING(进行中) NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)
 /// @param page 页数
 /// @param rows 条数
 /// @param success 成功
 /// @param faliure 失败
-+ (void)LiveCourseGroupRequest:(NSString *)post groupStatus:(NSString *)groupStatus page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
++ (void)LiveOrGroupCourseGroupRequest:(NSString *)post courseType:(NSString *)courseType groupStatus:(NSString *)groupStatus page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 #pragma mark ----- 课程查询
 // /api-teacher/courseSchedule/queryTeacherPracticeCourse
@@ -790,8 +791,9 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 // /api-teacher/courseSchedule/queryTeacherLiveCourse
-/// 我的课程-直播课
+/// 我的课程-直播课\小组课
 /// @param post post
+/// @param courseType 课程类型 LIVE 、 GROUP
 /// @param classDate 月份 yyyy-MM
 /// @param status 课程状态(NOT_START:未开始 ING:进行中 COMPLETE:已完成 CANCEL:已取消)
 /// @param subjectId 声部id
@@ -800,7 +802,7 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param rows 条数
 /// @param success 成功
 /// @param faliure 失败
-+ (void)queryTeacherLiveCourse:(NSString *)post classDate:(NSString *)classDate status:(NSString *)status subjectId:(NSString *)subjectId search:(NSString *)search page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
++ (void)queryTeacherLiveCourse:(NSString *)post courseType:(NSString *)courseType classDate:(NSString *)classDate status:(NSString *)status subjectId:(NSString *)subjectId search:(NSString *)search page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 #pragma mark ----- 琴房课
 // /teacher-server/courseSchedule/selectCourseList

+ 8 - 4
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -1539,20 +1539,22 @@
     [self request:get andWithUrl:url and:parm success:success faliure:faliure];
 }
 
-// 直播课程组查询
+// 直播/小组课程组查询
 // /api-teacher/courseGroup/queryPageCourseGroup
 
 /// 直播课程组查询
 /// @param post post
+/// @param courseType 课程类型
 /// @param groupStatus 课程组状态 ING(进行中) NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)
 /// @param page 页数
 /// @param rows 条数
 /// @param success 成功
 /// @param faliure 失败
-+ (void)LiveCourseGroupRequest:(NSString *)post groupStatus:(NSString *)groupStatus page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
++ (void)LiveOrGroupCourseGroupRequest:(NSString *)post courseType:(NSString *)courseType groupStatus:(NSString *)groupStatus page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     [self configRequestMethodJSON];
     NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/courseGroup/queryPageCourseGroup"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:courseType forKey:@"courseType"];
     [parm setValue:groupStatus forKey:@"groupStatus"];
     [parm setValue:@(page) forKey:@"page"];
     [parm setValue:@(rows) forKey:@"rows"];
@@ -1586,8 +1588,9 @@
 
 
 // /api-teacher/courseSchedule/queryTeacherLiveCourse
-/// 我的课程-直播课
+/// 我的课程-直播课\小组课
 /// @param post post
+/// @param courseType 课程类型 LIVE 、 GROUP
 /// @param classDate 月份 yyyy-MM
 /// @param status 课程状态(NOT_START:未开始 ING:进行中 COMPLETE:已完成 CANCEL:已取消)
 /// @param subjectId 声部id
@@ -1596,10 +1599,11 @@
 /// @param rows 条数
 /// @param success 成功
 /// @param faliure 失败
-+ (void)queryTeacherLiveCourse:(NSString *)post classDate:(NSString *)classDate status:(NSString *)status subjectId:(NSString *)subjectId search:(NSString *)search page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
++ (void)queryTeacherLiveCourse:(NSString *)post courseType:(NSString *)courseType classDate:(NSString *)classDate status:(NSString *)status subjectId:(NSString *)subjectId search:(NSString *)search page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     [self configRequestMethodJSON];
     NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/courseSchedule/queryTeacherLiveCourse"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:courseType forKey:@"courseType"];
     [parm setValue:classDate forKey:@"classDate"];
     [parm setValue:status forKey:@"status"];
     [parm setValue:subjectId forKey:@"subjectId"];

+ 19 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Controller/MyCourseViewController.m

@@ -15,6 +15,7 @@
 
 #import "MyVipCourseGroupView.h"
 #import "MyAccompanyCourseGroupView.h"
+#import "MyGroupCourseGroupView.h"
 #import "MyLiveCourseGroupView.h"
 #import "MyVideoCourseGroupView.h"
 #import "MyMusicRoomCourseGroupView.h"
@@ -71,7 +72,7 @@
         make.height.mas_equalTo(navHeight);
     }];
     
-    self.titles = @[@"VIP定制课", @"趣纠课", @"直播课",@"视频课",@"琴房课"];
+    self.titles = @[@"VIP定制课", @"趣纠课", @"小组课", @"直播课",@"视频课",@"琴房课"];
     [self configCategoryView:navHeight];
 }
 
@@ -159,6 +160,10 @@
             MyAccompanyCourseGroupView *pageView = (MyAccompanyCourseGroupView *)view;
             pageView.subjectList = [self.subjectList mutableCopy];
         }
+        else if ([view isKindOfClass:[MyGroupCourseGroupView class]]) {
+            MyGroupCourseGroupView *pageView = (MyGroupCourseGroupView *)view;
+            pageView.subjectList = [self.subjectList mutableCopy];
+        }
         else if ([view isKindOfClass:[MyLiveCourseGroupView class]]) {
             MyLiveCourseGroupView *pageView = (MyLiveCourseGroupView *)view;
             pageView.subjectList = [self.subjectList mutableCopy];
@@ -231,7 +236,7 @@
         return listView;
     }
     else if (index == 2) {
-        MyLiveCourseGroupView *listView = [[MyLiveCourseGroupView alloc] init];
+        MyGroupCourseGroupView *listView = [[MyGroupCourseGroupView alloc] init];
         listView.naviController = self.navigationController;
         [self.listViewArray replaceObjectAtIndex:index withObject:listView];
         self.listViewArray[index] = listView;
@@ -243,6 +248,18 @@
         return listView;
     }
     else if (index == 3) {
+        MyLiveCourseGroupView *listView = [[MyLiveCourseGroupView alloc] init];
+        listView.naviController = self.navigationController;
+        [self.listViewArray replaceObjectAtIndex:index withObject:listView];
+        self.listViewArray[index] = listView;
+        listView.selectIndex = index;
+        if (self.subjectList) {
+            listView.subjectList = [self.subjectList mutableCopy];
+        }
+        [listView beginFirstRefresh];
+        return listView;
+    }
+    else if (index == 4) {
         MyVideoCourseGroupView *listView = [[MyVideoCourseGroupView alloc] init];
         listView.naviController = self.navigationController;
         [self.listViewArray replaceObjectAtIndex:index withObject:listView];

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Model/LiveLessonModel.h

@@ -29,6 +29,8 @@
 @property (nonatomic, assign) NSInteger courseNum;
 @property (nonatomic, assign) NSInteger completeCourseNum;
 
+@property (nonatomic, assign) NSInteger maxStudentNum;
+
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;
 - (NSDictionary *)dictionaryRepresentation;

+ 7 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/Model/LiveLessonModel.m

@@ -24,6 +24,7 @@ NSString *const kLiveLessonModelUserId = @"userId";
 NSString *const kLiveLessonModelCourseIntroduce = @"courseIntroduce";
 NSString *const kLiveLessonModelCourseNum = @"courseNum";
 NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
+NSString *const kLiveLessonModelMaxStudentNum = @"maxStudentNum";
 
 
 @interface LiveLessonModel ()
@@ -50,6 +51,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
 @synthesize courseIntroduce = _courseIntroduce;
 @synthesize courseNum = _courseNum;
 @synthesize completeCourseNum = _completeCourseNum;
+@synthesize maxStudentNum = _maxStudentNum;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -79,6 +81,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
         self.courseIntroduce = [self objectOrNilForKey:kLiveLessonModelCourseIntroduce fromDictionary:dict];
         self.courseNum = [[self objectOrNilForKey:kLiveLessonModelCourseNum fromDictionary:dict] integerValue];
         self.completeCourseNum = [[self objectOrNilForKey:kLiveLessonModelCompleteCourseNum fromDictionary:dict] integerValue];
+        self.maxStudentNum = [[self objectOrNilForKey:kLiveLessonModelMaxStudentNum fromDictionary:dict] integerValue];
     }
     
     return self;
@@ -104,6 +107,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
     [mutableDict setValue:self.courseIntroduce forKey:kLiveLessonModelCourseIntroduce];
     [mutableDict setValue:[NSNumber numberWithInteger:self.courseNum] forKey:kLiveLessonModelCourseNum];
     [mutableDict setValue:[NSNumber numberWithInteger:self.completeCourseNum] forKey:kLiveLessonModelCompleteCourseNum];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.maxStudentNum] forKey:kLiveLessonModelMaxStudentNum];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -146,7 +150,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
     self.courseIntroduce = [aDecoder decodeObjectForKey:kLiveLessonModelCourseIntroduce];
     self.courseNum = [aDecoder decodeIntegerForKey:kLiveLessonModelCourseNum];
     self.completeCourseNum = [aDecoder decodeIntegerForKey:kLiveLessonModelCompleteCourseNum];
-    
+    self.maxStudentNum = [aDecoder decodeIntegerForKey:kLiveLessonModelMaxStudentNum];
     return self;
 }
 
@@ -169,6 +173,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
     [aCoder encodeObject:_courseIntroduce forKey:kLiveLessonModelCourseIntroduce];
     [aCoder encodeInteger:_courseNum forKey:kLiveLessonModelCourseNum];
     [aCoder encodeInteger:_completeCourseNum forKey:kLiveLessonModelCompleteCourseNum];
+    [aCoder encodeInteger:_maxStudentNum forKey:kLiveLessonModelMaxStudentNum];
     
 }
 
@@ -194,6 +199,7 @@ NSString *const kLiveLessonModelCompleteCourseNum = @"completeCourseNum";
         copy.courseIntroduce = [self.courseIntroduce copyWithZone:zone];
         copy.courseNum = self.courseNum;
         copy.completeCourseNum = self.completeCourseNum;
+        copy.maxStudentNum = self.maxStudentNum;
     }
     
     return copy;

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/CourseGroupAlertView/CourseDescAlertView.h

@@ -16,6 +16,7 @@ typedef NS_ENUM(NSInteger, SHOWTYPE) {
 typedef NS_ENUM(NSInteger, COURSE_DISPLAY_INDEX) {
     COURSE_DISPLAY_INDEX_VIP = 0,
     COURSE_DISPLAY_INDEX_ACCOMPANY,
+    COURSE_DISPLAY_INDEX_GROUP,
     COURSE_DISPLAY_INDEX_LIVE,
     COURSE_DISPLAY_INDEX_VIDEO,
     COURSE_DISPLAY_INDEX_MUSICROOM,

文件差异内容过多而无法显示
+ 0 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/CourseGroupAlertView/CourseDescAlertView.m


+ 19 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.h

@@ -0,0 +1,19 @@
+//
+//  MyGroupCourseGroupListCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "LiveLessonModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyGroupCourseGroupListCell : UICollectionViewCell
+
+- (void)configWithSource:(LiveLessonModel *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 96 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.m

@@ -0,0 +1,96 @@
+//
+//  MyGroupCourseGroupListCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MyGroupCourseGroupListCell.h"
+
+@interface MyGroupCourseGroupListCell ()
+
+@property (weak, nonatomic) IBOutlet UILabel *courseStatus;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseTime;
+
+@property (weak, nonatomic) IBOutlet UIImageView *courseCover;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseSubject;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *bookDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *finishDesc;
+
+@end
+
+@implementation MyGroupCourseGroupListCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)configWithSource:(LiveLessonModel *)model {
+    [self evaluateGroupStatus:model.status sourceModel:model];
+    // time
+    NSDateFormatter *formatter = [NSObject getDateformatter];
+    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *startDate = [formatter dateFromString:model.startTime];
+    [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
+    NSString *courseBegin = [formatter stringFromDate:startDate];
+    self.courseTime.text = [NSString returnNoNullStringWithString:courseBegin];
+    
+    [self.courseCover sd_setImageWithURL:[NSURL URLWithString:[model.backgroundPic getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    self.courseSubject.text = [NSString returnNoNullStringWithString:model.subjectName];
+    self.courseTitle.text = [NSString returnNoNullStringWithString:model.courseGroupName];
+    
+    NSString *introduce = model.courseIntroduce;
+    if (![NSString isEmptyString:introduce]) {
+        introduce = [introduce replaceAll:@"\n" WithString:@" "];
+        self.courseDesc.text = [NSString returnNoNullStringWithString:introduce];
+    }
+    else {
+        self.courseDesc.text = @"暂无介绍";
+    }
+    
+    NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:@"已上课时 " attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f weight:UIFontWeightRegular],NSForegroundColorAttributeName:HexRGB(0x999999)}];
+    NSAttributedString *finishNumAttr = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%zd", model.completeCourseNum] attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f weight:UIFontWeightSemibold],NSForegroundColorAttributeName:THEMECOLOR}];
+    [attrs appendAttributedString:finishNumAttr];
+    
+    NSAttributedString *totalDescAttr = [[NSAttributedString alloc] initWithString:@" /总课时 " attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f weight:UIFontWeightRegular],NSForegroundColorAttributeName:HexRGB(0x999999)}];
+    [attrs appendAttributedString:totalDescAttr];
+    NSAttributedString *totalNumAttr = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%zd", model.courseNum] attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f weight:UIFontWeightSemibold],NSForegroundColorAttributeName:HexRGB(0x333333)}];
+    [attrs appendAttributedString:totalNumAttr];
+    self.finishDesc.attributedText = attrs;
+}
+
+- (void)evaluateGroupStatus:(NSString *)status sourceModel:(LiveLessonModel *)model {
+    NSString *desc = [NSString stringWithFormat:@"%.0f人学习", model.studentCount];
+    if ([status isEqualToString:@"ING"]) {
+        self.courseStatus.text = @"已开课";
+        self.courseStatus.textColor = THEMECOLOR;
+    }
+    else if ([status isEqualToString:@"NOT_START"]) {
+        self.courseStatus.text = @"未开课";
+        self.courseStatus.textColor = HexRGB(0xFF802C);
+        desc = [NSString stringWithFormat:@"剩余%.0f个名额", model.maxStudentNum - model.studentCount];
+    }
+    else if ([status isEqualToString:@"COMPLETE"]) {
+        self.courseStatus.text = @"已结课";
+        self.courseStatus.textColor = HexRGB(0x999999);
+    }
+    else if ([status isEqualToString:@"CANCEL"]) {
+        self.courseStatus.text = @"已取消";
+        self.courseStatus.textColor = HexRGB(0x999999);
+        desc = [NSString stringWithFormat:@"剩余%.0f个名额", model.maxStudentNum - model.studentCount];
+    }
+    
+    self.bookDesc.text = desc;
+
+}
+
+@end

+ 209 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupListCell.xib

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" 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="23506"/>
+        <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"/>
+        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="MyGroupCourseGroupListCell">
+            <rect key="frame" x="0.0" y="0.0" width="341" height="337"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="341" height="337"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kvV-11-cNR">
+                        <rect key="frame" x="0.0" y="0.0" width="341" height="337"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" image="mine_page_live_tag" translatesAutoresizingMaskIntoConstraints="NO" id="YcV-KQ-NN1">
+                                <rect key="frame" x="12" y="15" width="20" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="6GP-g9-c8Y"/>
+                                    <constraint firstAttribute="width" constant="20" id="v67-7a-KSg"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UXV-0a-AxL">
+                                <rect key="frame" x="329" y="13" width="0.0" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="KY6-0x-lu6"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                                <color key="textColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="video_placeholder" translatesAutoresizingMaskIntoConstraints="NO" id="yLE-tf-4WZ">
+                                <rect key="frame" x="12" y="46.000000000000014" width="317" height="178.33333333333337"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" secondItem="yLE-tf-4WZ" secondAttribute="height" multiplier="16:9" id="phD-MJ-HSk"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="6"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hRG-2p-YAL">
+                                <rect key="frame" x="20" y="54" width="12" height="19"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="H07-oi-uXu">
+                                        <rect key="frame" x="6" y="9.6666666666666643" width="0.0" height="0.0"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.40000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="H07-oi-uXu" secondAttribute="trailing" constant="6" id="4rX-ZG-3I1"/>
+                                    <constraint firstAttribute="height" constant="19" id="GQy-HT-n62"/>
+                                    <constraint firstItem="H07-oi-uXu" firstAttribute="centerY" secondItem="hRG-2p-YAL" secondAttribute="centerY" id="XKQ-LU-RBx"/>
+                                    <constraint firstItem="H07-oi-uXu" firstAttribute="leading" secondItem="hRG-2p-YAL" secondAttribute="leading" constant="6" id="mhy-bg-LTC"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="3"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                            <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="3H0-e9-1SR">
+                                <rect key="frame" x="12" y="232.33333333333334" width="317" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="iEY-dO-JPP"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                <color key="textColor" red="0.074509803920000006" green="0.078431372550000003" blue="0.08235294118" 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="Zvw-F2-EZB">
+                                <rect key="frame" x="12" y="258.33333333333331" width="317" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="dG0-Gj-hj7"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DKC-SA-wU9">
+                                <rect key="frame" x="12" y="304" width="8" height="19"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="X2n-U1-CAd">
+                                        <rect key="frame" x="4" y="9.6666666666666856" width="0.0" height="0.0"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                        <color key="textColor" red="1" green="0.40784313729999999" blue="0.1529411765" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="1" green="0.50196078430000002" blue="0.17254901959999999" alpha="0.070000000000000007" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstItem="X2n-U1-CAd" firstAttribute="leading" secondItem="DKC-SA-wU9" secondAttribute="leading" constant="4" id="Iqr-iU-Dv1"/>
+                                    <constraint firstAttribute="trailing" secondItem="X2n-U1-CAd" secondAttribute="trailing" constant="4" id="KWE-xU-p9X"/>
+                                    <constraint firstItem="X2n-U1-CAd" firstAttribute="centerY" secondItem="DKC-SA-wU9" secondAttribute="centerY" id="a4u-d6-HnS"/>
+                                    <constraint firstAttribute="height" constant="19" id="qT1-5I-BA4"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <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="Bor-lw-IMb">
+                                <rect key="frame" x="329" y="304" width="0.0" height="19"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrange_course_icon" translatesAutoresizingMaskIntoConstraints="NO" id="bdJ-si-r9S">
+                                <rect key="frame" x="315" y="306.66666666666669" width="12" height="14"/>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" text="开课时间:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IPU-1C-QpZ">
+                                <rect key="frame" x="39" y="13" width="62.666666666666657" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="lsb-ed-zvK"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="749" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WZe-Hk-Ppm">
+                                <rect key="frame" x="101.66666666666667" y="13" width="0.0" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="bt1-hs-hut"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="Zvw-F2-EZB" firstAttribute="top" secondItem="3H0-e9-1SR" secondAttribute="bottom" constant="4" id="0Aq-uC-U7V"/>
+                            <constraint firstItem="DKC-SA-wU9" firstAttribute="leading" secondItem="kvV-11-cNR" secondAttribute="leading" constant="12" id="146-FX-oME"/>
+                            <constraint firstItem="WZe-Hk-Ppm" firstAttribute="centerY" secondItem="YcV-KQ-NN1" secondAttribute="centerY" id="3rk-Aq-QUZ"/>
+                            <constraint firstItem="Bor-lw-IMb" firstAttribute="centerY" secondItem="DKC-SA-wU9" secondAttribute="centerY" id="4ao-Hg-lLc"/>
+                            <constraint firstAttribute="trailing" secondItem="Bor-lw-IMb" secondAttribute="trailing" constant="12" id="9D4-1t-A0d"/>
+                            <constraint firstItem="UXV-0a-AxL" firstAttribute="centerY" secondItem="WZe-Hk-Ppm" secondAttribute="centerY" id="AfI-Lp-n26"/>
+                            <constraint firstItem="Bor-lw-IMb" firstAttribute="leading" secondItem="bdJ-si-r9S" secondAttribute="trailing" constant="2" id="Ejh-Vi-nJM"/>
+                            <constraint firstItem="IPU-1C-QpZ" firstAttribute="centerY" secondItem="YcV-KQ-NN1" secondAttribute="centerY" id="ImJ-f4-5Gc"/>
+                            <constraint firstAttribute="trailing" secondItem="UXV-0a-AxL" secondAttribute="trailing" constant="12" id="KMv-4r-ipv"/>
+                            <constraint firstItem="UXV-0a-AxL" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="WZe-Hk-Ppm" secondAttribute="trailing" constant="10" id="Neq-HN-egv"/>
+                            <constraint firstItem="YcV-KQ-NN1" firstAttribute="leading" secondItem="kvV-11-cNR" secondAttribute="leading" constant="12" id="SVA-af-dkD"/>
+                            <constraint firstItem="YcV-KQ-NN1" firstAttribute="top" secondItem="kvV-11-cNR" secondAttribute="top" constant="15" id="Uff-JE-Wuf"/>
+                            <constraint firstItem="bdJ-si-r9S" firstAttribute="centerY" secondItem="DKC-SA-wU9" secondAttribute="centerY" id="VbC-rF-axe"/>
+                            <constraint firstItem="IPU-1C-QpZ" firstAttribute="leading" secondItem="YcV-KQ-NN1" secondAttribute="trailing" constant="7" id="WgO-im-PP7"/>
+                            <constraint firstItem="WZe-Hk-Ppm" firstAttribute="centerY" secondItem="IPU-1C-QpZ" secondAttribute="centerY" id="aZl-jv-rt7"/>
+                            <constraint firstAttribute="bottom" secondItem="Bor-lw-IMb" secondAttribute="bottom" constant="14" id="avj-zc-eXg"/>
+                            <constraint firstItem="yLE-tf-4WZ" firstAttribute="top" secondItem="YcV-KQ-NN1" secondAttribute="bottom" constant="15" id="eSF-hG-QGz"/>
+                            <constraint firstItem="WZe-Hk-Ppm" firstAttribute="leading" secondItem="IPU-1C-QpZ" secondAttribute="trailing" id="ehC-YH-DmM"/>
+                            <constraint firstAttribute="trailing" secondItem="3H0-e9-1SR" secondAttribute="trailing" constant="12" id="gOI-9P-Qfh"/>
+                            <constraint firstItem="DKC-SA-wU9" firstAttribute="top" relation="greaterThanOrEqual" secondItem="Zvw-F2-EZB" secondAttribute="bottom" constant="8" id="jWz-nR-XRi"/>
+                            <constraint firstItem="hRG-2p-YAL" firstAttribute="leading" secondItem="yLE-tf-4WZ" secondAttribute="leading" constant="8" id="jjF-V4-RKF"/>
+                            <constraint firstItem="hRG-2p-YAL" firstAttribute="top" secondItem="yLE-tf-4WZ" secondAttribute="top" constant="8" id="lgR-Ez-w86"/>
+                            <constraint firstAttribute="trailing" secondItem="yLE-tf-4WZ" secondAttribute="trailing" constant="12" id="nKG-Db-M0y"/>
+                            <constraint firstItem="WZe-Hk-Ppm" firstAttribute="centerY" secondItem="IPU-1C-QpZ" secondAttribute="centerY" id="oPN-cF-BXU"/>
+                            <constraint firstItem="Zvw-F2-EZB" firstAttribute="leading" secondItem="kvV-11-cNR" secondAttribute="leading" constant="12" id="r2M-ft-2ce"/>
+                            <constraint firstAttribute="trailing" secondItem="Zvw-F2-EZB" secondAttribute="trailing" constant="12" id="tWf-Gy-iJT"/>
+                            <constraint firstItem="3H0-e9-1SR" firstAttribute="leading" secondItem="kvV-11-cNR" secondAttribute="leading" constant="12" id="uH4-WE-WL4"/>
+                            <constraint firstItem="yLE-tf-4WZ" firstAttribute="leading" secondItem="kvV-11-cNR" secondAttribute="leading" constant="12" id="uJw-hP-zxb"/>
+                            <constraint firstAttribute="bottom" secondItem="DKC-SA-wU9" secondAttribute="bottom" constant="14" id="wkm-2V-Eb6"/>
+                            <constraint firstItem="3H0-e9-1SR" firstAttribute="top" secondItem="yLE-tf-4WZ" secondAttribute="bottom" constant="8" id="xHA-OY-WgU"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+            </view>
+            <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
+            <constraints>
+                <constraint firstItem="kvV-11-cNR" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="6M7-r1-fAn"/>
+                <constraint firstItem="kvV-11-cNR" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="I8H-cR-nJm"/>
+                <constraint firstAttribute="bottom" secondItem="kvV-11-cNR" secondAttribute="bottom" id="dfy-9q-tYR"/>
+                <constraint firstAttribute="trailing" secondItem="kvV-11-cNR" secondAttribute="trailing" id="mbT-p5-eiA"/>
+            </constraints>
+            <size key="customSize" width="341" height="337"/>
+            <connections>
+                <outlet property="bookDesc" destination="X2n-U1-CAd" id="vnK-8E-EbA"/>
+                <outlet property="courseCover" destination="yLE-tf-4WZ" id="Yl2-mp-I0m"/>
+                <outlet property="courseDesc" destination="Zvw-F2-EZB" id="jC4-iJ-i1t"/>
+                <outlet property="courseStatus" destination="UXV-0a-AxL" id="sRp-Cf-coY"/>
+                <outlet property="courseSubject" destination="H07-oi-uXu" id="nP3-xh-XDi"/>
+                <outlet property="courseTime" destination="WZe-Hk-Ppm" id="ImO-BQ-1LL"/>
+                <outlet property="courseTitle" destination="3H0-e9-1SR" id="4N3-T6-JP0"/>
+                <outlet property="finishDesc" destination="Bor-lw-IMb" id="rSm-Z3-lEj"/>
+            </connections>
+            <point key="canvasLocation" x="264.8854961832061" y="77.816901408450704"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="arrange_course_icon" width="12" height="14"/>
+        <image name="mine_page_live_tag" width="20" height="16"/>
+        <image name="video_placeholder" width="103" height="72"/>
+    </resources>
+</document>

+ 18 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupView.h

@@ -0,0 +1,18 @@
+//
+//  MyGroupCourseGroupView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "kSJXCollectionView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyGroupCourseGroupView : kSJXCollectionView
+
+@property (nonatomic, strong) NSMutableArray *subjectList;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 368 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/GroupCourseGroup/MyGroupCourseGroupView.m

@@ -0,0 +1,368 @@
+//
+//  MyGroupCourseGroupView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MyGroupCourseGroupView.h"
+#import "MyCourseSearchView.h"
+#import "MyGroupCourseGroupListCell.h"
+#import "StateView.h"
+#import "Reachability.h"
+#import "LiveLessonModel.h"
+#import "MyCourseRankSortView.h"
+
+@interface MyGroupCourseGroupView ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) StateView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+@property (nonatomic, strong) MyCourseSearchView *searchView;
+
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectId;
+
+@property (nonatomic, strong) NSString *status;
+
+@property (nonatomic, strong) NSString *classDate;
+
+@property (nonatomic, assign) NSInteger subjectChooseIndex;
+
+@property (nonatomic, assign) NSInteger statusChooseIndex;
+
+@property (nonatomic, strong) MyCourseRankSortView *sortView;
+
+@property (nonatomic, strong) NSMutableArray *statusArray;
+
+@end
+
+@implementation MyGroupCourseGroupView
+
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = [UIColor clearColor];
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 12, 14);
+        
+        self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
+        self.collectionView.backgroundColor = [UIColor clearColor];
+        self.collectionView.delegate = self;
+        self.collectionView.dataSource = self;
+        self.collectionView.showsVerticalScrollIndicator = NO;
+        self.collectionView.showsHorizontalScrollIndicator = NO;
+        [self.collectionView registerNib:[UINib nibWithNibName:@"MyLiveCourseGroupListCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"MyLiveCourseGroupListCell"];
+        [self addSubview:self.collectionView];
+        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        MJWeakSelf;
+        self.collectionView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+            [weakSelf resetParamenter];
+            [weakSelf requestData];
+        }];
+        self.collectionView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+            if (weakSelf.isLoadMore) {
+                weakSelf.pages += 1;
+                [weakSelf requestData];
+            }
+            else {
+                [weakSelf.collectionView.mj_footer endRefreshingWithNoMoreData];
+            }
+        }];
+    }
+    return self;
+}
+
+- (void)endRefresh {
+    @weakObj(self);
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        @strongObj(self);
+        [self.collectionView.mj_header endRefreshing];
+        [self.collectionView.mj_footer endRefreshing];
+    });
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    self.dataArray = [NSMutableArray array];
+    [self.collectionView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无内容" imageName:@"empty_course" inView:self.collectionView];
+    [self.collectionView reloadData];
+}
+
+- (void)requestData {
+    [KSNetworkingManager queryTeacherLiveCourse:KS_POST courseType:@"GROUP" classDate:self.classDate status:self.status subjectId:self.subjectId search:self.searchKey page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self endRefresh];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                LiveLessonModel *model = [[LiveLessonModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    } faliure:^(NSError * _Nonnull error) {
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.collectionView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    }];
+}
+
+- (void)beginRefreshImmediately {
+    [self.collectionView.mj_header beginRefreshing];
+}
+
+- (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (self.lastSelectedIndexPath == indexPath) {
+        return;
+    }
+    if (self.lastSelectedIndexPath != nil) {
+        UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:self.lastSelectedIndexPath];
+        [cell setSelected:NO];
+    }
+    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
+    [cell setSelected:YES];
+    self.lastSelectedIndexPath = indexPath;
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    CGFloat searchViewHeight = [MyCourseSearchView getViewHeight];
+
+    if (![self.subviews containsObject:self.searchView]) {
+        [self addSubview:self.searchView];
+        [self.searchView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.top.mas_equalTo(self);
+            make.height.mas_equalTo(searchViewHeight);
+        }];
+    }
+
+    [self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self);
+        make.top.mas_equalTo(self.searchView.mas_bottom);
+    }];
+}
+
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+
+#pragma mark ----- collection view
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+    return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    MyGroupCourseGroupListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyGroupCourseGroupListCell" forIndexPath:indexPath];
+    
+    LiveLessonModel *model = [self.dataArray objectAtIndex:indexPath.row];
+    [cell configWithSource:model];
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+//    LiveLessonModel *model = self.dataArray[indexPath.row];
+//    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+//    NSString *url = [NSString stringWithFormat:@"%@/#/liveDetail?joinRoom=1&groupId=%@&classId=%@", WEBHOST, model.courseGroupId,model.courseId];
+//    ctrl.url = url;
+//    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+    CGFloat width = KPortraitWidth - 28;
+    if (IS_IPAD) {
+        width = (KPortraitWidth - 28 - 12) / 2.0f;
+    }
+    CGFloat height = (width - 12 * 2) / 16 * 9 + 143;
+    return CGSizeMake(width, height);
+}
+
+#pragma mark ------ lazying
+- (MyCourseSearchView *)searchView {
+    if (!_searchView) {
+        _searchView = [MyCourseSearchView sharedInstance];
+        [_searchView configPlaceholder:@"请输入课程组名称"];
+        MJWeakSelf;
+        [_searchView searchActionCallback:^(MY_COURSE_SORT type, NSString * _Nullable searchKey) {
+            [weakSelf searchAction:type searchKey:searchKey];
+        }];
+    }
+    return _searchView;
+}
+
+- (void)searchAction:(MY_COURSE_SORT)type searchKey:(NSString *)searchKey {
+    switch (type) {
+        case MY_COURSE_SORT_RANK:
+        {
+            [self showSortView];
+        }
+            break;
+        case MY_COURSE_SORT_SEARCH:
+        {
+            [self evaluateSource:searchKey];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (void)showSortView {
+    self.searchView.arrowUp = YES;
+    [self.sortView refreshUI:self.statusChooseIndex subjectId:self.subjectChooseIndex];
+    [self.sortView showInView:[NSObject getKeyWindow]];
+}
+
+- (void)evaluateSource:(NSString *)searchKey {
+    self.searchKey = searchKey;
+    [self refreshAndRequestData];
+}
+
+/**
+ 设置没有数据时的显示
+ 
+ @param promptString 提示语
+ @param imgName 图片名称
+ @param view 显示在什么地方
+ */
+- (void)setPromptString:(NSString *)promptString imageName:(NSString *)imgName inView:(UIView *)view {
+    if (self.promptView != nil) {
+        [self.promptView removeFromSuperview];
+    }
+    else {
+        self.promptView = [[StateView alloc]init];
+        self.promptView.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight - 300);
+    }
+    _promptPlaceView = view;
+    //当请求不到数据时 ,自定义提示view 将会出现;
+    self.promptView.imageName = imgName;
+    self.promptView.alpha = 0.0f;
+    [self.promptView setText:promptString];
+    [view addSubview:self.promptView];
+}
+
+// 结束刷新后调用方法
+- (void)changePromptLabelStateWithArray:(NSMutableArray *)array {
+    NSInteger count;
+    if (array.count) {
+        count = array.count;
+    } else {
+        count = 0;
+    }
+    
+    [UIView animateWithDuration:0.1 animations:^{
+        [[self promptView] setAlpha:count ? 0.0f :1.0f ] ;
+    }] ;
+    
+}
+
+- (BOOL)networkAvaiable {
+    return [self checkNetworkAvaiable];
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
+
+- (MyCourseRankSortView *)sortView {
+    if (!_sortView) {
+        _sortView = [MyCourseRankSortView sharedInstance];
+        [_sortView configWithStatusArray:self.statusArray subjectArray:self.subjectList];
+        MJWeakSelf;
+        [_sortView sortActionCallback:^(MY_COURSE_SORTTYPE type, NSString * _Nullable status, NSString * _Nullable subjectId, NSInteger statusIndex, NSInteger subjectIndex) {
+            [weakSelf sortActionWithType:type status:status subjectId:subjectId statusChooseIndex:statusIndex subjectChooseIndex:subjectIndex];
+        }];
+    }
+    return _sortView;
+}
+
+- (void)sortActionWithType:(MY_COURSE_SORTTYPE)type status:(NSString *)status subjectId:(NSString *)subjectId statusChooseIndex:(NSInteger)statusChooseIndex subjectChooseIndex:(NSInteger)subjectChooseIndex  {
+    self.searchView.arrowUp = NO;
+    if (type == MY_COURSE_SORTTYPE_SORT) {
+        self.statusChooseIndex = statusChooseIndex;
+        self.subjectChooseIndex = subjectChooseIndex;
+        self.status = status;
+        self.subjectId = subjectId;
+        if ([NSString isEmptyString:status]) {
+            self.status = nil;
+        }
+        if ([NSString isEmptyString:subjectId]) {
+            self.subjectId = nil;
+        }
+        [self refreshAndRequestData];
+    }
+}
+
+- (NSMutableArray *)statusArray {
+    if (!_statusArray) {
+        _statusArray = [NSMutableArray arrayWithArray:@[@{@"name":@"全部",@"id":@""},@{@"name":@"未开课",@"id":@"NOT_START"},@{@"name":@"已开课",@"id":@"ING"},@{@"name":@"已结课",@"id":@"COMPLETE"}]];
+    }
+    return _statusArray;
+}
+
+- (void)setSubjectList:(NSMutableArray *)subjectList {
+    NSMutableArray *array = [NSMutableArray arrayWithArray:subjectList];
+    [array insertObject:@{@"name":@"全部",@"id":@""} atIndex:0];
+    _subjectList = array;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/LiveCourseGroup/MyLiveCourseGroupView.m

@@ -108,7 +108,7 @@
 }
 
 - (void)requestData {
-    [KSNetworkingManager queryTeacherLiveCourse:KS_POST classDate:self.classDate status:self.status subjectId:self.subjectId search:self.searchKey page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager queryTeacherLiveCourse:KS_POST courseType:@"LIVE" classDate:self.classDate status:self.status subjectId:self.subjectId search:self.searchKey page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
         [self endRefresh];
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
             NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];

+ 4 - 11
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m

@@ -41,6 +41,7 @@
 #import "MineWorksViewController.h"
 
 #import "KSChatConversationViewController.h"
+#import "MyGroupCourseViewController.h"
 
 @interface MineViewController ()<UIScrollViewDelegate>
 
@@ -373,18 +374,10 @@
             [self.navigationController pushViewController:ctrl animated:YES];
         }
             break;
-        case MINEVIEWTYPE_ACCOMPANY: // 趣纠课设置
+        case MINEVIEWTYPE_GROUP: // 小组课
         {
-            if (![self.mineInfo.entryStatus isEqualToString:@"PASS"]) { // 跳转老师认证
-                KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
-                webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/teacherCert"];
-                [self.navigationController pushViewController:webCtrl animated:YES];
-            }
-            else { // 设置页面
-                KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
-                webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/practiceSetting"];
-                [self.navigationController pushViewController:webCtrl animated:YES];
-            }
+            MyGroupCourseViewController *ctrl = [[MyGroupCourseViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
         }
             break;
         case MINEVIEWTYPE_BOARDCASTCOURSE: // 直播课程

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/Controller/MyGroupCourseViewController.h

@@ -0,0 +1,22 @@
+//
+//  MyGroupCourseViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "KSBaseViewController.h"
+#import "JXCategoryTitleView.h"
+#import "JXPagerView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+/// 主页小组课课程组
+@interface MyGroupCourseViewController : KSBaseViewController
+
+@property (nonatomic, strong) JXPagerView *pagerView;
+@property (nonatomic, strong, readonly) JXCategoryTitleView *categoryView;
+@property (nonatomic, strong) NSArray <NSString *> *titles;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 174 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/Controller/MyGroupCourseViewController.m

@@ -0,0 +1,174 @@
+//
+//  MyGroupCourseViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MyGroupCourseViewController.h"
+#import "KSBaseWKWebViewController.h"
+#import "JXCategoryView.h"
+#import "JXPagerListRefreshView.h"
+#import "MyGroupCourseBodyView.h"
+#import "TeacherInfo.h"
+#import "UserInfoManager.h"
+
+#define HEADER_HEIGHT (44)
+
+@interface MyGroupCourseViewController ()<JXPagerViewDelegate, JXPagerMainTableViewGestureDelegate,JXCategoryViewDelegate>
+
+@property (nonatomic, assign) NSInteger selectedIndex;
+
+@property (nonatomic, strong) NSMutableArray *listViewArray;
+
+@property (nonatomic, strong) TeacherInfo *teacherInfo;
+
+@end
+
+@implementation MyGroupCourseViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"小组课"];
+    _titles = @[@"进行中",@"未上架",@"销售中",@"已完成",@"已取消",@"已下架"];
+    [self configUI];
+    [self countUMEvent];
+}
+
+- (void)countUMEvent {
+    [USER_MANAGER sendUMEvent:@"klx_groupCourse"];
+}
+
+- (void)configUI {
+    [self rightButtonTitle:@"创建课程" color:HexRGB(0x000000)];
+    [self.scrollView removeFromSuperview];
+    self.view.backgroundColor = HexRGB(0xf8f9fc);
+    
+    _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, HEADER_HEIGHT)];
+    self.categoryView.titles = self.titles;
+    self.categoryView.delegate = self;
+    self.categoryView.titleFont = [UIFont systemFontOfSize:17.0f];
+    self.categoryView.titleSelectedFont = [UIFont systemFontOfSize:17.0f weight:UIFontWeightMedium];
+    self.categoryView.titleSelectedColor = HexRGB(0x333333);
+    self.categoryView.titleColor = HexRGB(0x666666);
+    self.categoryView.titleColorGradientEnabled = YES;
+    
+    JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
+    lineView.indicatorColor = THEMECOLOR;
+    lineView.indicatorWidth = 16;
+    lineView.indicatorHeight = 4.0f;
+    self.categoryView.indicators = @[lineView];
+    
+    _pagerView = [self preferredPagingView];
+    self.pagerView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    self.pagerView.backgroundColor = [UIColor clearColor];
+    self.pagerView.mainTableView.backgroundColor = [UIColor clearColor];
+    self.pagerView.listContainerView.backgroundColor = [UIColor clearColor];
+    self.pagerView.mainTableView.gestureDelegate = self;
+    self.categoryView.listContainer = (id<JXCategoryViewListContainer>)self.pagerView.listContainerView;
+    self.pagerView.listContainerView.listCellBackgroundColor = [UIColor clearColor];
+    [self.view addSubview:self.pagerView];
+}
+
+- (void)rightBtnClick {
+    KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+    webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/groupCreate"];
+    [self.navigationController pushViewController:webCtrl animated:YES];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
+    if (self.listViewArray.count > self.categoryView.selectedIndex) {
+         id value = self.listViewArray[self.categoryView.selectedIndex];
+        if ([value isKindOfClass:[MyGroupCourseBodyView class]]) {
+            MyGroupCourseBodyView *listView = (MyGroupCourseBodyView *)value;
+            [listView beginFirstRefresh];
+        }
+    }
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+    self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0);
+}
+
+- (JXPagerView *)preferredPagingView {
+    return [[JXPagerListRefreshView alloc] initWithDelegate:self];
+}
+
+#pragma mark - JXPagerViewDelegate
+
+- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView {
+    return [UIView new];
+}
+
+- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView {
+    return CGFLOAT_MIN;
+}
+
+- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+    return HEADER_HEIGHT;
+}
+
+- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+    return self.categoryView;
+}
+
+- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView {
+    //和categoryView的item数量一致
+    return self.titles.count;
+}
+
+- (id<JXPagerViewListViewDelegate>)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index {
+    MyGroupCourseBodyView *listView = [[MyGroupCourseBodyView alloc] init];
+    listView.naviController = self.navigationController;
+    [self.listViewArray replaceObjectAtIndex:index withObject:listView];
+    self.listViewArray[index] = listView;
+    listView.selectIndex = index;
+    [listView beginFirstRefresh];
+    return listView;
+}
+
+#pragma mark - JXCategoryViewDelegate
+- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
+    self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
+    if (self.listViewArray.count > index) {
+        id value = self.listViewArray[index];
+        if ([value isKindOfClass:[MyGroupCourseBodyView class]]) {
+            MyGroupCourseBodyView *listView = (MyGroupCourseBodyView *)value;
+            [listView beginFirstRefresh];
+        }
+    }
+}
+
+
+#pragma mark - JXPagerMainTableViewGestureDelegate
+
+- (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
+    //禁止categoryView左右滑动的时候,上下和左右都可以滚动
+    if (otherGestureRecognizer == self.categoryView.collectionView.panGestureRecognizer) {
+        return NO;
+    }
+    return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
+}
+
+
+- (NSMutableArray *)listViewArray {
+    if (!_listViewArray) {
+        _listViewArray = [NSMutableArray arrayWithArray:@[@"",@"",@"",@"",@"",@""]];
+    }
+    return _listViewArray;
+}
+/*
+#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
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/View/MyGroupCourseBodyView.h

@@ -0,0 +1,18 @@
+//
+//  MyGroupCourseBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "kSJXCollectionView.h"
+#import "KSButtonStatusView.h"
+#import "Reachability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyGroupCourseBodyView : kSJXCollectionView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 366 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CroupCourse/View/MyGroupCourseBodyView.m

@@ -0,0 +1,366 @@
+//
+//  MyGroupCourseBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MyGroupCourseBodyView.h"
+#import "MineGroupCourseCell.h"
+#import "LiveCourseModel.h"
+#import "KSBaseWKWebViewController.h"
+
+
+@interface MyGroupCourseBodyView ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) KSButtonStatusView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+@property (nonatomic, strong) NSString *groupStatus;
+
+@end
+
+@implementation MyGroupCourseBodyView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = [UIColor clearColor];
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        
+        self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
+        self.collectionView.backgroundColor = [UIColor clearColor];
+        self.collectionView.delegate = self;
+        self.collectionView.dataSource = self;
+        self.collectionView.showsVerticalScrollIndicator = NO;
+        self.collectionView.showsHorizontalScrollIndicator = NO;
+        [self.collectionView registerNib:[UINib nibWithNibName:@"MineGroupCourseCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"MineGroupCourseCell"];
+        [self addSubview:self.collectionView];
+        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        MJWeakSelf;
+        self.collectionView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+            [weakSelf resetParamenter];
+            [weakSelf requestData];
+        }];
+        self.collectionView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+            if (weakSelf.isLoadMore) {
+                weakSelf.pages += 1;
+                [weakSelf requestData];
+            }
+            else {
+                [weakSelf.collectionView.mj_footer endRefreshingWithNoMoreData];
+            }
+        }];
+    }
+    return self;
+}
+
+
+- (void)configRequestStatus {
+    if (self.selectIndex == 0) {
+        self.groupStatus = @"ING";
+    }
+    else if (self.selectIndex == 1) {
+        self.groupStatus = @"NOT_SALE";
+    }
+    else if (self.selectIndex == 2) {
+        self.groupStatus = @"APPLY";
+    }
+    else if (self.selectIndex == 3) {
+        self.groupStatus = @"COMPLETE";
+    }
+    else if (self.selectIndex == 4) {
+        self.groupStatus = @"CANCEL";
+    }
+    else {
+        self.groupStatus = @"OUT_SALE";
+    }
+}
+
+- (void)endRefresh {
+    @weakObj(self);
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        @strongObj(self);
+        [self.collectionView.mj_header endRefreshing];
+        [self.collectionView.mj_footer endRefreshing];
+    });
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    [self configRequestStatus];
+    self.dataArray = [NSMutableArray array];
+    [self.collectionView.mj_footer resetNoMoreData];
+    [self setPromptString:[self getEmptyMessage] imageName:@"authTeacher_Live" buttonTitle:@"立即创建" inView:self.collectionView];
+    
+    [self.collectionView reloadData];
+}
+
+- (NSString *)getEmptyMessage {
+    if (self.selectIndex == 0) {
+        return @"暂无进行中小组课课程";
+    }
+    else if (self.selectIndex == 1) {
+        return @"暂无未上架小组课课程";
+    }
+    else if (self.selectIndex == 2) {
+        return @"暂无销售中小组课课程";
+    }
+    else if (self.selectIndex == 3) {
+        return @"暂无已完成小组课课程";
+    }
+    else if (self.selectIndex == 4) {
+        return @"暂无已取消小组课课程";
+    }
+    else {
+        return @"暂无已下架小组课课程";
+    }
+}
+
+- (void)requestData {
+    [KSNetworkingManager LiveOrGroupCourseGroupRequest:KS_POST courseType:@"GROUP" groupStatus:self.groupStatus page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self endRefresh];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                LiveCourseModel *model = [[LiveCourseModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    } faliure:^(NSError * _Nonnull error) {
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" buttonTitle:@"" inView:self.collectionView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    }];
+}
+
+- (void)beginRefreshImmediately {
+    [self.collectionView.mj_header beginRefreshing];
+}
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+- (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (self.lastSelectedIndexPath == indexPath) {
+        return;
+    }
+    if (self.lastSelectedIndexPath != nil) {
+        UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:self.lastSelectedIndexPath];
+        [cell setSelected:NO];
+    }
+    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
+    [cell setSelected:YES];
+    self.lastSelectedIndexPath = indexPath;
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    [self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self);
+    }];
+}
+
+#pragma mark ----- collection view
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+    return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    MineGroupCourseCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MineGroupCourseCell" forIndexPath:indexPath];
+    
+    LiveCourseModel *model = [self.dataArray objectAtIndex:indexPath.row];
+    COURSERSTATUS status = [self getCourseStatus:self.selectIndex];
+    [cell configCellWithSource:model groupStatus:status hideStatusView:NO];
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+    // 直播课程组详情
+    LiveCourseModel *model = self.dataArray[indexPath.item];
+    if (self.selectIndex == 5) {
+        [self editLiveCourseWithGroupId:[NSString stringWithFormat:@"%.0f",model.courseGroupId]];
+        
+    }
+    else {
+        [self displayLiveCourseDetailWithGroupId:[NSString stringWithFormat:@"%.0f",model.courseGroupId]];
+    }
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+    CGFloat width = KPortraitWidth - 28;
+    if (IS_IPAD) {
+        width = (KPortraitWidth - 28 - 12) / 2.0f;
+    }
+    CGFloat height = (width - 12 * 2) / 16 * 9 + 143;
+    return CGSizeMake(width, height);
+}
+
+
+- (COURSERSTATUS)getCourseStatus:(NSInteger)index {
+    COURSERSTATUS status;
+    if (index == 0) {
+        status = COURSERSTATUS_ING;
+    }
+    else if (index == 1) {
+        status = COURSERSTATUS_NOTSALE;
+    }
+    else if (index == 2) {
+        status = COURSERSTATUS_APPLY;
+    }
+    else if (index == 3) {
+        status = COURSERSTATUS_COMPLETE;
+    }
+    else if (index == 4) {
+        status = COURSERSTATUS_CANCLE;
+    }
+    else {
+        status = COURSERSTATUS_OUTSALE;
+    }
+    return status;
+}
+
+- (void)editLiveCourseWithGroupId:(NSString *)groupId {
+    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/groupCreate?groupId=",groupId];
+    ctrl.url = url;
+    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+- (void)displayLiveCourseDetailWithGroupId:(NSString *)groupId {
+    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/groupDetail?groupId=",groupId];
+    ctrl.url = url;
+    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+/**
+ 设置没有数据时的显示
+ 
+ @param promptString 提示语
+ @param imgName 图片名称
+ @param view 显示在什么地方
+ */
+- (void)setPromptString:(NSString *)promptString imageName:(NSString *)imgName buttonTitle:(NSString *)buttonTitle inView:(UIView *)view {
+    if (self.promptView != nil) {
+        [self.promptView removeFromSuperview];
+    }
+    else {
+        self.promptView = [[KSButtonStatusView alloc] init];
+    }
+    _promptPlaceView = view;
+    //当请求不到数据时 ,自定义提示view 将会出现;
+    self.promptView.imageName = imgName;
+    self.promptView.alpha = 0.0f;
+    [self.promptView setText:promptString];
+    [self.promptView setButtonTitle:buttonTitle];
+    MJWeakSelf;
+    [self.promptView buttonClickCallback:^{
+        [weakSelf emptyButtonAction];
+    }];
+    [view addSubview:self.promptView];
+    [self.promptView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self);
+        make.top.mas_equalTo(self.collectionView);
+        make.height.mas_equalTo(self);
+    }];
+}
+
+- (void)emptyButtonAction {
+    KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+    webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/groupCreate"];
+    [self.naviController pushViewController:webCtrl animated:YES];
+}
+
+// 结束刷新后调用方法
+- (void)changePromptLabelStateWithArray:(NSMutableArray *)array {
+    NSInteger count;
+    if (array.count) {
+        count = array.count;
+    } else {
+        count = 0;
+    }
+    
+    [UIView animateWithDuration:0.1 animations:^{
+        [[self promptView] setAlpha:count ? 0.0f :1.0f ] ;
+    }] ;
+    
+}
+
+- (BOOL)networkAvaiable {
+    return [self checkNetworkAvaiable];
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
+
+#pragma mark ---- lazying
+- (NSMutableArray *)dataArray {
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Controller/MyLiveCourseViewController.m

@@ -39,6 +39,7 @@
 - (void)countUMEvent {
     [USER_MANAGER sendUMEvent:@"klx_liveCourse"];
 }
+
 - (void)configUI {
     [self rightButtonTitle:@"创建课程" color:HexRGB(0x000000)];
     [self.scrollView removeFromSuperview];

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Model/LiveCourseModel.h

@@ -28,6 +28,7 @@
 @property (nonatomic, strong) NSString *salesEndDate;
 @property (nonatomic, strong) NSString *courseGroupName;
 @property (nonatomic, strong) NSString *courseIntroduce;
+@property (nonatomic, assign) NSInteger maxStudentNum;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 7 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/Model/LiveCourseModel.m

@@ -25,7 +25,7 @@ NSString *const kLiveCourseModelSubjectName = @"subjectName";
 NSString *const kLiveCourseModelSalesEndDate = @"salesEndDate";
 NSString *const kLiveCourseModelCourseGroupName = @"courseGroupName";
 NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
-
+NSString *const kLiveCourseModelMaxStudentNum = @"maxStudentNum";
 
 @interface LiveCourseModel ()
 
@@ -52,7 +52,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
 @synthesize salesEndDate = _salesEndDate;
 @synthesize courseGroupName = _courseGroupName;
 @synthesize courseIntroduce = _courseIntroduce;
-
+@synthesize maxStudentNum = _maxStudentNum;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -83,6 +83,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
             self.salesEndDate = [self objectOrNilForKey:kLiveCourseModelSalesEndDate fromDictionary:dict];
             self.courseGroupName = [self objectOrNilForKey:kLiveCourseModelCourseGroupName fromDictionary:dict];
             self.courseIntroduce = [self objectOrNilForKey:kLiveCourseModelCourseIntroduce fromDictionary:dict];
+            self.maxStudentNum = [[self objectOrNilForKey:kLiveCourseModelMaxStudentNum fromDictionary:dict] integerValue];
 
     }
     
@@ -110,7 +111,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
     [mutableDict setValue:self.salesEndDate forKey:kLiveCourseModelSalesEndDate];
     [mutableDict setValue:self.courseGroupName forKey:kLiveCourseModelCourseGroupName];
     [mutableDict setValue:self.courseIntroduce forKey:kLiveCourseModelCourseIntroduce];
-
+    [mutableDict setValue:[NSNumber numberWithInteger:self.maxStudentNum] forKey:kLiveCourseModelMaxStudentNum];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -155,6 +156,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
     self.salesEndDate = [aDecoder decodeObjectForKey:kLiveCourseModelSalesEndDate];
     self.courseGroupName = [aDecoder decodeObjectForKey:kLiveCourseModelCourseGroupName];
     self.courseIntroduce = [aDecoder decodeObjectForKey:kLiveCourseModelCourseIntroduce];
+    self.maxStudentNum = [aDecoder decodeIntegerForKey:kLiveCourseModelMaxStudentNum];
     return self;
 }
 
@@ -178,6 +180,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
     [aCoder encodeObject:_salesEndDate forKey:kLiveCourseModelSalesEndDate];
     [aCoder encodeObject:_courseGroupName forKey:kLiveCourseModelCourseGroupName];
     [aCoder encodeObject:_courseIntroduce forKey:kLiveCourseModelCourseIntroduce];
+    [aCoder encodeInteger:_maxStudentNum forKey:kLiveCourseModelMaxStudentNum];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -203,6 +206,7 @@ NSString *const kLiveCourseModelCourseIntroduce = @"courseIntroduce";
         copy.salesEndDate = [self.salesEndDate copyWithZone:zone];
         copy.courseGroupName = [self.courseGroupName copyWithZone:zone];
         copy.courseIntroduce = [self.courseIntroduce copyWithZone:zone];
+        copy.maxStudentNum = self.maxStudentNum;
     }
     
     return copy;

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/View/MyLiveCourseBodyView.m

@@ -138,7 +138,7 @@
 }
 
 - (void)requestData {
-    [KSNetworkingManager LiveCourseGroupRequest:KS_POST groupStatus:self.groupStatus page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager LiveOrGroupCourseGroupRequest:KS_POST courseType:@"LIVE" groupStatus:self.groupStatus page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
         [self endRefresh];
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
             NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];

+ 15 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MinePageViewController.m

@@ -25,6 +25,7 @@
 #import "KSGroupConversationController.h"
 #import "CreateFansGroupViewController.h"
 #import "MyStyleVideoListController.h"
+#import "MineGroupCourseBodyView.h"
 
 #define HEADER_HEIGHT (50)
 
@@ -54,7 +55,7 @@
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     self.ks_prefersNavigationBarHidden = YES;
-    _titles = @[@"VIP定制课",@"趣纠课",@"直播课",@"视频课",@"乐谱"];
+    _titles = @[@"VIP定制课",@"趣纠课",@"小组课",@"直播课",@"视频课",@"乐谱"];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startSearchEdit) name:@"MinePageStartSearch" object:nil];
     [self configUI];
     [self countUMEvent];
@@ -105,7 +106,7 @@
     self.categoryView.titleSelectedColor = HexRGB(0x333333);
     self.categoryView.titleColor = HexRGB(0x666666);
     self.categoryView.titleColorGradientEnabled = YES;
-    self.categoryView.cellSpacing = 10.0f;
+    self.categoryView.cellSpacing = 16.0f;
     
     JXCategoryIndicatorGradientLineView *lineView = [[JXCategoryIndicatorGradientLineView alloc] init];
     lineView.indicatorColor = [UIColor clearColor];
@@ -276,7 +277,16 @@
         [listView beginFirstRefresh];
         return listView;
     }
-    else if (index == 2) { // 直播
+    else if (index == 2) {
+        MineGroupCourseBodyView *listView = [[MineGroupCourseBodyView alloc] init];
+        listView.naviController = self.navigationController;
+        [self.listViewArray replaceObjectAtIndex:index withObject:listView];
+        self.listViewArray[index] = listView;
+        listView.selectIndex = index;
+        [listView beginFirstRefresh];
+        return listView;
+    }
+    else if (index == 3) { // 直播
         MinePageLiveCourseView *listView = [[MinePageLiveCourseView alloc] init];
         listView.naviController = self.navigationController;
         [self.listViewArray replaceObjectAtIndex:index withObject:listView];
@@ -291,7 +301,7 @@
         [listView beginFirstRefresh];
         return listView;
     }
-    else if (index == 3) { // 视频课
+    else if (index == 4) { // 视频课
         MinePageVideoCourseView *listView = [[MinePageVideoCourseView alloc] init];
         listView.naviController = self.navigationController;
         [self.listViewArray replaceObjectAtIndex:index withObject:listView];
@@ -393,7 +403,7 @@
 
 - (NSMutableArray *)listViewArray {
     if (!_listViewArray) {
-        _listViewArray = [NSMutableArray arrayWithArray:@[@"",@"",@"",@"",@""]];
+        _listViewArray = [NSMutableArray arrayWithArray:@[@"",@"",@"",@"",@"",@""]];
     }
     return _listViewArray;
 }

+ 18 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseBodyView.h

@@ -0,0 +1,18 @@
+//
+//  MineGroupCourseBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "kSJXCollectionView.h"
+#import "StateView.h"
+#import "Reachability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MineGroupCourseBodyView : kSJXCollectionView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 382 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseBodyView.m

@@ -0,0 +1,382 @@
+//
+//  MineGroupCourseBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MineGroupCourseBodyView.h"
+#import "MinePageCourseTipsView.h"
+#import "MineCourseSettingView.h"
+#import "KSBaseWKWebViewController.h"
+#import "MineGroupCourseCell.h"
+
+#define HIDE_GROUPCOURSE_TIPS (@"HIDE_GROUPCOURSE_TIPS")
+
+@interface MineGroupCourseBodyView ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) StateView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+@property (nonatomic, strong) UIView *headView;
+
+@property (nonatomic, strong) MinePageCourseTipsView *tipsView;
+
+@property (nonatomic, strong) MineCourseSettingView *settingView;
+
+@property (nonatomic, assign) BOOL hideTips; // 是否隐藏提示
+
+@end
+
+@implementation MineGroupCourseBodyView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = HexRGB(0xf8f9fc);
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 12, 14);
+        
+        self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
+        self.collectionView.backgroundColor = HexRGB(0xf8f9fc);
+        self.collectionView.delegate = self;
+        self.collectionView.dataSource = self;
+        self.collectionView.showsVerticalScrollIndicator = NO;
+        self.collectionView.showsHorizontalScrollIndicator = NO;
+        [self.collectionView registerNib:[UINib nibWithNibName:@"MineGroupCourseCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"MineGroupCourseCell"];
+        [self addSubview:self.collectionView];
+        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        MJWeakSelf;
+        self.collectionView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+            [weakSelf resetParamenter];
+            [weakSelf requestData];
+        }];
+        self.collectionView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+            if (weakSelf.isLoadMore) {
+                weakSelf.pages += 1;
+                [weakSelf requestData];
+            }
+            else {
+                [weakSelf.collectionView.mj_footer endRefreshingWithNoMoreData];
+            }
+        }];
+        if (UserDefaultBoolForKey(HIDE_GROUPCOURSE_TIPS)) {
+            self.hideTips = YES;
+        }
+    }
+    return self;
+}
+
+- (void)endRefresh {
+    @weakObj(self);
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        @strongObj(self);
+        [self.collectionView.mj_header endRefreshing];
+        [self.collectionView.mj_footer endRefreshing];
+    });
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    self.dataArray = [NSMutableArray array];
+    [self.collectionView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无内容" imageName:@"empty_course" inView:self.collectionView];
+    [self.collectionView reloadData];
+}
+
+- (void)requestData {
+    [KSNetworkingManager LiveOrGroupCourseGroupRequest:KS_POST courseType:@"GROUP" groupStatus:@"APPLY" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self endRefresh];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                LiveCourseModel *model = [[LiveCourseModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    } faliure:^(NSError * _Nonnull error) {
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.collectionView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.collectionView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    }];
+}
+
+- (void)beginRefreshImmediately {
+    [self.collectionView.mj_header beginRefreshing];
+}
+
+- (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (self.lastSelectedIndexPath == indexPath) {
+        return;
+    }
+    if (self.lastSelectedIndexPath != nil) {
+        UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:self.lastSelectedIndexPath];
+        [cell setSelected:NO];
+    }
+    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
+    [cell setSelected:YES];
+    self.lastSelectedIndexPath = indexPath;
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    CGFloat tipsHeight = [self.tipsView getViewHeight];
+    CGFloat settingHeight = [MineCourseSettingView getViewHeight];
+    CGFloat headHeight = 0.0f;
+    if (self.hideTips) {
+        headHeight = settingHeight + 12;
+    }
+    else {
+        headHeight = tipsHeight + settingHeight + 12;
+    }
+    
+    if (![self.subviews containsObject:self.headView]) {
+        [self addSubview:self.headView];
+        [self evaluateHeadView];
+        [self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.top.mas_equalTo(self);
+            make.height.mas_equalTo(headHeight);
+        }];
+    }
+    else {
+        [self.headView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(headHeight);
+        }];
+        if (self.hideTips) {
+            self.tipsView.hidden = YES;
+            [self.tipsView mas_updateConstraints:^(MASConstraintMaker *make) {
+                make.height.mas_equalTo(0);
+            }];
+        }
+        else {
+            self.tipsView.hidden = NO;
+            [self.tipsView mas_updateConstraints:^(MASConstraintMaker *make) {
+                make.height.mas_equalTo(tipsHeight);
+            }];
+        }
+    }
+    
+    [self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self);
+        make.top.mas_equalTo(self.headView.mas_bottom);
+    }];
+}
+
+- (void)evaluateHeadView {
+    
+    CGFloat tipsHeight = 0.0f;
+    if (self.hideTips == NO) {
+        tipsHeight = [self.tipsView getViewHeight];
+    }
+    CGFloat settingHeight = [MineCourseSettingView getViewHeight];
+    [self.headView addSubview:self.tipsView];
+    [self.tipsView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.headView);
+        make.height.mas_equalTo(tipsHeight);
+    }];
+    [self.headView addSubview:self.settingView];
+    [self.settingView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.headView);
+        make.bottom.mas_equalTo(self.headView.mas_bottom).offset(-12);
+        make.height.mas_equalTo(settingHeight);
+    }];
+}
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+
+#pragma mark ----- collection view
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+    return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    MineGroupCourseCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MineGroupCourseCell" forIndexPath:indexPath];
+    LiveCourseModel *model = [self.dataArray objectAtIndex:indexPath.row];
+    [cell configCellWithSource:model groupStatus:COURSERSTATUS_APPLY hideStatusView:YES];
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+    LiveCourseModel *model = self.dataArray[indexPath.row];
+    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+    NSString *url = [NSString stringWithFormat:@"%@%@%.0f", WEBHOST, @"/#/groupDetail?groupId=",model.courseGroupId];
+    ctrl.url = url;
+    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+    CGFloat width = KPortraitWidth - 28;
+    if (IS_IPAD) {
+        width = (KPortraitWidth - 28 - 12) / 2.0f;
+    }
+    CGFloat height = (width - 12 * 2) / 16 * 9 + 143;
+    return CGSizeMake(width, height);
+}
+
+#pragma mark ----- lazying
+
+- (UIView *)headView {
+    if (!_headView) {
+        _headView = [[UIView alloc] initWithFrame:CGRectZero];
+        _headView.backgroundColor = [UIColor clearColor];
+    }
+    return _headView;
+}
+
+- (MinePageCourseTipsView *)tipsView {
+    if (!_tipsView) {
+        _tipsView = [MinePageCourseTipsView shareIntance];
+        MJWeakSelf;
+        [_tipsView configWithTypeImage:@"minePage_course_introduce" headTitle:@"什么是小组课?" descMsg:@"小组课是老师根据教学目的编排的课程,固定时间进行1V5线上授课。您可根据老师开放的课程内容和您的时间安排,选择您感兴趣的课程组进行学习。" callback:^(COURSE_TIPS_ACTION action) {
+            [weakSelf courseTipsAction:action];
+        }];
+    }
+    return _tipsView;
+}
+
+- (MineCourseSettingView *)settingView {
+    if (!_settingView) {
+        _settingView = [MineCourseSettingView shareInstance];
+        MJWeakSelf;
+        [_settingView configWithCourseType:COURSE_TYPE_GROUP callback:^{
+            [weakSelf settingCourseAction];
+        }];
+    }
+    return _settingView;
+}
+
+- (void)settingCourseAction {
+    // 设置
+    KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+    webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/groupCreate"];
+    [self.naviController pushViewController:webCtrl animated:YES];
+}
+
+- (void)courseTipsAction:(COURSE_TIPS_ACTION)action {
+    switch (action) {
+        case COURSE_TIPS_ACTION_REMOVE:
+        {
+            self.hideTips = YES;
+            [self setNeedsLayout];
+        }
+            break;
+        case COURSE_TIPS_ACTION_STOPREMIND:
+        {
+            UserDefaultSetBoolForKey(YES, HIDE_GROUPCOURSE_TIPS);
+            self.hideTips = YES;
+            [self setNeedsLayout];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+/**
+ 设置没有数据时的显示
+ 
+ @param promptString 提示语
+ @param imgName 图片名称
+ @param view 显示在什么地方
+ */
+- (void)setPromptString:(NSString *)promptString imageName:(NSString *)imgName inView:(UIView *)view {
+    if (self.promptView != nil) {
+        [self.promptView removeFromSuperview];
+    }
+    else {
+        self.promptView = [[StateView alloc]init];
+        self.promptView.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight - 300);
+    }
+    _promptPlaceView = view;
+    //当请求不到数据时 ,自定义提示view 将会出现;
+    self.promptView.imageName = imgName;
+    self.promptView.alpha = 0.0f;
+    [self.promptView setText:promptString];
+    [view addSubview:self.promptView];
+}
+
+// 结束刷新后调用方法
+- (void)changePromptLabelStateWithArray:(NSMutableArray *)array {
+    NSInteger count;
+    if (array.count) {
+        count = array.count;
+    } else {
+        count = 0;
+    }
+    
+    [UIView animateWithDuration:0.1 animations:^{
+        [[self promptView] setAlpha:count ? 0.0f :1.0f ] ;
+    }] ;
+    
+}
+
+- (BOOL)networkAvaiable {
+    return [self checkNetworkAvaiable];
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 28 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.h

@@ -0,0 +1,28 @@
+//
+//  MineGroupCourseCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "LiveCourseModel.h"
+
+typedef NS_ENUM(NSInteger, COURSERSTATUS) {
+    COURSERSTATUS_ING,        // 进行中
+    COURSERSTATUS_NOTSALE,    // 未上架
+    COURSERSTATUS_APPLY,      // 报名中
+    COURSERSTATUS_COMPLETE,   // 已完成
+    COURSERSTATUS_CANCLE,     // 已取消
+    COURSERSTATUS_OUTSALE,    // 已下架
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MineGroupCourseCell : UICollectionViewCell
+
+- (void)configCellWithSource:(LiveCourseModel *)model groupStatus:(COURSERSTATUS)status hideStatusView:(BOOL)hideStatusView;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 138 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.m

@@ -0,0 +1,138 @@
+//
+//  MineGroupCourseCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/23.
+//
+
+#import "MineGroupCourseCell.h"
+
+@interface MineGroupCourseCell ()
+
+@property (weak, nonatomic) IBOutlet UIView *statusView;
+@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *coverImage;
+@property (weak, nonatomic) IBOutlet UILabel *courseName;
+
+@property (weak, nonatomic) IBOutlet UIView *orderUserBg;
+@property (weak, nonatomic) IBOutlet UILabel *orderUser;
+@property (weak, nonatomic) IBOutlet UILabel *courseTime;
+@property (weak, nonatomic) IBOutlet UILabel *tagLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
+@property (weak, nonatomic) IBOutlet UILabel *courseCount;
+@property (weak, nonatomic) IBOutlet UILabel *subjectLabel;
+@property (weak, nonatomic) IBOutlet UILabel *teacherDesc;
+
+@end
+
+@implementation MineGroupCourseCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    [self setupRadius];
+}
+
+- (void)setupRadius {
+    _statusView.layer.cornerRadius = 10.0f;
+    _statusView.layer.maskedCorners = kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner;
+}
+
+- (void)configCellWithSource:(LiveCourseModel *)model groupStatus:(COURSERSTATUS)status hideStatusView:(BOOL)hideStatusView {
+    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:[model.backgroundPic getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    self.courseName.text = [NSString returnNoNullStringWithString:model.courseGroupName];
+        
+    
+    
+    if (model.coursePrice > 0) {
+        NSString *mountMsg = [NSString formatAllDoubleNum:model.coursePrice];
+        self.priceLabel.text = mountMsg;
+        self.tagLabel.hidden = NO;
+    }
+    else {
+        self.priceLabel.text = [NSString  stringWithFormat:@"免费"];
+        self.tagLabel.hidden = YES;
+    }
+    
+    self.courseCount.text = [NSString stringWithFormat:@"/%.0f课时",model.courseNum];
+    // time
+    NSDateFormatter *formatter = [NSObject getDateformatter];
+    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *startDate = [formatter dateFromString:model.courseStartTime];
+    [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
+    NSString *courseBegin = [formatter stringFromDate:startDate];
+    self.courseTime.text = [NSString returnNoNullStringWithString:courseBegin];
+    self.subjectLabel.text = [NSString returnNoNullStringWithString:model.subjectName];
+    
+    NSString *introduce = model.courseIntroduce;
+    if (![NSString isEmptyString:introduce]) {
+        introduce = [introduce replaceAll:@"\n" WithString:@" "];
+        // 介绍
+        self.teacherDesc.text = [NSString returnNoNullStringWithString:introduce];
+    }
+    else {
+        self.teacherDesc.text = @"暂无介绍";
+    }
+    NSString *tipsString = [NSString stringWithFormat:@"剩余%.0f个名额", model.maxStudentNum - model.studentCount];
+    switch (status) {
+        case COURSERSTATUS_ING:
+        {
+            self.statusView.backgroundColor = HexRGB(0xd5fff7);
+            self.statusLabel.textColor = HexRGB(0x2dc7aa);
+            self.statusLabel.text = @"进行中";
+            self.orderUserBg.hidden = NO;
+            tipsString = [NSString stringWithFormat:@"%.0f人学习", model.studentCount];
+        }
+            break;
+        case COURSERSTATUS_NOTSALE:
+        {
+            self.statusView.backgroundColor = HexRGB(0xFFEEE3);
+            self.statusLabel.textColor = HexRGB(0xFF4E19);
+            self.statusLabel.text = @"未上架";
+            self.orderUserBg.hidden = NO;
+        }
+            break;
+        case COURSERSTATUS_APPLY:
+        {
+            self.statusView.backgroundColor = HexRGB(0xFFE7E7);
+            self.statusLabel.textColor = HexRGB(0xFF1919);
+            self.statusLabel.text = @"销售中";
+            self.orderUserBg.hidden = NO;
+        }
+            break;
+        case COURSERSTATUS_COMPLETE:
+        {
+            self.statusView.backgroundColor = HexRGB(0xDEF2FF);
+            self.statusLabel.textColor = HexRGB(0x008AE0);
+            self.statusLabel.text = @"已完成";
+            self.orderUserBg.hidden = NO;
+            tipsString = [NSString stringWithFormat:@"%.0f人学习", model.studentCount];
+        }
+            break;
+        case COURSERSTATUS_CANCLE:
+        {
+            self.statusView.backgroundColor = HexRGB(0xF0F0F0);
+            self.statusLabel.textColor = HexRGB(0x666666);
+            self.statusLabel.text = @"已取消";
+            self.orderUserBg.hidden = NO;
+        }
+            break;
+        case COURSERSTATUS_OUTSALE:
+        {
+            self.statusView.backgroundColor = HexRGB(0xF0F0F0);
+            self.statusLabel.textColor = HexRGB(0x666666);
+            self.statusLabel.text = @"已下架";
+            self.orderUserBg.hidden = NO;
+        }
+            break;
+        default:
+            break;
+    }
+    
+    self.orderUser.text = tipsString;
+
+}
+
+@end

+ 240 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/GroupCourse/MineGroupCourseCell.xib

@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" 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="23506"/>
+        <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"/>
+        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="MineGroupCourseCell">
+            <rect key="frame" x="0.0" y="0.0" width="364" height="333"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="364" height="333"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Dae-Tc-y6S">
+                        <rect key="frame" x="0.0" y="0.0" width="364" height="333"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_page_live_tag" translatesAutoresizingMaskIntoConstraints="NO" id="LSl-WN-lyr">
+                                <rect key="frame" x="12" y="15" width="20" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="20" id="afC-yN-MlU"/>
+                                    <constraint firstAttribute="height" constant="16" id="kYm-si-5jV"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" text="开课时间:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PED-4r-1td">
+                                <rect key="frame" x="39" y="13" width="62.666666666666657" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="os6-xs-oOT"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="749" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Un5-xJ-S8I">
+                                <rect key="frame" x="101.66666666666667" y="13" width="0.0" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="8dR-eH-03g"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="video_placeholder" translatesAutoresizingMaskIntoConstraints="NO" id="zyt-nS-jUd">
+                                <rect key="frame" x="12" y="46.000000000000014" width="340" height="191.33333333333337"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" secondItem="zyt-nS-jUd" secondAttribute="height" multiplier="16:9" id="pT9-N5-t5S"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="6"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="k4k-ze-92t">
+                                <rect key="frame" x="20" y="54" width="12" height="19"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4j0-Xt-fxB">
+                                        <rect key="frame" x="6" y="9.6666666666666643" width="0.0" height="0.0"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.40000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="4j0-Xt-fxB" secondAttribute="trailing" constant="6" id="4ra-0R-rvD"/>
+                                    <constraint firstAttribute="height" constant="19" id="MzN-hI-EpZ"/>
+                                    <constraint firstItem="4j0-Xt-fxB" firstAttribute="centerY" secondItem="k4k-ze-92t" secondAttribute="centerY" id="TCX-sf-BaN"/>
+                                    <constraint firstItem="4j0-Xt-fxB" firstAttribute="leading" secondItem="k4k-ze-92t" secondAttribute="leading" constant="6" id="bv4-Kl-CTe"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="3"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="N8D-SN-S9a">
+                                <rect key="frame" x="298" y="53" width="54" 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="x3j-c2-FfG">
+                                        <rect key="frame" x="12" y="4" width="30" height="12"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
+                                        <color key="textColor" red="1" green="0.20410433410000001" blue="0.1207968071" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="1" green="0.90588235289999997" blue="0.90588235289999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstItem="x3j-c2-FfG" firstAttribute="centerY" secondItem="N8D-SN-S9a" secondAttribute="centerY" id="A4I-Jb-SIG"/>
+                                    <constraint firstAttribute="height" constant="20" id="Ug3-XS-dlK"/>
+                                    <constraint firstItem="x3j-c2-FfG" firstAttribute="leading" secondItem="N8D-SN-S9a" secondAttribute="leading" constant="12" id="gAD-Mu-Oca"/>
+                                    <constraint firstAttribute="trailing" secondItem="x3j-c2-FfG" secondAttribute="trailing" constant="12" id="iIK-gJ-sPJ"/>
+                                </constraints>
+                            </view>
+                            <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="P46-t1-mZs">
+                                <rect key="frame" x="12" y="245.33333333333337" width="340" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="A9y-lc-QLk"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                <color key="textColor" red="0.074509803920000006" green="0.078431372550000003" blue="0.08235294118" 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="Fzh-Ag-f5R">
+                                <rect key="frame" x="12" y="271.33333333333331" width="340" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="wlL-Ur-sab"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2hY-gB-9ON">
+                                <rect key="frame" x="12" y="300" width="8" height="19"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NQC-C5-KUo">
+                                        <rect key="frame" x="4" y="9.6666666666666856" width="0.0" height="0.0"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                        <color key="textColor" red="1" green="0.40784313729999999" blue="0.1529411765" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="1" green="0.50196078430000002" blue="0.17254901959999999" alpha="0.070000000000000007" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="NQC-C5-KUo" secondAttribute="trailing" constant="4" id="Gzh-oT-pJ8"/>
+                                    <constraint firstAttribute="height" constant="19" id="OOr-Ec-Z30"/>
+                                    <constraint firstItem="NQC-C5-KUo" firstAttribute="centerY" secondItem="2hY-gB-9ON" secondAttribute="centerY" id="RDo-YK-zNr"/>
+                                    <constraint firstItem="NQC-C5-KUo" firstAttribute="leading" secondItem="2hY-gB-9ON" secondAttribute="leading" constant="4" id="j8y-mh-de6"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <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="T8z-Qn-U7N">
+                                <rect key="frame" x="318" y="297" width="0.0" height="24"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="24" id="Qtx-rm-7lf"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" name="DINAlternate-Bold" family="DIN Alternate" pointSize="20"/>
+                                <color key="textColor" red="0.95686274510000002" green="0.27058823529999998" blue="0.25490196079999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="/1课时" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mtc-dx-cg2">
+                                <rect key="frame" x="320" y="302" width="32" height="17"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="17" id="e52-fl-CUj"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                <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="UQU-S7-j0h">
+                                <rect key="frame" x="309" y="303" width="7" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="vgY-75-8rM"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" name="DINAlternate-Bold" family="DIN Alternate" pointSize="14"/>
+                                <color key="textColor" red="0.95686274510000002" green="0.27058823529999998" blue="0.25490196079999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="zyt-nS-jUd" firstAttribute="leading" secondItem="Dae-Tc-y6S" secondAttribute="leading" constant="12" id="3pI-qV-zoN"/>
+                            <constraint firstItem="PED-4r-1td" firstAttribute="centerY" secondItem="LSl-WN-lyr" secondAttribute="centerY" id="5GB-z3-7mW"/>
+                            <constraint firstAttribute="trailing" secondItem="Fzh-Ag-f5R" secondAttribute="trailing" constant="12" id="86k-PQ-STv"/>
+                            <constraint firstItem="PED-4r-1td" firstAttribute="leading" secondItem="LSl-WN-lyr" secondAttribute="trailing" constant="7" id="904-pf-hyI"/>
+                            <constraint firstItem="LSl-WN-lyr" firstAttribute="top" secondItem="Dae-Tc-y6S" secondAttribute="top" constant="15" id="BhM-3e-uKB"/>
+                            <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Un5-xJ-S8I" secondAttribute="trailing" constant="12" id="CDW-9P-H1r"/>
+                            <constraint firstItem="Un5-xJ-S8I" firstAttribute="centerY" secondItem="PED-4r-1td" secondAttribute="centerY" id="DJE-qI-0Fi"/>
+                            <constraint firstAttribute="trailing" secondItem="Mtc-dx-cg2" secondAttribute="trailing" constant="12" id="EDL-t0-v1u"/>
+                            <constraint firstItem="N8D-SN-S9a" firstAttribute="top" secondItem="zyt-nS-jUd" secondAttribute="top" constant="7" id="J5c-9D-ViV"/>
+                            <constraint firstItem="Fzh-Ag-f5R" firstAttribute="leading" secondItem="Dae-Tc-y6S" secondAttribute="leading" constant="12" id="JEW-3y-aiN"/>
+                            <constraint firstAttribute="bottom" secondItem="Mtc-dx-cg2" secondAttribute="bottom" constant="14" id="K67-Vl-4K5"/>
+                            <constraint firstItem="T8z-Qn-U7N" firstAttribute="bottom" secondItem="UQU-S7-j0h" secondAttribute="bottom" constant="2" id="Kyo-27-eRj"/>
+                            <constraint firstItem="Mtc-dx-cg2" firstAttribute="leading" secondItem="T8z-Qn-U7N" secondAttribute="trailing" constant="2" id="LZq-Mi-VKO"/>
+                            <constraint firstAttribute="trailing" secondItem="zyt-nS-jUd" secondAttribute="trailing" constant="12" id="NuO-1a-1U2"/>
+                            <constraint firstItem="P46-t1-mZs" firstAttribute="top" secondItem="zyt-nS-jUd" secondAttribute="bottom" constant="8" id="OIx-aV-yv6"/>
+                            <constraint firstItem="Un5-xJ-S8I" firstAttribute="leading" secondItem="PED-4r-1td" secondAttribute="trailing" id="Qig-ts-2g4"/>
+                            <constraint firstItem="N8D-SN-S9a" firstAttribute="trailing" secondItem="zyt-nS-jUd" secondAttribute="trailing" id="UKM-Y2-KOb"/>
+                            <constraint firstItem="k4k-ze-92t" firstAttribute="top" secondItem="zyt-nS-jUd" secondAttribute="top" constant="8" id="XQ2-a0-5H6"/>
+                            <constraint firstItem="k4k-ze-92t" firstAttribute="leading" secondItem="zyt-nS-jUd" secondAttribute="leading" constant="8" id="YOX-vx-Sos"/>
+                            <constraint firstItem="2hY-gB-9ON" firstAttribute="leading" secondItem="Dae-Tc-y6S" secondAttribute="leading" constant="12" id="Z5R-oL-pX0"/>
+                            <constraint firstItem="Mtc-dx-cg2" firstAttribute="bottom" secondItem="T8z-Qn-U7N" secondAttribute="bottom" constant="-2" id="Z8X-Yf-KM7"/>
+                            <constraint firstItem="2hY-gB-9ON" firstAttribute="top" relation="greaterThanOrEqual" secondItem="Fzh-Ag-f5R" secondAttribute="bottom" constant="8" id="b9j-4a-gzQ"/>
+                            <constraint firstItem="T8z-Qn-U7N" firstAttribute="leading" secondItem="UQU-S7-j0h" secondAttribute="trailing" constant="2" id="c4C-2Y-Igc"/>
+                            <constraint firstItem="P46-t1-mZs" firstAttribute="leading" secondItem="Dae-Tc-y6S" secondAttribute="leading" constant="12" id="cLb-Q7-75L"/>
+                            <constraint firstItem="LSl-WN-lyr" firstAttribute="leading" secondItem="Dae-Tc-y6S" secondAttribute="leading" constant="12" id="djJ-NM-ABN"/>
+                            <constraint firstItem="Fzh-Ag-f5R" firstAttribute="top" secondItem="P46-t1-mZs" secondAttribute="bottom" constant="4" id="eyD-JX-JlK"/>
+                            <constraint firstItem="zyt-nS-jUd" firstAttribute="top" secondItem="LSl-WN-lyr" secondAttribute="bottom" constant="15" id="gUR-ga-syu"/>
+                            <constraint firstAttribute="trailing" secondItem="P46-t1-mZs" secondAttribute="trailing" constant="12" id="gUl-TY-jUO"/>
+                            <constraint firstAttribute="bottom" secondItem="2hY-gB-9ON" secondAttribute="bottom" constant="14" id="lgo-HV-SxA"/>
+                            <constraint firstItem="T8z-Qn-U7N" firstAttribute="leading" secondItem="UQU-S7-j0h" secondAttribute="trailing" constant="2" id="pgc-sR-Jz1"/>
+                            <constraint firstItem="Un5-xJ-S8I" firstAttribute="centerY" secondItem="PED-4r-1td" secondAttribute="centerY" id="tJU-te-GbL"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+            </view>
+            <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
+            <constraints>
+                <constraint firstItem="Dae-Tc-y6S" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="9uj-WI-gJP"/>
+                <constraint firstItem="Dae-Tc-y6S" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="Ssz-xD-z3k"/>
+                <constraint firstAttribute="bottom" secondItem="Dae-Tc-y6S" secondAttribute="bottom" id="Ycu-Dd-GuW"/>
+                <constraint firstAttribute="trailing" secondItem="Dae-Tc-y6S" secondAttribute="trailing" id="zPH-It-Nf1"/>
+            </constraints>
+            <size key="customSize" width="364" height="333"/>
+            <connections>
+                <outlet property="courseCount" destination="Mtc-dx-cg2" id="031-yt-iId"/>
+                <outlet property="courseName" destination="P46-t1-mZs" id="Y0K-O1-pIU"/>
+                <outlet property="courseTime" destination="Un5-xJ-S8I" id="p0C-n4-iXZ"/>
+                <outlet property="coverImage" destination="zyt-nS-jUd" id="hx6-IH-Fal"/>
+                <outlet property="orderUser" destination="NQC-C5-KUo" id="6dr-Nj-P8X"/>
+                <outlet property="orderUserBg" destination="2hY-gB-9ON" id="hq2-P1-bBZ"/>
+                <outlet property="priceLabel" destination="T8z-Qn-U7N" id="EOX-E0-d43"/>
+                <outlet property="statusLabel" destination="x3j-c2-FfG" id="ckC-nN-B3V"/>
+                <outlet property="statusView" destination="N8D-SN-S9a" id="nhg-Cr-LOt"/>
+                <outlet property="subjectLabel" destination="4j0-Xt-fxB" id="0qz-ac-uWM"/>
+                <outlet property="tagLabel" destination="UQU-S7-j0h" id="kC2-qp-6QG"/>
+                <outlet property="teacherDesc" destination="Fzh-Ag-f5R" id="y2F-z3-xgX"/>
+            </connections>
+            <point key="canvasLocation" x="282.44274809160305" y="119.36619718309859"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="mine_page_live_tag" width="20" height="16"/>
+        <image name="video_placeholder" width="103" height="72"/>
+    </resources>
+</document>

+ 7 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.m

@@ -28,6 +28,7 @@
 @property (weak, nonatomic) IBOutlet UIView *subjectView;
 
 @property (weak, nonatomic) IBOutlet UIView *starBgView;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *starBgWidth;
 
 @property (weak, nonatomic) IBOutlet UILabel *fansCount;
 
@@ -53,6 +54,11 @@
 
 @implementation MinePageTopView
 
+- (void)hideStarBgView {
+    self.starBgView.hidden = YES;
+    self.starBgWidth.constant = 0.0f;
+}
+
 - (void)awakeFromNib {
     [super awakeFromNib];
     CAGradientLayer *styleLayer = [UIView createGradientLayerFromColor:HexRGBAlpha(0x5CD6D6, 0.07) startPoint:CGPointMake(1, 1) endColor:HexRGBAlpha(0xffffff, 0.03) endPoint:CGPointMake(0, 0.16) bounds:CGRectMake(0, 0, (KPortraitWidth - 14 * 2 - 11) / 2, 36)];
@@ -66,6 +72,7 @@
     [self.tagScroll mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.top.bottom.mas_equalTo(self.subjectView);
     }];
+    [self hideStarBgView];
 }
 
 + (instancetype)shareInstance {

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.xib

@@ -329,6 +329,7 @@
                 <outlet property="finishCourse" destination="WdG-ah-bQ7" id="kTh-1z-CZK"/>
                 <outlet property="introduceLabel" destination="PZD-oz-8cA" id="EJj-a3-yl6"/>
                 <outlet property="starBgView" destination="j04-k1-RIV" id="76r-zk-VWm"/>
+                <outlet property="starBgWidth" destination="y0S-Fk-5a6" id="72p-7y-Dic"/>
                 <outlet property="starView" destination="7YI-eG-JcD" id="P33-L0-TAr"/>
                 <outlet property="styleColorLayer" destination="USe-oC-N7T" id="kL9-ou-IXw"/>
                 <outlet property="subjectView" destination="fZT-24-HFt" id="A3q-LS-oWX"/>

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.m

@@ -158,7 +158,7 @@
         }];
     }
     else if (self.selectIndex == 2) { // 直播课
-        [KSNetworkingManager LiveCourseGroupRequest:KS_POST groupStatus:@"APPLY" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [KSNetworkingManager LiveOrGroupCourseGroupRequest:KS_POST courseType:@"LIVE" groupStatus:@"APPLY" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
             [self endRefresh];
             if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
                 NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];

+ 1 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MineLiveCourseGroupCell.m

@@ -88,7 +88,6 @@
             self.statusLabel.textColor = HexRGB(0x2dc7aa);
             self.statusLabel.text = @"进行中";
             self.orderUserBg.hidden = NO;
-            self.statusView.hidden = NO;
         }
             break;
         case COURSERSTATUS_NOTSALE:
@@ -96,7 +95,7 @@
             self.statusView.backgroundColor = HexRGB(0xFFEEE3);
             self.statusLabel.textColor = HexRGB(0xFF4E19);
             self.statusLabel.text = @"未上架";
-            self.orderUserBg.hidden = YES;
+            self.orderUserBg.hidden = NO; // 设计要求需要显示
         }
             break;
         case COURSERSTATUS_APPLY:
@@ -113,7 +112,6 @@
             self.statusLabel.textColor = HexRGB(0x008AE0);
             self.statusLabel.text = @"已完成";
             self.orderUserBg.hidden = NO;
-            
         }
             break;
         case COURSERSTATUS_CANCLE:

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MinePageLiveCourseView.m

@@ -105,7 +105,7 @@
 }
 
 - (void)requestData {
-    [KSNetworkingManager LiveCourseGroupRequest:KS_POST groupStatus:@"APPLY" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager LiveOrGroupCourseGroupRequest:KS_POST courseType:@"LIVE" groupStatus:@"APPLY" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
         [self endRefresh];
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
             NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageTipsView/MineCourseSettingView.h

@@ -10,6 +10,7 @@
 typedef NS_ENUM(NSInteger, COURSE_TYPE) {
     COURSE_TYPE_VIP,
     COURSE_TYPE_ACCOMPANY,
+    COURSE_TYPE_GROUP,
     COURSE_TYPE_LIVE,
     COURSE_TYPE_VDIEO,
     COURSE_TYPE_MUSIC,

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageTipsView/MineCourseSettingView.m

@@ -60,6 +60,12 @@
             descTitle = @"设置趣纠课";
         }
             break;
+        case COURSE_TYPE_GROUP:
+        {
+            imgName = @"mine_info_create_groupCourse";
+            descTitle = @"创建小组课";
+        }
+            break;
         case COURSE_TYPE_LIVE:
         {
             imgName = @"mine_info_create_LiveCourse";

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineActionView.h

@@ -13,7 +13,7 @@ typedef NS_ENUM(NSInteger, MINEVIEWTYPE) {
     MINEVIEWTYPE_MIEN,     // 个人风采
     MINEVIEWTYPE_STARTBOARDCAST, // 开启直播
     MINEVIEWTYPE_ORDER,    // 商品订单
-    MINEVIEWTYPE_ACCOMPANY, // 趣纠课设置
+    MINEVIEWTYPE_GROUP, // 小组课设置
     MINEVIEWTYPE_BOARDCASTCOURSE, // 直播课
     MINEVIEWTYPE_VIDEOCOURSE,  // 视频课
     MINEVIEWTYPE_EXTENDPLAN, // 推广计划

+ 0 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineHeadView.m

@@ -6,7 +6,6 @@
 //
 
 #import "MineHeadView.h"
-#import "KSStarView.h"
 #import <UIImageView+DisplayImage.h>
 
 @interface MineHeadView ()
@@ -17,8 +16,6 @@
 
 @property (nonatomic, copy) MineViewCallback callback;
 
-
-
 @property (weak, nonatomic) IBOutlet UIImageView *viperImage;
 
 @property (weak, nonatomic) IBOutlet UIImageView *firstImage;

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineTeachToolView.m

@@ -38,7 +38,7 @@
         if (self.isMember == NO && index == self.imageArray.count - 1) {
             return;
         }
-        if (self.isMember == NO && index == 3) {
+        if (self.isMember == NO && index == 4) {
             tagHandle = YES;
             continue;
         }
@@ -81,21 +81,21 @@
 
 - (NSMutableArray *)imageArray {
     if (!_imageArray) {
-        _imageArray = [NSMutableArray arrayWithArray:@[@"tool_myLive",@"tool_liveCourse",@"tool_videoCourse",@"tool_musicRoom",/*@"tool_myAccompany",*/@"tool_homework",@"tool_evaluate",@"tool_courseware",@"tool_award"]];
+        _imageArray = [NSMutableArray arrayWithArray:@[@"tool_myLive",@"tool_myGroupCourse",@"tool_liveCourse",@"tool_videoCourse",@"tool_musicRoom",@"tool_homework",@"tool_evaluate",@"tool_courseware",@"tool_award"]];
     }
     return _imageArray;
 }
 
 - (NSMutableArray *)titleArray {
     if (!_titleArray) {
-        _titleArray = [NSMutableArray arrayWithArray:@[@"我的直播",@"直播课",@"视频课",@"云酷琴房",/*@"趣纠课设置",*/@"课后作业",@"课后评价",@"我的课件",@"活动奖品"]];
+        _titleArray = [NSMutableArray arrayWithArray:@[@"我的直播",@"小组课",@"直播课",@"视频课",@"云酷琴房",@"课后作业",@"课后评价",@"我的课件",@"活动奖品"]];
     }
     return _titleArray;
 }
 
 - (NSMutableArray *)tagArray {
     if (!_tagArray) {
-        _tagArray = [NSMutableArray arrayWithArray:@[@(MINEVIEWTYPE_STARTBOARDCAST),@(MINEVIEWTYPE_BOARDCASTCOURSE),@(MINEVIEWTYPE_VIDEOCOURSE),@(MINEVIEWTYPE_MUSICROOM),/*@(MINEVIEWTYPE_ACCOMPANY),*/@(MINEVIEWTYPE_HOMEWORK),@(MINEVIEWTYPE_EVALUATE),@(MINENAVATYPE_COURSEWARE),@(MINEVIEWTYPE_AWARD)]];
+        _tagArray = [NSMutableArray arrayWithArray:@[@(MINEVIEWTYPE_STARTBOARDCAST),@(MINEVIEWTYPE_GROUP),@(MINEVIEWTYPE_BOARDCASTCOURSE),@(MINEVIEWTYPE_VIDEOCOURSE),@(MINEVIEWTYPE_MUSICROOM),@(MINEVIEWTYPE_HOMEWORK),@(MINEVIEWTYPE_EVALUATE),@(MINENAVATYPE_COURSEWARE),@(MINEVIEWTYPE_AWARD)]];
     }
     return _tagArray;
 }

+ 5 - 36
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/TenantMineHeadView.m

@@ -6,7 +6,6 @@
 //
 
 #import "TenantMineHeadView.h"
-#import "KSStarView.h"
 
 @interface TenantMineHeadView ()
 
@@ -57,41 +56,11 @@
         viperImage = @"";
     }
     [self.viperImage setImage:[UIImage imageNamed:viperImage]];
-    // 学历标识去掉
-//    BOOL hasDegreeAuth = infoMessage.degreeFlag;
-//    BOOL hasTeacherAuth = infoMessage.teacherFlag;
-//    
-//    if (hasDegreeAuth && hasTeacherAuth) {
-//        [self.firstImage setImage:[UIImage imageNamed:@"education_icon"]];
-//        self.firstImage.hidden = NO;
-//        self.firstImageWidth.constant = 39.0f;
-//        [self.secondImage setImage:[UIImage imageNamed:@"qualification_icon"]];
-//        self.secondImage.hidden = NO;
-//        self.secondImageWidth.constant = 39.0f;
-//    }
-//    else {
-//        if (hasDegreeAuth) {
-//            [self.firstImage setImage:[UIImage imageNamed:@"education_icon"]];
-//            self.firstImage.hidden = NO;
-//            self.firstImageWidth.constant = 39.0f;
-//            self.secondImage.hidden = YES;
-//            self.secondImageWidth.constant = 0.0f;
-//        }
-//        else if (hasTeacherAuth) {
-//            [self.firstImage setImage:[UIImage imageNamed:@"qualification_icon"]];
-//            self.firstImage.hidden = NO;
-//            self.firstImageWidth.constant = 39.0f;
-//            self.secondImage.hidden = YES;
-//            self.secondImageWidth.constant = 0.0f;
-//        }
-//        else {
-            self.firstImage.hidden = YES;
-            self.firstImageWidth.constant = 0.0f;
-            self.secondImage.hidden = YES;
-            self.secondImageWidth.constant = 0.0f;
-//        }
-//    }
-    
+
+    self.firstImage.hidden = YES;
+    self.firstImageWidth.constant = 0.0f;
+    self.secondImage.hidden = YES;
+    self.secondImageWidth.constant = 0.0f;
     
     if (![NSString isEmptyString:infoMessage.heardUrl]) {
         [self.userAvatal sd_setImageWithURL:[NSURL URLWithString:[infoMessage.heardUrl getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:TEACHER_AVATAR]];

部分文件因为文件数量过多而无法显示