Steven 5 месяцев назад
Родитель
Сommit
50b2b539e1
58 измененных файлов с 3061 добавлено и 41 удалено
  1. 76 0
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForStudent/KulexiuForStudent.xcodeproj/xcshareddata/xcschemes/KulexiuForStudent.xcscheme
  3. 6 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/Contents.json
  4. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/Contents.json
  5. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/arrange_course_icon@2x.png
  6. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/arrange_course_icon@3x.png
  7. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/Contents.json
  8. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/arrange_live_tag@2x.png
  9. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/arrange_live_tag@3x.png
  10. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/Contents.json
  11. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/arrange_search_green@2x.png
  12. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/arrange_search_green@3x.png
  13. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/Contents.json
  14. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/arrange_sort_down@2x.png
  15. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/arrange_sort_down@3x.png
  16. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/Contents.json
  17. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/arrange_sort_none@2x.png
  18. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/arrange_sort_none@3x.png
  19. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/Contents.json
  20. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/arrange_sort_up@2x.png
  21. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/arrange_sort_up@3x.png
  22. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/Contents.json
  23. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/course_desc_top@2x.png
  24. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/course_desc_top@3x.png
  25. 24 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h
  26. 46 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m
  27. 25 22
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Controller/HomeArrangeCourseController.m
  28. 32 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Model/ArrangeTeacherModel.h
  29. 183 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Model/ArrangeTeacherModel.m
  30. 25 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.h
  31. 70 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.m
  32. 72 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.xib
  33. 27 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.h
  34. 37 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.m
  35. 111 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.xib
  36. 20 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.h
  37. 78 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.m
  38. 168 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.xib
  39. 336 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeAccompanyCourseView.m
  40. 2 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeLiveCourseView.m
  41. 32 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.h
  42. 117 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.m
  43. 86 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.xib
  44. 26 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.h
  45. 218 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.m
  46. 37 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.xib
  47. 15 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.h
  48. 51 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.m
  49. 106 16
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.xib
  50. 338 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeVIPCourseView.m
  51. 2 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeVideoCourseView.m
  52. 16 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.h
  53. 39 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.m
  54. 201 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.xib
  55. 16 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.h
  56. 48 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.m
  57. 215 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.xib
  58. 5 0
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

+ 76 - 0
KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj

@@ -395,6 +395,14 @@
 		BC3332732CEC235600649FF9 /* MusicSquareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3332722CEC235600649FF9 /* MusicSquareViewController.m */; };
 		BC3332762CEC259F00649FF9 /* MusicSquareNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3332752CEC259F00649FF9 /* MusicSquareNavView.m */; };
 		BC3332782CEC25A900649FF9 /* MusicSquareNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC3332772CEC25A900649FF9 /* MusicSquareNavView.xib */; };
+		BC33327B2CEC32AA00649FF9 /* CourseDescAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC33327A2CEC32AA00649FF9 /* CourseDescAlertView.m */; };
+		BC33327D2CEC32B200649FF9 /* CourseDescAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC33327C2CEC32B200649FF9 /* CourseDescAlertView.xib */; };
+		BC3332812CEC356500649FF9 /* CourseTeacherDescCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC33327F2CEC356500649FF9 /* CourseTeacherDescCell.m */; };
+		BC3332822CEC356500649FF9 /* CourseTeacherDescCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC3332802CEC356500649FF9 /* CourseTeacherDescCell.xib */; };
+		BC3332862CEC35B000649FF9 /* LiveCourseArrangeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3332842CEC35B000649FF9 /* LiveCourseArrangeCell.m */; };
+		BC3332872CEC35B000649FF9 /* LiveCourseArrangeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC3332852CEC35B000649FF9 /* LiveCourseArrangeCell.xib */; };
+		BC33328B2CEC35D000649FF9 /* VideoCourseArrangeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3332892CEC35D000649FF9 /* VideoCourseArrangeCell.m */; };
+		BC33328C2CEC35D000649FF9 /* VideoCourseArrangeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC33328A2CEC35D000649FF9 /* VideoCourseArrangeCell.xib */; };
 		BC36A5082AB406A5002FEFB1 /* GroupOwnerTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC36A5072AB406A5002FEFB1 /* GroupOwnerTagView.m */; };
 		BC36A50A2AB406AB002FEFB1 /* GroupOwnerTagView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC36A5092AB406AB002FEFB1 /* GroupOwnerTagView.xib */; };
 		BC38C3E82AF893B400ABFCC2 /* KSPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC38C3D52AF893B300ABFCC2 /* KSPlayerView.m */; };
@@ -794,6 +802,12 @@
 		BCC0F6E62A8CE24400C4EFA4 /* WhiteUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0F6E02A8CE24400C4EFA4 /* WhiteUtils.m */; };
 		BCC0F6E92A8CE37E00C4EFA4 /* VideoMaskView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0F6E72A8CE37D00C4EFA4 /* VideoMaskView.m */; };
 		BCC0F6ED2A8CE4AF00C4EFA4 /* ZoomControl.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0F6EB2A8CE4AF00C4EFA4 /* ZoomControl.m */; };
+		BCC17DEC2CEC5CBE00808B60 /* HomeArrangeRankView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC17DEB2CEC5CBE00808B60 /* HomeArrangeRankView.m */; };
+		BCC17DEE2CEC5CC600808B60 /* HomeArrangeRankView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC17DED2CEC5CC600808B60 /* HomeArrangeRankView.xib */; };
+		BCC17DF12CEC641300808B60 /* HomeArrangeRankButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC17DF02CEC641300808B60 /* HomeArrangeRankButtonView.m */; };
+		BCC17DF32CEC641A00808B60 /* HomeArrangeRankButtonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC17DF22CEC641A00808B60 /* HomeArrangeRankButtonView.xib */; };
+		BCC17DF62CEC6B2A00808B60 /* ArrangeRecentRankButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC17DF52CEC6B2A00808B60 /* ArrangeRecentRankButtonView.m */; };
+		BCC17DF82CEC6B4100808B60 /* ArrangeRecentRankButtonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC17DF72CEC6B4100808B60 /* ArrangeRecentRankButtonView.xib */; };
 		BCC408ED2AFCE6A000C60249 /* KSVideoCropViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC408EB2AFCE69F00C60249 /* KSVideoCropViewController.m */; };
 		BCC409002AFCE6B500C60249 /* VideoCoverChooseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC408EF2AFCE6B200C60249 /* VideoCoverChooseView.m */; };
 		BCC409012AFCE6B500C60249 /* MusicPublicContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC408F02AFCE6B200C60249 /* MusicPublicContentView.xib */; };
@@ -868,6 +882,7 @@
 		BCCE95EF2AB05ED000AB6385 /* TenantHotAlbumView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCCE95EE2AB05ED000AB6385 /* TenantHotAlbumView.xib */; };
 		BCCE95F32AB05F3D00AB6385 /* TenantHotAlbumCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCCE95F12AB05F3D00AB6385 /* TenantHotAlbumCell.m */; };
 		BCCE95F42AB05F3D00AB6385 /* TenantHotAlbumCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCCE95F22AB05F3D00AB6385 /* TenantHotAlbumCell.xib */; };
+		BCD1603A2CEC808700A78B43 /* ArrangeTeacherModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD160392CEC808700A78B43 /* ArrangeTeacherModel.m */; };
 		BCD457A1286313D70010B493 /* NotiferNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD4579E286313D70010B493 /* NotiferNavView.m */; };
 		BCD457A2286313D70010B493 /* NotiferNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCD457A0286313D70010B493 /* NotiferNavView.xib */; };
 		BCD457AB286469600010B493 /* PublicNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD457A92864695F0010B493 /* PublicNoticeView.m */; };
@@ -1682,6 +1697,18 @@
 		BC3332742CEC259F00649FF9 /* MusicSquareNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicSquareNavView.h; sourceTree = "<group>"; };
 		BC3332752CEC259F00649FF9 /* MusicSquareNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MusicSquareNavView.m; sourceTree = "<group>"; };
 		BC3332772CEC25A900649FF9 /* MusicSquareNavView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MusicSquareNavView.xib; sourceTree = "<group>"; };
+		BC3332792CEC32AA00649FF9 /* CourseDescAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseDescAlertView.h; sourceTree = "<group>"; };
+		BC33327A2CEC32AA00649FF9 /* CourseDescAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseDescAlertView.m; sourceTree = "<group>"; };
+		BC33327C2CEC32B200649FF9 /* CourseDescAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseDescAlertView.xib; sourceTree = "<group>"; };
+		BC33327E2CEC356500649FF9 /* CourseTeacherDescCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseTeacherDescCell.h; sourceTree = "<group>"; };
+		BC33327F2CEC356500649FF9 /* CourseTeacherDescCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseTeacherDescCell.m; sourceTree = "<group>"; };
+		BC3332802CEC356500649FF9 /* CourseTeacherDescCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseTeacherDescCell.xib; sourceTree = "<group>"; };
+		BC3332832CEC35B000649FF9 /* LiveCourseArrangeCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveCourseArrangeCell.h; sourceTree = "<group>"; };
+		BC3332842CEC35B000649FF9 /* LiveCourseArrangeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveCourseArrangeCell.m; sourceTree = "<group>"; };
+		BC3332852CEC35B000649FF9 /* LiveCourseArrangeCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LiveCourseArrangeCell.xib; sourceTree = "<group>"; };
+		BC3332882CEC35D000649FF9 /* VideoCourseArrangeCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoCourseArrangeCell.h; sourceTree = "<group>"; };
+		BC3332892CEC35D000649FF9 /* VideoCourseArrangeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VideoCourseArrangeCell.m; sourceTree = "<group>"; };
+		BC33328A2CEC35D000649FF9 /* VideoCourseArrangeCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VideoCourseArrangeCell.xib; sourceTree = "<group>"; };
 		BC36A5062AB406A5002FEFB1 /* GroupOwnerTagView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroupOwnerTagView.h; sourceTree = "<group>"; };
 		BC36A5072AB406A5002FEFB1 /* GroupOwnerTagView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroupOwnerTagView.m; sourceTree = "<group>"; };
 		BC36A5092AB406AB002FEFB1 /* GroupOwnerTagView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GroupOwnerTagView.xib; sourceTree = "<group>"; };
@@ -2300,6 +2327,15 @@
 		BCC0F6E82A8CE37E00C4EFA4 /* VideoMaskView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoMaskView.h; sourceTree = "<group>"; };
 		BCC0F6EB2A8CE4AF00C4EFA4 /* ZoomControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZoomControl.m; sourceTree = "<group>"; };
 		BCC0F6EC2A8CE4AF00C4EFA4 /* ZoomControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZoomControl.h; sourceTree = "<group>"; };
+		BCC17DEA2CEC5CBE00808B60 /* HomeArrangeRankView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeArrangeRankView.h; sourceTree = "<group>"; };
+		BCC17DEB2CEC5CBE00808B60 /* HomeArrangeRankView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeArrangeRankView.m; sourceTree = "<group>"; };
+		BCC17DED2CEC5CC600808B60 /* HomeArrangeRankView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeArrangeRankView.xib; sourceTree = "<group>"; };
+		BCC17DEF2CEC641300808B60 /* HomeArrangeRankButtonView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeArrangeRankButtonView.h; sourceTree = "<group>"; };
+		BCC17DF02CEC641300808B60 /* HomeArrangeRankButtonView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeArrangeRankButtonView.m; sourceTree = "<group>"; };
+		BCC17DF22CEC641A00808B60 /* HomeArrangeRankButtonView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeArrangeRankButtonView.xib; sourceTree = "<group>"; };
+		BCC17DF42CEC6B2A00808B60 /* ArrangeRecentRankButtonView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArrangeRecentRankButtonView.h; sourceTree = "<group>"; };
+		BCC17DF52CEC6B2A00808B60 /* ArrangeRecentRankButtonView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ArrangeRecentRankButtonView.m; sourceTree = "<group>"; };
+		BCC17DF72CEC6B4100808B60 /* ArrangeRecentRankButtonView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ArrangeRecentRankButtonView.xib; sourceTree = "<group>"; };
 		BCC408EB2AFCE69F00C60249 /* KSVideoCropViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSVideoCropViewController.m; sourceTree = "<group>"; };
 		BCC408EC2AFCE69F00C60249 /* KSVideoCropViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSVideoCropViewController.h; sourceTree = "<group>"; };
 		BCC408EE2AFCE6B100C60249 /* MusicPubHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicPubHeader.h; sourceTree = "<group>"; };
@@ -2397,6 +2433,8 @@
 		BCCE95F02AB05F3D00AB6385 /* TenantHotAlbumCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TenantHotAlbumCell.h; sourceTree = "<group>"; };
 		BCCE95F12AB05F3D00AB6385 /* TenantHotAlbumCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TenantHotAlbumCell.m; sourceTree = "<group>"; };
 		BCCE95F22AB05F3D00AB6385 /* TenantHotAlbumCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TenantHotAlbumCell.xib; sourceTree = "<group>"; };
+		BCD160382CEC808700A78B43 /* ArrangeTeacherModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArrangeTeacherModel.h; sourceTree = "<group>"; };
+		BCD160392CEC808700A78B43 /* ArrangeTeacherModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ArrangeTeacherModel.m; sourceTree = "<group>"; };
 		BCD4579E286313D70010B493 /* NotiferNavView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotiferNavView.m; sourceTree = "<group>"; };
 		BCD4579F286313D70010B493 /* NotiferNavView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotiferNavView.h; sourceTree = "<group>"; };
 		BCD457A0286313D70010B493 /* NotiferNavView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NotiferNavView.xib; sourceTree = "<group>"; };
@@ -4233,6 +4271,8 @@
 		BC2C1BA42CEB4FA800EDEB97 /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				BCD160382CEC808700A78B43 /* ArrangeTeacherModel.h */,
+				BCD160392CEC808700A78B43 /* ArrangeTeacherModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -4254,6 +4294,27 @@
 				BC2C1BB62CEB556E00EDEB97 /* HomeArrangeLiveCourseView.m */,
 				BC2C1BB82CEB557700EDEB97 /* HomeArrangeVideoCourseView.h */,
 				BC2C1BB92CEB557700EDEB97 /* HomeArrangeVideoCourseView.m */,
+				BC33327E2CEC356500649FF9 /* CourseTeacherDescCell.h */,
+				BC33327F2CEC356500649FF9 /* CourseTeacherDescCell.m */,
+				BC3332802CEC356500649FF9 /* CourseTeacherDescCell.xib */,
+				BC3332832CEC35B000649FF9 /* LiveCourseArrangeCell.h */,
+				BC3332842CEC35B000649FF9 /* LiveCourseArrangeCell.m */,
+				BC3332852CEC35B000649FF9 /* LiveCourseArrangeCell.xib */,
+				BC3332882CEC35D000649FF9 /* VideoCourseArrangeCell.h */,
+				BC3332892CEC35D000649FF9 /* VideoCourseArrangeCell.m */,
+				BC33328A2CEC35D000649FF9 /* VideoCourseArrangeCell.xib */,
+				BC3332792CEC32AA00649FF9 /* CourseDescAlertView.h */,
+				BC33327A2CEC32AA00649FF9 /* CourseDescAlertView.m */,
+				BC33327C2CEC32B200649FF9 /* CourseDescAlertView.xib */,
+				BCC17DEA2CEC5CBE00808B60 /* HomeArrangeRankView.h */,
+				BCC17DEB2CEC5CBE00808B60 /* HomeArrangeRankView.m */,
+				BCC17DED2CEC5CC600808B60 /* HomeArrangeRankView.xib */,
+				BCC17DF42CEC6B2A00808B60 /* ArrangeRecentRankButtonView.h */,
+				BCC17DF52CEC6B2A00808B60 /* ArrangeRecentRankButtonView.m */,
+				BCC17DF72CEC6B4100808B60 /* ArrangeRecentRankButtonView.xib */,
+				BCC17DEF2CEC641300808B60 /* HomeArrangeRankButtonView.h */,
+				BCC17DF02CEC641300808B60 /* HomeArrangeRankButtonView.m */,
+				BCC17DF22CEC641A00808B60 /* HomeArrangeRankButtonView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -6301,6 +6362,7 @@
 				275FA1EF27E7351900CFEA2E /* KSUpdateAlert.xib in Resources */,
 				BC802DBA28BC8C810079E350 /* HomeHotVideoCourseView.xib in Resources */,
 				BCCE95D72AB043F900AB6385 /* subject_Ani.json in Resources */,
+				BCC17DF32CEC641A00808B60 /* HomeArrangeRankButtonView.xib in Resources */,
 				BC756CBE28FE7D6000AA9ECB /* UserDetailBodyView.xib in Resources */,
 				BC60E3CE287D552800B05441 /* DeleteAccountBodyView.xib in Resources */,
 				BCFDA61328BC8FCE0022B497 /* HomeHotVideoCell.xib in Resources */,
@@ -6382,6 +6444,7 @@
 				BCFDA65028BCA2000022B497 /* live_animation_3.png in Resources */,
 				BC71D252288804CD0010F14B /* img_29.png in Resources */,
 				BC71D24D288804CD0010F14B /* img_12.png in Resources */,
+				BCC17DF82CEC6B4100808B60 /* ArrangeRecentRankButtonView.xib in Resources */,
 				BC119275280FB01100A716F7 /* AccompanyHomeworkCell.xib in Resources */,
 				BC71D1022881A2420010F14B /* WeiboSDK.bundle in Resources */,
 				BC7F7B772C92DD9500265AE1 /* KSDeleteAccountTipsAlert.xib in Resources */,
@@ -6479,6 +6542,7 @@
 				BC71D260288804CD0010F14B /* img_44.png in Resources */,
 				BC71D26C288804CD0010F14B /* img_9.png in Resources */,
 				BC736A93288036E8004A9B0A /* MyVideoSearchView.xib in Resources */,
+				BC3332872CEC35B000649FF9 /* LiveCourseArrangeCell.xib in Resources */,
 				BCC583C528A9EC6400BAB4CF /* cloud_animation_17.png in Resources */,
 				BC0D953B2AC2AB1500E54D3F /* PasswordModifyBodyView.xib in Resources */,
 				BCC583CE28A9EC6400BAB4CF /* cloud_animation_0.png in Resources */,
@@ -6523,8 +6587,10 @@
 				BC31BF1E2B21925700F7D538 /* TunerSettingView.xib in Resources */,
 				BC71D259288804CD0010F14B /* img_48.png in Resources */,
 				BC71D274288804CD0010F14B /* img_37.png in Resources */,
+				BC3332822CEC356500649FF9 /* CourseTeacherDescCell.xib in Resources */,
 				BCFE53E82812765600AD6786 /* HomeHotAlbumCell.xib in Resources */,
 				BC119239280ED98E00A716F7 /* AccompanyCourseCell.xib in Resources */,
+				BC33327D2CEC32B200649FF9 /* CourseDescAlertView.xib in Resources */,
 				BC27A076280FF61300F91E27 /* AccompanyDetailBottomView.xib in Resources */,
 				BCBFDF4D28115C7A0052AFE5 /* HomeHotCourseView.xib in Resources */,
 				BC71D2892888083B0010F14B /* tabbar5.json in Resources */,
@@ -6620,6 +6686,7 @@
 				BC71D0F42881A2420010F14B /* UMCommonLog.bundle in Resources */,
 				BC8A45C1283DDD7100094BBB /* synthgms.sf2 in Resources */,
 				BC71D24B288804CD0010F14B /* img_2.png in Resources */,
+				BCC17DEE2CEC5CC600808B60 /* HomeArrangeRankView.xib in Resources */,
 				BC0D1F72281015B000C5D9E5 /* VideoCourseCell.xib in Resources */,
 				BCECE24A2B3D670500C0D555 /* FeedbackSortView.xib in Resources */,
 				BCFDA64A28BCA2000022B497 /* accomapny_animation.json in Resources */,
@@ -6633,6 +6700,7 @@
 				BC31BF112B21925700F7D538 /* tick.wav in Resources */,
 				BC11927B280FB07F00A716F7 /* AccompanyArrangeCell.xib in Resources */,
 				BC98527E2BCCC571008F0435 /* AlbumSwitchView.xib in Resources */,
+				BC33328C2CEC35D000649FF9 /* VideoCourseArrangeCell.xib in Resources */,
 				BCCE95C92AB0363100AB6385 /* TenantDarkSearhView.xib in Resources */,
 				BC40B9FF281177BD00DEC0D1 /* HomeInformationCell.xib in Resources */,
 				BC31BF2E2B21925700F7D538 /* WidgetDotView.xib in Resources */,
@@ -6874,6 +6942,7 @@
 				2723B66427F15CFC00E0B90B /* VeriCheckView.m in Sources */,
 				2779354C27E324A70010E277 /* KSGifRefreshHeader.m in Sources */,
 				BC2C1BAC2CEB505600EDEB97 /* HomeArrangeNavView.m in Sources */,
+				BCC17DEC2CEC5CBE00808B60 /* HomeArrangeRankView.m in Sources */,
 				BC11925E280FA89A00A716F7 /* HomeworkBodyView.m in Sources */,
 				275FA1EB27E7351900CFEA2E /* KSBaseWKWebViewController.m in Sources */,
 				BCC409072AFCE6B500C60249 /* MusicPublicContentView.m in Sources */,
@@ -6913,6 +6982,7 @@
 				BC119241280ED9E000A716F7 /* AccompanyDetailViewController.m in Sources */,
 				BCB6346F27F6D29600ACFDCF /* LiveroomTimeManager.m in Sources */,
 				BCFB9BA12CE4A07900B66BC0 /* VipCouseDetailViewController.m in Sources */,
+				BC33327B2CEC32AA00649FF9 /* CourseDescAlertView.m in Sources */,
 				27F9033627E87C8B00C08A19 /* MineNavView.m in Sources */,
 				BCED0AF72C4651F800369AED /* KSMergeEnginePlayer.m in Sources */,
 				BC50171527FC0D8300F8BCBC /* SubjectChooseBodyView.m in Sources */,
@@ -7026,6 +7096,7 @@
 				2723B5BC27F157B100E0B90B /* GroupCreateView.m in Sources */,
 				BC42CAA72BEC8272001F076E /* RhythmView.m in Sources */,
 				BC0D95192AC280CB00E54D3F /* KSWebLoadRefreshView.m in Sources */,
+				BCC17DF12CEC641300808B60 /* HomeArrangeRankButtonView.m in Sources */,
 				BC802D8D28B896460079E350 /* LiveApplyView.m in Sources */,
 				2723B63027F157D500E0B90B /* GroupApplyChooseAllCell.m in Sources */,
 				BC106C372A9338A7000759A9 /* TXLiveChatListCell.m in Sources */,
@@ -7104,6 +7175,7 @@
 				BCCC36272AAF4346000D60CA /* KSTenantHomeViewController.m in Sources */,
 				BC38C3EA2AF893B400ABFCC2 /* KSVideoPlayerView.m in Sources */,
 				BCFDA61228BC8FCE0022B497 /* HomeHotVideoCell.m in Sources */,
+				BC33328B2CEC35D000649FF9 /* VideoCourseArrangeCell.m in Sources */,
 				BCECE24D2B3D670500C0D555 /* FeedbackListNavView.m in Sources */,
 				BC106C182A933829000759A9 /* TXLiveMessageShopRush.m in Sources */,
 				BC756CB928FE7D1D00AA9ECB /* KSChatUserDetailViewController.m in Sources */,
@@ -7180,6 +7252,7 @@
 				BC2C1BB72CEB556E00EDEB97 /* HomeArrangeLiveCourseView.m in Sources */,
 				BC38C3E92AF893B400ABFCC2 /* KSMediaMergeView.m in Sources */,
 				BC38C45F2AFA095D00ABFCC2 /* MineWorksBottomView.m in Sources */,
+				BC3332812CEC356500649FF9 /* CourseTeacherDescCell.m in Sources */,
 				BC38C45A2AFA095D00ABFCC2 /* MineWorksNavView.m in Sources */,
 				BC494A8028696BC300CCD343 /* MusicRoomListModel.m in Sources */,
 				BC2820FC2C9186E5008BD2CC /* GroupNoticeDetailModel.m in Sources */,
@@ -7221,6 +7294,7 @@
 				BC31BF242B21925700F7D538 /* WMGaugeViewStyleFlatThin.m in Sources */,
 				BC9AA0BA2ABC288000CD954D /* ChatComplainBottomView.m in Sources */,
 				275FA23327E7356B00CFEA2E /* VefiCodeLoginController.m in Sources */,
+				BCC17DF62CEC6B2A00808B60 /* ArrangeRecentRankButtonView.m in Sources */,
 				275FA23B27E7356B00CFEA2E /* PasswordBodyView.m in Sources */,
 				BCB9090B2852EE9600F5FF69 /* KSLiveWebViewController.m in Sources */,
 				BC2932F82AAEC46B0024D98E /* InstitutionMineBodyView.m in Sources */,
@@ -7235,6 +7309,7 @@
 				275FA1EC27E7351900CFEA2E /* BaseViewController.m in Sources */,
 				BC2C1BB42CEB556100EDEB97 /* HomeArrangeAccompanyCourseView.m in Sources */,
 				BC11922B280ED8E800A716F7 /* CourseNavView.m in Sources */,
+				BC3332862CEC35B000649FF9 /* LiveCourseArrangeCell.m in Sources */,
 				BCC0F6632A8CD8F500C4EFA4 /* TXTimeView.m in Sources */,
 				BCECE2472B3D670500C0D555 /* FeedbackListModel.m in Sources */,
 				BCC0F60F2A8CD86C00C4EFA4 /* TXClassroomMsgModel.m in Sources */,
@@ -7309,6 +7384,7 @@
 				27F9032C27E87C2E00C08A19 /* KSNetworkAlert.m in Sources */,
 				BCC0F60B2A8CD86C00C4EFA4 /* TXClassroomMemberChange.m in Sources */,
 				BC40BA1828124D3D00DEC0D1 /* NotiferMessageViewController.m in Sources */,
+				BCD1603A2CEC808700A78B43 /* ArrangeTeacherModel.m in Sources */,
 				BC31BF1F2B21925700F7D538 /* TunerSettingView.m in Sources */,
 				275FA22D27E7356B00CFEA2E /* ChatViewController.m in Sources */,
 				BCC0F6E22A8CE24400C4EFA4 /* KSWhiteboardRefreshView.m in Sources */,

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

@@ -51,7 +51,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "TEST"
+      buildConfiguration = "DEV"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"

+ 6 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/arrange_course_icon@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_course_icon.imageset/arrange_course_icon@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/arrange_live_tag@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_live_tag.imageset/arrange_live_tag@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/arrange_search_green@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_search_green.imageset/arrange_search_green@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/arrange_sort_down@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_down.imageset/arrange_sort_down@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/arrange_sort_none@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_none.imageset/arrange_sort_none@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/arrange_sort_up@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/arrange_sort_up.imageset/arrange_sort_up@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/course_desc_top@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/ArrangeCourse/course_desc_top.imageset/course_desc_top@3x.png


+ 24 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h

@@ -1054,6 +1054,30 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param success 成功
 /// @param faliure 失败
 + (void)updateUserCustomerServiceRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+#pragma mark ----- 约课
+// /api-student/open/subject/queryPage
+
+/// 查询声部信息
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)subjectQueryPageRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// courseSchedule/teacherList
+
+/// 约课老师列表
+/// @param post post json
+/// @param courseType 课程类型 VIP / PRACTICE
+/// @param search 搜索
+/// @param recentFree 是否最近30天有空
+/// @param sortField 排序类型
+/// @param sortRule 规则
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)findTeacherList:(NSString *)post courseType:(NSString *)courseType search:(NSString *)search recentFree:(BOOL)recentFree sortField:(NSString *)sortField sortRule:(NSString *)sortRule page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 @end
 
 NS_ASSUME_NONNULL_END

+ 46 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m

@@ -2005,4 +2005,50 @@
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [self request:get andWithUrl:url and:parm success:success faliure:faliure];
 }
+
+#pragma mark ----- 约课
+// /api-student/open/subject/queryPage
+
+/// 查询声部信息
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)subjectQueryPageRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestHeader];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-student/open/subject/queryPage"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@"list" forKey:@"queryType"];
+    [parm setValue:@(1) forKey:@"page"];
+    [parm setValue:@(9999) forKey:@"rows"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+// courseSchedule/teacherList
+
+/// 约课老师列表
+/// @param post post json
+/// @param courseType 课程类型 VIP / PRACTICE
+/// @param search 搜索
+/// @param recentFree 是否最近30天有空
+/// @param sortField 排序类型
+/// @param sortRule 规则
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)findTeacherList:(NSString *)post courseType:(NSString *)courseType search:(NSString *)search recentFree:(BOOL)recentFree sortField:(NSString *)sortField sortRule:(NSString *)sortRule page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-student/courseSchedule/queryTeacherList"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@(page) forKey:@"page"];
+    [parm setValue:@(rows) forKey:@"rows"];
+    [parm setValue:courseType forKey:@"courseType"];
+    [parm setValue:search forKey:@"search"];
+    [parm setValue:sortField forKey:@"sortField"];
+    [parm setValue:sortRule forKey:@"sortRule"];
+    if (recentFree) {
+        [parm setValue:@(recentFree) forKey:@"recentFreeTime"];
+    }
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
 @end

+ 25 - 22
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Controller/HomeArrangeCourseController.m

@@ -95,22 +95,21 @@
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     self.navigationController.interactivePopGestureRecognizer.enabled = YES;
-    // [self requestSubjectList];
+     [self requestSubjectList];
 }
 
 - (void)requestSubjectList {
     [KSNetworkingManager querySubjectItemRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
-            NSArray *dataArray = [NSMutableArray array];
-            dataArray = [dic ks_arrayValueForKey:@"data"];
-            NSMutableArray *subjectArray = [NSMutableArray array];
-            for (NSDictionary *parm in dataArray) {
-                NSMutableDictionary *subjectSource = [NSMutableDictionary dictionary];
-                [subjectSource setValue:[parm ks_stringValueForKey:@"id"] forKey:@"subjectId"];
-                [subjectSource setValue:[parm ks_stringValueForKey:@"name"] forKey:@"subjectName"];
-                [subjectArray addObject:subjectSource];
+            NSArray *subjectArray = [dic ks_arrayValueForKey:@"data"];
+            NSMutableArray *subjectParmArray = [NSMutableArray array];
+            for (NSDictionary *parm in subjectArray) {
+                NSMutableDictionary *orchestParm = [NSMutableDictionary dictionary];
+                [orchestParm setValue:[parm ks_stringValueForKey:@"id"] forKey:@"subjectId"];
+                [orchestParm setValue:[parm ks_stringValueForKey:@"name"] forKey:@"subjectName"];
+                [subjectParmArray addObject:orchestParm];
             }
-            self.subjectList = [subjectArray mutableCopy];
+            self.subjectList = [subjectParmArray mutableCopy];
             [self refreshSubjectMessage];
         }
         else{
@@ -124,18 +123,22 @@
 - (void)refreshSubjectMessage {
     for (NSInteger index = 0; index < self.listViewArray.count; index++) {
         id view = self.listViewArray[index];
-//        if ([view isKindOfClass:[MyLessonBodyView class]]) {
-//            MyLessonBodyView *courseView = (MyLessonBodyView *)view;
-//            courseView.subjectList = [self.subjectList mutableCopy];
-//        }
-//        else if ([view isKindOfClass:[MyVideoCourseBodyView class]]) {
-//            MyVideoCourseBodyView *videoCourseView = (MyVideoCourseBodyView *)view;
-//            videoCourseView.subjectList = [self.subjectList mutableCopy];
-//        }
-//        else if ([view isKindOfClass:[MyMusicRoomBodyView class]]) {
-//            MyMusicRoomBodyView *musicView = (MyMusicRoomBodyView *)view;
-//            musicView.subjectList = [self.subjectList mutableCopy];
-//        }
+        if ([view isKindOfClass:[HomeArrangeVIPCourseView class]]) {
+            HomeArrangeVIPCourseView *courseView = (HomeArrangeVIPCourseView *)view;
+            courseView.subjectList = [self.subjectList mutableCopy];
+        }
+        else if ([view isKindOfClass:[HomeArrangeAccompanyCourseView class]]) {
+            HomeArrangeAccompanyCourseView *courseView = (HomeArrangeAccompanyCourseView *)view;
+            courseView.subjectList = [self.subjectList mutableCopy];
+        }
+        else if ([view isKindOfClass:[HomeArrangeLiveCourseView class]]) {
+            HomeArrangeLiveCourseView *courseView = (HomeArrangeLiveCourseView *)view;
+            courseView.subjectList = [self.subjectList mutableCopy];
+        }
+        else if ([view isKindOfClass:[HomeArrangeVideoCourseView class]]) {
+            HomeArrangeVideoCourseView *courseView = (HomeArrangeVideoCourseView *)view;
+            courseView.subjectList = [self.subjectList mutableCopy];
+        }
     }
 }
 

+ 32 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Model/ArrangeTeacherModel.h

@@ -0,0 +1,32 @@
+//
+//  ArrangeTeacherModel.h
+//
+//  Created by Steven  on 2024/11/19
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface ArrangeTeacherModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *realName;
+@property (nonatomic, strong) NSString *school;
+@property (nonatomic, strong) NSString *subjectPrice;
+@property (nonatomic, strong) NSString *starGrade;
+@property (nonatomic, strong) NSString *subjectId;
+@property (nonatomic, strong) NSString *teacherId;
+@property (nonatomic, strong) NSString *courseMinutes;
+@property (nonatomic, strong) NSString *avatar;
+@property (nonatomic, strong) NSString *userName;
+@property (nonatomic, strong) NSString *expTime;
+@property (nonatomic, strong) NSString *subjectName;
+@property (nonatomic, strong) NSString *schoolSubject;
+@property (nonatomic, strong) NSString *configSubject;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 183 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/Model/ArrangeTeacherModel.m

@@ -0,0 +1,183 @@
+//
+//  ArrangeTeacherModel.m
+//
+//  Created by Steven  on 2024/11/19
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "ArrangeTeacherModel.h"
+
+
+NSString *const kArrangeTeacherModelRealName = @"realName";
+NSString *const kArrangeTeacherModelSchool = @"school";
+NSString *const kArrangeTeacherModelSubjectPrice = @"subjectPrice";
+NSString *const kArrangeTeacherModelStarGrade = @"starGrade";
+NSString *const kArrangeTeacherModelSubjectId = @"subjectId";
+NSString *const kArrangeTeacherModelTeacherId = @"teacherId";
+NSString *const kArrangeTeacherModelCourseMinutes = @"courseMinutes";
+NSString *const kArrangeTeacherModelAvatar = @"avatar";
+NSString *const kArrangeTeacherModelUserName = @"userName";
+NSString *const kArrangeTeacherModelExpTime = @"expTime";
+NSString *const kArrangeTeacherModelSubjectName = @"subjectName";
+NSString *const kArrangeTeacherModelSchoolSubject = @"schoolSubject";
+NSString *const kArrangeTeacherModelConfigSubject = @"configSubject";
+
+
+@interface ArrangeTeacherModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation ArrangeTeacherModel
+
+@synthesize realName = _realName;
+@synthesize school = _school;
+@synthesize subjectPrice = _subjectPrice;
+@synthesize starGrade = _starGrade;
+@synthesize subjectId = _subjectId;
+@synthesize teacherId = _teacherId;
+@synthesize courseMinutes = _courseMinutes;
+@synthesize avatar = _avatar;
+@synthesize userName = _userName;
+@synthesize expTime = _expTime;
+@synthesize subjectName = _subjectName;
+@synthesize schoolSubject = _schoolSubject;
+@synthesize configSubject = _configSubject;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.realName = [self objectOrNilForKey:kArrangeTeacherModelRealName fromDictionary:dict];
+            self.school = [self objectOrNilForKey:kArrangeTeacherModelSchool fromDictionary:dict];
+            self.subjectPrice = [self objectOrNilForKey:kArrangeTeacherModelSubjectPrice fromDictionary:dict];
+            self.starGrade = [self objectOrNilForKey:kArrangeTeacherModelStarGrade fromDictionary:dict];
+            self.subjectId = [self objectOrNilForKey:kArrangeTeacherModelSubjectId fromDictionary:dict];
+            self.teacherId = [self objectOrNilForKey:kArrangeTeacherModelTeacherId fromDictionary:dict];
+            self.courseMinutes = [self objectOrNilForKey:kArrangeTeacherModelCourseMinutes fromDictionary:dict];
+            self.avatar = [self objectOrNilForKey:kArrangeTeacherModelAvatar fromDictionary:dict];
+            self.userName = [self objectOrNilForKey:kArrangeTeacherModelUserName fromDictionary:dict];
+            self.expTime = [self objectOrNilForKey:kArrangeTeacherModelExpTime fromDictionary:dict];
+            self.subjectName = [self objectOrNilForKey:kArrangeTeacherModelSubjectName fromDictionary:dict];
+            self.schoolSubject = [self objectOrNilForKey:kArrangeTeacherModelSchoolSubject fromDictionary:dict];
+            self.configSubject = [self objectOrNilForKey:kArrangeTeacherModelConfigSubject fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.realName forKey:kArrangeTeacherModelRealName];
+    [mutableDict setValue:self.school forKey:kArrangeTeacherModelSchool];
+    [mutableDict setValue:self.subjectPrice forKey:kArrangeTeacherModelSubjectPrice];
+    [mutableDict setValue:self.starGrade forKey:kArrangeTeacherModelStarGrade];
+    [mutableDict setValue:self.subjectId forKey:kArrangeTeacherModelSubjectId];
+    [mutableDict setValue:self.teacherId forKey:kArrangeTeacherModelTeacherId];
+    [mutableDict setValue:self.courseMinutes forKey:kArrangeTeacherModelCourseMinutes];
+    [mutableDict setValue:self.avatar forKey:kArrangeTeacherModelAvatar];
+    [mutableDict setValue:self.userName forKey:kArrangeTeacherModelUserName];
+    [mutableDict setValue:self.expTime forKey:kArrangeTeacherModelExpTime];
+    [mutableDict setValue:self.subjectName forKey:kArrangeTeacherModelSubjectName];
+    [mutableDict setValue:self.schoolSubject forKey:kArrangeTeacherModelSchoolSubject];
+    [mutableDict setValue:self.configSubject forKey:kArrangeTeacherModelConfigSubject];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.realName = [aDecoder decodeObjectForKey:kArrangeTeacherModelRealName];
+    self.school = [aDecoder decodeObjectForKey:kArrangeTeacherModelSchool];
+    self.subjectPrice = [aDecoder decodeObjectForKey:kArrangeTeacherModelSubjectPrice];
+    self.starGrade = [aDecoder decodeObjectForKey:kArrangeTeacherModelStarGrade];
+    self.subjectId = [aDecoder decodeObjectForKey:kArrangeTeacherModelSubjectId];
+    self.teacherId = [aDecoder decodeObjectForKey:kArrangeTeacherModelTeacherId];
+    self.courseMinutes = [aDecoder decodeObjectForKey:kArrangeTeacherModelCourseMinutes];
+    self.avatar = [aDecoder decodeObjectForKey:kArrangeTeacherModelAvatar];
+    self.userName = [aDecoder decodeObjectForKey:kArrangeTeacherModelUserName];
+    self.expTime = [aDecoder decodeObjectForKey:kArrangeTeacherModelExpTime];
+    self.subjectName = [aDecoder decodeObjectForKey:kArrangeTeacherModelSubjectName];
+    self.schoolSubject = [aDecoder decodeObjectForKey:kArrangeTeacherModelSchoolSubject];
+    self.configSubject = [aDecoder decodeObjectForKey:kArrangeTeacherModelConfigSubject];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_realName forKey:kArrangeTeacherModelRealName];
+    [aCoder encodeObject:_school forKey:kArrangeTeacherModelSchool];
+    [aCoder encodeObject:_subjectPrice forKey:kArrangeTeacherModelSubjectPrice];
+    [aCoder encodeObject:_starGrade forKey:kArrangeTeacherModelStarGrade];
+    [aCoder encodeObject:_subjectId forKey:kArrangeTeacherModelSubjectId];
+    [aCoder encodeObject:_teacherId forKey:kArrangeTeacherModelTeacherId];
+    [aCoder encodeObject:_courseMinutes forKey:kArrangeTeacherModelCourseMinutes];
+    [aCoder encodeObject:_avatar forKey:kArrangeTeacherModelAvatar];
+    [aCoder encodeObject:_userName forKey:kArrangeTeacherModelUserName];
+    [aCoder encodeObject:_expTime forKey:kArrangeTeacherModelExpTime];
+    [aCoder encodeObject:_subjectName forKey:kArrangeTeacherModelSubjectName];
+    [aCoder encodeObject:_schoolSubject forKey:kArrangeTeacherModelSchoolSubject];
+    [aCoder encodeObject:_configSubject forKey:kArrangeTeacherModelConfigSubject];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    ArrangeTeacherModel *copy = [[ArrangeTeacherModel alloc] init];
+    
+    if (copy) {
+
+        copy.realName = [self.realName copyWithZone:zone];
+        copy.school = [self.school copyWithZone:zone];
+        copy.subjectPrice = [self.subjectPrice copyWithZone:zone];
+        copy.starGrade = [self.starGrade copyWithZone:zone];
+        copy.subjectId = [self.subjectId copyWithZone:zone];
+        copy.teacherId = [self.teacherId copyWithZone:zone];
+        copy.courseMinutes = [self.courseMinutes copyWithZone:zone];
+        copy.avatar = [self.avatar copyWithZone:zone];
+        copy.userName = [self.userName copyWithZone:zone];
+        copy.expTime = [self.expTime copyWithZone:zone];
+        copy.subjectName = [self.subjectName copyWithZone:zone];
+        copy.schoolSubject = [self.schoolSubject copyWithZone:zone];
+        copy.configSubject = [self.configSubject copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 25 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.h

@@ -0,0 +1,25 @@
+//
+//  ArrangeRecentRankButtonView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^RankRecentCallback)(BOOL isChoose);
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ArrangeRecentRankButtonView : UIView
+
+@property (nonatomic, assign) BOOL isChoose;
+
++ (instancetype)sharedInstance;
+
+- (void)settingCallback:(RankRecentCallback)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.m

@@ -0,0 +1,70 @@
+//
+//  ArrangeRecentRankButtonView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "ArrangeRecentRankButtonView.h"
+
+@interface ArrangeRecentRankButtonView ()
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+
+@property (nonatomic, copy) RankRecentCallback callback;
+@end
+
+@implementation ArrangeRecentRankButtonView
+
+
++ (instancetype)sharedInstance {
+    ArrangeRecentRankButtonView *view = [[[NSBundle mainBundle] loadNibNamed:@"ArrangeRecentRankButtonView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)settingCallback:(RankRecentCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)butonAction:(id)sender {
+    self.isChoose = !self.isChoose;
+    if (self.callback) {
+        self.callback(self.isChoose);
+    }
+}
+
+- (void)setIsChoose:(BOOL)isChoose {
+    _isChoose = isChoose;
+    if (isChoose) {
+        self.bgView.backgroundColor = HexRGB(0xE8FFFB);
+        self.bgView.layer.borderColor = THEMECOLOR.CGColor;
+        self.titleLabel.textColor = HexRGB(0x18B99A);
+        self.titleLabel.font = [UIFont systemFontOfSize:12.0f weight:UIFontWeightMedium];
+    }
+    else {
+        self.bgView.backgroundColor = HexRGB(0xffffff);
+        self.bgView.layer.borderColor = [UIColor clearColor].CGColor;
+        self.titleLabel.textColor = HexRGB(0x333333);
+        self.titleLabel.font = [UIFont systemFontOfSize:12.0f weight:UIFontWeightRegular];
+    }
+}
+
++ (CGFloat)getViewHeight {
+    return 28.0f;
+}
+
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 72 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/ArrangeRecentRankButtonView.xib

@@ -0,0 +1,72 @@
+<?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" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ArrangeRecentRankButtonView">
+            <rect key="frame" x="0.0" y="0.0" width="184" height="62"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="L6h-AW-RYG">
+                    <rect key="frame" x="0.0" y="0.0" width="184" height="62"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="仅看30天内有空" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g3C-a0-xU1">
+                            <rect key="frame" x="47.333333333333336" y="24" width="89.666666666666657" height="14.333333333333336"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FSP-wu-DfR">
+                            <rect key="frame" x="0.0" y="0.0" width="184" height="62"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="butonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="gB8-qB-bLL"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="FSP-wu-DfR" firstAttribute="top" secondItem="L6h-AW-RYG" secondAttribute="top" id="Utf-jc-cjG"/>
+                        <constraint firstItem="g3C-a0-xU1" firstAttribute="centerX" secondItem="L6h-AW-RYG" secondAttribute="centerX" id="WB6-Sl-SFy"/>
+                        <constraint firstAttribute="trailing" secondItem="FSP-wu-DfR" secondAttribute="trailing" id="baQ-cT-gAS"/>
+                        <constraint firstItem="g3C-a0-xU1" firstAttribute="centerY" secondItem="L6h-AW-RYG" secondAttribute="centerY" id="d9l-YP-Qgx"/>
+                        <constraint firstItem="FSP-wu-DfR" firstAttribute="leading" secondItem="L6h-AW-RYG" secondAttribute="leading" id="gEC-R4-MP0"/>
+                        <constraint firstAttribute="bottom" secondItem="FSP-wu-DfR" secondAttribute="bottom" id="rt2-oh-XGM"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="L6h-AW-RYG" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Bi8-xa-gx5"/>
+                <constraint firstItem="L6h-AW-RYG" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="O4k-9G-Qph"/>
+                <constraint firstAttribute="bottom" secondItem="L6h-AW-RYG" secondAttribute="bottom" id="WTk-uj-4OM"/>
+                <constraint firstAttribute="trailing" secondItem="L6h-AW-RYG" secondAttribute="trailing" id="jY3-Qi-uJR"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bgView" destination="L6h-AW-RYG" id="f9m-wz-Hrb"/>
+                <outlet property="titleLabel" destination="g3C-a0-xU1" id="uaU-0v-gFD"/>
+            </connections>
+            <point key="canvasLocation" x="-135.87786259541986" y="4.2253521126760569"/>
+        </view>
+    </objects>
+</document>

+ 27 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.h

@@ -0,0 +1,27 @@
+//
+//  CourseDescAlertView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, COURSE_DISPLAY_INDEX) {
+    COURSE_DISPLAY_INDEX_VIP,
+    COURSE_DISPLAY_INDEX_ACCOMPANY,
+    COURSE_DISPLAY_INDEX_LIVE,
+    COURSE_DISPLAY_INDEX_VIDEO,
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CourseDescAlertView : UIView
+
++ (instancetype)sharedInstance;
+
+- (void)displayCourseType:(COURSE_DISPLAY_INDEX)courseType;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 37 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.m

@@ -0,0 +1,37 @@
+//
+//  CourseDescAlertView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "CourseDescAlertView.h"
+
+@interface CourseDescAlertView ()
+
+@property (weak, nonatomic) IBOutlet UIView *containerView;
+
+@property (nonatomic, assign) COURSE_DISPLAY_INDEX displayIndex;
+
+@end
+
+@implementation CourseDescAlertView
+
++ (instancetype)sharedInstance {
+    CourseDescAlertView *view = [[[NSBundle mainBundle] loadNibNamed:@"CourseDescAlertView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)displayCourseType:(COURSE_DISPLAY_INDEX)courseType {
+    self.displayIndex = courseType;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 111 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseDescAlertView.xib

@@ -0,0 +1,111 @@
+<?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="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="CourseDescAlertView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="azl-Ae-oTb">
+                    <rect key="frame" x="46.666666666666657" y="174" width="300" height="504"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_desc_top" translatesAutoresizingMaskIntoConstraints="NO" id="krG-Dg-aen">
+                            <rect key="frame" x="0.0" y="0.0" width="300" height="113"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="113" id="Fae-UT-5W4"/>
+                                <constraint firstAttribute="width" constant="300" id="fb4-7b-21v"/>
+                            </constraints>
+                        </imageView>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cqL-gu-egq">
+                            <rect key="frame" x="0.0" y="113" width="300" height="332"/>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        </view>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rwW-L4-iiZ">
+                            <rect key="frame" x="20" y="445" width="260" height="39"/>
+                            <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="39" id="0Hx-gk-O27"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="我知道了"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="8"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </button>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="cancle_button" translatesAutoresizingMaskIntoConstraints="NO" id="b4p-H9-rif">
+                            <rect key="frame" x="274" y="13" width="13" height="13"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="13" id="AKb-6s-PJJ"/>
+                                <constraint firstAttribute="height" constant="13" id="AQX-Ra-dN9"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="jF1-Hx-NNv">
+                            <rect key="frame" x="260" y="0.0" width="40" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="40" id="4BV-48-Byj"/>
+                                <constraint firstAttribute="height" constant="40" id="gXB-Au-TeE"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="krG-Dg-aen" secondAttribute="trailing" id="0vW-OY-vVD"/>
+                        <constraint firstAttribute="bottom" secondItem="rwW-L4-iiZ" secondAttribute="bottom" constant="20" id="2Jr-b3-yKl"/>
+                        <constraint firstItem="rwW-L4-iiZ" firstAttribute="top" secondItem="cqL-gu-egq" secondAttribute="bottom" id="81x-OM-IH9"/>
+                        <constraint firstItem="jF1-Hx-NNv" firstAttribute="top" secondItem="azl-Ae-oTb" secondAttribute="top" id="8Vq-FJ-nec"/>
+                        <constraint firstItem="b4p-H9-rif" firstAttribute="top" secondItem="azl-Ae-oTb" secondAttribute="top" constant="13" id="A75-Tq-Bfv"/>
+                        <constraint firstAttribute="trailing" secondItem="b4p-H9-rif" secondAttribute="trailing" constant="13" id="HCe-RP-H8c"/>
+                        <constraint firstAttribute="width" constant="300" id="OoO-5l-wQW"/>
+                        <constraint firstAttribute="trailing" secondItem="cqL-gu-egq" secondAttribute="trailing" id="PaH-lu-eAA"/>
+                        <constraint firstItem="krG-Dg-aen" firstAttribute="top" secondItem="azl-Ae-oTb" secondAttribute="top" id="alz-DX-sff"/>
+                        <constraint firstItem="krG-Dg-aen" firstAttribute="leading" secondItem="azl-Ae-oTb" secondAttribute="leading" id="ge7-9X-Ybd"/>
+                        <constraint firstAttribute="trailing" secondItem="jF1-Hx-NNv" secondAttribute="trailing" id="j0S-er-iZ6"/>
+                        <constraint firstItem="rwW-L4-iiZ" firstAttribute="leading" secondItem="azl-Ae-oTb" secondAttribute="leading" constant="20" id="sFL-jx-daD"/>
+                        <constraint firstItem="cqL-gu-egq" firstAttribute="top" secondItem="krG-Dg-aen" secondAttribute="bottom" id="sLL-Qb-6jt"/>
+                        <constraint firstAttribute="height" constant="504" id="u4m-cZ-5ct"/>
+                        <constraint firstAttribute="trailing" secondItem="rwW-L4-iiZ" secondAttribute="trailing" constant="20" id="yaY-8f-z2q"/>
+                        <constraint firstItem="cqL-gu-egq" firstAttribute="leading" secondItem="azl-Ae-oTb" secondAttribute="leading" id="ycI-2K-a4K"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="azl-Ae-oTb" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="QUM-nk-6Do"/>
+                <constraint firstItem="azl-Ae-oTb" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="wfu-Jg-UTT"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="containerView" destination="cqL-gu-egq" id="CoO-5Y-KgI"/>
+            </connections>
+            <point key="canvasLocation" x="23.664122137404579" y="19.718309859154932"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="cancle_button" width="20" height="20"/>
+        <image name="course_desc_top" width="300" height="113"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 20 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.h

@@ -0,0 +1,20 @@
+//
+//  CourseTeacherDescCell.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+#import "ArrangeTeacherModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+// 课程老师介绍 显示老师
+
+@interface CourseTeacherDescCell : UITableViewCell
+
+- (void)configWithSource:(ArrangeTeacherModel *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 78 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.m

@@ -0,0 +1,78 @@
+//
+//  CourseTeacherDescCell.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "CourseTeacherDescCell.h"
+#import "KSStarView.h"
+
+@interface CourseTeacherDescCell ()
+
+@property (weak, nonatomic) IBOutlet KSStarView *starView;
+
+@property (weak, nonatomic) IBOutlet UILabel *noStarLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *teacherName;
+
+@property (weak, nonatomic) IBOutlet UIImageView *teacherAvatar;
+
+@property (weak, nonatomic) IBOutlet UILabel *teacherDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *finishCount;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseDuration;
+
+@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
+
+@end
+
+@implementation CourseTeacherDescCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+    self.starView.allowMark = NO;
+}
+
+
+- (void)configWithSource:(ArrangeTeacherModel *)model {
+    self.teacherName.text = [NSString returnNoNullStringWithString:model.realName];
+    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:TEACHER_AVATAR]];
+    self.teacherDesc.text = [NSString stringWithFormat:@"%@·%@",[NSString returnNoNullStringWithString:model.school], [NSString returnNoNullStringWithString:model.schoolSubject]];
+    double starNum = [model.starGrade doubleValue];
+    if (starNum <= 0) {
+        self.starView.hidden = YES;
+        self.noStarLabel.hidden = NO;
+    }
+    else {
+        self.noStarLabel.hidden = YES;
+        self.starView.hidden = NO;
+        self.starView.rate = model.starGrade.doubleValue / 5.0f;
+    }
+    self.finishCount.text = [NSString stringWithFormat:@"已上课时%zd节", [model.expTime integerValue]];
+    
+    self.courseDuration.text = [NSString stringWithFormat:@"/%@分钟", model.courseMinutes];
+    double price = [model.subjectPrice doubleValue];
+    if (price > 0) {
+        NSString *mountMsg = [NSString formatDoubleNum:price];
+        NSString *descMsg = [NSString stringWithFormat:@"¥%@",mountMsg];
+        
+        NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:descMsg attributes:@{NSFontAttributeName:[UIFont fontWithName:@"DIN Alternate Bold" size:14.0f],NSForegroundColorAttributeName:HexRGB(0xF44541)}];
+        [attr addAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"DIN Alternate Bold" size:18.0f]} range:[descMsg rangeOfString:mountMsg]];
+        self.priceLabel.attributedText = attr;
+    }
+    else {
+        self.priceLabel.text = @"免费";
+    }
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 168 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/CourseTeacherDescCell.xib

@@ -0,0 +1,168 @@
+<?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" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="101" id="KGk-i7-Jjw" customClass="CourseTeacherDescCell">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="106"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="375" height="106"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="L4X-4j-TAS">
+                        <rect key="frame" x="14" y="0.0" width="347" height="94"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="teacher_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="EAh-FG-nIZ">
+                                <rect key="frame" x="12" y="12" width="70" height="70"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="70" id="AKA-bO-pgM"/>
+                                    <constraint firstAttribute="width" constant="70" id="yoD-eN-lib"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="10"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="张三" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kSc-Bn-tRF">
+                                <rect key="frame" x="94" y="14" width="32" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="NrO-ml-kfW"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" 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="wAx-0C-FLk">
+                                <rect key="frame" x="94" y="40" width="241" height="18"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="18" id="5wJ-hT-XRQ"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5fv-Zu-mpb">
+                                <rect key="frame" x="245" y="15.666666666666664" width="90" height="19"/>
+                                <subviews>
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RQI-Hg-dao" customClass="KSStarView">
+                                        <rect key="frame" x="0.0" y="0.0" width="90" height="19"/>
+                                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    </view>
+                                </subviews>
+                                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="RQI-Hg-dao" secondAttribute="trailing" id="7mA-aA-hOr"/>
+                                    <constraint firstItem="RQI-Hg-dao" firstAttribute="leading" secondItem="5fv-Zu-mpb" secondAttribute="leading" id="Eyi-X3-93v"/>
+                                    <constraint firstAttribute="height" constant="19" id="KUc-ms-RwL"/>
+                                    <constraint firstAttribute="width" constant="90" id="cNI-F7-5DC"/>
+                                    <constraint firstAttribute="bottom" secondItem="RQI-Hg-dao" secondAttribute="bottom" id="iFi-o0-4gM"/>
+                                    <constraint firstItem="RQI-Hg-dao" firstAttribute="top" secondItem="5fv-Zu-mpb" secondAttribute="top" id="uI9-NV-dTm"/>
+                                </constraints>
+                            </view>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrange_course_icon" translatesAutoresizingMaskIntoConstraints="NO" id="VcT-no-hdl">
+                                <rect key="frame" x="94" y="65" width="12" height="14"/>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="已上课时34节" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kQq-1l-JW1">
+                                <rect key="frame" x="110" y="64" width="78" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="Hvk-2R-872"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="/25分钟" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TOg-Vl-8yz">
+                                <rect key="frame" x="291.33333333333331" y="63" width="43.666666666666686" height="17"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="17" id="VGm-rI-6R7"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="¥ 100.00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="14o-Dv-2M4">
+                                <rect key="frame" x="228.66666666666666" y="60" width="60.666666666666657" height="21"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="21" id="l3t-yK-rvz"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" name="DINAlternate-Bold" family="DIN Alternate" pointSize="18"/>
+                                <color key="textColor" red="0.95686274509803915" green="0.27058823529411763" blue="0.25490196078431371" 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="foG-ZX-f0E">
+                                <rect key="frame" x="287" y="17" width="48" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="rXa-R8-xbj"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="foG-ZX-f0E" firstAttribute="centerY" secondItem="kSc-Bn-tRF" secondAttribute="centerY" id="02X-9H-UQT"/>
+                            <constraint firstAttribute="trailing" secondItem="5fv-Zu-mpb" secondAttribute="trailing" constant="12" id="1tU-B1-3Fz"/>
+                            <constraint firstItem="TOg-Vl-8yz" firstAttribute="leading" secondItem="14o-Dv-2M4" secondAttribute="trailing" constant="2" id="751-Wg-80V"/>
+                            <constraint firstItem="TOg-Vl-8yz" firstAttribute="bottom" secondItem="kQq-1l-JW1" secondAttribute="bottom" id="D5d-rh-U7d"/>
+                            <constraint firstItem="EAh-FG-nIZ" firstAttribute="leading" secondItem="L4X-4j-TAS" secondAttribute="leading" constant="12" id="DsS-f7-EtI"/>
+                            <constraint firstItem="5fv-Zu-mpb" firstAttribute="centerY" secondItem="kSc-Bn-tRF" secondAttribute="centerY" id="F7P-fW-fRe"/>
+                            <constraint firstItem="kQq-1l-JW1" firstAttribute="leading" secondItem="VcT-no-hdl" secondAttribute="trailing" constant="4" id="FtU-yM-3mE"/>
+                            <constraint firstAttribute="trailing" secondItem="TOg-Vl-8yz" secondAttribute="trailing" constant="12" id="Hbg-0s-54b"/>
+                            <constraint firstAttribute="trailing" secondItem="wAx-0C-FLk" secondAttribute="trailing" constant="12" id="HhT-HG-0n3"/>
+                            <constraint firstItem="EAh-FG-nIZ" firstAttribute="centerY" secondItem="L4X-4j-TAS" secondAttribute="centerY" id="OnS-3f-0Ut"/>
+                            <constraint firstAttribute="bottom" secondItem="14o-Dv-2M4" secondAttribute="bottom" constant="13" id="XbV-al-MfW"/>
+                            <constraint firstItem="wAx-0C-FLk" firstAttribute="top" secondItem="kSc-Bn-tRF" secondAttribute="bottom" constant="4" id="XgW-i3-DQ9"/>
+                            <constraint firstItem="wAx-0C-FLk" firstAttribute="leading" secondItem="EAh-FG-nIZ" secondAttribute="trailing" constant="12" id="cok-gl-jCk"/>
+                            <constraint firstAttribute="trailing" secondItem="foG-ZX-f0E" secondAttribute="trailing" constant="12" id="eyD-ZO-KsZ"/>
+                            <constraint firstItem="VcT-no-hdl" firstAttribute="leading" secondItem="EAh-FG-nIZ" secondAttribute="trailing" constant="12" id="fS9-Yc-O4U"/>
+                            <constraint firstItem="kSc-Bn-tRF" firstAttribute="leading" secondItem="EAh-FG-nIZ" secondAttribute="trailing" constant="12" id="w8s-1K-2cE"/>
+                            <constraint firstItem="kSc-Bn-tRF" firstAttribute="top" secondItem="L4X-4j-TAS" secondAttribute="top" constant="14" id="y8f-kQ-773"/>
+                            <constraint firstItem="kQq-1l-JW1" firstAttribute="centerY" secondItem="VcT-no-hdl" secondAttribute="centerY" id="y9Z-gi-Jvf"/>
+                            <constraint firstItem="VcT-no-hdl" firstAttribute="top" secondItem="wAx-0C-FLk" secondAttribute="bottom" constant="7" id="zc7-fu-R8S"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="L4X-4j-TAS" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="JFJ-WJ-fRp"/>
+                    <constraint firstAttribute="trailing" secondItem="L4X-4j-TAS" secondAttribute="trailing" constant="14" id="Y8q-df-5Sn"/>
+                    <constraint firstAttribute="bottom" secondItem="L4X-4j-TAS" secondAttribute="bottom" constant="12" id="kS3-e2-PMP"/>
+                    <constraint firstItem="L4X-4j-TAS" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="pxr-g9-ZgE"/>
+                </constraints>
+            </tableViewCellContentView>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="courseDuration" destination="TOg-Vl-8yz" id="3ex-KD-7nL"/>
+                <outlet property="finishCount" destination="kQq-1l-JW1" id="wCh-fT-dve"/>
+                <outlet property="noStarLabel" destination="foG-ZX-f0E" id="tLq-rh-wlh"/>
+                <outlet property="priceLabel" destination="14o-Dv-2M4" id="OyV-af-Idv"/>
+                <outlet property="starView" destination="RQI-Hg-dao" id="Tn4-Ul-ZLq"/>
+                <outlet property="teacherAvatar" destination="EAh-FG-nIZ" id="BP7-Ey-KML"/>
+                <outlet property="teacherDesc" destination="wAx-0C-FLk" id="Pb4-WY-jcR"/>
+                <outlet property="teacherName" destination="kSc-Bn-tRF" id="afu-nS-0zX"/>
+            </connections>
+            <point key="canvasLocation" x="25.190839694656489" y="53.87323943661972"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="arrange_course_icon" width="12" height="14"/>
+        <image name="teacher_avatar" width="150" height="150"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 336 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeAccompanyCourseView.m

@@ -7,13 +7,348 @@
 
 #import "HomeArrangeAccompanyCourseView.h"
 #import "HomeArrangeSortView.h"
+#import "CourseTeacherDescCell.h"
+#import "HomeArrangeSortView.h"
+#import "HomeArrangeRankView.h"
+#import "StateView.h"
+#import "Reachability.h"
+#import <KSChoosePicker.h>
+#import "UserInfoManager.h"
+#import "ArrangeTeacherModel.h"
+
+@interface HomeArrangeAccompanyCourseView ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) StateView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, strong) HomeArrangeSortView *searchView;
+
+@property (nonatomic, strong) HomeArrangeRankView *rankView;
 
-@interface HomeArrangeAccompanyCourseView ()
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectId;
+
+@property (nonatomic, strong) NSString *sortField;
+
+@property (nonatomic, strong) NSString *sortRole;
+
+@property (nonatomic, assign) BOOL recentFree;
 
 @end
 
 @implementation HomeArrangeAccompanyCourseView
 
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = [UIColor clearColor];
+        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        self.tableView.backgroundColor = [UIColor clearColor];
+        self.tableView.showsVerticalScrollIndicator = NO;
+        self.tableView.dataSource = self;
+        self.tableView.delegate = self;
+        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        [self addSubview:self.tableView];
+        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        [self.tableView registerNib:[UINib nibWithNibName:@"CourseTeacherDescCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CourseTeacherDescCell"];
+
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, 10)];
+        bottomView.backgroundColor = [UIColor clearColor];
+        self.tableView.tableFooterView = bottomView;
+        
+        MJWeakSelf;
+        self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+            [weakSelf resetParamenter];
+            [weakSelf requestData];
+        }];
+        self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+            if (weakSelf.isLoadMore) {
+                weakSelf.pages += 1;
+                [weakSelf requestData];
+            }
+            else {
+                [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+            }
+        }];
+        [self defaultSubject];
+    }
+    return self;
+}
+
+- (void)defaultSubject {
+    self.subjectId = USER_MANAGER.userInfo.subjectId;
+    self.searchView.subjectLabel.text = [NSString returnNoNullStringWithString:USER_MANAGER.userInfo.subjectName];
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无内容" imageName:@"empty_course" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+- (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.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+    });
+}
+
+- (void)requestData { // 趣纠课程
+    
+    [KSNetworkingManager findTeacherList:KS_POST courseType:@"PRACTICE" search:self.searchKey recentFree:self.recentFree sortField:self.sortField sortRule:self.sortRole 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) {
+                ArrangeTeacherModel *model = [[ArrangeTeacherModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.tableView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    } faliure:^(NSError * _Nonnull error) {
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.tableView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    }];
+}
+
+- (void)beginRefreshImmediately {
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+- (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (self.lastSelectedIndexPath == indexPath) {
+        return;
+    }
+    if (self.lastSelectedIndexPath != nil) {
+        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.lastSelectedIndexPath];
+        [cell setSelected:NO animated:NO];
+    }
+    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
+    [cell setSelected:YES animated:NO];
+    self.lastSelectedIndexPath = indexPath;
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    CGFloat searchViewHeight = [HomeArrangeSortView getViewHeight];
+    CGFloat sortHeight = [HomeArrangeRankView 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 addSubview:self.rankView];
+        [self.rankView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.mas_equalTo(self);
+            make.top.mas_equalTo(self.searchView.mas_bottom);
+            make.height.mas_equalTo(sortHeight);
+        }];
+    }
+
+    [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self);
+        make.top.mas_equalTo(self.rankView.mas_bottom);
+    }];
+}
+
+#pragma mark - UITableViewDataSource
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return 106.0f;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    CourseTeacherDescCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CourseTeacherDescCell"];
+    ArrangeTeacherModel *model = [self.dataArray objectAtIndex:indexPath.row];
+    [cell configWithSource:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+//    MusicMessageModel *model = self.dataArray[indexPath.row];
+//    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+//    ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/music-detail?id=",model.internalBaseClassIdentifier];
+//    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+#pragma mark ----- lazying
+
+- (HomeArrangeSortView *)searchView {
+    if (!_searchView) {
+        _searchView = [HomeArrangeSortView sharedInstance];
+        MJWeakSelf;
+        [_searchView searchActionCallback:^(HOME_ARRANGE_SORT type, NSString * _Nullable searchKey) {
+            [weakSelf courseSortAction:type searchKey:searchKey];
+        }];
+    }
+    return _searchView;
+}
+
+- (void)courseSortAction:(HOME_ARRANGE_SORT)type searchKey:(NSString *)searchKey {
+    switch (type) {
+        case HOME_ARRANGE_SORT_SUBJECT:
+        {
+            [self searchSubject];
+        }
+            break;
+        case HOME_ARRANGE_SORT_SEARCH:
+        {
+            [self evaluateSource:searchKey];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
+- (void)evaluateSource:(NSString *)searchKey {
+    self.searchKey = searchKey;
+    [self refreshAndRequestData];
+}
+
+- (void)searchSubject {
+    if (self.subjectList.count) {
+        NSMutableArray *nameArray = [NSMutableArray array];
+        for (NSDictionary *parm in self.subjectList) {
+            [nameArray addObject:[parm ks_stringValueForKey:@"subjectName"]];
+        }
+        MJWeakSelf;
+        KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"" sourceData:nameArray lastChooseIndex:0 sureButtonColor:THEMECOLOR chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+            
+            weakSelf.searchView.subjectLabel.text = returnValue;
+            NSDictionary *parm = self.subjectList[chooseIndex-1];
+            weakSelf.subjectId = [parm ks_stringValueForKey:@"subjectId"];
+            [weakSelf refreshAndRequestData];
+        } cancel:^{
+            
+        }];
+        [picker showPicker];
+    }
+    else {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"无声部信息"];
+    }
+}
+
+- (HomeArrangeRankView *)rankView {
+    if (!_rankView) {
+        _rankView = [HomeArrangeRankView sharedInstance];
+        [_rankView configUI];
+        MJWeakSelf;
+        [_rankView sortAction:^(BOOL recentFree, NSString * _Nullable sortField, NSString * _Nullable sortRole) {
+            weakSelf.recentFree = recentFree;
+            weakSelf.sortField = sortField;
+            weakSelf.sortRole = sortRole;
+            [weakSelf refreshAndRequestData];
+        }];
+    }
+    return _rankView;
+}
+/**
+ 设置没有数据时的显示
+ 
+ @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.

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeLiveCourseView.m

@@ -7,6 +7,8 @@
 
 #import "HomeArrangeLiveCourseView.h"
 #import "HomeArrangeSortView.h"
+#import "LiveCourseArrangeCell.h"
+#import "HomeArrangeSortView.h"
 
 @interface HomeArrangeLiveCourseView ()
 

+ 32 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.h

@@ -0,0 +1,32 @@
+//
+//  HomeArrangeRankButtonView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, RANKTYPE) {
+    RANKTYPE_NONE, // 无
+    RANKTYPE_UP,   // 生序
+    RANKTYPE_DOWN, // 降序
+};
+
+typedef void(^RankButtonCallback)(RANKTYPE type);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeArrangeRankButtonView : UIView
+
+@property (nonatomic, assign) RANKTYPE status;
+
++ (instancetype)sharedInstance;
+
+- (void)configWithTitle:(NSString *)title callback:(RankButtonCallback)callback;
+
+
++ (CGFloat)getViewHeight;
+@end
+
+NS_ASSUME_NONNULL_END

+ 117 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.m

@@ -0,0 +1,117 @@
+//
+//  HomeArrangeRankButtonView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "HomeArrangeRankButtonView.h"
+
+@interface HomeArrangeRankButtonView ()
+
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *sortImage;
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@property (nonatomic, copy) RankButtonCallback callback;
+
+@end
+
+@implementation HomeArrangeRankButtonView
+
+
++ (instancetype)sharedInstance {
+    HomeArrangeRankButtonView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeArrangeRankButtonView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configWithTitle:(NSString *)title callback:(RankButtonCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.titleLabel.text = title;
+}
+
+- (IBAction)buttonAction:(id)sender {
+    [self changeSortType];
+    
+    if (self.callback) {
+        self.callback(self.status);
+    }
+}
+
+- (void)changeSortType {
+    RANKTYPE newStatus;
+    switch (self.status) {
+        case RANKTYPE_NONE:
+        {
+            newStatus = RANKTYPE_UP;
+        }
+            break;
+        case RANKTYPE_UP:
+        {
+            newStatus = RANKTYPE_DOWN;
+        }
+            break;
+        case RANKTYPE_DOWN:
+        {
+            newStatus = RANKTYPE_NONE;
+        }
+            break;
+        default:
+            break;
+    }
+    self.status = newStatus;
+}
+
+- (void)setStatus:(RANKTYPE)status {
+    _status = status;
+    switch (status) {
+        case RANKTYPE_NONE:
+        {
+            self.bgView.backgroundColor = HexRGB(0xffffff);
+            self.bgView.layer.borderColor = [UIColor clearColor].CGColor;
+            self.titleLabel.textColor = HexRGB(0x333333);
+            [self.sortImage setImage:[UIImage imageNamed:@"arrange_sort_none"]];
+            self.titleLabel.font = [UIFont systemFontOfSize:12.0f weight:UIFontWeightRegular];
+        }
+            break;
+        case RANKTYPE_UP:
+        {
+            self.bgView.backgroundColor = HexRGB(0xE8FFFB);
+            self.bgView.layer.borderColor = THEMECOLOR.CGColor;
+            self.titleLabel.textColor = HexRGB(0x18B99A);
+            self.titleLabel.font = [UIFont systemFontOfSize:12.0f weight:UIFontWeightMedium];
+            [self.sortImage setImage:[UIImage imageNamed:@"arrange_sort_up"]];
+        }
+            break;
+        case RANKTYPE_DOWN:
+        {
+            self.bgView.backgroundColor = HexRGB(0xE8FFFB);
+            self.bgView.layer.borderColor = THEMECOLOR.CGColor;
+            self.titleLabel.textColor = HexRGB(0x18B99A);
+            self.titleLabel.font = [UIFont systemFontOfSize:12.0f weight:UIFontWeightMedium];
+            [self.sortImage setImage:[UIImage imageNamed:@"arrange_sort_down"]];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
+
++ (CGFloat)getViewHeight {
+    return 28.0f;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 86 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankButtonView.xib

@@ -0,0 +1,86 @@
+<?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" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeArrangeRankButtonView">
+            <rect key="frame" x="0.0" y="0.0" width="78" height="49"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qve-rV-Yio">
+                    <rect key="frame" x="0.0" y="0.0" width="78" height="49"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="已上课时" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Npb-xy-rTU">
+                            <rect key="frame" x="8" y="17" width="56" height="15"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <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="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrange_sort_none" translatesAutoresizingMaskIntoConstraints="NO" id="KHb-3Q-59D">
+                            <rect key="frame" x="64" y="19.666666666666668" width="6" height="10"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="6" id="ODe-eW-Cj3"/>
+                                <constraint firstAttribute="height" constant="10" id="mc1-A4-ZS9"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Y9H-Yu-VfS">
+                            <rect key="frame" x="0.0" y="0.0" width="78" height="49"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="buttonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="8Bg-65-jw4"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="Y9H-Yu-VfS" firstAttribute="leading" secondItem="qve-rV-Yio" secondAttribute="leading" id="3Qp-h7-PPT"/>
+                        <constraint firstItem="Npb-xy-rTU" firstAttribute="centerY" secondItem="qve-rV-Yio" secondAttribute="centerY" id="5IJ-Yz-dRT"/>
+                        <constraint firstAttribute="trailing" secondItem="Y9H-Yu-VfS" secondAttribute="trailing" id="923-XY-izE"/>
+                        <constraint firstAttribute="bottom" secondItem="Y9H-Yu-VfS" secondAttribute="bottom" id="Cnb-1E-R1w"/>
+                        <constraint firstItem="KHb-3Q-59D" firstAttribute="centerY" secondItem="qve-rV-Yio" secondAttribute="centerY" id="NE8-IG-68L"/>
+                        <constraint firstItem="Npb-xy-rTU" firstAttribute="leading" secondItem="qve-rV-Yio" secondAttribute="leading" constant="8" id="Osr-kv-TgE"/>
+                        <constraint firstAttribute="trailing" secondItem="KHb-3Q-59D" secondAttribute="trailing" constant="8" id="WYw-eG-OGm"/>
+                        <constraint firstItem="KHb-3Q-59D" firstAttribute="leading" secondItem="Npb-xy-rTU" secondAttribute="trailing" id="gce-LS-P3M"/>
+                        <constraint firstItem="Y9H-Yu-VfS" firstAttribute="top" secondItem="qve-rV-Yio" secondAttribute="top" id="waI-Um-els"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="qve-rV-Yio" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="3dg-d8-pAd"/>
+                <constraint firstAttribute="bottom" secondItem="qve-rV-Yio" secondAttribute="bottom" id="CJj-x4-70R"/>
+                <constraint firstItem="qve-rV-Yio" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="EwZ-L5-75x"/>
+                <constraint firstAttribute="trailing" secondItem="qve-rV-Yio" secondAttribute="trailing" id="pRh-lf-CmU"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bgView" destination="qve-rV-Yio" id="PdR-3V-gdU"/>
+                <outlet property="sortImage" destination="KHb-3Q-59D" id="L7C-vf-M8j"/>
+                <outlet property="titleLabel" destination="Npb-xy-rTU" id="RmA-SG-LkG"/>
+            </connections>
+            <point key="canvasLocation" x="-33.587786259541986" y="-152.46478873239437"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="arrange_sort_none" width="6" height="10"/>
+    </resources>
+</document>

+ 26 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.h

@@ -0,0 +1,26 @@
+//
+//  HomeArrangeRankView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^ArrangeRankCallback)(BOOL recentFree, NSString * _Nullable sortField, NSString * _Nullable sortRole);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeArrangeRankView : UIView
+
++ (instancetype)sharedInstance;
+
+- (void)configUI;
+
+- (void)sortAction:(ArrangeRankCallback)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 218 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.m

@@ -0,0 +1,218 @@
+//
+//  HomeArrangeRankView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "HomeArrangeRankView.h"
+#import "ArrangeRecentRankButtonView.h"
+#import "HomeArrangeRankButtonView.h"
+
+typedef NS_ENUM(NSInteger, RANK_BUTTON_TYPE) {
+    RANK_BUTTON_TYPE_FINISH,
+    RANK_BUTTON_TYPE_PRICE,
+    RANK_BUTTON_TYPE_SCORE,
+};
+
+#define ARR_LEFT_SPACE (14)
+#define ARR_BUTTON_SPACE (10)
+
+@interface HomeArrangeRankView ()
+
+@property (weak, nonatomic) IBOutlet UIView *buttonContainer;
+
+@property (nonatomic, strong) ArrangeRecentRankButtonView *recentButton;
+
+@property (nonatomic, strong) HomeArrangeRankButtonView *finishButton;
+
+@property (nonatomic, strong) HomeArrangeRankButtonView *priceButton;
+
+@property (nonatomic, strong) HomeArrangeRankButtonView *scoreButton;
+
+@property (nonatomic, copy) ArrangeRankCallback callback;
+
+@property (nonatomic, strong) NSString *sortField;
+
+@property (nonatomic, strong) NSString *sortRule;
+
+@property (nonatomic, assign) BOOL isRecentFree;
+
+@end
+
+@implementation HomeArrangeRankView
+
++ (instancetype)sharedInstance {
+    HomeArrangeRankView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeArrangeRankView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configUI {
+    CGFloat phoneSpace = (KPortraitWidth - 111 - 74 * 2 - 58 - ARR_LEFT_SPACE * 2) / 3.0f;
+    CGFloat space = IS_IPAD ? ARR_BUTTON_SPACE : phoneSpace;
+    [self.buttonContainer addSubview:self.recentButton];
+    [self.recentButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.buttonContainer.mas_left).offset(ARR_LEFT_SPACE);
+        make.top.bottom.mas_equalTo(self.buttonContainer);
+        make.width.mas_equalTo(111.0f);
+    }];
+    
+    [self.buttonContainer addSubview:self.finishButton];
+    [self.finishButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.recentButton.mas_right).offset(space);
+        make.top.bottom.mas_equalTo(self.buttonContainer);
+        make.width.mas_equalTo(74.0f);
+    }];
+    
+    [self.buttonContainer addSubview:self.priceButton];
+    [self.priceButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.finishButton.mas_right).offset(space);
+        make.top.bottom.mas_equalTo(self.buttonContainer);
+        make.width.mas_equalTo(74.0f);
+    }];
+    
+    [self.buttonContainer addSubview:self.scoreButton];
+    [self.scoreButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.priceButton.mas_right).offset(space);
+        make.top.bottom.mas_equalTo(self.buttonContainer);
+        make.width.mas_equalTo(58.0f);
+    }];
+}
+
+- (void)sortAction:(ArrangeRankCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
++ (CGFloat)getViewHeight {
+    return 40.0f;
+}
+
+- (ArrangeRecentRankButtonView *)recentButton {
+    if (!_recentButton) {
+        _recentButton = [ArrangeRecentRankButtonView sharedInstance];
+        MJWeakSelf;
+        [_recentButton settingCallback:^(BOOL isChoose) {
+            [weakSelf recentButtonAction:isChoose];
+        }];
+    }
+    return _recentButton;
+}
+
+- (HomeArrangeRankButtonView *)finishButton {
+    if (!_finishButton) {
+        _finishButton = [HomeArrangeRankButtonView sharedInstance];
+        MJWeakSelf;
+        [_finishButton configWithTitle:@"已上课时" callback:^(RANKTYPE type) {
+            [weakSelf rankAction:type buttonType:RANK_BUTTON_TYPE_FINISH];
+        }];
+    }
+    return _finishButton;
+}
+
+- (HomeArrangeRankButtonView *)priceButton {
+    if (!_priceButton) {
+        _priceButton = [HomeArrangeRankButtonView sharedInstance];
+        MJWeakSelf;
+        [_priceButton configWithTitle:@"课时单价" callback:^(RANKTYPE type) {
+            [weakSelf rankAction:type buttonType:RANK_BUTTON_TYPE_PRICE];
+        }];
+    }
+    return _priceButton;
+}
+
+- (HomeArrangeRankButtonView *)scoreButton {
+    if (!_scoreButton) {
+        _scoreButton = [HomeArrangeRankButtonView sharedInstance];
+        MJWeakSelf;
+        [_scoreButton configWithTitle:@"评分" callback:^(RANKTYPE type) {
+            [weakSelf rankAction:type buttonType:RANK_BUTTON_TYPE_SCORE];
+        }];
+    }
+    return _scoreButton;
+}
+
+
+- (void)rankAction:(RANKTYPE)type buttonType:(RANK_BUTTON_TYPE)buttonType {
+    
+    switch (buttonType) {
+        case RANK_BUTTON_TYPE_FINISH:
+        {
+            self.priceButton.status = RANKTYPE_NONE;
+            self.scoreButton.status = RANKTYPE_NONE;
+            if (type == RANKTYPE_NONE) {
+                self.sortRule = nil;
+                self.sortField = nil;
+            }
+            else if (type == RANKTYPE_UP) {
+                self.sortRule = @"ASC";
+                self.sortField = @"expTime";
+            }
+            else {
+                self.sortRule = @"DESC";
+                self.sortField = @"expTime";
+            }
+        }
+            break;
+        case RANK_BUTTON_TYPE_PRICE:
+        {
+            self.finishButton.status = RANKTYPE_NONE;
+            self.scoreButton.status = RANKTYPE_NONE;
+            if (type == RANKTYPE_NONE) {
+                self.sortRule = nil;
+                self.sortField = nil;
+            }
+            else if (type == RANKTYPE_UP) {
+                self.sortRule = @"ASC";
+                self.sortField = @"subjectPrice";
+            }
+            else {
+                self.sortRule = @"DESC";
+                self.sortField = @"subjectPrice";
+            }
+        }
+            break;
+        case RANK_BUTTON_TYPE_SCORE:
+        {
+            self.finishButton.status = RANKTYPE_NONE;
+            self.priceButton.status = RANKTYPE_NONE;
+            if (type == RANKTYPE_NONE) {
+                self.sortRule = nil;
+                self.sortField = nil;
+            }
+            else if (type == RANKTYPE_UP) {
+                self.sortRule = @"ASC";
+                self.sortField = @"starGrade";
+            }
+            else {
+                self.sortRule = @"DESC";
+                self.sortField = @"starGrade";
+            }
+        }
+            break;
+        default:
+            break;
+    }
+    if (self.callback) {
+        self.callback(self.isRecentFree, self.sortField, self.sortRule);
+    }
+}
+
+
+- (void)recentButtonAction:(BOOL)isChoose {
+    self.isRecentFree = !self.isRecentFree;
+    if (self.callback) {
+        self.callback(self.isRecentFree, self.sortField, self.sortRule);
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 37 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeRankView.xib

@@ -0,0 +1,37 @@
+<?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" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23504"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeArrangeRankView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="40"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ibk-pE-EwZ">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="28"/>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="ibk-pE-EwZ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Oe6-9m-u2Q"/>
+                <constraint firstAttribute="bottom" secondItem="ibk-pE-EwZ" secondAttribute="bottom" constant="12" id="en5-hT-hB9"/>
+                <constraint firstItem="ibk-pE-EwZ" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="pqT-1n-DWA"/>
+                <constraint firstAttribute="trailing" secondItem="ibk-pE-EwZ" secondAttribute="trailing" id="s0W-uh-9ue"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="buttonContainer" destination="ibk-pE-EwZ" id="ZhO-tr-RbJ"/>
+            </connections>
+            <point key="canvasLocation" x="23.664122137404579" y="149.29577464788733"/>
+        </view>
+    </objects>
+</document>

+ 15 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.h

@@ -7,10 +7,25 @@
 
 #import <UIKit/UIKit.h>
 
+typedef NS_ENUM(NSInteger, HOME_ARRANGE_SORT) {
+    HOME_ARRANGE_SORT_SUBJECT,
+    HOME_ARRANGE_SORT_SEARCH,
+};
+
+typedef void(^HomeArrangeSortCallback)(HOME_ARRANGE_SORT type, NSString * _Nullable searchKey);
+
 NS_ASSUME_NONNULL_BEGIN
 
 @interface HomeArrangeSortView : UIView
 
+@property (weak, nonatomic) IBOutlet UILabel *subjectLabel;
+
++ (instancetype)sharedInstance;
+
+- (void)searchActionCallback:(HomeArrangeSortCallback)callback;
+
++ (CGFloat)getViewHeight;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 51 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.m

@@ -7,8 +7,59 @@
 
 #import "HomeArrangeSortView.h"
 
+@interface HomeArrangeSortView ()<UITextFieldDelegate>
+
+
+@property (weak, nonatomic) IBOutlet UITextField *searchField;
+
+@property (nonatomic, copy) HomeArrangeSortCallback callback;
+
+@end
+
 @implementation HomeArrangeSortView
 
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.searchField.delegate = self;
+}
+
+
++ (instancetype)sharedInstance {
+    HomeArrangeSortView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeArrangeSortView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)searchActionCallback:(HomeArrangeSortCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)chooseSubject:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(HOME_ARRANGE_SORT_SUBJECT, nil);
+    }
+}
+
+- (IBAction)searchAction:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(HOME_ARRANGE_SORT_SEARCH, self.searchField.text);
+    }
+}
+
+- (BOOL)textFieldShouldReturn:(UITextField *)textField {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(HOME_ARRANGE_SORT_SEARCH, textField.text);
+    }
+    return YES;
+}
+
++ (CGFloat)getViewHeight {
+    return 58.0f;
+}
 /*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.

+ 106 - 16
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeSortView.xib

@@ -1,40 +1,130 @@
 <?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">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="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"/>
         <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeArrangeSortView">
-            <rect key="frame" x="0.0" y="0.0" width="393" height="65"/>
+            <rect key="frame" x="0.0" y="0.0" width="393" height="58"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="长笛" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0zy-dI-QZa">
-                    <rect key="frame" x="14" y="24" width="28" height="17"/>
-                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                    <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                    <nil key="highlightedColor"/>
-                </label>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L2t-eK-pev">
-                    <rect key="frame" x="50" y="24" width="20" height="17"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                </imageView>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5DK-eh-JEE">
+                    <rect key="frame" x="14" y="12" width="41" height="34"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="长笛" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0zy-dI-QZa">
+                            <rect key="frame" x="0.0" y="8.6666666666666679" width="28" height="17"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="L2t-eK-pev">
+                            <rect key="frame" x="32" y="14" width="9" height="6"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="9" id="OHG-D3-ed4"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OGi-OZ-3FZ">
+                            <rect key="frame" x="0.0" y="0.0" width="41" height="34"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="chooseSubject:" destination="iN0-l3-epB" eventType="touchUpInside" id="yJH-1P-dzM"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="0zy-dI-QZa" firstAttribute="leading" secondItem="5DK-eh-JEE" secondAttribute="leading" id="9Ed-1J-zgn"/>
+                        <constraint firstAttribute="bottom" secondItem="OGi-OZ-3FZ" secondAttribute="bottom" id="BGK-tG-06b"/>
+                        <constraint firstItem="OGi-OZ-3FZ" firstAttribute="leading" secondItem="5DK-eh-JEE" secondAttribute="leading" id="EHB-7e-zSz"/>
+                        <constraint firstItem="0zy-dI-QZa" firstAttribute="centerY" secondItem="5DK-eh-JEE" secondAttribute="centerY" id="Jy7-5g-KfD"/>
+                        <constraint firstItem="OGi-OZ-3FZ" firstAttribute="top" secondItem="5DK-eh-JEE" secondAttribute="top" id="Sqr-fb-HKQ"/>
+                        <constraint firstAttribute="trailing" secondItem="L2t-eK-pev" secondAttribute="trailing" id="b9W-0C-CEk"/>
+                        <constraint firstItem="L2t-eK-pev" firstAttribute="leading" secondItem="0zy-dI-QZa" secondAttribute="trailing" constant="4" id="fM6-x4-9Zf"/>
+                        <constraint firstItem="L2t-eK-pev" firstAttribute="centerY" secondItem="0zy-dI-QZa" secondAttribute="centerY" id="sK7-nL-L6c"/>
+                        <constraint firstAttribute="height" constant="34" id="tMq-eq-1sh"/>
+                        <constraint firstAttribute="trailing" secondItem="OGi-OZ-3FZ" secondAttribute="trailing" id="ufG-z5-cYs"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OTa-BQ-PVU">
+                    <rect key="frame" x="67" y="12" width="312" height="34"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrange_search_green" translatesAutoresizingMaskIntoConstraints="NO" id="6fQ-ha-jt2">
+                            <rect key="frame" x="12" y="9" width="16" height="16"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="16" id="0nv-kL-KKT"/>
+                                <constraint firstAttribute="width" constant="16" id="otY-z8-okn"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aJo-7V-U5Y">
+                            <rect key="frame" x="253" y="3" width="56" height="28"/>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="GVV-0L-0U5"/>
+                                <constraint firstAttribute="width" constant="56" id="k6Z-A6-gq0"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="搜索"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="14"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="searchAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="vsG-qb-3GM"/>
+                            </connections>
+                        </button>
+                        <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="搜索你喜欢的老师" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="QIy-bA-QSm">
+                            <rect key="frame" x="34" y="0.0" width="207" height="34"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <textInputTraits key="textInputTraits"/>
+                        </textField>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="QIy-bA-QSm" firstAttribute="top" secondItem="OTa-BQ-PVU" secondAttribute="top" id="14g-Cx-Jq9"/>
+                        <constraint firstItem="6fQ-ha-jt2" firstAttribute="centerY" secondItem="OTa-BQ-PVU" secondAttribute="centerY" id="5bD-9f-1u3"/>
+                        <constraint firstAttribute="height" constant="34" id="Joc-9A-uf4"/>
+                        <constraint firstAttribute="bottom" secondItem="QIy-bA-QSm" secondAttribute="bottom" id="LiY-RO-8CZ"/>
+                        <constraint firstItem="6fQ-ha-jt2" firstAttribute="leading" secondItem="OTa-BQ-PVU" secondAttribute="leading" constant="12" id="VJh-k7-FsG"/>
+                        <constraint firstItem="QIy-bA-QSm" firstAttribute="leading" secondItem="6fQ-ha-jt2" secondAttribute="trailing" constant="6" id="heT-wj-ccs"/>
+                        <constraint firstItem="aJo-7V-U5Y" firstAttribute="centerY" secondItem="OTa-BQ-PVU" secondAttribute="centerY" id="mzy-yl-glM"/>
+                        <constraint firstAttribute="trailing" secondItem="aJo-7V-U5Y" secondAttribute="trailing" constant="3" id="uH4-EN-0Gk"/>
+                        <constraint firstItem="aJo-7V-U5Y" firstAttribute="leading" secondItem="QIy-bA-QSm" secondAttribute="trailing" constant="12" id="zHo-6E-6E1"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="17"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
             </subviews>
-            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
-                <constraint firstItem="0zy-dI-QZa" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="14" id="SSn-ts-bZY"/>
-                <constraint firstItem="0zy-dI-QZa" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="ffZ-nR-dXU"/>
+                <constraint firstItem="OTa-BQ-PVU" firstAttribute="leading" secondItem="5DK-eh-JEE" secondAttribute="trailing" constant="12" id="Pwn-TV-Atr"/>
+                <constraint firstItem="5DK-eh-JEE" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="Z0h-YV-I2p"/>
+                <constraint firstItem="OTa-BQ-PVU" firstAttribute="centerY" secondItem="5DK-eh-JEE" secondAttribute="centerY" id="any-I9-Fur"/>
+                <constraint firstAttribute="trailing" secondItem="OTa-BQ-PVU" secondAttribute="trailing" constant="14" id="lOW-1K-PE4"/>
+                <constraint firstItem="5DK-eh-JEE" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="lae-zR-aXp"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>
             <nil key="simulatedBottomBarMetrics"/>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="searchField" destination="QIy-bA-QSm" id="OMk-OF-AV9"/>
+                <outlet property="subjectLabel" destination="0zy-dI-QZa" id="PZl-hZ-Q22"/>
+            </connections>
             <point key="canvasLocation" x="25.190839694656489" y="-117.95774647887325"/>
         </view>
     </objects>
+    <resources>
+        <image name="arrange_search_green" width="16" height="16"/>
+        <image name="sort_down" width="8" height="6"/>
+    </resources>
 </document>

+ 338 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeVIPCourseView.m

@@ -7,13 +7,350 @@
 
 #import "HomeArrangeVIPCourseView.h"
 #import "HomeArrangeSortView.h"
+#import "CourseTeacherDescCell.h"
+#import "HomeArrangeSortView.h"
+#import "HomeArrangeRankView.h"
+#import "StateView.h"
+#import "Reachability.h"
+#import <KSChoosePicker.h>
+#import "UserInfoManager.h"
+#import "ArrangeTeacherModel.h"
+
+@interface HomeArrangeVIPCourseView ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) StateView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, strong) HomeArrangeSortView *searchView;
+
+@property (nonatomic, strong) HomeArrangeRankView *rankView;
 
-@interface HomeArrangeVIPCourseView ()
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectId;
+
+@property (nonatomic, strong) NSString *sortField;
+
+@property (nonatomic, strong) NSString *sortRole;
+
+@property (nonatomic, assign) BOOL recentFree;
 
 @end
 
 @implementation HomeArrangeVIPCourseView
 
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = [UIColor clearColor];
+        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        self.tableView.backgroundColor = [UIColor clearColor];
+        self.tableView.showsVerticalScrollIndicator = NO;
+        self.tableView.dataSource = self;
+        self.tableView.delegate = self;
+        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        [self addSubview:self.tableView];
+        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        [self.tableView registerNib:[UINib nibWithNibName:@"CourseTeacherDescCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CourseTeacherDescCell"];
+
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, 10)];
+        bottomView.backgroundColor = [UIColor clearColor];
+        self.tableView.tableFooterView = bottomView;
+        
+        MJWeakSelf;
+        self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+            [weakSelf resetParamenter];
+            [weakSelf requestData];
+        }];
+        self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+            if (weakSelf.isLoadMore) {
+                weakSelf.pages += 1;
+                [weakSelf requestData];
+            }
+            else {
+                [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+            }
+        }];
+        [self defaultSubject];
+    }
+    return self;
+}
+
+- (void)defaultSubject {
+    self.subjectId = USER_MANAGER.userInfo.subjectId;
+    self.searchView.subjectLabel.text = [NSString returnNoNullStringWithString:USER_MANAGER.userInfo.subjectName];
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无内容" imageName:@"empty_course" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+- (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.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+    });
+}
+
+- (void)requestData { // VIP课程
+    
+    [KSNetworkingManager findTeacherList:KS_POST courseType:@"VIP" search:self.searchKey recentFree:self.recentFree sortField:self.sortField sortRule:self.sortRole 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) {
+                ArrangeTeacherModel *model = [[ArrangeTeacherModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self.tableView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    } faliure:^(NSError * _Nonnull error) {
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.tableView reloadData];
+        [self changePromptLabelStateWithArray:self.dataArray];
+    }];
+}
+
+- (void)beginRefreshImmediately {
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+- (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (self.lastSelectedIndexPath == indexPath) {
+        return;
+    }
+    if (self.lastSelectedIndexPath != nil) {
+        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.lastSelectedIndexPath];
+        [cell setSelected:NO animated:NO];
+    }
+    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
+    [cell setSelected:YES animated:NO];
+    self.lastSelectedIndexPath = indexPath;
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    CGFloat searchViewHeight = [HomeArrangeSortView getViewHeight];
+    CGFloat sortHeight = [HomeArrangeRankView 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 addSubview:self.rankView];
+        [self.rankView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.mas_equalTo(self);
+            make.top.mas_equalTo(self.searchView.mas_bottom);
+            make.height.mas_equalTo(sortHeight);
+        }];
+    }
+
+    [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self);
+        make.top.mas_equalTo(self.rankView.mas_bottom);
+    }];
+}
+
+#pragma mark - UITableViewDataSource
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return 106.0f;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    CourseTeacherDescCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CourseTeacherDescCell"];
+    ArrangeTeacherModel *model = [self.dataArray objectAtIndex:indexPath.row];
+    [cell configWithSource:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    ArrangeTeacherModel *model = self.dataArray[indexPath.row];
+//    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+//    ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/music-detail?id=",model.internalBaseClassIdentifier];
+//    [self.naviController pushViewController:ctrl animated:YES];
+}
+
+#pragma mark ----- lazying
+
+- (HomeArrangeSortView *)searchView {
+    if (!_searchView) {
+        _searchView = [HomeArrangeSortView sharedInstance];
+        MJWeakSelf;
+        [_searchView searchActionCallback:^(HOME_ARRANGE_SORT type, NSString * _Nullable searchKey) {
+            [weakSelf courseSortAction:type searchKey:searchKey];
+        }];
+    }
+    return _searchView;
+}
+
+- (void)courseSortAction:(HOME_ARRANGE_SORT)type searchKey:(NSString *)searchKey {
+    switch (type) {
+        case HOME_ARRANGE_SORT_SUBJECT:
+        {
+            [self searchSubject];
+        }
+            break;
+        case HOME_ARRANGE_SORT_SEARCH:
+        {
+            [self evaluateSource:searchKey];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
+- (void)evaluateSource:(NSString *)searchKey {
+    self.searchKey = searchKey;
+    [self refreshAndRequestData];
+}
+
+- (void)searchSubject {
+    if (self.subjectList.count) {
+        NSMutableArray *nameArray = [NSMutableArray array];
+        for (NSDictionary *parm in self.subjectList) {
+            [nameArray addObject:[parm ks_stringValueForKey:@"subjectName"]];
+        }
+        MJWeakSelf;
+        KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"" sourceData:nameArray lastChooseIndex:0 sureButtonColor:THEMECOLOR chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+            
+            weakSelf.searchView.subjectLabel.text = returnValue;
+            NSDictionary *parm = self.subjectList[chooseIndex-1];
+            weakSelf.subjectId = [parm ks_stringValueForKey:@"subjectId"];
+            [weakSelf refreshAndRequestData];
+        } cancel:^{
+            
+        }];
+        [picker showPicker];
+    }
+    else {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"无声部信息"];
+    }
+}
+
+
+- (HomeArrangeRankView *)rankView {
+    if (!_rankView) {
+        _rankView = [HomeArrangeRankView sharedInstance];
+        [_rankView configUI];
+        MJWeakSelf;
+        [_rankView sortAction:^(BOOL recentFree, NSString * _Nullable sortField, NSString * _Nullable sortRole) {
+            weakSelf.recentFree = recentFree;
+            weakSelf.sortField = sortField;
+            weakSelf.sortRole = sortRole;
+            [weakSelf refreshAndRequestData];
+        }];
+    }
+    return _rankView;
+}
+/**
+ 设置没有数据时的显示
+ 
+ @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.

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/HomeArrangeVideoCourseView.m

@@ -7,6 +7,8 @@
 
 #import "HomeArrangeVideoCourseView.h"
 #import "HomeArrangeSortView.h"
+#import "VideoCourseArrangeCell.h"
+#import "HomeArrangeSortView.h"
 
 @interface HomeArrangeVideoCourseView ()
 

+ 16 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.h

@@ -0,0 +1,16 @@
+//
+//  LiveCourseArrangeCell.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface LiveCourseArrangeCell : UICollectionViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 39 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.m

@@ -0,0 +1,39 @@
+//
+//  LiveCourseArrangeCell.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "LiveCourseArrangeCell.h"
+
+@interface LiveCourseArrangeCell ()
+
+@property (weak, nonatomic) IBOutlet UILabel *courseStartTime;
+
+@property (weak, nonatomic) IBOutlet UILabel *subjectLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *courseImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseName;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseCount;
+
+@property (weak, nonatomic) IBOutlet UIImageView *teacherAvatar;
+
+@property (weak, nonatomic) IBOutlet UILabel *teacherName;
+
+@end
+
+@implementation LiveCourseArrangeCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+@end

+ 201 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/LiveCourseArrangeCell.xib

@@ -0,0 +1,201 @@
+<?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="LiveCourseArrangeCell">
+            <rect key="frame" x="0.0" y="0.0" width="307" height="315"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="307" height="315"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pOD-tU-dw9">
+                        <rect key="frame" x="0.0" y="0.0" width="307" height="315"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrange_live_tag" translatesAutoresizingMaskIntoConstraints="NO" id="Nss-l5-qsr">
+                                <rect key="frame" x="12" y="15" width="20" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="AFf-Ow-P42"/>
+                                    <constraint firstAttribute="width" constant="20" id="w6c-qZ-yzg"/>
+                                </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="6DL-8w-1GF">
+                                <rect key="frame" x="39" y="13" width="62.666666666666657" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="SMj-AX-8Ee"/>
+                                </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="2024-11-16 09:30" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dGU-cY-gNI">
+                                <rect key="frame" x="101.66666666666666" y="13" width="122.66666666666666" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="20" id="SuJ-6S-Exl"/>
+                                </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="fxd-IB-bWS">
+                                <rect key="frame" x="12" y="46" width="283" height="159.33333333333334"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" secondItem="fxd-IB-bWS" secondAttribute="height" multiplier="16:9" id="g1c-p0-8Qr"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="6"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="PZN-ZY-dhJ">
+                                <rect key="frame" x="20" y="54" width="36" 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="PM9-PV-hbP">
+                                        <rect key="frame" x="6" y="3.0000000000000009" width="24" height="13.333333333333336"/>
+                                        <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="PM9-PV-hbP" secondAttribute="trailing" constant="6" id="C5c-eS-pWF"/>
+                                    <constraint firstItem="PM9-PV-hbP" firstAttribute="centerY" secondItem="PZN-ZY-dhJ" secondAttribute="centerY" id="Q1r-0E-wPY"/>
+                                    <constraint firstItem="PM9-PV-hbP" firstAttribute="leading" secondItem="PZN-ZY-dhJ" secondAttribute="leading" constant="6" id="sI7-7v-NAA"/>
+                                    <constraint firstAttribute="height" constant="19" id="w56-4T-ure"/>
+                                </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="QcX-ab-zdn">
+                                <rect key="frame" x="12" y="213.33333333333334" width="283" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="ESQ-cU-96G"/>
+                                </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="kob-BR-mDx">
+                                <rect key="frame" x="12" y="239.33333333333334" width="283" height="29.666666666666657"/>
+                                <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>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" text="¥120" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FTk-RK-PpI">
+                                <rect key="frame" x="207.33333333333334" y="278" width="49.000000000000028" height="24"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="24" id="iJt-Ll-uCa"/>
+                                </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" horizontalCompressionResistancePriority="752" text="/4课时" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7jr-Mq-1qA">
+                                <rect key="frame" x="258.33333333333331" y="283" width="36.666666666666686" height="17"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="17" id="J0y-D5-fpX"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                <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" horizontalCompressionResistancePriority="749" text="严琦" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EV0-5G-Zqo">
+                                <rect key="frame" x="44" y="281.66666666666669" width="28" height="17"/>
+                                <fontDescription key="fontDescription" type="system" 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" horizontalCompressionResistancePriority="752" image="teacher_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="XMD-jO-43x">
+                                <rect key="frame" x="12" y="277" width="26" height="26"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="26" id="3pf-PC-RPH"/>
+                                    <constraint firstAttribute="width" constant="26" id="OJC-eG-7nN"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="10"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstAttribute="trailing" secondItem="fxd-IB-bWS" secondAttribute="trailing" constant="12" id="1ZZ-rc-HGG"/>
+                            <constraint firstAttribute="trailing" secondItem="QcX-ab-zdn" secondAttribute="trailing" constant="12" id="2q7-zh-Cim"/>
+                            <constraint firstItem="7jr-Mq-1qA" firstAttribute="bottom" secondItem="FTk-RK-PpI" secondAttribute="bottom" constant="-2" id="3Sz-NQ-9ik"/>
+                            <constraint firstItem="PZN-ZY-dhJ" firstAttribute="top" secondItem="fxd-IB-bWS" secondAttribute="top" constant="8" id="6Mj-hE-DEA"/>
+                            <constraint firstItem="kob-BR-mDx" firstAttribute="leading" secondItem="pOD-tU-dw9" secondAttribute="leading" constant="12" id="7nH-qY-JPo"/>
+                            <constraint firstAttribute="trailing" secondItem="kob-BR-mDx" secondAttribute="trailing" constant="12" id="C7U-7p-EJl"/>
+                            <constraint firstAttribute="bottom" secondItem="7jr-Mq-1qA" secondAttribute="bottom" constant="15" id="IdI-O4-0bL"/>
+                            <constraint firstItem="dGU-cY-gNI" firstAttribute="leading" secondItem="6DL-8w-1GF" secondAttribute="trailing" id="LqI-OV-Lgt"/>
+                            <constraint firstAttribute="trailing" secondItem="7jr-Mq-1qA" secondAttribute="trailing" constant="12" id="Nhi-Em-JYw"/>
+                            <constraint firstItem="PZN-ZY-dhJ" firstAttribute="leading" secondItem="fxd-IB-bWS" secondAttribute="leading" constant="8" id="R9B-cR-4VH"/>
+                            <constraint firstItem="6DL-8w-1GF" firstAttribute="centerY" secondItem="Nss-l5-qsr" secondAttribute="centerY" id="R9K-Ly-5eG"/>
+                            <constraint firstItem="XMD-jO-43x" firstAttribute="leading" secondItem="pOD-tU-dw9" secondAttribute="leading" constant="12" id="SO8-Z2-HVg"/>
+                            <constraint firstItem="QcX-ab-zdn" firstAttribute="top" secondItem="fxd-IB-bWS" secondAttribute="bottom" constant="8" id="U1h-Sc-TEU"/>
+                            <constraint firstItem="Nss-l5-qsr" firstAttribute="leading" secondItem="pOD-tU-dw9" secondAttribute="leading" constant="12" id="Wvi-yS-Xcx"/>
+                            <constraint firstAttribute="bottom" secondItem="XMD-jO-43x" secondAttribute="bottom" constant="12" id="a3k-qe-Mdb"/>
+                            <constraint firstItem="QcX-ab-zdn" firstAttribute="leading" secondItem="pOD-tU-dw9" secondAttribute="leading" constant="12" id="c7g-OW-iLH"/>
+                            <constraint firstItem="XMD-jO-43x" firstAttribute="top" secondItem="kob-BR-mDx" secondAttribute="bottom" constant="8" id="cbj-iG-LgU"/>
+                            <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dGU-cY-gNI" secondAttribute="trailing" constant="12" id="dkO-w1-8JW"/>
+                            <constraint firstItem="dGU-cY-gNI" firstAttribute="centerY" secondItem="6DL-8w-1GF" secondAttribute="centerY" id="e1N-Pt-n11"/>
+                            <constraint firstItem="fxd-IB-bWS" firstAttribute="top" secondItem="Nss-l5-qsr" secondAttribute="bottom" constant="15" id="feR-v4-vgy"/>
+                            <constraint firstItem="EV0-5G-Zqo" firstAttribute="centerY" secondItem="XMD-jO-43x" secondAttribute="centerY" id="fxc-N6-781"/>
+                            <constraint firstItem="6DL-8w-1GF" firstAttribute="leading" secondItem="Nss-l5-qsr" secondAttribute="trailing" constant="7" id="iJu-6u-OIT"/>
+                            <constraint firstItem="FTk-RK-PpI" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="EV0-5G-Zqo" secondAttribute="trailing" constant="10" id="imF-an-jnG"/>
+                            <constraint firstItem="Nss-l5-qsr" firstAttribute="top" secondItem="pOD-tU-dw9" secondAttribute="top" constant="15" id="j7o-QY-U4Q"/>
+                            <constraint firstItem="kob-BR-mDx" firstAttribute="top" secondItem="QcX-ab-zdn" secondAttribute="bottom" constant="4" id="mPB-sC-sOn"/>
+                            <constraint firstItem="EV0-5G-Zqo" firstAttribute="leading" secondItem="XMD-jO-43x" secondAttribute="trailing" constant="6" id="oML-gU-N14"/>
+                            <constraint firstItem="dGU-cY-gNI" firstAttribute="centerY" secondItem="6DL-8w-1GF" secondAttribute="centerY" id="rip-RP-TzF"/>
+                            <constraint firstItem="fxd-IB-bWS" firstAttribute="leading" secondItem="pOD-tU-dw9" secondAttribute="leading" constant="12" id="sNs-aG-qv9"/>
+                            <constraint firstItem="7jr-Mq-1qA" firstAttribute="leading" secondItem="FTk-RK-PpI" secondAttribute="trailing" constant="2" id="vUy-qO-Ghm"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="6"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+            </view>
+            <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="pOD-tU-dw9" secondAttribute="trailing" id="Icm-vg-nf0"/>
+                <constraint firstAttribute="bottom" secondItem="pOD-tU-dw9" secondAttribute="bottom" id="Qc3-EQ-gcz"/>
+                <constraint firstItem="pOD-tU-dw9" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="ccv-yy-qyK"/>
+                <constraint firstItem="pOD-tU-dw9" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="rM0-cr-dCd"/>
+            </constraints>
+            <size key="customSize" width="307" height="315"/>
+            <connections>
+                <outlet property="courseCount" destination="7jr-Mq-1qA" id="Ved-ji-rsJ"/>
+                <outlet property="courseDesc" destination="kob-BR-mDx" id="2wC-6q-qMS"/>
+                <outlet property="courseImage" destination="fxd-IB-bWS" id="Rw8-uv-QoQ"/>
+                <outlet property="courseName" destination="QcX-ab-zdn" id="jEE-eg-WMY"/>
+                <outlet property="courseStartTime" destination="dGU-cY-gNI" id="w7O-ic-94o"/>
+                <outlet property="priceLabel" destination="FTk-RK-PpI" id="BOy-Cf-2Oa"/>
+                <outlet property="subjectLabel" destination="PM9-PV-hbP" id="hsf-b2-tUW"/>
+                <outlet property="teacherAvatar" destination="XMD-jO-43x" id="Xmc-GB-orL"/>
+                <outlet property="teacherName" destination="EV0-5G-Zqo" id="5ey-2N-aJc"/>
+            </connections>
+            <point key="canvasLocation" x="142.74809160305344" y="113.02816901408451"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="arrange_live_tag" width="20" height="16"/>
+        <image name="teacher_avatar" width="150" height="150"/>
+        <image name="video_placeholder" width="103" height="72"/>
+    </resources>
+</document>

+ 16 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.h

@@ -0,0 +1,16 @@
+//
+//  VideoCourseArrangeCell.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VideoCourseArrangeCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 48 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.m

@@ -0,0 +1,48 @@
+//
+//  VideoCourseArrangeCell.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/11/19.
+//
+
+#import "VideoCourseArrangeCell.h"
+
+@interface VideoCourseArrangeCell ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *coverImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *subjectLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseNameLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseTag;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseMessage;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseCount;
+
+@property (weak, nonatomic) IBOutlet UIView *musicView;
+
+@property (weak, nonatomic) IBOutlet UILabel *musicLabel;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *musicRight;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *musicLabelLeft;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *musicLabelRight;
+@end
+
+@implementation VideoCourseArrangeCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 215 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/ArrangeCourse/View/VideoCourseArrangeCell.xib

@@ -0,0 +1,215 @@
+<?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="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="142" id="KGk-i7-Jjw" customClass="VideoCourseArrangeCell">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="115"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="375" height="115"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rda-FY-B9W">
+                        <rect key="frame" x="14" y="0.0" width="347" height="103"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="video_placeholder" translatesAutoresizingMaskIntoConstraints="NO" id="4T6-bd-5EO">
+                                <rect key="frame" x="12" y="12" width="146" height="79"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="146" id="ZcR-4a-ykH"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="6"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jJ6-0j-owd">
+                                <rect key="frame" x="16" y="16" width="28" height="14"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="长笛" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c1P-HO-aD8">
+                                        <rect key="frame" x="4" y="1" width="20" height="12"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="12" id="nl8-EG-eyC"/>
+                                        </constraints>
+                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
+                                        <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 firstItem="c1P-HO-aD8" firstAttribute="leading" secondItem="jJ6-0j-owd" secondAttribute="leading" constant="4" id="UZx-AQ-zFv"/>
+                                    <constraint firstAttribute="trailing" secondItem="c1P-HO-aD8" secondAttribute="trailing" constant="4" id="Zei-L8-nty"/>
+                                    <constraint firstAttribute="bottom" secondItem="c1P-HO-aD8" secondAttribute="bottom" constant="1" id="fyZ-PT-bQU"/>
+                                    <constraint firstItem="c1P-HO-aD8" firstAttribute="top" secondItem="jJ6-0j-owd" secondAttribute="top" constant="1" id="uXE-tC-RPs"/>
+                                </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" horizontalCompressionResistancePriority="752" text="120" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g4R-nC-SBs">
+                                <rect key="frame" x="309" y="68" width="26" height="21"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="21" id="iMT-fx-cJM"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" name="DINAlternate-Bold" family="DIN Alternate" pointSize="18"/>
+                                <color key="textColor" red="0.95686274510000002" green="0.27058823529999998" blue="0.25490196079999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fJN-RM-wff">
+                                <rect key="frame" x="227.33333333333334" y="43" width="42.666666666666657" height="18"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4课时" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3GF-0R-nHu">
+                                        <rect key="frame" x="6.0000000000000018" y="0.0" width="30.666666666666671" height="18"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                        <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="0.96078431369999995" green="0.96470588239999999" blue="0.98039215690000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstItem="3GF-0R-nHu" firstAttribute="top" secondItem="fJN-RM-wff" secondAttribute="top" id="2qh-WM-Vao"/>
+                                    <constraint firstAttribute="bottom" secondItem="3GF-0R-nHu" secondAttribute="bottom" id="Sy2-4W-YTV"/>
+                                    <constraint firstAttribute="trailing" secondItem="3GF-0R-nHu" secondAttribute="trailing" constant="6" id="YVL-bu-Hc4"/>
+                                    <constraint firstAttribute="height" constant="18" id="Yfx-t5-PAU"/>
+                                    <constraint firstItem="3GF-0R-nHu" firstAttribute="leading" secondItem="fJN-RM-wff" secondAttribute="leading" constant="6" id="mUB-1B-Lye"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="3"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Exy-3P-Utb">
+                                <rect key="frame" x="170" y="43" width="53.333333333333343" height="18"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="3首曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9jz-X3-StJ">
+                                        <rect key="frame" x="6" y="0.0" width="41.333333333333336" height="18"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                        <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" red="0.96078431369999995" green="0.96470588239999999" blue="0.98039215690000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="bottom" secondItem="9jz-X3-StJ" secondAttribute="bottom" id="CeR-vz-kxa"/>
+                                    <constraint firstItem="9jz-X3-StJ" firstAttribute="leading" secondItem="Exy-3P-Utb" secondAttribute="leading" constant="6" id="HBP-66-Yvq"/>
+                                    <constraint firstItem="9jz-X3-StJ" firstAttribute="top" secondItem="Exy-3P-Utb" secondAttribute="top" id="OTY-sZ-NHc"/>
+                                    <constraint firstAttribute="trailing" secondItem="9jz-X3-StJ" secondAttribute="trailing" constant="6" id="hjb-CH-kVA"/>
+                                    <constraint firstAttribute="height" constant="18" id="xqt-aR-tcZ"/>
+                                </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="从零开始学竖笛视频课" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tVu-HG-WPK">
+                                <rect key="frame" x="170" y="14" width="165" height="21"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="21" id="PbQ-DU-qiX"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
+                                <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" horizontalCompressionResistancePriority="752" text="¥" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6xv-gM-cKE">
+                                <rect key="frame" x="300" y="71" width="7" height="17"/>
+                                <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>
+                            <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="pqK-xI-BUS">
+                                <rect key="frame" x="194" y="70.333333333333329" width="26" height="15.666666666666671"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <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" horizontalCompressionResistancePriority="752" image="teacher_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="Dg1-1t-Ytx">
+                                <rect key="frame" x="170" y="68" width="20" height="20"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="20" id="IaN-dQ-80V"/>
+                                    <constraint firstAttribute="height" constant="20" id="pdl-OI-Ldf"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="10"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="Dg1-1t-Ytx" firstAttribute="leading" secondItem="4T6-bd-5EO" secondAttribute="trailing" constant="12" id="2FX-f2-1a3"/>
+                            <constraint firstItem="tVu-HG-WPK" firstAttribute="leading" secondItem="4T6-bd-5EO" secondAttribute="trailing" constant="12" id="7Dd-y1-KtB"/>
+                            <constraint firstItem="Exy-3P-Utb" firstAttribute="leading" secondItem="4T6-bd-5EO" secondAttribute="trailing" constant="12" id="DqL-9i-TRW"/>
+                            <constraint firstItem="g4R-nC-SBs" firstAttribute="bottom" secondItem="6xv-gM-cKE" secondAttribute="bottom" constant="1" id="EKT-Su-ksX"/>
+                            <constraint firstAttribute="bottom" secondItem="4T6-bd-5EO" secondAttribute="bottom" constant="12" id="HcI-7e-Fev"/>
+                            <constraint firstItem="tVu-HG-WPK" firstAttribute="top" secondItem="Rda-FY-B9W" secondAttribute="top" constant="14" id="Jq1-Dv-pxn"/>
+                            <constraint firstAttribute="trailing" secondItem="tVu-HG-WPK" secondAttribute="trailing" constant="12" id="Nh0-3b-JPu"/>
+                            <constraint firstAttribute="bottom" secondItem="g4R-nC-SBs" secondAttribute="bottom" constant="14" id="P52-zH-aMW"/>
+                            <constraint firstAttribute="trailing" secondItem="g4R-nC-SBs" secondAttribute="trailing" constant="12" id="QiW-gC-6pK"/>
+                            <constraint firstItem="jJ6-0j-owd" firstAttribute="top" secondItem="4T6-bd-5EO" secondAttribute="top" constant="4" id="T26-rr-MWf"/>
+                            <constraint firstItem="fJN-RM-wff" firstAttribute="leading" secondItem="Exy-3P-Utb" secondAttribute="trailing" constant="4" id="T4p-AK-vOB"/>
+                            <constraint firstItem="6xv-gM-cKE" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="pqK-xI-BUS" secondAttribute="trailing" constant="10" id="Xjl-fJ-9fo"/>
+                            <constraint firstItem="fJN-RM-wff" firstAttribute="top" secondItem="tVu-HG-WPK" secondAttribute="bottom" constant="8" id="g2B-Du-rvX"/>
+                            <constraint firstItem="4T6-bd-5EO" firstAttribute="leading" secondItem="Rda-FY-B9W" secondAttribute="leading" constant="12" id="hrP-Lv-EBc"/>
+                            <constraint firstAttribute="bottom" secondItem="Dg1-1t-Ytx" secondAttribute="bottom" constant="15" id="kI2-5r-UjQ"/>
+                            <constraint firstItem="4T6-bd-5EO" firstAttribute="top" secondItem="Rda-FY-B9W" secondAttribute="top" constant="12" id="oFS-RP-gcc"/>
+                            <constraint firstItem="jJ6-0j-owd" firstAttribute="leading" secondItem="4T6-bd-5EO" secondAttribute="leading" constant="4" id="pfe-Pj-C5d"/>
+                            <constraint firstItem="pqK-xI-BUS" firstAttribute="leading" secondItem="Dg1-1t-Ytx" secondAttribute="trailing" constant="4" id="smA-9H-Pw0"/>
+                            <constraint firstItem="pqK-xI-BUS" firstAttribute="centerY" secondItem="Dg1-1t-Ytx" secondAttribute="centerY" id="wNo-5n-SrN"/>
+                            <constraint firstItem="g4R-nC-SBs" firstAttribute="leading" secondItem="6xv-gM-cKE" secondAttribute="trailing" constant="2" id="wP1-1u-K6o"/>
+                            <constraint firstItem="Exy-3P-Utb" firstAttribute="top" secondItem="tVu-HG-WPK" secondAttribute="bottom" constant="8" id="ydi-d9-Tf4"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="6"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="Rda-FY-B9W" secondAttribute="trailing" constant="14" id="8y4-cy-J39"/>
+                    <constraint firstItem="Rda-FY-B9W" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="UdT-S8-PjU"/>
+                    <constraint firstAttribute="bottom" secondItem="Rda-FY-B9W" secondAttribute="bottom" constant="12" id="W13-Rb-DrQ"/>
+                    <constraint firstItem="Rda-FY-B9W" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="pjs-Xg-vGz"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="courseCount" destination="3GF-0R-nHu" id="IGd-iA-Fro"/>
+                <outlet property="courseMessage" destination="g4R-nC-SBs" id="HRA-Rc-5Dz"/>
+                <outlet property="courseNameLabel" destination="tVu-HG-WPK" id="f9b-86-drU"/>
+                <outlet property="courseTag" destination="6xv-gM-cKE" id="JfJ-eR-qac"/>
+                <outlet property="coverImage" destination="4T6-bd-5EO" id="91Q-Fd-STg"/>
+                <outlet property="musicLabel" destination="9jz-X3-StJ" id="qYl-1f-DMQ"/>
+                <outlet property="musicLabelLeft" destination="HBP-66-Yvq" id="hTM-3A-cBa"/>
+                <outlet property="musicLabelRight" destination="hjb-CH-kVA" id="EeU-9S-eQ1"/>
+                <outlet property="musicRight" destination="T4p-AK-vOB" id="w57-s2-o5p"/>
+                <outlet property="musicView" destination="Exy-3P-Utb" id="2qL-64-Ug9"/>
+                <outlet property="subjectLabel" destination="c1P-HO-aD8" id="ncG-kl-VYW"/>
+            </connections>
+            <point key="canvasLocation" x="25.954198473282442" y="54.225352112676056"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="teacher_avatar" width="150" height="150"/>
+        <image name="video_placeholder" width="103" height="72"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 5 - 0
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -239,6 +239,11 @@
 			<key>isShown</key>
 			<false/>
 		</dict>
+		<key>White_YYModel.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
 		<key>Whiteboard-Whiteboard.xcscheme</key>
 		<dict>
 			<key>isShown</key>