Steven hace 3 años
padre
commit
a7ebd998f2
Se han modificado 89 ficheros con 3605 adiciones y 173 borrados
  1. 106 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 98 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme
  3. 18 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist
  4. BIN
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate
  5. 359 68
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  6. 1 1
      KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m
  7. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/Contents.json
  8. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/liveVideo_placeholder@2x.png
  9. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/liveVideo_placeholder@3x.png
  10. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/Contents.json
  11. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image1.imageset/Contents.json
  12. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image1.imageset/live_image1@2x.png
  13. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image2.imageset/Contents.json
  14. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image2.imageset/live_image2@2x.png
  15. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image3.imageset/Contents.json
  16. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image3.imageset/live_image3@2x.png
  17. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image4.imageset/Contents.json
  18. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image4.imageset/live_image4@2x.png
  19. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image5.imageset/Contents.json
  20. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image5.imageset/live_image5@2x.png
  21. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_feedback.imageset/Contents.json
  22. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_feedback.imageset/mine_feedback@2x.png
  23. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_feedback.imageset/mine_feedback@3x.png
  24. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/temp_live.imageset/Contents.json
  25. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/temp_live.imageset/temp_live@2x.png
  26. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/temp_live.imageset/temp_live@3x.png
  27. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/liveVidel_left.imageset/Contents.json
  28. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/liveVidel_left.imageset/liveVidel_left@2x.png
  29. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/liveVidel_left.imageset/liveVidel_left@3x.png
  30. 18 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m
  31. 34 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  32. 62 8
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  33. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/ShareMusic/Controller/ShareMusicViewController.m
  34. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m
  35. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Model/HomeworkListModel.h
  36. 7 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Model/HomeworkListModel.m
  37. 11 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkBodyView.m
  38. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.h
  39. 14 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.m
  40. 3 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.xib
  41. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html
  42. 40 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.m
  43. 111 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/Controller/MyMusicViewController.m
  44. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicBodyView.h
  45. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicBodyView.m
  46. 26 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.h
  47. 75 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.m
  48. 118 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.xib
  49. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MusicRoomCourseCell.m
  50. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MusicRoomCourseCell.xib
  51. 23 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/CreateLiveViewController.m
  52. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m
  53. 11 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveVideoRoomViewController.m
  54. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/Model/LiveroomTimeManager.m
  55. 3 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.h
  56. 12 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.m
  57. 64 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.xib
  58. 8 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m
  59. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CreateStyle/Controller/InstrumentChooseViewController.m
  60. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveCourse/View/MyLiveCourseBodyView.m
  61. 23 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Controller/LiveListViewController.h
  62. 173 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Controller/LiveListViewController.m
  63. 36 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveListModel.h
  64. 211 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveListModel.m
  65. 29 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveVideoModel.h
  66. 162 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveVideoModel.m
  67. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.h
  68. 63 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.m
  69. 153 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.xib
  70. 20 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveListBodyView.h
  71. 370 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveListBodyView.m
  72. 20 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.h
  73. 53 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.m
  74. 74 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.xib
  75. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.h
  76. 122 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.m
  77. 133 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.xib
  78. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.h
  79. 76 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.m
  80. 167 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.xib
  81. 40 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MinePageViewController.m
  82. 2 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.h
  83. 76 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.m
  84. 7 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageMienBodyView.m
  85. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageVideoView.m
  86. 3 59
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/SettingBodyView.xib
  87. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.h
  88. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.m
  89. 58 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.xib

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

@@ -579,6 +579,9 @@
 		BC7CFFD22817FF6D00CAEB21 /* CardDisplayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFD12817FF6D00CAEB21 /* CardDisplayView.xib */; };
 		BC7CFFD5281801A800CAEB21 /* CardBandBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */; };
 		BC7CFFD7281801B700CAEB21 /* CardBandBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */; };
+		BC8831002873D26000C702A0 /* LiveVideoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8830FE2873D25F00C702A0 /* LiveVideoModel.m */; };
+		BC8831042873D67C00C702A0 /* LiveVideoCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8831022873D67C00C702A0 /* LiveVideoCollectionViewCell.m */; };
+		BC8831052873D67C00C702A0 /* LiveVideoCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8831032873D67C00C702A0 /* LiveVideoCollectionViewCell.xib */; };
 		BC8A2CF828476C3000122BBE /* MusicScoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8A2CF728476C3000122BBE /* MusicScoreViewController.m */; };
 		BC8B6DB8285327DD00866917 /* MusicShareDisplayView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8B6DB7285327DD00866917 /* MusicShareDisplayView.m */; };
 		BC8B6DBA285327EE00866917 /* MusicShareDisplayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8B6DB9285327EE00866917 /* MusicShareDisplayView.xib */; };
@@ -656,6 +659,8 @@
 		BCA9CE4427FD947C00D558C6 /* AccompanyArrangeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9CE4227FD947C00D558C6 /* AccompanyArrangeCell.xib */; };
 		BCA9CE5027FD954800D558C6 /* AccompanyRemarkCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA9CE4E27FD954800D558C6 /* AccompanyRemarkCell.m */; };
 		BCA9CE5127FD954800D558C6 /* AccompanyRemarkCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA9CE4F27FD954800D558C6 /* AccompanyRemarkCell.xib */; };
+		BCAD01C02872F54F0002CC40 /* LiveVideoListView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCAD01BF2872F54F0002CC40 /* LiveVideoListView.m */; };
+		BCAD01C22872F5560002CC40 /* LiveVideoListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCAD01C12872F5560002CC40 /* LiveVideoListView.xib */; };
 		BCB399AC27F946A200AFF376 /* CourseNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB399AB27F946A200AFF376 /* CourseNavView.m */; };
 		BCB399AE27F946AA00AFF376 /* CourseNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB399AD27F946AA00AFF376 /* CourseNavView.xib */; };
 		BCB399B227F94B5A00AFF376 /* LTSCalendarBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB399B027F94B5A00AFF376 /* LTSCalendarBottomView.m */; };
@@ -694,6 +699,15 @@
 		BCB9FA40286DA337005D766B /* GuideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA3B286DA337005D766B /* GuideViewController.m */; };
 		BCB9FA41286DA337005D766B /* GuideListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB9FA3D286DA337005D766B /* GuideListView.xib */; };
 		BCB9FA42286DA337005D766B /* GuideListView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA3F286DA337005D766B /* GuideListView.m */; };
+		BCB9FA4D28717BB2005D766B /* MyMusicSearchView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA4C28717BB1005D766B /* MyMusicSearchView.m */; };
+		BCB9FA4F28717BBD005D766B /* MyMusicSearchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB9FA4E28717BBD005D766B /* MyMusicSearchView.xib */; };
+		BCB9FA562872BA85005D766B /* LiveListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA552872BA84005D766B /* LiveListViewController.m */; };
+		BCB9FA592872C670005D766B /* LiveListBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA582872C670005D766B /* LiveListBodyView.m */; };
+		BCB9FA622872C8D2005D766B /* UnderwayLiveCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA602872C8D2005D766B /* UnderwayLiveCell.m */; };
+		BCB9FA632872C8D2005D766B /* UnderwayLiveCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB9FA612872C8D2005D766B /* UnderwayLiveCell.xib */; };
+		BCB9FA672872C8F0005D766B /* FinishedLiveCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA652872C8F0005D766B /* FinishedLiveCell.m */; };
+		BCB9FA682872C8F0005D766B /* FinishedLiveCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB9FA662872C8F0005D766B /* FinishedLiveCell.xib */; };
+		BCB9FA6B2872D57E005D766B /* LiveListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA692872D57E005D766B /* LiveListModel.m */; };
 		BCC03F88280460C000461B7C /* InstrumentHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC03F86280460C000461B7C /* InstrumentHeaderView.m */; };
 		BCC03F89280460C000461B7C /* InstrumentHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC03F87280460C000461B7C /* InstrumentHeaderView.xib */; };
 		BCC03F8C280526B300461B7C /* MyStyleVideoChooseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC03F8B280526B300461B7C /* MyStyleVideoChooseView.m */; };
@@ -1901,6 +1915,11 @@
 		BC7CFFD3281801A800CAEB21 /* CardBandBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardBandBodyView.h; sourceTree = "<group>"; };
 		BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardBandBodyView.m; sourceTree = "<group>"; };
 		BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardBandBodyView.xib; sourceTree = "<group>"; };
+		BC8830FE2873D25F00C702A0 /* LiveVideoModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveVideoModel.m; sourceTree = "<group>"; };
+		BC8830FF2873D25F00C702A0 /* LiveVideoModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveVideoModel.h; sourceTree = "<group>"; };
+		BC8831012873D67B00C702A0 /* LiveVideoCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveVideoCollectionViewCell.h; sourceTree = "<group>"; };
+		BC8831022873D67C00C702A0 /* LiveVideoCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveVideoCollectionViewCell.m; sourceTree = "<group>"; };
+		BC8831032873D67C00C702A0 /* LiveVideoCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LiveVideoCollectionViewCell.xib; sourceTree = "<group>"; };
 		BC8A2CF628476C2F00122BBE /* MusicScoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicScoreViewController.h; sourceTree = "<group>"; };
 		BC8A2CF728476C3000122BBE /* MusicScoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MusicScoreViewController.m; sourceTree = "<group>"; };
 		BC8B6DB6285327DD00866917 /* MusicShareDisplayView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicShareDisplayView.h; sourceTree = "<group>"; };
@@ -2024,6 +2043,9 @@
 		BCA9CE4D27FD954800D558C6 /* AccompanyRemarkCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccompanyRemarkCell.h; sourceTree = "<group>"; };
 		BCA9CE4E27FD954800D558C6 /* AccompanyRemarkCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccompanyRemarkCell.m; sourceTree = "<group>"; };
 		BCA9CE4F27FD954800D558C6 /* AccompanyRemarkCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccompanyRemarkCell.xib; sourceTree = "<group>"; };
+		BCAD01BE2872F54F0002CC40 /* LiveVideoListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveVideoListView.h; sourceTree = "<group>"; };
+		BCAD01BF2872F54F0002CC40 /* LiveVideoListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveVideoListView.m; sourceTree = "<group>"; };
+		BCAD01C12872F5560002CC40 /* LiveVideoListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LiveVideoListView.xib; sourceTree = "<group>"; };
 		BCB399AA27F946A200AFF376 /* CourseNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseNavView.h; sourceTree = "<group>"; };
 		BCB399AB27F946A200AFF376 /* CourseNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseNavView.m; sourceTree = "<group>"; };
 		BCB399AD27F946AA00AFF376 /* CourseNavView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseNavView.xib; sourceTree = "<group>"; };
@@ -2090,6 +2112,21 @@
 		BCB9FA3D286DA337005D766B /* GuideListView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GuideListView.xib; sourceTree = "<group>"; };
 		BCB9FA3E286DA337005D766B /* GuideListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuideListView.h; sourceTree = "<group>"; };
 		BCB9FA3F286DA337005D766B /* GuideListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GuideListView.m; sourceTree = "<group>"; };
+		BCB9FA4B28717BB1005D766B /* MyMusicSearchView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyMusicSearchView.h; sourceTree = "<group>"; };
+		BCB9FA4C28717BB1005D766B /* MyMusicSearchView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyMusicSearchView.m; sourceTree = "<group>"; };
+		BCB9FA4E28717BBD005D766B /* MyMusicSearchView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyMusicSearchView.xib; sourceTree = "<group>"; };
+		BCB9FA542872BA84005D766B /* LiveListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveListViewController.h; sourceTree = "<group>"; };
+		BCB9FA552872BA84005D766B /* LiveListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveListViewController.m; sourceTree = "<group>"; };
+		BCB9FA572872C670005D766B /* LiveListBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveListBodyView.h; sourceTree = "<group>"; };
+		BCB9FA582872C670005D766B /* LiveListBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveListBodyView.m; sourceTree = "<group>"; };
+		BCB9FA5F2872C8D2005D766B /* UnderwayLiveCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnderwayLiveCell.h; sourceTree = "<group>"; };
+		BCB9FA602872C8D2005D766B /* UnderwayLiveCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UnderwayLiveCell.m; sourceTree = "<group>"; };
+		BCB9FA612872C8D2005D766B /* UnderwayLiveCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UnderwayLiveCell.xib; sourceTree = "<group>"; };
+		BCB9FA642872C8F0005D766B /* FinishedLiveCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FinishedLiveCell.h; sourceTree = "<group>"; };
+		BCB9FA652872C8F0005D766B /* FinishedLiveCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FinishedLiveCell.m; sourceTree = "<group>"; };
+		BCB9FA662872C8F0005D766B /* FinishedLiveCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FinishedLiveCell.xib; sourceTree = "<group>"; };
+		BCB9FA692872D57E005D766B /* LiveListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveListModel.m; sourceTree = "<group>"; };
+		BCB9FA6A2872D57E005D766B /* LiveListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveListModel.h; sourceTree = "<group>"; };
 		BCC03F85280460C000461B7C /* InstrumentHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InstrumentHeaderView.h; sourceTree = "<group>"; };
 		BCC03F86280460C000461B7C /* InstrumentHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InstrumentHeaderView.m; sourceTree = "<group>"; };
 		BCC03F87280460C000461B7C /* InstrumentHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = InstrumentHeaderView.xib; sourceTree = "<group>"; };
@@ -3681,6 +3718,7 @@
 		277935FE27E32BBF0010E277 /* Mine */ = {
 			isa = PBXGroup;
 			children = (
+				BCB9FA502872BA6D005D766B /* LiveList */,
 				BC4BCE622823990100522C8B /* AddressList */,
 				BC7CFFBF2817F1EE00CAEB21 /* BankCard */,
 				BC5EB5AC2804016200B4A3B0 /* CreateStyle */,
@@ -4207,6 +4245,9 @@
 				BC8B6E6628575DD200866917 /* MusicDisplayView.h */,
 				BC8B6E6728575DD200866917 /* MusicDisplayView.m */,
 				BC8B6E6928575DED00866917 /* MusicDisplayView.xib */,
+				BCB9FA4B28717BB1005D766B /* MyMusicSearchView.h */,
+				BCB9FA4C28717BB1005D766B /* MyMusicSearchView.m */,
+				BCB9FA4E28717BBD005D766B /* MyMusicSearchView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -5440,6 +5481,57 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BCB9FA502872BA6D005D766B /* LiveList */ = {
+			isa = PBXGroup;
+			children = (
+				BCB9FA512872BA6D005D766B /* Controller */,
+				BCB9FA522872BA6D005D766B /* Model */,
+				BCB9FA532872BA6D005D766B /* View */,
+			);
+			path = LiveList;
+			sourceTree = "<group>";
+		};
+		BCB9FA512872BA6D005D766B /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BCB9FA542872BA84005D766B /* LiveListViewController.h */,
+				BCB9FA552872BA84005D766B /* LiveListViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BCB9FA522872BA6D005D766B /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BCB9FA6A2872D57E005D766B /* LiveListModel.h */,
+				BCB9FA692872D57E005D766B /* LiveListModel.m */,
+				BC8830FF2873D25F00C702A0 /* LiveVideoModel.h */,
+				BC8830FE2873D25F00C702A0 /* LiveVideoModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BCB9FA532872BA6D005D766B /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BCB9FA572872C670005D766B /* LiveListBodyView.h */,
+				BCB9FA582872C670005D766B /* LiveListBodyView.m */,
+				BCB9FA5F2872C8D2005D766B /* UnderwayLiveCell.h */,
+				BCB9FA602872C8D2005D766B /* UnderwayLiveCell.m */,
+				BCB9FA612872C8D2005D766B /* UnderwayLiveCell.xib */,
+				BCB9FA642872C8F0005D766B /* FinishedLiveCell.h */,
+				BCB9FA652872C8F0005D766B /* FinishedLiveCell.m */,
+				BCB9FA662872C8F0005D766B /* FinishedLiveCell.xib */,
+				BCAD01BE2872F54F0002CC40 /* LiveVideoListView.h */,
+				BCAD01BF2872F54F0002CC40 /* LiveVideoListView.m */,
+				BCAD01C12872F5560002CC40 /* LiveVideoListView.xib */,
+				BC8831012873D67B00C702A0 /* LiveVideoCollectionViewCell.h */,
+				BC8831022873D67C00C702A0 /* LiveVideoCollectionViewCell.m */,
+				BC8831032873D67C00C702A0 /* LiveVideoCollectionViewCell.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		BCC9F35A27F69BD100647449 /* SealClass */ = {
 			isa = PBXGroup;
 			children = (
@@ -6058,6 +6150,7 @@
 				BCB908F82850C6EF00F5FF69 /* MusicChooseCell.xib in Resources */,
 				BC24570C286C436E00D1F7C0 /* KSCloudBeatView.xib in Resources */,
 				BCC9F43227F69BD200647449 /* class_stop.mp3 in Resources */,
+				BC8831052873D67C00C702A0 /* LiveVideoCollectionViewCell.xib in Resources */,
 				2755C08E27ED5DB2007D9070 /* GroupApplyChooseCell.xib in Resources */,
 				BCF61BE9280425DA0000ACFE /* InstrumentChooseCell.xib in Resources */,
 				BC76146F280D57220080FD1F /* HomeworkVideoView.xib in Resources */,
@@ -6111,6 +6204,7 @@
 				2723B68E27F1686100E0B90B /* HomeNavView.xib in Resources */,
 				BC5EB5C62804087700B4A3B0 /* MyStyleBottomView.xib in Resources */,
 				BCDB093F2805C0EF00D0BDAD /* NewClassPopCell.xib in Resources */,
+				BCAD01C22872F5560002CC40 /* LiveVideoListView.xib in Resources */,
 				275E3DE927F4679E0010EC30 /* LiveRoomHeadView.xib in Resources */,
 				27D83F4E27F3EC2100062476 /* CreateLiveBodyView.xib in Resources */,
 				BCEA75282819103B00886A86 /* UnbindBodyView.xib in Resources */,
@@ -6130,6 +6224,7 @@
 				BC8B6E562856ED0600866917 /* iOS集成升级必读.pdf in Resources */,
 				BC8B6E6A28575DEE00866917 /* MusicDisplayView.xib in Resources */,
 				BCB9FA21286D53A1005D766B /* ScanNavView.xib in Resources */,
+				BCB9FA4F28717BBD005D766B /* MyMusicSearchView.xib in Resources */,
 				BC483233282A6473005F534C /* HomeRecentCourseView.xib in Resources */,
 				2708565927ED961900EC8E72 /* ApplyBottomView.xib in Resources */,
 				BCB399AE27F946AA00AFF376 /* CourseNavView.xib in Resources */,
@@ -6176,6 +6271,7 @@
 				BC32E10E286AB326001434DD /* KSPublicAlertView.xib in Resources */,
 				BC7CFFAA2817E3BD00CAEB21 /* IncomeCountTopView.xib in Resources */,
 				BC0A22B82847523E0065C1AB /* MemberListCell.xib in Resources */,
+				BCB9FA632872C8D2005D766B /* UnderwayLiveCell.xib in Resources */,
 				BCA9CE3A27FD93EB00D558C6 /* AccompanyStudentEvaCell.xib in Resources */,
 				BCE6A09627F823DC00C97704 /* MinePageMusicCell.xib in Resources */,
 				BC4BCE722823A03A00522C8B /* AddressBottomView.xib in Resources */,
@@ -6207,6 +6303,7 @@
 				2779329A27E30FEB0010E277 /* mss_browseLoading@2x.png in Resources */,
 				27F9CAFC27EC1AF3003E0FE4 /* ContractListCell.xib in Resources */,
 				BCA9CE5127FD954800D558C6 /* AccompanyRemarkCell.xib in Resources */,
+				BCB9FA682872C8F0005D766B /* FinishedLiveCell.xib in Resources */,
 				BCF61BDE280417190000ACFE /* MyStyleVideoView.xib in Resources */,
 				BCC03F89280460C000461B7C /* InstrumentHeaderView.xib in Resources */,
 				BCD6D16728195A98009A773E /* WithdrawApplyBodyView.xib in Resources */,
@@ -6324,6 +6421,7 @@
 				2708565D27EDA83100EC8E72 /* GroupMemberListCell.m in Sources */,
 				277931BF27E30FC20010E277 /* CoinModel.m in Sources */,
 				BCC9F43127F69BD200647449 /* NormalAlertView.m in Sources */,
+				BCB9FA562872BA85005D766B /* LiveListViewController.m in Sources */,
 				2779321F27E30FC30010E277 /* ShoppCatView.m in Sources */,
 				277931CD27E30FC20010E277 /* KSPremissionAlert.m in Sources */,
 				2779323927E30FC30010E277 /* LLCollectionViewCell.m in Sources */,
@@ -6334,6 +6432,7 @@
 				277931EB27E30FC20010E277 /* NSArray+zh_SafeAccess.m in Sources */,
 				BCA724042806AFF100DA0D0D /* AccompanyCourseInfoCell.m in Sources */,
 				BC245704286C434800D1F7C0 /* MidiPlayerEngine.m in Sources */,
+				BC8831042873D67C00C702A0 /* LiveVideoCollectionViewCell.m in Sources */,
 				BCB633F527F6A18200ACFDCF /* NewClassRoomViewController.m in Sources */,
 				BC4BCE6C28239EEB00522C8B /* MyAddressListCell.m in Sources */,
 				BCD6D16228195A17009A773E /* WithdrawApplyViewController.m in Sources */,
@@ -6410,6 +6509,7 @@
 				BCDB093E2805C0EF00D0BDAD /* NewClassPopCell.m in Sources */,
 				BCC9F41B27F69BD200647449 /* RecentSharedWhiteboardCell.m in Sources */,
 				BCB635B627F6FB0A00ACFDCF /* SeatTipsView.m in Sources */,
+				BCB9FA672872C8F0005D766B /* FinishedLiveCell.m in Sources */,
 				277935EB27E32A930010E277 /* KSBaseWKWebViewController.m in Sources */,
 				275B172627EB1C6C0081FDEF /* KSBaseTableViewController.m in Sources */,
 				BC2456E9286BEF8000D1F7C0 /* MineEmptyGroupCell.m in Sources */,
@@ -6424,6 +6524,7 @@
 				BC5EB5BB2804083800B4A3B0 /* MyStyleIntroduceCell.m in Sources */,
 				277931D627E30FC20010E277 /* UIImage+Property.m in Sources */,
 				2779326727E30FD80010E277 /* FSCalendarStickyHeader.m in Sources */,
+				BCB9FA592872C670005D766B /* LiveListBodyView.m in Sources */,
 				BCD6D16A28195FBE009A773E /* CashRecordHeadView.m in Sources */,
 				277931F027E30FC20010E277 /* UIView+AddConstraints.m in Sources */,
 				277D432527E9A46A00107DB7 /* ModifyPhoneCheckController.m in Sources */,
@@ -6466,6 +6567,7 @@
 				275B171727EB1B930081FDEF /* KSSearchHistoryMessageController.m in Sources */,
 				275E3DE227F467410010EC30 /* KSChatEmojiCollectionCell.m in Sources */,
 				275E3DC227F45F3F0010EC30 /* KSLiveChatroomWelcome.m in Sources */,
+				BC8831002873D26000C702A0 /* LiveVideoModel.m in Sources */,
 				BC1365C8280D476500EB03E2 /* NotiferMessageCell.m in Sources */,
 				27F9030E27E875DD00C08A19 /* AudioPlayManager.m in Sources */,
 				BCC9F41127F69BD200647449 /* MessageCell.m in Sources */,
@@ -6618,6 +6720,7 @@
 				275B16EF27EAF9B20081FDEF /* ChatNavView.m in Sources */,
 				BCA353E92859A6FB00377661 /* MusicRoomHomeworkCell.m in Sources */,
 				BCEA752028190CEB00886A86 /* CardBandResultViewController.m in Sources */,
+				BCB9FA4D28717BB2005D766B /* MyMusicSearchView.m in Sources */,
 				BCC9F43627F69BD200647449 /* SongDownloadMessage.m in Sources */,
 				275B170527EB13420081FDEF /* KSChatListViewController.m in Sources */,
 				277931C827E30FC20010E277 /* KSVideoEditor.m in Sources */,
@@ -6697,6 +6800,7 @@
 				277931C727E30FC20010E277 /* NSMutableString+KSSafe.m in Sources */,
 				BCA353D82858B18100377661 /* StudentHomeworkList.m in Sources */,
 				BCC9F44527F69BD200647449 /* Whiteboard.m in Sources */,
+				BCAD01C02872F54F0002CC40 /* LiveVideoListView.m in Sources */,
 				BCC9F44327F69BD200647449 /* AccompanyDownloadCallbackMessage.m in Sources */,
 				2779322327E30FC30010E277 /* PIckView.m in Sources */,
 				BCED5CAE28507E5F009A42DE /* KSChatLiveMessage.m in Sources */,
@@ -6729,6 +6833,7 @@
 				27D83F5427F408E000062476 /* LivePrepareViewController.m in Sources */,
 				2780A06427E81E4900447CFD /* MineNavView.m in Sources */,
 				2779326E27E30FD80010E277 /* FSCalendarCalculator.m in Sources */,
+				BCB9FA6B2872D57E005D766B /* LiveListModel.m in Sources */,
 				2779320027E30FC30010E277 /* QCCountdownButton.m in Sources */,
 				277932EF27E310070010E277 /* UIView+TZLayout.m in Sources */,
 				2779321427E30FC30010E277 /* MBProgressHUD+NJ.m in Sources */,
@@ -6923,6 +7028,7 @@
 				2779362C27E33C2B0010E277 /* LoginBodyView.m in Sources */,
 				BC1191F3280EAB9600A716F7 /* AccompanyDetailViewController.m in Sources */,
 				277931DD27E30FC20010E277 /* UIImage+Resize.m in Sources */,
+				BCB9FA622872C8D2005D766B /* UnderwayLiveCell.m in Sources */,
 				BCB399B227F94B5A00AFF376 /* LTSCalendarBottomView.m in Sources */,
 				BC8B6E84285887A400866917 /* MusicRoomViewController.m in Sources */,
 				275E3DA327F441EC0010EC30 /* KSEnterLiveroomManager.m in Sources */,

+ 98 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1330"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "275E8A6327E18F2300DD3F6E"
+               BuildableName = "KulexiuForTeacher.app"
+               BlueprintName = "KulexiuForTeacher"
+               ReferencedContainer = "container:KulexiuForTeacher.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "275E8A7E27E18F2800DD3F6E"
+               BuildableName = "KulexiuForTeacherTests.xctest"
+               BlueprintName = "KulexiuForTeacherTests"
+               ReferencedContainer = "container:KulexiuForTeacher.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "275E8A8827E18F2900DD3F6E"
+               BuildableName = "KulexiuForTeacherUITests.xctest"
+               BlueprintName = "KulexiuForTeacherUITests"
+               ReferencedContainer = "container:KulexiuForTeacher.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "275E8A6327E18F2300DD3F6E"
+            BuildableName = "KulexiuForTeacher.app"
+            BlueprintName = "KulexiuForTeacher"
+            ReferencedContainer = "container:KulexiuForTeacher.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "275E8A6327E18F2300DD3F6E"
+            BuildableName = "KulexiuForTeacher.app"
+            BlueprintName = "KulexiuForTeacher"
+            ReferencedContainer = "container:KulexiuForTeacher.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 18 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -10,5 +10,23 @@
 			<integer>26</integer>
 		</dict>
 	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>275E8A6327E18F2300DD3F6E</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>275E8A7E27E18F2800DD3F6E</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>275E8A8827E18F2900DD3F6E</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
 </dict>
 </plist>

BIN
KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate


+ 359 - 68
KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -179,22 +179,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "AF785028-EFA3-45BA-BAE0-3EA9820B3DFB"
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "249"
-            endingLineNumber = "249"
-            landmarkName = "-configMessage:headSource:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "71FA8FBF-57FD-4D5B-94AE-AB18D5ACCB52"
             shouldBeEnabled = "No"
             ignoreCount = "0"
@@ -202,8 +186,8 @@
             filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1184"
-            endingLineNumber = "1184"
+            startingLineNumber = "1201"
+            endingLineNumber = "1201"
             landmarkName = "-documentPicker:didPickDocumentAtURL:"
             landmarkType = "7">
          </BreakpointContent>
@@ -211,22 +195,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "B51A7095-7E78-4224-9F20-BFF5B87D9602"
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "337"
-            endingLineNumber = "337"
-            landmarkName = "-configMessage:headSource:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "4E18CE7A-8F95-406E-B5E2-29C90A45F6E6"
             shouldBeEnabled = "No"
             ignoreCount = "0"
@@ -426,8 +394,8 @@
             filePath = "KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "598"
-            endingLineNumber = "598"
+            startingLineNumber = "604"
+            endingLineNumber = "604"
             landmarkName = "-memberDidJoin:"
             landmarkType = "7">
          </BreakpointContent>
@@ -588,24 +556,8 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "C68DB6BB-00AA-47F5-8BFE-086AEC494C5F"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Common/Tools/Extension/NSDictionary+Extension.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "31"
-            endingLineNumber = "31"
-            landmarkName = "-longValueForKey:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "8C885F47-AACF-49FA-AA9E-27E0C5C4C6F2"
-            shouldBeEnabled = "Yes"
+            shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/Message/MemberChangeMessage.m"
@@ -655,8 +607,8 @@
             filePath = "KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1791"
-            endingLineNumber = "1791"
+            startingLineNumber = "1807"
+            endingLineNumber = "1807"
             landmarkName = "-showAnimationView:showMessag:"
             landmarkType = "7">
          </BreakpointContent>
@@ -680,48 +632,387 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "15D1244A-6788-434A-8201-E692667D7059"
+            uuid = "289E6237-EF1C-4ACF-8BFF-6855E14AF4C6"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/ClassroomService.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "220"
+            endingLineNumber = "220"
+            landmarkName = "-queryNoJoinRoomList:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "F7171A21-1BB6-44FD-88C5-DDEDFC27482C"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "84"
-            endingLineNumber = "84"
-            landmarkName = "-operationDealCallbackMessage:"
+            startingLineNumber = "613"
+            endingLineNumber = "613"
+            landmarkName = "-chooseMediaWithType:maxCount:bucket:"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "289E6237-EF1C-4ACF-8BFF-6855E14AF4C6"
+            uuid = "A2B1BE97-A470-4E36-A860-CEC997E807A0"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "311"
+            endingLineNumber = "311"
+            landmarkName = "-configMessage:headSource:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "8B301842-497E-4618-9DC2-36C235BA6745"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "347"
+            endingLineNumber = "347"
+            landmarkName = "-configMessage:headSource:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "16219C93-2CD3-4FEF-BD85-B75A9ED4121F"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/x.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "136"
+            endingLineNumber = "136"
+            landmarkName = "-joinClassroom:userName:isAudience:success:error:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "66AAD507-BD70-490C-A1AA-FD27CE97E934"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/ClassroomService.m"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveVideoRoomViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "220"
-            endingLineNumber = "220"
-            landmarkName = "-queryNoJoinRoomList:"
+            startingLineNumber = "526"
+            endingLineNumber = "526"
+            landmarkName = "-quitNotiferService"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "F7171A21-1BB6-44FD-88C5-DDEDFC27482C"
+            uuid = "29CEA109-EFED-4F55-B63D-6B980B5FF9F4"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveVideoRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "145"
+            endingLineNumber = "145"
+            landmarkName = "-liveroomQuit"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "F886B3BD-7F0F-4412-827B-D510C4C7E842"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1183"
+            endingLineNumber = "1183"
+            landmarkName = "-didReceiveMessageNotification:"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "F886B3BD-7F0F-4412-827B-D510C4C7E842 - ffb5e0723c52b853"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[LiveRoomViewController didReceiveMessageNotification:]"
+                  moduleName = "KulexiuForTeacher"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/wangzhi/DayaWorkspace/klx_teacher/KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1193"
+                  endingLineNumber = "1193"
+                  offsetFromSymbolStart = "1104">
+               </Location>
+               <Location
+                  uuid = "F886B3BD-7F0F-4412-827B-D510C4C7E842 - ffb5e0723c52b853"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[LiveRoomViewController didReceiveMessageNotification:]"
+                  moduleName = "KulexiuForTeacher"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/wangzhi/DayaWorkspace/klx_teacher/KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1193"
+                  endingLineNumber = "1193"
+                  offsetFromSymbolStart = "1108">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "2FB2461A-79DB-449D-B2BE-554278B1F157"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/AppDelegate.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "465"
+            endingLineNumber = "465"
+            landmarkName = "-onRCIMReceiveMessage:left:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "8710CDEB-C48B-4909-85CE-E9A80B3DECC8"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1098"
+            endingLineNumber = "1098"
+            landmarkName = "-didReceiveMessageNotification:"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "8710CDEB-C48B-4909-85CE-E9A80B3DECC8 - ffb5e0723c52b853"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[LiveRoomViewController didReceiveMessageNotification:]"
+                  moduleName = "KulexiuForTeacher"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/wangzhi/DayaWorkspace/klx_teacher/KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1193"
+                  endingLineNumber = "1193"
+                  offsetFromSymbolStart = "1104">
+               </Location>
+               <Location
+                  uuid = "8710CDEB-C48B-4909-85CE-E9A80B3DECC8 - ffb5e0723c52b853"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[LiveRoomViewController didReceiveMessageNotification:]"
+                  moduleName = "KulexiuForTeacher"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/wangzhi/DayaWorkspace/klx_teacher/KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1193"
+                  endingLineNumber = "1193"
+                  offsetFromSymbolStart = "1108">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "85DE3513-44F0-43A5-8201-EA8E61969DCF"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveVideoRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "720"
+            endingLineNumber = "720"
+            landmarkName = "-quitClassroomNotifer"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.AddressBreakpoint">
+         <BreakpointContent
+            uuid = "856137FD-FD7E-4836-B7BA-53ECC0F6F050"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            symbolName = "*0x1dc7f5eb4">
+            <Locations>
+               <Location
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  usesParentBreakpointCondition = "Yes"
+                  offsetFromSymbolStart = "0">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "4820E9FB-92BA-420F-9FD5-484C57635B50"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "467"
+            endingLineNumber = "467"
+            landmarkName = "-judgeAutoClose"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "A69885F4-2897-4F2A-B71D-D2D2C7E56B98"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "624"
+            endingLineNumber = "624"
+            landmarkName = "-IMConnetedCallback"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "BCEF1D87-B72E-46C8-A8E9-2F911ACE628F"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "596"
-            endingLineNumber = "596"
-            landmarkName = "-chooseMediaWithType:maxCount:bucket:"
+            startingLineNumber = "537"
+            endingLineNumber = "537"
+            landmarkName = "-handleScriptMessageSource:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "A6E13BFE-9049-4248-AA95-75744735E63C"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Mine/LiveList/Controller/LiveRecordViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "32"
+            endingLineNumber = "32"
+            landmarkName = "-requestData"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "22B509ED-2A9F-4D2C-857A-4518277045D3"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/Homework/View/HomeworkBodyView.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "110"
+            endingLineNumber = "110"
+            landmarkName = "-requestData"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "26167999-CC0F-4181-993A-4D5DC14B0B56"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Mine/MinePage/View/MinePageMienBodyView.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "79"
+            endingLineNumber = "79"
+            landmarkName = "-requestData"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "E460B4E7-C941-40E4-BCBF-5810C73A6B49"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "90"
+            endingLineNumber = "90"
+            landmarkName = "-collectionView:didSelectItemAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "C10C032F-4633-4EB2-8E18-6484FE0B4419"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Common/Base/KSNetworkingManager.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1173"
+            endingLineNumber = "1173"
+            landmarkName = "+liveRoomCreateTempLiveRoom:coverPic:liveRemark:roomTitle:liveTime:success:faliure:"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m

@@ -52,7 +52,7 @@
 
 @end
 
-@interface AppDelegate ()<UITabBarControllerDelegate,RCIMReceiveMessageDelegate>
+@interface AppDelegate ()<UITabBarControllerDelegate,RCIMReceiveMessageDelegate,JPUSHRegisterDelegate>
 
 @property (nonatomic, assign) BOOL isNeedUpdate;
 

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/liveVideo_placeholder@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Live/liveVideo_placeholder.imageset/liveVideo_placeholder@3x.png


+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/Contents.json

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

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image1.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image1.imageset/live_image1@2x.png


+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image2.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image2.imageset/live_image2@2x.png


+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image3.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image3.imageset/live_image3@2x.png


+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image4.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image4.imageset/live_image4@2x.png


+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image5.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/live_image/live_image5.imageset/live_image5@2x.png


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

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_feedback.imageset/mine_feedback@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/mine_feedback.imageset/mine_feedback@3x.png


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

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/temp_live.imageset/temp_live@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/temp_live.imageset/temp_live@3x.png


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

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/liveVidel_left.imageset/liveVidel_left@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/liveVidel_left.imageset/liveVidel_left@3x.png


+ 18 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m

@@ -62,6 +62,8 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 @property (nonatomic, strong) NSString *bucketName;
 
+@property (nonatomic, assign) BOOL isFirstLoad;
+
 @end
 
 @implementation KSBaseWKWebViewController
@@ -72,6 +74,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     self.ks_prefersNavigationBarHidden = YES; // 隐藏导航栏,其他事件额外处理
     [self initWebView];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(operationDealCallbackMessage:) name:DEALCALLBACKNOTICIFATION object:nil];
+    self.isFirstLoad = YES;
 }
 
 - (void)operationDealCallbackMessage:(NSNotification *)notification {
@@ -115,11 +118,23 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         [UIDevice switchNewOrientation:UIInterfaceOrientationPortrait];
     }
 }
+
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     if (_hasChangeSource) {
         [self setParmDic:self.parmDic];
     }
+    if (self.isFirstLoad == NO) {
+        [self sendResumeMessage];
+    }
+    self.isFirstLoad = NO;
+}
+
+- (void)sendResumeMessage {
+    
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@"webViewOnResume" forKey:@"api"];
+    [self postMessage:parm];
 }
 
 - (void)viewWillDisappear:(BOOL)animated {
@@ -518,7 +533,9 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             [self.navigationController pushViewController:ctrl animated:YES];
         }
     }
-    
+    else if ([[parm stringValueForKey:@"api"] isEqualToString:@"openPageSuccess"]) {
+//        [self backAction];
+    }
 }
 
 

+ 34 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -521,9 +521,10 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param page 分页
 /// @param rows 条数
 /// @param search 搜索
+/// @param subjectIds 声部
 /// @param success 成功
 /// @param faliure 失败
-+ (void)musicListRequest:(NSString *)post auditStatus:(NSString *)auditStatus page:(NSInteger)page rows:(NSInteger)rows search:(NSString *)search success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
++ (void)musicListRequest:(NSString *)post auditStatus:(NSString *)auditStatus page:(NSInteger)page rows:(NSInteger)rows search:(NSString *)search subjectIds:(NSString *)subjectIds success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 
 // /api-teacher/music/sheet/share
@@ -535,6 +536,27 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)queryMusicShareMessageRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 #pragma mark ----- 直播房间与课程的关系表
+// /api-teacher/liveRoom/queryPageRoom
+// 查询用户关联的临时直播信息
+
+/// 查询直播间
+/// @param post post
+/// @param liveState 房间状态
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryPageRoomRequest:(NSString *)post liveState:(NSInteger)liveState page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/liveRoomVideo/queryVideo
+
+/// 查询直播视频
+/// @param get get
+/// @param roomUid 房间号
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryVideoRequest:(NSString *)get roomUid:(NSString *)roomUid success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 // /api-teacher/liveRoom/createTempLiveRoom
 
 /// 创建直播 (临时开播)
@@ -542,9 +564,10 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param coverPic 封面图
 /// @param liveRemark 直播内容(200以内)
 /// @param roomTitle 房间标题
+/// @param liveTime 直播时长
 /// @param success 成功
 /// @param faliure 失败
-+ (void)liveRoomCreateTempLiveRoom:(NSString *)post coverPic:(NSString *)coverPic liveRemark:(NSString *)liveRemark roomTitle:(NSString *)roomTitle success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
++ (void)liveRoomCreateTempLiveRoom:(NSString *)post coverPic:(NSString *)coverPic liveRemark:(NSString *)liveRemark roomTitle:(NSString *)roomTitle liveTime:(NSInteger)liveTime success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 // /teacher-server/liveRoom/speakerCheckRoomInfo
 
@@ -853,6 +876,15 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)teacherAccountDetail:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 #pragma mark ----- 提现
+// 协议查询 /api-teacher/sysUserContractRecord/checkContractSign
+
+/// 查询协议
+/// @param get get
+/// @param contractType 业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 结算
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkContractSignRequest:(NSString *)get contractType:(NSString *)contractType success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 //  /api-teacher/userWithdrawal/getWithdrawalInfo
 
 /// 查询提现页面信息

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

@@ -85,14 +85,14 @@
             
             if ([dic integerValueForKey:@"code"] == 403) { // token验证失败
                 [self logOutWithType:YES];
-                return ;
+                success(dic);
             }
             else if ([dic integerValueForKey:@"code"] == 401) {
                 [self logOutWithType:NO];
-                return ;
+                success(dic);
             }
             success(dic);
-            return ;
+            return;
             
         } failBlock:^(NSError *error) {
             NSLog(@"%@",error.description);
@@ -118,10 +118,12 @@
             
             if ([dic integerValueForKey:@"code"] == 403) { // token验证失败
                 [self logOutWithType:YES];
+                success(dic);
                 return;
             }
             else if ([dic integerValueForKey:@"code"] == 401) {
                 [self logOutWithType:NO];
+                success(dic);
                 return;
             }
             success(dic);
@@ -1093,15 +1095,18 @@
 /// @param page 分页
 /// @param rows 条数
 /// @param search 搜索
+/// @param subjectIds 声部
 /// @param success 成功
 /// @param faliure 失败
-+ (void)musicListRequest:(NSString *)post auditStatus:(NSString *)auditStatus page:(NSInteger)page rows:(NSInteger)rows search:(NSString *)search success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
++ (void)musicListRequest:(NSString *)post auditStatus:(NSString *)auditStatus page:(NSInteger)page rows:(NSInteger)rows search:(NSString *)search subjectIds:(NSString *)subjectIds success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     [self configRequestMethodJSON];
     NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/music/sheet/list"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [parm setValue:auditStatus forKey:@"auditStatus"];
     [parm setValue:@(page) forKey:@"page"];
     [parm setValue:@(rows) forKey:@"rows"];
+    [parm setValue:search forKey:@"idAndName"];
+    [parm setValue:subjectIds forKey:@"subjectIds"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
@@ -1113,6 +1118,40 @@
 }
 
 #pragma mark ----- 直播房间与课程的关系表
+// /api-teacher/liveRoom/queryPageRoom
+// 查询用户关联的临时直播信息
+
+/// 查询直播间
+/// @param post post
+/// @param liveState 房间状态
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryPageRoomRequest:(NSString *)post liveState:(NSInteger)liveState page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/liveRoom/queryPageRoom"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@(liveState) forKey:@"liveState"];
+    [parm setValue:@(page) forKey:@"page"];
+    [parm setValue:@(rows) forKey:@"rows"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/liveRoomVideo/queryVideo
+
+/// 查询直播视频
+/// @param get get
+/// @param roomUid 房间号
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryVideoRequest:(NSString *)get roomUid:(NSString *)roomUid success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/liveRoomVideo/queryVideo"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:roomUid forKey:@"roomUid"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 // /api-teacher/liveRoom/createTempLiveRoom
 
 /// 创建直播 (临时开播)
@@ -1120,16 +1159,17 @@
 /// @param coverPic 封面图
 /// @param liveRemark 直播内容(200以内)
 /// @param roomTitle 房间标题
+/// @param liveTime 直播时长
 /// @param success 成功
 /// @param faliure 失败
-+ (void)liveRoomCreateTempLiveRoom:(NSString *)post coverPic:(NSString *)coverPic liveRemark:(NSString *)liveRemark roomTitle:(NSString *)roomTitle success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
++ (void)liveRoomCreateTempLiveRoom:(NSString *)post coverPic:(NSString *)coverPic liveRemark:(NSString *)liveRemark roomTitle:(NSString *)roomTitle liveTime:(NSInteger)liveTime success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     [self configRequestMethodJSON];
     NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/liveRoom/createTempLiveRoom"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [parm setValue:coverPic forKey:@"coverPic"];
     [parm setValue:liveRemark forKey:@"liveRemark"];
     [parm setValue:roomTitle forKey:@"roomTitle"];
-    [parm setValue:@(40) forKey:@"liveTime"];
+    [parm setValue:@(liveTime) forKey:@"liveTime"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
@@ -1146,6 +1186,7 @@
     [parm setValue:roomUid forKey:@"roomUid"];
     [self request:get andWithUrl:url and:parm success:success faliure:faliure];
 }
+
 // 进入直播房间
 // /api-teacher/liveRoom/speakerJoinRoom
 
@@ -1192,7 +1233,7 @@
     [parm setValue:@"iOS" forKey:@"os"];
     [parm setValue:@"3" forKey:@"status"];
     [parm setValue:UserDefault(UIDKey) forKey:@"userid"];
-    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+    [self request:post andWithUrl:url and:@[parm] success:success faliure:faliure];
 }
 
 // /api-teacher/liveRoom/destroyLiveRoom
@@ -1382,7 +1423,7 @@
 // /api-teacher/courseReplied/myReplied
 /// 我收到的评价
 /// @param post post
-/// @param classDate 上课日期
+/// @param classMonth 上课日期
 /// @param search search
 /// @param page 分页
 /// @param rows 条数
@@ -1641,6 +1682,19 @@
     [self request:get andWithUrl:url and:nil success:success faliure:faliure];
 }
 #pragma mark ----- 提现
+// 协议查询 /api-teacher/sysUserContractRecord/checkContractSign
+
+/// 查询协议
+/// @param get get
+/// @param contractType 业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 结算
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkContractSignRequest:(NSString *)get contractType:(NSString *)contractType success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/sysUserContractRecord/checkContractSign"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:contractType forKey:@"contractType"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
 //  /api-teacher/userWithdrawal/getWithdrawalInfo
 
 /// 查询提现页面信息

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/ShareMusic/Controller/ShareMusicViewController.m

@@ -127,7 +127,7 @@
 
 - (void)requestData {
     [self showhud];
-    [KSNetworkingManager musicListRequest:KS_POST auditStatus:@"PASS" page:self.pages rows:self.rows search:self.searchKey success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager musicListRequest:KS_POST auditStatus:@"PASS" page:self.pages rows:self.rows search:self.searchKey subjectIds:nil success:^(NSDictionary * _Nonnull dic) {
         [self removehub];
         [self endRefresh];
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m

@@ -247,6 +247,9 @@
 
 #pragma mark ----- 账号异地登陆
 - (void)leaveRoomAction {
+    if (self.isQuitRoom) {
+        return;
+    }
     [self showMessage:@"该账号在其他设备上登录"];
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         self.isQuitRoom = YES;
@@ -261,6 +264,9 @@
 }
 
 - (void)quitRoomAction {
+    if (self.isQuitRoom) {
+        return;
+    }
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         self.isQuitRoom = YES;
         self.isSwitchLine = NO;

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Model/HomeworkListModel.h

@@ -32,6 +32,7 @@
 @property (nonatomic, strong) NSString *startTime;
 @property (nonatomic, strong) NSString *teacherAvatar;
 @property (nonatomic, strong) NSString *homeworkStatus;
+@property (nonatomic, strong) NSString *imGroupId;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 7 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Model/HomeworkListModel.m

@@ -29,6 +29,7 @@ NSString *const kHomeworkListModelClassDate = @"classDate";
 NSString *const kHomeworkListModelStartTime = @"startTime";
 NSString *const kHomeworkListModelTeacherAvatar = @"teacherAvatar";
 NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
+NSString *const kHomeworkListModelImGroupId = @"imGroupId";
 
 @interface HomeworkListModel ()
 
@@ -59,6 +60,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
 @synthesize startTime = _startTime;
 @synthesize teacherAvatar = _teacherAvatar;
 @synthesize homeworkStatus = _homeworkStatus;
+@synthesize imGroupId = _imGroupId;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -93,7 +95,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
             self.startTime = [self objectOrNilForKey:kHomeworkListModelStartTime fromDictionary:dict];
             self.teacherAvatar = [self objectOrNilForKey:kHomeworkListModelTeacherAvatar fromDictionary:dict];
             self.homeworkStatus = [self objectOrNilForKey:kHomeworkListModelHomeworkStatus fromDictionary:dict];
-
+            self.imGroupId = [self objectOrNilForKey:kHomeworkListModelImGroupId fromDictionary:dict];
     }
     
     return self;
@@ -124,6 +126,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
     [mutableDict setValue:self.startTime forKey:kHomeworkListModelStartTime];
     [mutableDict setValue:self.teacherAvatar forKey:kHomeworkListModelTeacherAvatar];
     [mutableDict setValue:self.homeworkStatus forKey:kHomeworkListModelHomeworkStatus];
+    [mutableDict setValue:self.imGroupId forKey:kHomeworkListModelImGroupId];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -171,6 +174,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
     self.startTime = [aDecoder decodeObjectForKey:kHomeworkListModelStartTime];
     self.teacherAvatar = [aDecoder decodeObjectForKey:kHomeworkListModelTeacherAvatar];
     self.homeworkStatus = [aDecoder decodeObjectForKey:kHomeworkListModelHomeworkStatus];
+    self.imGroupId = [aDecoder decodeObjectForKey:kHomeworkListModelImGroupId];
     return self;
 }
 
@@ -198,6 +202,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
     [aCoder encodeObject:_startTime forKey:kHomeworkListModelStartTime];
     [aCoder encodeObject:_teacherAvatar forKey:kHomeworkListModelTeacherAvatar];
     [aCoder encodeObject:_homeworkStatus forKey:kHomeworkListModelHomeworkStatus];
+    [aCoder encodeObject:_imGroupId forKey:kHomeworkListModelImGroupId];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -227,6 +232,7 @@ NSString *const kHomeworkListModelHomeworkStatus = @"homeworkStatus";
         copy.startTime = [self.startTime copyWithZone:zone];
         copy.teacherAvatar = [self.teacherAvatar copyWithZone:zone];
         copy.homeworkStatus = [self.homeworkStatus copyWithZone:zone];
+        copy.imGroupId = [self.imGroupId copyWithZone:zone];
     }
     
     return copy;

+ 11 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkBodyView.m

@@ -181,7 +181,10 @@
     HomeworkListModel *model = self.dataArray[indexPath.row];
     if ([model.type isEqualToString:@"PIANO_ROOM_CLASS"]) { // 琴房课作业
         MusicRoomHomeworkCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MusicRoomHomeworkCell"];
-        [cell configWithSource:model];
+        MJWeakSelf;
+        [cell configWithSource:model chatCallback:^(NSString *targetId) {
+            [weakSelf chatGroup:targetId];
+        }];
         return cell;
     }
     else {
@@ -195,6 +198,13 @@
     }
 }
 
+- (void)chatGroup:(NSString *)targetId {
+    KSChatConversationViewController *conversationVC = [[KSChatConversationViewController alloc] init];
+    conversationVC.targetId = targetId;
+    conversationVC.conversationType = ConversationType_GROUP;
+    [self.naviController pushViewController:conversationVC animated:YES];
+}
+
 - (void)chatStudent:(NSString *)studentId name:(NSString *)name {
     KSChatConversationViewController *conversationVC = [[KSChatConversationViewController alloc] init];
     conversationVC.targetId = studentId;

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.h

@@ -8,11 +8,12 @@
 #import <UIKit/UIKit.h>
 #import "HomeworkListModel.h"
 
+typedef void(^ChatGroupCallback)(NSString *targetId);
 NS_ASSUME_NONNULL_BEGIN
 
 @interface MusicRoomHomeworkCell : UITableViewCell
 
-- (void)configWithSource:(HomeworkListModel *)sourceModel;
+- (void)configWithSource:(HomeworkListModel *)sourceModel chatCallback:(ChatGroupCallback)callback;
 
 @end
 

+ 14 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.m

@@ -17,6 +17,10 @@
 
 @property (weak, nonatomic) IBOutlet UILabel *statusLabel;
 
+@property (nonatomic, copy) ChatGroupCallback callback;
+
+@property (nonatomic, strong) NSString *targetId;
+
 @end
 
 @implementation MusicRoomHomeworkCell
@@ -27,7 +31,11 @@
     self.selectionStyle = UITableViewCellSelectionStyleNone;
 }
 
-- (void)configWithSource:(HomeworkListModel *)sourceModel {
+- (void)configWithSource:(HomeworkListModel *)sourceModel chatCallback:(ChatGroupCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.targetId = sourceModel.imGroupId;
     // time
     NSDateFormatter *formatter = [NSObject getDateformatter];
     [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
@@ -63,6 +71,11 @@
         }
     }
 }
+- (IBAction)chatGroup:(id)sender {
+    if (self.callback) {
+        self.callback(self.targetId);
+    }
+}
 
 
 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {

+ 3 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.xib

@@ -98,6 +98,9 @@
                                 </constraints>
                                 <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                 <state key="normal" image="course_chat"/>
+                                <connections>
+                                    <action selector="chatGroup:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="8dN-mQ-CMm"/>
+                                </connections>
                             </button>
                         </subviews>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html

@@ -17,7 +17,7 @@
                 </head>
     <body>
         <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
-        <div id="main" style="width: 100%;height:calc(100vh - 15pt);margin-top: 5px;"></div>
+        <div id="main" style="width: 100%;height:calc(100vh - 15pt);"></div>
         <script type="text/javascript">
             // 基于准备好的dom,初始化echarts实例
             var myChart = echarts.init(document.getElementById('main'));
@@ -25,7 +25,7 @@
             function loadEcharts(echartJson){
                 var option = JSON.parse(echartJson);
                 option.tooltip.confine = true;
-
+                myChart.clear();
                 myChart.setOption(option,true);
             }
         

+ 40 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.m

@@ -12,6 +12,7 @@
 #import "BandCardViewController.h"
 #import "KSConfirmAlertView.h"
 #import "WithdrawApplyViewController.h"
+#import "KSBaseWKWebViewController.h"
 
 @interface WithdrawViewController ()
 
@@ -36,7 +37,44 @@
 
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
-    [self requestData];
+    [self checkSighMessage];
+}
+
+- (void)checkSighMessage {
+    [KSNetworkingManager checkContractSignRequest:KS_GET contractType:@"WITHDRAW" success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            BOOL hasSign = [dic boolValueForKey:@"data"];
+            if (hasSign == NO) { // 未实名
+                [self showSignAlert];
+            }
+            else {
+                [self requestData];
+            }
+        }
+        else {
+            
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)showSignAlert {
+    KSConfirmAlertView *alert = [KSConfirmAlertView shareInstance];
+    [alert configWithTitle:@"协议签署" subTitle:@"您需要先签署协议才能结算"];
+    MJWeakSelf;
+    [alert opreationSure:^{
+        [weakSelf showWebView];
+    } cancel:^{
+        [weakSelf backAction];
+    }];
+    [alert showAlert];
+}
+
+- (void)showWebView {
+    KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+    webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/cashProtocol"];
+    [self.navigationController pushViewController:webCtrl animated:YES];
 }
 
 - (void)requestData {
@@ -131,7 +169,7 @@
     [alert opreationSure:^{
         [weakSelf bandCard];
     } cancel:^{
-        
+        [weakSelf backAction];
     }];
     [alert showAlert];
 }

+ 111 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/Controller/MyMusicViewController.m

@@ -19,8 +19,11 @@
 #import "RecordCheckManager.h"
 #import "KSPremissionAlert.h"
 #import "KSUMShareManager.h"
+#import "MyMusicSearchView.h"
+#import "KSChoosePicker.h"
 
 #define HEADER_HEIGHT (50)
+#define SEARCH_HEIGHT (50)
 
 @interface MyMusicViewController ()<JXPagerViewDelegate, JXPagerMainTableViewGestureDelegate,JXCategoryViewDelegate>
 
@@ -32,6 +35,15 @@
 
 @property (nonatomic, strong) MusicShareDisplayView *shareView;
 
+@property (nonatomic, strong) MyMusicSearchView *searchView;
+
+@property (nonatomic, strong) NSMutableArray *subjectList;
+
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectIds;
+
+
 @end
 
 @implementation MyMusicViewController
@@ -49,7 +61,10 @@
     [self.scrollView removeFromSuperview];
     self.view.backgroundColor = HexRGB(0xf6f8f9);
     
-    _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, HEADER_HEIGHT)];
+    [self.view addSubview:self.searchView];
+    self.searchView.frame = CGRectMake(0, 0, KPortraitWidth, SEARCH_HEIGHT);
+    
+    _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, SEARCH_HEIGHT, kScreenWidth, HEADER_HEIGHT)];
     self.categoryView.titles = self.titles;
     self.categoryView.delegate = self;
     self.categoryView.titleFont = [UIFont systemFontOfSize:17.0f];
@@ -65,7 +80,7 @@
     self.categoryView.indicators = @[lineView];
     
     _pagerView = [self preferredPagingView];
-    self.pagerView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    self.pagerView.frame = CGRectMake(0, SEARCH_HEIGHT, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin - SEARCH_HEIGHT);
     self.pagerView.backgroundColor = [UIColor clearColor];
     self.pagerView.mainTableView.backgroundColor = [UIColor clearColor];
     self.pagerView.listContainerView.backgroundColor = [UIColor clearColor];
@@ -116,7 +131,7 @@
 }
 
 - (void)showShareUI:(UIImage *)image {
-    KSUMShareManager *manager = [KSUMShareManager shareInstanceWithImage:image url:@"" shareTitle:@"" descMessage:nil shareType:KSSHARETYPE_IMAGE showInView:self callback:^(BOOL isSuccess, NSString * _Nonnull descMessage) {
+    [KSUMShareManager shareInstanceWithImage:image url:@"" shareTitle:@"" descMessage:@"" shareType:KSSHARETYPE_IMAGE showInView:self callback:^(BOOL isSuccess, NSString * _Nonnull descMessage) {
         if (isSuccess) {
             [self .shareView hideView];
         }
@@ -128,8 +143,7 @@
 }
 
 - (void)savePicWithImage:(UIImage *)image {
-    
-    
+
     // 判断相册权限
     PREMISSIONTYPE albumEnable = [RecordCheckManager checkPhotoLibraryPremissionAvaiable:NO showInView:nil];
     if (albumEnable == PREMISSIONTYPE_YES) { // 如果有权限
@@ -172,6 +186,7 @@
     [super viewWillAppear:animated];
     self.navigationController.interactivePopGestureRecognizer.enabled = YES;
     [self requestTeachMessage];
+    [self requestSubjectList];
     if (self.listViewArray.count > self.categoryView.selectedIndex) {
          id value = self.listViewArray[self.categoryView.selectedIndex];
         if ([value isKindOfClass:[MyMusicBodyView class]]) {
@@ -214,6 +229,29 @@
     }
 }
 
+- (void)requestSubjectList {
+    [KSNetworkingManager querySubjectItemRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *dataArray = [NSMutableArray array];
+            dataArray = [dic arrayValueForKey:@"data"];
+            NSMutableArray *subjectArray = [NSMutableArray array];
+            for (NSDictionary *parm in dataArray) {
+                NSMutableDictionary *subjectSource = [NSMutableDictionary dictionary];
+                [subjectSource setValue:[parm stringValueForKey:@"id"] forKey:@"subjectId"];
+                [subjectSource setValue:[parm stringValueForKey:@"name"] forKey:@"subjectName"];
+                [subjectArray addObject:subjectSource];
+            }
+            self.subjectList = [subjectArray mutableCopy];
+        }
+        else{
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+
 - (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0);
@@ -265,6 +303,8 @@
     else {
         listView.musicianStatus = @"PASS";
     }
+    listView.subjectIds = self.subjectIds;
+    listView.searchKey = self.searchKey;
     [listView beginFirstRefresh];
     return listView;
 }
@@ -299,6 +339,72 @@
     }
     return _listViewArray;
 }
+
+- (MyMusicSearchView *)searchView {
+    if (!_searchView) {
+        _searchView = [MyMusicSearchView shareInstance];
+        MJWeakSelf;
+        [_searchView musicSearchAction:^(NSString * _Nonnull searchKey, BOOL isChooseSubject) {
+            if (isChooseSubject) {
+                [weakSelf searchSubject];
+            }
+            else {
+                [weakSelf evaluateSource:searchKey];
+            }
+        }];
+    }
+    return _searchView;
+}
+
+- (void)searchSubject {
+    if (self.subjectList.count) {
+        NSMutableArray *nameArray = [NSMutableArray array];
+        [nameArray addObject:@"全部"];
+        for (NSDictionary *parm in self.subjectList) {
+            [nameArray addObject:[parm stringValueForKey:@"subjectName"]];
+        }
+        MJWeakSelf;
+        KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"声部筛选" sourceData:nameArray chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+            if (chooseIndex == 0) {
+                weakSelf.searchView.sortTitleLabel.text = @"声部";
+                weakSelf.subjectIds = nil;
+            }
+            else {
+                NSDictionary *parm = self.subjectList[chooseIndex-1];
+
+                weakSelf.searchView.sortTitleLabel.text = returnValue;
+                weakSelf.subjectIds = [parm stringValueForKey:@"subjectId"];
+            }
+            weakSelf.searchView.arrowUp = NO;
+            [weakSelf refreshSearchSource];
+        } cancel:^{
+            self.searchView.arrowUp = NO;
+        }];
+        [picker showPicker];
+    }
+    else {
+        [self MBPShow:@"无声部信息"];
+        self.searchView.arrowUp = NO;
+    }
+}
+
+- (void)evaluateSource:(NSString *)searchKey {
+    self.searchKey = searchKey;
+    [self refreshSearchSource];
+}
+
+- (void)refreshSearchSource {
+    for (NSInteger index = 0; index < self.listViewArray.count; index++) {
+        id view = self.listViewArray[index];
+        if ([view isKindOfClass:[MyMusicBodyView class]]) {
+            MyMusicBodyView *courseView = (MyMusicBodyView *)view;
+            courseView.subjectIds = self.subjectIds;
+            courseView.searchKey = self.searchKey;
+            [courseView beginFirstRefresh];
+        }
+    }
+}
+
 /*
 #pragma mark - Navigation
 

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicBodyView.h

@@ -15,6 +15,10 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, strong) NSString *musicianStatus;
 
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectIds;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicBodyView.m

@@ -109,7 +109,7 @@
 
 
 - (void)requestData {
-    [KSNetworkingManager musicListRequest:KS_POST auditStatus:self.audioStatus page:self.pages rows:self.right search:@"" success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager musicListRequest:KS_POST auditStatus:self.audioStatus page:self.pages rows:self.right search:self.searchKey subjectIds:self.subjectIds success:^(NSDictionary * _Nonnull dic) {
         [self endRefresh];
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
             NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];

+ 26 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.h

@@ -0,0 +1,26 @@
+//
+//  MyMusicSearchView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/3.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^MusicShareCallback)(NSString *searchKey, BOOL isChooseSubject);
+
+@interface MyMusicSearchView : UIView
+
+@property (weak, nonatomic) IBOutlet UILabel *sortTitleLabel;
+
+@property (nonatomic, assign) BOOL arrowUp;
+
++ (instancetype)shareInstance;
+
+- (void)musicSearchAction:(MusicShareCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 75 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.m

@@ -0,0 +1,75 @@
+//
+//  MyMusicSearchView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/3.
+//
+
+#import "MyMusicSearchView.h"
+
+@interface MyMusicSearchView ()<UITextFieldDelegate>
+
+@property (nonatomic, copy) MusicShareCallback callback;
+
+@property (weak, nonatomic) IBOutlet UIImageView *arrowImage;
+
+@property (weak, nonatomic) IBOutlet UITextField *searchField;
+
+@end
+
+@implementation MyMusicSearchView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.arrowUp = NO;
+    self.searchField.delegate = self;
+    self.searchField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"请输入曲目名称" attributes:@{NSForegroundColorAttributeName:HexRGB(0x999999)}];
+}
+
++ (instancetype)shareInstance {
+    MyMusicSearchView *view = [[[NSBundle mainBundle] loadNibNamed:@"MyMusicSearchView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)musicSearchAction:(MusicShareCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)setArrowUp:(BOOL)arrowUp {
+    _arrowUp = arrowUp;
+    NSString *imageName = arrowUp ? @"sort_up" : @"sort_down";
+    [_arrowImage setImage:[UIImage imageNamed:imageName]];
+}
+
+
+- (IBAction)buttonClickAction:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(self.searchField.text, NO);
+    }
+}
+- (IBAction)chooseSubjcetAction:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(self.searchField.text, YES);
+    }
+}
+
+- (BOOL)textFieldShouldReturn:(UITextField *)textField {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(textField.text,NO);
+    }
+    return YES;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 118 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MyMusicSearchView.xib

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <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="MyMusicSearchView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="50"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Uun-yR-wUh">
+                    <rect key="frame" x="67" y="7.5" width="333" height="35"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="search_green" translatesAutoresizingMaskIntoConstraints="NO" id="tjK-yc-EqR">
+                            <rect key="frame" x="12" y="10" width="15" height="15"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="15" id="2EC-rt-pef"/>
+                                <constraint firstAttribute="width" constant="15" id="Aqb-dy-vy4"/>
+                            </constraints>
+                        </imageView>
+                        <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入曲目名称" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ET6-Bq-mch">
+                            <rect key="frame" x="38" y="0.0" width="218" height="35"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                            <textInputTraits key="textInputTraits" returnKeyType="done" enablesReturnKeyAutomatically="YES"/>
+                        </textField>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FQ7-Z9-vyz">
+                            <rect key="frame" x="266" y="4" width="56" height="27"/>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="56" id="Gi6-bs-LLL"/>
+                                <constraint firstAttribute="height" constant="27" id="Woe-BX-Waq"/>
+                            </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="13.5"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="buttonClickAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="yai-so-4bW"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstItem="ET6-Bq-mch" firstAttribute="top" secondItem="Uun-yR-wUh" secondAttribute="top" id="1vY-BN-cli"/>
+                        <constraint firstItem="FQ7-Z9-vyz" firstAttribute="leading" secondItem="ET6-Bq-mch" secondAttribute="trailing" constant="10" id="6mU-7g-8R8"/>
+                        <constraint firstAttribute="trailing" secondItem="FQ7-Z9-vyz" secondAttribute="trailing" constant="11" id="AfE-t9-cP7"/>
+                        <constraint firstAttribute="height" constant="35" id="ERv-55-Puq"/>
+                        <constraint firstItem="tjK-yc-EqR" firstAttribute="centerY" secondItem="Uun-yR-wUh" secondAttribute="centerY" id="daC-86-7YO"/>
+                        <constraint firstItem="FQ7-Z9-vyz" firstAttribute="centerY" secondItem="Uun-yR-wUh" secondAttribute="centerY" id="egX-kd-p79"/>
+                        <constraint firstAttribute="bottom" secondItem="ET6-Bq-mch" secondAttribute="bottom" id="iWQ-hW-3he"/>
+                        <constraint firstItem="tjK-yc-EqR" firstAttribute="leading" secondItem="Uun-yR-wUh" secondAttribute="leading" constant="12" id="l8O-gv-UjC"/>
+                        <constraint firstItem="ET6-Bq-mch" firstAttribute="leading" secondItem="tjK-yc-EqR" secondAttribute="trailing" constant="11" id="vBj-Tz-fFc"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="17.5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="声部" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KpS-Cg-2zY">
+                    <rect key="frame" x="14" y="15" width="29" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="Dvl-aQ-09K"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="ixh-e8-4DX">
+                    <rect key="frame" x="49" y="22" width="8" height="6"/>
+                </imageView>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zsS-Hg-jho">
+                    <rect key="frame" x="14" y="8" width="43" height="34"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <connections>
+                        <action selector="chooseSubjcetAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="VzP-Up-8ae"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="Uun-yR-wUh" firstAttribute="leading" secondItem="ixh-e8-4DX" secondAttribute="trailing" constant="10" id="0oR-4H-k5c"/>
+                <constraint firstItem="ixh-e8-4DX" firstAttribute="centerY" secondItem="zsS-Hg-jho" secondAttribute="centerY" id="2Ze-Fb-t8G"/>
+                <constraint firstItem="Uun-yR-wUh" firstAttribute="centerY" secondItem="KpS-Cg-2zY" secondAttribute="centerY" id="7sS-eE-MmP"/>
+                <constraint firstItem="KpS-Cg-2zY" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="9D6-OS-kQT"/>
+                <constraint firstItem="KpS-Cg-2zY" firstAttribute="leading" secondItem="zsS-Hg-jho" secondAttribute="leading" id="AS0-Rg-XDO"/>
+                <constraint firstItem="KpS-Cg-2zY" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="Hm6-CP-js4"/>
+                <constraint firstAttribute="trailing" secondItem="Uun-yR-wUh" secondAttribute="trailing" constant="14" id="MEv-Gn-l3a"/>
+                <constraint firstItem="ixh-e8-4DX" firstAttribute="trailing" secondItem="zsS-Hg-jho" secondAttribute="trailing" id="QUN-xT-MyL"/>
+                <constraint firstItem="ixh-e8-4DX" firstAttribute="leading" secondItem="KpS-Cg-2zY" secondAttribute="trailing" constant="6" id="WEO-rE-ZPt"/>
+                <constraint firstItem="ixh-e8-4DX" firstAttribute="centerY" secondItem="KpS-Cg-2zY" secondAttribute="centerY" id="bct-B0-5xh"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="arrowImage" destination="ixh-e8-4DX" id="jDo-hq-MEI"/>
+                <outlet property="searchField" destination="ET6-Bq-mch" id="5XY-xU-Vzp"/>
+                <outlet property="sortTitleLabel" destination="KpS-Cg-2zY" id="Ema-iJ-DOF"/>
+            </connections>
+            <point key="canvasLocation" x="137.68115942028987" y="-16.40625"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="search_green" width="15" height="16"/>
+        <image name="sort_down" width="8" height="6"/>
+    </resources>
+</document>

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MusicRoomCourseCell.m

@@ -26,6 +26,7 @@
 
 @property (weak, nonatomic) IBOutlet UIButton *operationButton;
 
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *buttonWidth;
 
 @end
 
@@ -44,6 +45,7 @@
     }
     if ([source isKindOfClass:[MusicRoomListModel class]]) {
         self.operationButton.hidden = YES;
+        self.buttonWidth.constant = 0.0f;
         MusicRoomListModel *model = (MusicRoomListModel *)source;
         self.targetId = model.imGroupId;
         // time
@@ -83,20 +85,24 @@
             NSTimeInterval beginTimeInterval = [beginDate timeIntervalSinceDate:currentDate];
             if (beginTimeInterval < beforeTime * 60) {
                 self.operationButton.hidden = NO;
+                self.buttonWidth.constant = 70.0f;
             }
             else {
                 self.operationButton.hidden = YES;
+                self.buttonWidth.constant = 0.0f;
             }
         }
         else if ([model.status isEqualToString:@"ING"]) {
             self.statusLabel.text = @"进行中";
             self.statusLabel.textColor = THEMECOLOR;
             self.operationButton.hidden = NO;
+            self.buttonWidth.constant = 70.0f;
         }
         else if ([model.status isEqualToString:@"COMPLETE"]) {
             self.statusLabel.text = @"已结束";
             self.statusLabel.textColor = HexRGB(0x999999);
             self.operationButton.hidden = YES;
+            self.buttonWidth.constant = 0.0f;
         }
     }
 }

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MusicRoomCourseCell.xib

@@ -145,7 +145,6 @@
                             <constraint firstItem="l2B-EY-GWY" firstAttribute="top" secondItem="SU2-Qb-iP7" secondAttribute="top" constant="-2" id="CLv-wr-aLa"/>
                             <constraint firstItem="UxS-Xs-zTk" firstAttribute="leading" secondItem="VjP-WA-4SG" secondAttribute="trailing" constant="6" id="Ct9-78-SuQ"/>
                             <constraint firstAttribute="trailing" secondItem="vhC-DA-OVA" secondAttribute="trailing" constant="11" id="DCC-bH-qfZ"/>
-                            <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="t3h-kH-4md" secondAttribute="trailing" constant="10" id="ED5-iv-eMn"/>
                             <constraint firstItem="SU2-Qb-iP7" firstAttribute="leading" secondItem="Wl9-sn-VK0" secondAttribute="leading" constant="11" id="GV9-3y-mVI"/>
                             <constraint firstAttribute="trailing" secondItem="89l-Qb-VVR" secondAttribute="trailing" constant="10" id="J29-HZ-el6"/>
                             <constraint firstAttribute="bottom" secondItem="Ynq-yf-PqU" secondAttribute="bottom" constant="20" id="QUK-Km-aDl"/>
@@ -157,6 +156,7 @@
                             <constraint firstItem="vhC-DA-OVA" firstAttribute="leading" secondItem="UxS-Xs-zTk" secondAttribute="trailing" constant="10" id="Y6C-wT-tn5"/>
                             <constraint firstItem="XK0-9s-28t" firstAttribute="leading" secondItem="Dys-CR-rsC" secondAttribute="trailing" constant="8" id="fGP-SU-r99"/>
                             <constraint firstItem="Dys-CR-rsC" firstAttribute="leading" secondItem="l2B-EY-GWY" secondAttribute="leading" id="h8r-WE-IEp"/>
+                            <constraint firstItem="Ynq-yf-PqU" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="t3h-kH-4md" secondAttribute="trailing" constant="10" id="iAc-ym-ByU"/>
                             <constraint firstItem="89l-Qb-VVR" firstAttribute="top" secondItem="VjP-WA-4SG" secondAttribute="bottom" constant="12" id="jqu-OZ-Js3"/>
                             <constraint firstItem="XK0-9s-28t" firstAttribute="centerY" secondItem="Dys-CR-rsC" secondAttribute="centerY" id="mf9-mC-k9x"/>
                             <constraint firstItem="89l-Qb-VVR" firstAttribute="leading" secondItem="Wl9-sn-VK0" secondAttribute="leading" constant="10" id="pgO-Fi-Mwz"/>
@@ -182,6 +182,7 @@
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <connections>
+                <outlet property="buttonWidth" destination="Bjh-bg-ieX" id="Gsx-iz-PLv"/>
                 <outlet property="courseName" destination="l2B-EY-GWY" id="D00-Cj-zrr"/>
                 <outlet property="courseTimeLabel" destination="UxS-Xs-zTk" id="dkq-PI-dck"/>
                 <outlet property="memberCount" destination="IdU-Te-VFw" id="1Lu-Rg-nb5"/>

+ 23 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/CreateLiveViewController.m

@@ -9,12 +9,14 @@
 #import "CreateLiveBodyView.h"
 #import "CustomNavViewController.h"
 #import "LiveRoomViewController.h"
-
+#import "KSChoosePicker.h"
 
 @interface CreateLiveViewController ()
 
 @property (nonatomic, strong) CreateLiveBodyView *bodyView;
 
+@property (nonatomic, strong) NSString *chooseTime;
+
 @end
 
 @implementation CreateLiveViewController
@@ -37,15 +39,32 @@
     }];
     [self.scrollView setContentSize:CGSizeMake(kScreenWidth, height)];
     MJWeakSelf;
-    [self.bodyView createSureCallback:^(NSString *title, NSString *content) {
-        [weakSelf createLiveAction:title content:content];
+    [self.bodyView createSureCallback:^(BOOL chooseTime, NSString * _Nonnull title, NSString * _Nonnull content) {
+        if (chooseTime) {
+            [weakSelf chooseTimeAction];
+        }
+        else {
+            [weakSelf createLiveAction:title content:content];
+        }
     }];
 }
 
+- (void)chooseTimeAction {
+    MJWeakSelf;
+    KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"直播时长(分钟)" sourceData:@[@"30",@"45",@"60",@"90"] chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+        weakSelf.chooseTime = returnValue;
+        weakSelf.bodyView.timeLabel.text = [NSString stringWithFormat:@"%@分钟",returnValue];
+    } cancel:^{
+
+    }];
+    [picker showPicker];
+}
+
+
 - (void)createLiveAction:(NSString *)title content:(NSString *)content {
     NSString *imgUrl = nil;
     [self showhud];
-    [KSNetworkingManager liveRoomCreateTempLiveRoom:KS_POST coverPic:imgUrl liveRemark:content roomTitle:title success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager liveRoomCreateTempLiveRoom:KS_POST coverPic:imgUrl liveRemark:content roomTitle:title liveTime:[self.chooseTime integerValue] success:^(NSDictionary * _Nonnull dic) {
         [self removehub];
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
             NSString *roomId = [dic stringValueForKey:@"data"];

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveRoomViewController.m

@@ -31,6 +31,7 @@
 #import "LiveAnimationView.h"
 #import "KSShareChooseViewController.h"
 #import "KSChatLiveMessage.h"
+
 typedef NS_ENUM(NSInteger, LIVEPAGE) {
     LIVEPAGE_PREVIEW,
     LIVEPAGE_LIVE,
@@ -403,6 +404,12 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
         self.enableSeat = ![configDic boolValueForKey:@"whether_mic"];
         self.enableLike = ![configDic boolValueForKey:@"whether_like"];
     }
+    BOOL isTemp = [[source stringValueForKey:@"roomType"] isEqualToString:@"TEMP"];
+    self.isTempRoom = isTemp;
+    if (isTemp == NO) {
+        self.liveEndTime = [source stringValueForKey:@"liveEndTime"];
+        self.expiredMinute = [source integerValueForKey:@"expiredMinute"];
+    }
 }
 
 - (void)createLivePageViewDisplay {
@@ -456,6 +463,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 
 - (void)judgeAutoClose {
     if (self.isTempRoom == NO) {
+        self.timeManager.endClassTime = self.liveEndTime;
         self.timeManager.autoCloseNetworkRoomTime = [self getCloseTime];
     }
 }
@@ -648,6 +656,9 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 }
 
 - (void)liveroomLogOut {
+    if (self.isOtherLogin) {
+        return;
+    }
     self.isOtherLogin = YES;
     [self MBPShow:@"该账号在其他设备上登录"];
     [self quitRoomBackPreView:NO];
@@ -658,6 +669,9 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 }
 
 - (void)liveroomQuit {
+    if (self.isOtherLogin) {
+        return;
+    }
     self.isOtherLogin = YES;
     [self quitRoomBackPreView:NO];
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
@@ -1165,6 +1179,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
                     [__blockSelf insertMessage:rcMessage userInfo:notification.userInfo];
                 }
                 else if ([rcMessage.content isMemberOfClass:[RCChatroomClose class]]) { // 直播间已关闭
+                    
                     [__blockSelf MBPShow:@"直播已结束"];
                     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                         // 退出直播间
@@ -1550,6 +1565,7 @@ typedef NS_ENUM(NSInteger, LIVEPAGE) {
 }
 
 - (void)quitRoomBackPreView:(BOOL)backPreView {
+    
     if (backPreView) { // 暂停
         [self pauseLiveActionBack:YES];
     }

+ 11 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/LiveVideoRoomViewController.m

@@ -82,6 +82,8 @@
 /// 连麦申请统计数据
 @property (nonatomic, strong) SeatTipsView *seatApplyTips;
 
+@property (nonatomic, assign) BOOL isQuitRoom; // 是否正在退出房间
+
 @end
 
 @implementation LiveVideoRoomViewController
@@ -130,6 +132,9 @@
 }
 
 - (void)liveroomLogOut {
+    if (self.isQuitRoom) {
+        return;
+    }
     [self MBPShow:@"该账号在其他设备上登录"];
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         [self quitAction];
@@ -137,6 +142,9 @@
 }
 
 - (void)liveroomQuit {
+    if (self.isQuitRoom) {
+        return;
+    }
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         [self quitAction];
     });
@@ -944,6 +952,7 @@
 }
 
 - (void)quitAction {
+    self.isQuitRoom = YES;
     MJWeakSelf;
     self.alertView = [KSNormalAlertView ks_showAlertWithTitle:@"确认退出直播间吗?" leftTitle:@"取消" rightTitle:@"确定" inView:self.view cancel:^{
         
@@ -1107,6 +1116,8 @@
 - (LiveroomTimeManager *)timeManager {
     if (!_timeManager) {
         _timeManager = [[LiveroomTimeManager alloc] initWithDelegate:self];
+        _timeManager.autoCloseNetworkRoomTime = self.expiredMinute;
+        _timeManager.endClassTime = self.liveEndTime;
     }
     return _timeManager;
 }

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Live/Model/LiveroomTimeManager.m

@@ -40,6 +40,7 @@
         if (self.delegate && [self.delegate respondsToSelector:@selector(quitClassroomNotifer)]) {
             [self.delegate quitClassroomNotifer];
         }
+        [self stopDurationTimer];
     }
     self.duration--;
 }

+ 3 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.h

@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-typedef void(^CreateLiveCallback)(NSString * _Nonnull title,NSString *content);
+typedef void(^CreateLiveCallback)(BOOL chooseTime, NSString * _Nonnull title,NSString * _Nonnull content);
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -15,6 +15,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (instancetype)shareInstance;
 
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
 - (void)createSureCallback:(CreateLiveCallback)callback;
 
 @end

+ 12 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.m

@@ -52,8 +52,19 @@
         [self MBPShow:@"请输入直播内容"];
         return;
     }
+    if ([self.timeLabel.text isEqualToString:@"请选择直播时长"]) {
+        [self MBPShow:@"请选择直播时长"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(NO,self.titleField.text, self.inputView.text);
+    }
+}
+
+- (IBAction)chooseTime:(id)sender {
+    [self endEditing:YES];
     if (self.callback) {
-        self.callback(self.titleField.text, self.inputView.text);
+        self.callback(YES, @"", @"");
     }
 }
 

+ 64 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Live/View/CreateLiveBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -132,18 +132,78 @@
                         <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Wco-AZ-BO6"/>
                     </connections>
                 </button>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2Lf-gZ-cFg">
+                    <rect key="frame" x="14" y="334" width="386" height="90"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FnJ-QX-6fw">
+                            <rect key="frame" x="12" y="20" width="8" height="21"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                            <color key="textColor" red="1" green="0.30588235289999999" blue="0.098039215690000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="直播时长" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qSu-TG-7Gc">
+                            <rect key="frame" x="20" y="20" width="70" height="21"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请选择直播时长" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2aF-Cf-b74">
+                            <rect key="frame" x="12" y="49" width="115" height="20"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.75686274509803919" green="0.75686274509803919" blue="0.75686274509803919" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="choose_arrow" translatesAutoresizingMaskIntoConstraints="NO" id="Hkc-TR-tSr">
+                            <rect key="frame" x="134" y="55.5" width="12" height="7"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="12" id="QYK-yx-jgb"/>
+                                <constraint firstAttribute="height" constant="7" id="amF-ZH-gIi"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uZ3-fq-Oj3">
+                            <rect key="frame" x="12" y="42" width="134" height="34"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="chooseTime:" destination="iN0-l3-epB" eventType="touchUpInside" id="mp0-85-wvH"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="Hkc-TR-tSr" firstAttribute="leading" secondItem="2aF-Cf-b74" secondAttribute="trailing" constant="7" id="1I0-3Z-x8H"/>
+                        <constraint firstItem="Hkc-TR-tSr" firstAttribute="trailing" secondItem="uZ3-fq-Oj3" secondAttribute="trailing" id="3g7-MY-EGG"/>
+                        <constraint firstItem="Hkc-TR-tSr" firstAttribute="centerY" secondItem="2aF-Cf-b74" secondAttribute="centerY" id="4J1-eV-Nrc"/>
+                        <constraint firstItem="2aF-Cf-b74" firstAttribute="leading" secondItem="2Lf-gZ-cFg" secondAttribute="leading" constant="12" id="LyL-qb-owe"/>
+                        <constraint firstItem="qSu-TG-7Gc" firstAttribute="centerY" secondItem="FnJ-QX-6fw" secondAttribute="centerY" id="OU8-eH-gqh"/>
+                        <constraint firstItem="FnJ-QX-6fw" firstAttribute="leading" secondItem="2Lf-gZ-cFg" secondAttribute="leading" constant="12" id="QxX-Cv-bwa"/>
+                        <constraint firstItem="2aF-Cf-b74" firstAttribute="top" secondItem="qSu-TG-7Gc" secondAttribute="bottom" constant="8" id="ZQu-Qr-tLK"/>
+                        <constraint firstItem="uZ3-fq-Oj3" firstAttribute="leading" secondItem="2aF-Cf-b74" secondAttribute="leading" id="bM2-fm-Ovt"/>
+                        <constraint firstItem="FnJ-QX-6fw" firstAttribute="top" secondItem="2Lf-gZ-cFg" secondAttribute="top" constant="20" id="bUr-0P-OEW"/>
+                        <constraint firstItem="qSu-TG-7Gc" firstAttribute="leading" secondItem="FnJ-QX-6fw" secondAttribute="trailing" id="dMh-MK-ffg"/>
+                        <constraint firstAttribute="height" constant="90" id="eOk-h6-cQJ"/>
+                        <constraint firstItem="2aF-Cf-b74" firstAttribute="centerY" secondItem="uZ3-fq-Oj3" secondAttribute="centerY" id="eZc-22-5Uo"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
             </subviews>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
                 <constraint firstItem="NVl-Up-QMs" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="70y-ah-k3R"/>
                 <constraint firstAttribute="trailing" secondItem="NVl-Up-QMs" secondAttribute="trailing" constant="28" id="77x-p2-Jer"/>
                 <constraint firstItem="AgR-dK-40h" firstAttribute="trailing" secondItem="IUC-2g-F8n" secondAttribute="trailing" id="BsZ-RO-vmP"/>
+                <constraint firstItem="2Lf-gZ-cFg" firstAttribute="top" secondItem="AgR-dK-40h" secondAttribute="bottom" constant="12" id="ETO-fF-boo"/>
                 <constraint firstAttribute="trailing" secondItem="IUC-2g-F8n" secondAttribute="trailing" constant="14" id="HHl-5j-HQK"/>
                 <constraint firstItem="IUC-2g-F8n" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="KzN-3e-sOc"/>
+                <constraint firstAttribute="trailing" secondItem="2Lf-gZ-cFg" secondAttribute="trailing" constant="14" id="Z8I-JA-xdt"/>
                 <constraint firstItem="IUC-2g-F8n" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="lnB-2q-sHz"/>
                 <constraint firstItem="AgR-dK-40h" firstAttribute="leading" secondItem="IUC-2g-F8n" secondAttribute="leading" id="oc2-Yu-gbH"/>
                 <constraint firstItem="AgR-dK-40h" firstAttribute="top" secondItem="IUC-2g-F8n" secondAttribute="bottom" constant="12" id="r6D-oe-Wh7"/>
                 <constraint firstAttribute="bottom" secondItem="NVl-Up-QMs" secondAttribute="bottom" constant="43" id="uVR-9h-5g8"/>
+                <constraint firstItem="2Lf-gZ-cFg" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="yWu-es-je5"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>
             <nil key="simulatedBottomBarMetrics"/>
@@ -151,6 +211,7 @@
             <connections>
                 <outlet property="countLabel" destination="K6I-S3-WCn" id="KTW-ST-cYe"/>
                 <outlet property="inputView" destination="ez8-R7-sTU" id="KkF-CH-6Gx"/>
+                <outlet property="timeLabel" destination="2aF-Cf-b74" id="frD-7s-QWn"/>
                 <outlet property="tipsLabel" destination="tnb-4n-z1s" id="hVS-S1-W0w"/>
                 <outlet property="titleField" destination="Zer-5J-UAf" id="9pj-Rs-O21"/>
             </connections>
@@ -158,6 +219,7 @@
         </view>
     </objects>
     <resources>
+        <image name="choose_arrow" width="12" height="7"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>

+ 8 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m

@@ -15,13 +15,14 @@
 #import "UserInfoManager.h"
 #import "TeacherInfo.h"
 #import "VideoCourseViewController.h"
-#import "CreateLiveViewController.h"
+#import "LiveListViewController.h"
 #import "MinePageViewController.h"
 #import "MyLiveCourseViewController.h"
 #import "MyStyleViewController.h"
 #import "MyBankCardViewController.h"
 #import "MyCourseViewController.h"
 #import "UserSettingViewController.h"
+#import "FeedbackViewController.h"
 
 @interface MineViewController ()
 
@@ -146,7 +147,7 @@
         case MINEVIEWTYPE_STARTBOARDCAST: // 开启直播
         {
             if ([self.mineInfo.liveFlag isEqualToString:@"1"]) {
-                CreateLiveViewController *ctrl = [[CreateLiveViewController alloc] init];
+                LiveListViewController *ctrl = [[LiveListViewController alloc] init];
                 [self.navigationController pushViewController:ctrl animated:YES];
             }
             else { // 开通直播审核
@@ -245,6 +246,11 @@
             [self.navigationController pushViewController:ctrl animated:YES];
         }
             break;
+        case MINEVIEWTYPE_FEEDBACK: // 反馈
+        {
+            FeedbackViewController *ctrl = [[FeedbackViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
         default:
             break;
     }

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/CreateStyle/Controller/InstrumentChooseViewController.m

@@ -194,6 +194,7 @@
         if (![self judgeContainModel:model]) {
             if (self.chooseArray.count == 5) {
                 [self MBPShow:@"最多只能选择5个乐器"];
+                model.isChoose = NO;
                 return;
             }
             [self.chooseArray addObject:model];

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

@@ -223,7 +223,7 @@
 
 - (void)displayLiveCourseDetailWithGroupId:(NSString *)groupId {
     KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    NSString *url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/liveDetail?joinRoom=1&groupId=",groupId];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/liveDetail?groupId=",groupId];
     ctrl.url = url;
     [self.naviController pushViewController:ctrl animated:YES];
 }

+ 23 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Controller/LiveListViewController.h

@@ -0,0 +1,23 @@
+//
+//  LiveListViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "KSBaseViewController.h"
+#import "JXCategoryView.h"
+#import "JXPagerView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface LiveListViewController : KSBaseViewController
+
+@property (nonatomic, strong) JXPagerView *pagerView;
+@property (nonatomic, strong, readonly) JXCategoryTitleView *categoryView;
+@property (nonatomic, strong) NSArray <NSString *> *titles;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 173 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Controller/LiveListViewController.m

@@ -0,0 +1,173 @@
+//
+//  LiveListViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "LiveListViewController.h"
+#import "JXCategoryView.h"
+#import "JXPagerListRefreshView.h"
+#import "LiveListBodyView.h"
+#import "CreateLiveViewController.h"
+
+#define HEADER_HEIGHT (50)
+
+@interface LiveListViewController ()<JXPagerViewDelegate, JXPagerMainTableViewGestureDelegate,JXCategoryViewDelegate>
+
+@property (nonatomic, assign) NSInteger selectedIndex;
+
+@property (nonatomic, strong) NSMutableArray *listViewArray;
+
+@property (nonatomic, strong) NSMutableArray *subjectList;
+
+@end
+
+@implementation LiveListViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"直播间"];
+    self.titles = @[@"直播中",@"已结束"];
+    [self createRightButton];
+    [self configUI];
+}
+
+- (void)createRightButton {
+    [self rightButtonTitle:@"创建直播"];
+}
+
+- (void)rightBtnClick {
+    CreateLiveViewController *ctrl = [[CreateLiveViewController alloc] init];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    self.view.backgroundColor = HexRGB(0xf6f8f9);
+    
+    _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, HEADER_HEIGHT)];
+    self.categoryView.titles = self.titles;
+    self.categoryView.delegate = self;
+    self.categoryView.titleFont = [UIFont systemFontOfSize:17.0f];
+    self.categoryView.titleSelectedFont = [UIFont systemFontOfSize:17.0f weight:UIFontWeightMedium];
+    self.categoryView.titleSelectedColor = HexRGB(0x333333);
+    self.categoryView.titleColor = HexRGB(0x666666);
+    self.categoryView.titleColorGradientEnabled = YES;
+    
+    JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
+    lineView.indicatorHeight = 4.0f;
+    lineView.indicatorColor = THEMECOLOR;
+    lineView.indicatorWidth = 16;
+    self.categoryView.indicators = @[lineView];
+    
+    _pagerView = [self preferredPagingView];
+    self.pagerView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+    self.pagerView.backgroundColor = [UIColor clearColor];
+    self.pagerView.mainTableView.backgroundColor = [UIColor clearColor];
+    self.pagerView.listContainerView.backgroundColor = [UIColor clearColor];
+    self.pagerView.mainTableView.gestureDelegate = self;
+    self.categoryView.listContainer = (id<JXCategoryViewListContainer>)self.pagerView.listContainerView;
+    self.pagerView.listContainerView.listCellBackgroundColor = [UIColor clearColor];
+    [self.view addSubview:self.pagerView];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
+    if (self.listViewArray.count > self.categoryView.selectedIndex) {
+        id value = self.listViewArray[self.categoryView.selectedIndex];
+        if ([value isKindOfClass:[LiveListBodyView class]]) {
+            LiveListBodyView *listView = (LiveListBodyView *)value;
+            [listView beginFirstRefresh];
+        }
+    }
+}
+
+
+- (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+    self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0);
+}
+
+- (JXPagerView *)preferredPagingView {
+    return [[JXPagerListRefreshView alloc] initWithDelegate:self];
+}
+
+#pragma mark - JXPagerViewDelegate
+
+- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView {
+    return [UIView new];
+}
+
+- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView {
+    return CGFLOAT_MIN;
+}
+
+- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+    return HEADER_HEIGHT;
+}
+
+- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+    return self.categoryView;
+}
+
+- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView {
+    //和categoryView的item数量一致
+    return self.titles.count;
+}
+
+- (id<JXPagerViewListViewDelegate>)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index {
+    LiveListBodyView *listView = [[LiveListBodyView alloc] init];
+    listView.naviController = self.navigationController;
+    [self.listViewArray replaceObjectAtIndex:index withObject:listView];
+    self.listViewArray[index] = listView;
+    listView.selectIndex = index;
+    [listView beginFirstRefresh];
+    return listView;
+    
+}
+
+#pragma mark - JXCategoryViewDelegate
+- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
+    self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
+    if (self.listViewArray.count > index) {
+        id value = self.listViewArray[index];
+        if ([value isKindOfClass:[KSJXBodyView class]]) {
+            KSJXBodyView *listView = (KSJXBodyView *)value;
+            [listView beginFirstRefresh];
+        }
+    }
+}
+
+
+#pragma mark - JXPagerMainTableViewGestureDelegate
+
+- (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
+    //禁止categoryView左右滑动的时候,上下和左右都可以滚动
+    if (otherGestureRecognizer == self.categoryView.collectionView.panGestureRecognizer) {
+        return NO;
+    }
+    return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
+}
+
+
+- (NSMutableArray *)listViewArray {
+    if (!_listViewArray) {
+        _listViewArray = [NSMutableArray arrayWithArray:@[@"",@""]];
+    }
+    return _listViewArray;
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 36 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveListModel.h

@@ -0,0 +1,36 @@
+//
+//  LiveListModel.h
+//
+//  Created by Steven  on 2022/7/4
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface LiveListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *courseGroupId;
+@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *createdTime;
+@property (nonatomic, strong) NSString *updatedTime;
+@property (nonatomic, strong) NSString *roomTitle;
+@property (nonatomic, strong) NSString *coverPic;
+@property (nonatomic, strong) NSString *courseId;
+@property (nonatomic, strong) NSString *liveRemark;
+@property (nonatomic, strong) NSString *type;
+@property (nonatomic, strong) NSString *roomUid;
+@property (nonatomic, assign) double roomState;
+@property (nonatomic, assign) double liveState;
+@property (nonatomic, assign) double speakerId;
+@property (nonatomic, strong) NSString *liveEndTime;
+@property (nonatomic, strong) NSString *liveStartTime;
+@property (nonatomic, assign) double updatedBy;
+@property (nonatomic, assign) double createdBy;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 211 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveListModel.m

@@ -0,0 +1,211 @@
+//
+//  LiveListModel.m
+//
+//  Created by Steven  on 2022/7/4
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "LiveListModel.h"
+
+
+NSString *const kLiveListModelCourseGroupId = @"courseGroupId";
+NSString *const kLiveListModelId = @"id";
+NSString *const kLiveListModelCreatedTime = @"createdTime";
+NSString *const kLiveListModelUpdatedTime = @"updatedTime";
+NSString *const kLiveListModelRoomTitle = @"roomTitle";
+NSString *const kLiveListModelCoverPic = @"coverPic";
+NSString *const kLiveListModelCourseId = @"courseId";
+NSString *const kLiveListModelLiveRemark = @"liveRemark";
+NSString *const kLiveListModelType = @"type";
+NSString *const kLiveListModelRoomUid = @"roomUid";
+NSString *const kLiveListModelRoomState = @"roomState";
+NSString *const kLiveListModelLiveState = @"liveState";
+NSString *const kLiveListModelSpeakerId = @"speakerId";
+NSString *const kLiveListModelLiveEndTime = @"liveEndTime";
+NSString *const kLiveListModelLiveStartTime = @"liveStartTime";
+NSString *const kLiveListModelUpdatedBy = @"updatedBy";
+NSString *const kLiveListModelCreatedBy = @"createdBy";
+
+
+@interface LiveListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation LiveListModel
+
+@synthesize courseGroupId = _courseGroupId;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize createdTime = _createdTime;
+@synthesize updatedTime = _updatedTime;
+@synthesize roomTitle = _roomTitle;
+@synthesize coverPic = _coverPic;
+@synthesize courseId = _courseId;
+@synthesize liveRemark = _liveRemark;
+@synthesize type = _type;
+@synthesize roomUid = _roomUid;
+@synthesize roomState = _roomState;
+@synthesize liveState = _liveState;
+@synthesize speakerId = _speakerId;
+@synthesize liveEndTime = _liveEndTime;
+@synthesize liveStartTime = _liveStartTime;
+@synthesize updatedBy = _updatedBy;
+@synthesize createdBy = _createdBy;
+
+
++ (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.courseGroupId = [self objectOrNilForKey:kLiveListModelCourseGroupId fromDictionary:dict];
+            self.internalBaseClassIdentifier = [[self objectOrNilForKey:kLiveListModelId fromDictionary:dict] doubleValue];
+            self.createdTime = [self objectOrNilForKey:kLiveListModelCreatedTime fromDictionary:dict];
+            self.updatedTime = [self objectOrNilForKey:kLiveListModelUpdatedTime fromDictionary:dict];
+            self.roomTitle = [self objectOrNilForKey:kLiveListModelRoomTitle fromDictionary:dict];
+            self.coverPic = [self objectOrNilForKey:kLiveListModelCoverPic fromDictionary:dict];
+            self.courseId = [self objectOrNilForKey:kLiveListModelCourseId fromDictionary:dict];
+            self.liveRemark = [self objectOrNilForKey:kLiveListModelLiveRemark fromDictionary:dict];
+            self.type = [self objectOrNilForKey:kLiveListModelType fromDictionary:dict];
+            self.roomUid = [self objectOrNilForKey:kLiveListModelRoomUid fromDictionary:dict];
+            self.roomState = [[self objectOrNilForKey:kLiveListModelRoomState fromDictionary:dict] doubleValue];
+            self.liveState = [[self objectOrNilForKey:kLiveListModelLiveState fromDictionary:dict] doubleValue];
+            self.speakerId = [[self objectOrNilForKey:kLiveListModelSpeakerId fromDictionary:dict] doubleValue];
+            self.liveEndTime = [self objectOrNilForKey:kLiveListModelLiveEndTime fromDictionary:dict];
+            self.liveStartTime = [self objectOrNilForKey:kLiveListModelLiveStartTime fromDictionary:dict];
+            self.updatedBy = [[self objectOrNilForKey:kLiveListModelUpdatedBy fromDictionary:dict] doubleValue];
+            self.createdBy = [[self objectOrNilForKey:kLiveListModelCreatedBy fromDictionary:dict] doubleValue];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.courseGroupId forKey:kLiveListModelCourseGroupId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kLiveListModelId];
+    [mutableDict setValue:self.createdTime forKey:kLiveListModelCreatedTime];
+    [mutableDict setValue:self.updatedTime forKey:kLiveListModelUpdatedTime];
+    [mutableDict setValue:self.roomTitle forKey:kLiveListModelRoomTitle];
+    [mutableDict setValue:self.coverPic forKey:kLiveListModelCoverPic];
+    [mutableDict setValue:self.courseId forKey:kLiveListModelCourseId];
+    [mutableDict setValue:self.liveRemark forKey:kLiveListModelLiveRemark];
+    [mutableDict setValue:self.type forKey:kLiveListModelType];
+    [mutableDict setValue:self.roomUid forKey:kLiveListModelRoomUid];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.roomState] forKey:kLiveListModelRoomState];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.liveState] forKey:kLiveListModelLiveState];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.speakerId] forKey:kLiveListModelSpeakerId];
+    [mutableDict setValue:self.liveEndTime forKey:kLiveListModelLiveEndTime];
+    [mutableDict setValue:self.liveStartTime forKey:kLiveListModelLiveStartTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.updatedBy] forKey:kLiveListModelUpdatedBy];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.createdBy] forKey:kLiveListModelCreatedBy];
+
+    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.courseGroupId = [aDecoder decodeObjectForKey:kLiveListModelCourseGroupId];
+    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kLiveListModelId];
+    self.createdTime = [aDecoder decodeObjectForKey:kLiveListModelCreatedTime];
+    self.updatedTime = [aDecoder decodeObjectForKey:kLiveListModelUpdatedTime];
+    self.roomTitle = [aDecoder decodeObjectForKey:kLiveListModelRoomTitle];
+    self.coverPic = [aDecoder decodeObjectForKey:kLiveListModelCoverPic];
+    self.courseId = [aDecoder decodeObjectForKey:kLiveListModelCourseId];
+    self.liveRemark = [aDecoder decodeObjectForKey:kLiveListModelLiveRemark];
+    self.type = [aDecoder decodeObjectForKey:kLiveListModelType];
+    self.roomUid = [aDecoder decodeObjectForKey:kLiveListModelRoomUid];
+    self.roomState = [aDecoder decodeDoubleForKey:kLiveListModelRoomState];
+    self.liveState = [aDecoder decodeDoubleForKey:kLiveListModelLiveState];
+    self.speakerId = [aDecoder decodeDoubleForKey:kLiveListModelSpeakerId];
+    self.liveEndTime = [aDecoder decodeObjectForKey:kLiveListModelLiveEndTime];
+    self.liveStartTime = [aDecoder decodeObjectForKey:kLiveListModelLiveStartTime];
+    self.updatedBy = [aDecoder decodeDoubleForKey:kLiveListModelUpdatedBy];
+    self.createdBy = [aDecoder decodeDoubleForKey:kLiveListModelCreatedBy];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_courseGroupId forKey:kLiveListModelCourseGroupId];
+    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kLiveListModelId];
+    [aCoder encodeObject:_createdTime forKey:kLiveListModelCreatedTime];
+    [aCoder encodeObject:_updatedTime forKey:kLiveListModelUpdatedTime];
+    [aCoder encodeObject:_roomTitle forKey:kLiveListModelRoomTitle];
+    [aCoder encodeObject:_coverPic forKey:kLiveListModelCoverPic];
+    [aCoder encodeObject:_courseId forKey:kLiveListModelCourseId];
+    [aCoder encodeObject:_liveRemark forKey:kLiveListModelLiveRemark];
+    [aCoder encodeObject:_type forKey:kLiveListModelType];
+    [aCoder encodeObject:_roomUid forKey:kLiveListModelRoomUid];
+    [aCoder encodeDouble:_roomState forKey:kLiveListModelRoomState];
+    [aCoder encodeDouble:_liveState forKey:kLiveListModelLiveState];
+    [aCoder encodeDouble:_speakerId forKey:kLiveListModelSpeakerId];
+    [aCoder encodeObject:_liveEndTime forKey:kLiveListModelLiveEndTime];
+    [aCoder encodeObject:_liveStartTime forKey:kLiveListModelLiveStartTime];
+    [aCoder encodeDouble:_updatedBy forKey:kLiveListModelUpdatedBy];
+    [aCoder encodeDouble:_createdBy forKey:kLiveListModelCreatedBy];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    LiveListModel *copy = [[LiveListModel alloc] init];
+    
+    if (copy) {
+
+        copy.courseGroupId = [self.courseGroupId copyWithZone:zone];
+        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.createdTime = [self.createdTime copyWithZone:zone];
+        copy.updatedTime = [self.updatedTime copyWithZone:zone];
+        copy.roomTitle = [self.roomTitle copyWithZone:zone];
+        copy.coverPic = [self.coverPic copyWithZone:zone];
+        copy.courseId = [self.courseId copyWithZone:zone];
+        copy.liveRemark = [self.liveRemark copyWithZone:zone];
+        copy.type = [self.type copyWithZone:zone];
+        copy.roomUid = [self.roomUid copyWithZone:zone];
+        copy.roomState = self.roomState;
+        copy.liveState = self.liveState;
+        copy.speakerId = self.speakerId;
+        copy.liveEndTime = [self.liveEndTime copyWithZone:zone];
+        copy.liveStartTime = [self.liveStartTime copyWithZone:zone];
+        copy.updatedBy = self.updatedBy;
+        copy.createdBy = self.createdBy;
+    }
+    
+    return copy;
+}
+
+
+@end

+ 29 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveVideoModel.h

@@ -0,0 +1,29 @@
+//
+//  LiveVideoModel.h
+//
+//  Created by Steven  on 2022/7/5
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface LiveVideoModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, assign) double courseGroupId;
+@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *roomUid;
+@property (nonatomic, strong) NSString *endTime;
+@property (nonatomic, assign) double courseId;
+@property (nonatomic, strong) NSString *recordId;
+@property (nonatomic, strong) NSString *createdTime;
+@property (nonatomic, assign) double type;
+@property (nonatomic, strong) NSString *startTime;
+@property (nonatomic, strong) NSString *url;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 162 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/Model/LiveVideoModel.m

@@ -0,0 +1,162 @@
+//
+//  LiveVideoModel.m
+//
+//  Created by Steven  on 2022/7/5
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "LiveVideoModel.h"
+
+
+NSString *const kLiveVideoModelCourseGroupId = @"courseGroupId";
+NSString *const kLiveVideoModelId = @"id";
+NSString *const kLiveVideoModelRoomUid = @"roomUid";
+NSString *const kLiveVideoModelEndTime = @"endTime";
+NSString *const kLiveVideoModelCourseId = @"courseId";
+NSString *const kLiveVideoModelRecordId = @"recordId";
+NSString *const kLiveVideoModelCreatedTime = @"createdTime";
+NSString *const kLiveVideoModelType = @"type";
+NSString *const kLiveVideoModelStartTime = @"startTime";
+NSString *const kLiveVideoModelUrl = @"url";
+
+
+@interface LiveVideoModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation LiveVideoModel
+
+@synthesize courseGroupId = _courseGroupId;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize roomUid = _roomUid;
+@synthesize endTime = _endTime;
+@synthesize courseId = _courseId;
+@synthesize recordId = _recordId;
+@synthesize createdTime = _createdTime;
+@synthesize type = _type;
+@synthesize startTime = _startTime;
+@synthesize url = _url;
+
+
++ (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.courseGroupId = [[self objectOrNilForKey:kLiveVideoModelCourseGroupId fromDictionary:dict] doubleValue];
+            self.internalBaseClassIdentifier = [[self objectOrNilForKey:kLiveVideoModelId fromDictionary:dict] doubleValue];
+            self.roomUid = [self objectOrNilForKey:kLiveVideoModelRoomUid fromDictionary:dict];
+            self.endTime = [self objectOrNilForKey:kLiveVideoModelEndTime fromDictionary:dict];
+            self.courseId = [[self objectOrNilForKey:kLiveVideoModelCourseId fromDictionary:dict] doubleValue];
+            self.recordId = [self objectOrNilForKey:kLiveVideoModelRecordId fromDictionary:dict];
+            self.createdTime = [self objectOrNilForKey:kLiveVideoModelCreatedTime fromDictionary:dict];
+            self.type = [[self objectOrNilForKey:kLiveVideoModelType fromDictionary:dict] doubleValue];
+            self.startTime = [self objectOrNilForKey:kLiveVideoModelStartTime fromDictionary:dict];
+            self.url = [self objectOrNilForKey:kLiveVideoModelUrl fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.courseGroupId] forKey:kLiveVideoModelCourseGroupId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kLiveVideoModelId];
+    [mutableDict setValue:self.roomUid forKey:kLiveVideoModelRoomUid];
+    [mutableDict setValue:self.endTime forKey:kLiveVideoModelEndTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.courseId] forKey:kLiveVideoModelCourseId];
+    [mutableDict setValue:self.recordId forKey:kLiveVideoModelRecordId];
+    [mutableDict setValue:self.createdTime forKey:kLiveVideoModelCreatedTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.type] forKey:kLiveVideoModelType];
+    [mutableDict setValue:self.startTime forKey:kLiveVideoModelStartTime];
+    [mutableDict setValue:self.url forKey:kLiveVideoModelUrl];
+
+    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.courseGroupId = [aDecoder decodeDoubleForKey:kLiveVideoModelCourseGroupId];
+    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kLiveVideoModelId];
+    self.roomUid = [aDecoder decodeObjectForKey:kLiveVideoModelRoomUid];
+    self.endTime = [aDecoder decodeObjectForKey:kLiveVideoModelEndTime];
+    self.courseId = [aDecoder decodeDoubleForKey:kLiveVideoModelCourseId];
+    self.recordId = [aDecoder decodeObjectForKey:kLiveVideoModelRecordId];
+    self.createdTime = [aDecoder decodeObjectForKey:kLiveVideoModelCreatedTime];
+    self.type = [aDecoder decodeDoubleForKey:kLiveVideoModelType];
+    self.startTime = [aDecoder decodeObjectForKey:kLiveVideoModelStartTime];
+    self.url = [aDecoder decodeObjectForKey:kLiveVideoModelUrl];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeDouble:_courseGroupId forKey:kLiveVideoModelCourseGroupId];
+    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kLiveVideoModelId];
+    [aCoder encodeObject:_roomUid forKey:kLiveVideoModelRoomUid];
+    [aCoder encodeObject:_endTime forKey:kLiveVideoModelEndTime];
+    [aCoder encodeDouble:_courseId forKey:kLiveVideoModelCourseId];
+    [aCoder encodeObject:_recordId forKey:kLiveVideoModelRecordId];
+    [aCoder encodeObject:_createdTime forKey:kLiveVideoModelCreatedTime];
+    [aCoder encodeDouble:_type forKey:kLiveVideoModelType];
+    [aCoder encodeObject:_startTime forKey:kLiveVideoModelStartTime];
+    [aCoder encodeObject:_url forKey:kLiveVideoModelUrl];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    LiveVideoModel *copy = [[LiveVideoModel alloc] init];
+    
+    if (copy) {
+
+        copy.courseGroupId = self.courseGroupId;
+        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.roomUid = [self.roomUid copyWithZone:zone];
+        copy.endTime = [self.endTime copyWithZone:zone];
+        copy.courseId = self.courseId;
+        copy.recordId = [self.recordId copyWithZone:zone];
+        copy.createdTime = [self.createdTime copyWithZone:zone];
+        copy.type = self.type;
+        copy.startTime = [self.startTime copyWithZone:zone];
+        copy.url = [self.url copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.h

@@ -0,0 +1,21 @@
+//
+//  FinishedLiveCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import <UIKit/UIKit.h>
+#import "LiveListModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^LiveRecordCallback)(LiveListModel *listModel);
+
+@interface FinishedLiveCell : UITableViewCell
+
+- (void)configWithSource:(LiveListModel *)source callback:(LiveRecordCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 63 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.m

@@ -0,0 +1,63 @@
+//
+//  FinishedLiveCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "FinishedLiveCell.h"
+
+@interface FinishedLiveCell ()
+
+@property (weak, nonatomic) IBOutlet UILabel *liveTitleLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *liveDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *endTimeLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *liveImage;
+
+@property (nonatomic, strong) LiveListModel *sourceModel;
+
+@property (nonatomic, copy) LiveRecordCallback callback;
+
+@end
+
+
+@implementation FinishedLiveCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)configWithSource:(LiveListModel *)source callback:(LiveRecordCallback)callback {
+    self.sourceModel = source;
+    if (callback) {
+        self.callback = callback;
+    }
+    self.liveTitleLabel.text = [NSString returnNoNullStringWithString:source.roomTitle];
+    self.liveDesc.text = [NSString returnNoNullStringWithString:source.liveRemark];
+    NSString *endTime = source.liveEndTime;
+    NSDateFormatter *formater = [NSObject getDateformatter];
+    [formater setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *endDate = [formater dateFromString:endTime];
+    [formater setDateFormat:@"yyyy/MM/dd HH:mm"];
+    self.endTimeLabel.text = [NSString returnNoNullStringWithString:[formater stringFromDate:endDate]];
+}
+
+- (IBAction)recordAction:(id)sender {
+    if (self.callback) {
+        self.callback(self.sourceModel);
+    }
+}
+
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 153 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/FinishedLiveCell.xib

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <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="161" id="KGk-i7-Jjw" customClass="FinishedLiveCell">
+            <rect key="frame" x="0.0" y="0.0" width="380" height="161"/>
+            <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="380" height="161"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xmg-JI-w8J">
+                        <rect key="frame" x="14" y="0.0" width="352" height="149"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="temp_live" translatesAutoresizingMaskIntoConstraints="NO" id="fs7-XC-zEH">
+                                <rect key="frame" x="11" y="21" width="22" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="22" id="ZSV-Ms-2Du"/>
+                                    <constraint firstAttribute="height" constant="22" id="gaR-4P-FCg"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="如何培养孩子练习的兴趣和效率" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MNg-U0-vzY">
+                                <rect key="frame" x="41" y="21" width="300" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="xDf-iT-U6d"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1Pf-H2-KRK">
+                                <rect key="frame" x="11" y="95" width="330" height="1"/>
+                                <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="1" id="a44-5H-AO1"/>
+                                </constraints>
+                            </view>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_time" translatesAutoresizingMaskIntoConstraints="NO" id="OCS-hK-eku">
+                                <rect key="frame" x="11" y="116" width="16" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="16" id="PdJ-TT-2Sc"/>
+                                    <constraint firstAttribute="height" constant="16" id="ry2-Wq-pxo"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间:2021/09/17 14:00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EzB-Nm-kvZ">
+                                <rect key="frame" x="34" y="116" width="171.5" height="16"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Evd-qh-8AI">
+                                <rect key="frame" x="262" y="110" width="80" height="28"/>
+                                <subviews>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="查看回放" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wJS-tc-DQS">
+                                        <rect key="frame" x="13" y="6" width="54" height="16"/>
+                                        <fontDescription key="fontDescription" type="system" weight="medium" pointSize="13"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Sep-MW-zzd">
+                                        <rect key="frame" x="0.0" y="0.0" width="80" height="28"/>
+                                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                        <connections>
+                                            <action selector="recordAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="mLF-oj-A8s"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                <constraints>
+                                    <constraint firstItem="Sep-MW-zzd" firstAttribute="leading" secondItem="Evd-qh-8AI" secondAttribute="leading" id="9Fn-Gp-Ldy"/>
+                                    <constraint firstItem="Sep-MW-zzd" firstAttribute="top" secondItem="Evd-qh-8AI" secondAttribute="top" id="9KK-DH-fUM"/>
+                                    <constraint firstItem="wJS-tc-DQS" firstAttribute="centerX" secondItem="Evd-qh-8AI" secondAttribute="centerX" id="IYt-Bv-KHF"/>
+                                    <constraint firstAttribute="trailing" secondItem="Sep-MW-zzd" secondAttribute="trailing" id="JAe-MD-OyE"/>
+                                    <constraint firstAttribute="width" constant="80" id="Jz9-7t-U8t"/>
+                                    <constraint firstAttribute="bottom" secondItem="Sep-MW-zzd" secondAttribute="bottom" id="S6P-9H-HvD"/>
+                                    <constraint firstAttribute="height" constant="28" id="dQM-QW-39o"/>
+                                    <constraint firstItem="wJS-tc-DQS" firstAttribute="centerY" secondItem="Evd-qh-8AI" secondAttribute="centerY" id="zXQ-7G-k9O"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="14"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="如何让孩子在家养成良好的器乐练习习惯" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aJw-hj-w8P">
+                                <rect key="frame" x="11" y="51" width="330" height="33"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="28" id="UpU-sD-zKs"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="aJw-hj-w8P" firstAttribute="top" secondItem="fs7-XC-zEH" secondAttribute="bottom" constant="8" id="Haw-45-MJ3"/>
+                            <constraint firstItem="EzB-Nm-kvZ" firstAttribute="leading" secondItem="OCS-hK-eku" secondAttribute="trailing" constant="7" id="IXS-Zg-GSF"/>
+                            <constraint firstItem="fs7-XC-zEH" firstAttribute="top" secondItem="xmg-JI-w8J" secondAttribute="top" constant="21" id="JKN-6d-dqN"/>
+                            <constraint firstItem="EzB-Nm-kvZ" firstAttribute="centerY" secondItem="OCS-hK-eku" secondAttribute="centerY" id="LNa-IG-Oqd"/>
+                            <constraint firstAttribute="bottom" secondItem="OCS-hK-eku" secondAttribute="bottom" constant="17" id="MN2-zP-rfg"/>
+                            <constraint firstItem="aJw-hj-w8P" firstAttribute="leading" secondItem="xmg-JI-w8J" secondAttribute="leading" constant="11" id="MQz-9X-YAY"/>
+                            <constraint firstItem="fs7-XC-zEH" firstAttribute="leading" secondItem="xmg-JI-w8J" secondAttribute="leading" constant="11" id="W3N-q6-Pba"/>
+                            <constraint firstAttribute="trailing" secondItem="Evd-qh-8AI" secondAttribute="trailing" constant="10" id="Y8l-Gs-Du7"/>
+                            <constraint firstAttribute="trailing" secondItem="aJw-hj-w8P" secondAttribute="trailing" constant="11" id="Z2p-74-Jbn"/>
+                            <constraint firstItem="MNg-U0-vzY" firstAttribute="leading" secondItem="fs7-XC-zEH" secondAttribute="trailing" constant="8" id="fv6-co-8pK"/>
+                            <constraint firstItem="Evd-qh-8AI" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="EzB-Nm-kvZ" secondAttribute="trailing" constant="10" id="jIW-iP-JFc"/>
+                            <constraint firstItem="1Pf-H2-KRK" firstAttribute="top" secondItem="aJw-hj-w8P" secondAttribute="bottom" constant="11" id="jZ8-3R-9PK"/>
+                            <constraint firstItem="OCS-hK-eku" firstAttribute="top" secondItem="1Pf-H2-KRK" secondAttribute="bottom" constant="20" id="oCx-7N-Sz4"/>
+                            <constraint firstAttribute="trailing" secondItem="MNg-U0-vzY" secondAttribute="trailing" constant="11" id="obR-D7-ySt"/>
+                            <constraint firstItem="OCS-hK-eku" firstAttribute="leading" secondItem="xmg-JI-w8J" secondAttribute="leading" constant="11" id="qfk-SR-h7E"/>
+                            <constraint firstItem="MNg-U0-vzY" firstAttribute="centerY" secondItem="fs7-XC-zEH" secondAttribute="centerY" id="rmB-0o-gBW"/>
+                            <constraint firstItem="1Pf-H2-KRK" firstAttribute="leading" secondItem="xmg-JI-w8J" secondAttribute="leading" constant="11" id="tlf-lS-wBB"/>
+                            <constraint firstAttribute="trailing" secondItem="1Pf-H2-KRK" secondAttribute="trailing" constant="11" id="u9e-jn-Bgw"/>
+                            <constraint firstItem="MNg-U0-vzY" firstAttribute="centerY" secondItem="fs7-XC-zEH" secondAttribute="centerY" id="v9H-L5-vAm"/>
+                            <constraint firstItem="Evd-qh-8AI" firstAttribute="centerY" secondItem="EzB-Nm-kvZ" secondAttribute="centerY" id="wau-q5-Zgt"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="bottom" secondItem="xmg-JI-w8J" secondAttribute="bottom" constant="12" id="0Im-E6-AFO"/>
+                    <constraint firstItem="xmg-JI-w8J" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="7bT-NS-X3j"/>
+                    <constraint firstAttribute="trailing" secondItem="xmg-JI-w8J" secondAttribute="trailing" constant="14" id="HMq-f1-yVw"/>
+                    <constraint firstItem="xmg-JI-w8J" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="Vf4-5R-PAe"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <point key="canvasLocation" x="175.36231884057972" y="102.79017857142857"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="course_time" width="16" height="16"/>
+        <image name="temp_live" width="22" height="22"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 20 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveListBodyView.h

@@ -0,0 +1,20 @@
+//
+//  LiveListBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "KSJXBodyView.h"
+#import "StateView.h"
+#import "Reachability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface LiveListBodyView : KSJXBodyView
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 370 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveListBodyView.m

@@ -0,0 +1,370 @@
+//
+//  LiveListBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "LiveListBodyView.h"
+#import "UnderwayLiveCell.h"
+#import "FinishedLiveCell.h"
+#import "LiveListModel.h"
+#import "LiveRoomViewController.h"
+#import "CustomNavViewController.h"
+#import "LiveVideoListView.h"
+#import "LiveVideoModel.h"
+#import "WMPlayer.h"
+
+@interface LiveListBodyView ()<UITableViewDelegate,UITableViewDataSource,WMPlayerDelegate>
+{
+    WMPlayer *_wmPlayer;
+    CGRect _playerFrame;
+}
+@property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, assign) BOOL isRatation;
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, strong) StateView *promptView;
+@property (nonatomic, strong) UIView *promptPlaceView;
+
+@property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
+
+@property (nonatomic, assign) BOOL isLoadMore;
+@property (nonatomic, assign) NSInteger rows;
+@property (nonatomic, assign) NSInteger pages;
+
+
+
+@end
+
+@implementation LiveListBodyView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.backgroundColor = HexRGB(0xf6f8f9);
+        self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) style:UITableViewStylePlain];
+        self.tableView.backgroundColor = HexRGB(0xf6f8f9);
+        self.tableView.showsVerticalScrollIndicator = NO;
+        self.tableView.showsHorizontalScrollIndicator = NO;
+        self.tableView.dataSource = self;
+        self.tableView.delegate = self;
+        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        self.tableView.estimatedRowHeight = 132;
+        self.tableView.rowHeight = UITableViewAutomaticDimension;
+        [self addSubview:self.tableView];
+        
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
+        bottomView.backgroundColor = HexRGB(0xf6f8f9);
+        self.tableView.tableFooterView = bottomView;
+        
+        [self.tableView registerNib:[UINib nibWithNibName:@"UnderwayLiveCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"UnderwayLiveCell"];
+        [self.tableView registerNib:[UINib nibWithNibName:@"FinishedLiveCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"FinishedLiveCell"];
+        
+        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];
+            }
+        }];
+    }
+    return self;
+}
+
+- (void)endRefresh {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [self.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+    });
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+    
+}
+
+- (void)resetParamenter {
+    self.isLoadMore = YES;
+    self.pages = 1;
+    self.rows = 10;
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无内容" imageName:@"wd_img_zwsj" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+- (void)requestData {
+    NSInteger liveStatus = self.selectIndex == 0 ? 1 : 2;
+    [KSNetworkingManager queryPageRoomRequest:KS_POST liveState:liveStatus page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self endRefresh];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                LiveListModel *model = [[LiveListModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [self MBPShow: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)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];
+    self.tableView.frame = self.bounds;
+}
+
+- (void)beginFirstRefresh {
+    if (!self.isHeaderRefreshed) {
+        [self beginRefreshImmediately];
+    }
+}
+
+#pragma mark - UITableViewDataSource
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (self.selectIndex == 0) { // 进行中的直播
+        LiveListModel *model = self.dataArray[indexPath.row];
+        UnderwayLiveCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UnderwayLiveCell"];
+        MJWeakSelf;
+        [cell configWithSource:model callback:^(LiveListModel * _Nonnull listModel) {
+            [weakSelf toLiveRoomWithRoomMessaeg:listModel];
+        }];
+
+        return cell;
+    }
+    else { // 已结束的直播
+        FinishedLiveCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FinishedLiveCell"];
+        LiveListModel *model = self.dataArray[indexPath.row];
+        MJWeakSelf;
+        [cell configWithSource:model callback:^(LiveListModel * _Nonnull listModel) {
+            [weakSelf toRecordView:listModel];
+        }];
+        return cell;
+    }
+}
+
+- (void)toLiveRoomWithRoomMessaeg:(LiveListModel *)listModel {
+    LiveRoomViewController *ctrl = [[LiveRoomViewController alloc] init];
+    ctrl.roomId = listModel.roomUid;
+    ctrl.isTempRoom = YES;
+    ctrl.liveContent = listModel.liveRemark;
+    CustomNavViewController *navCtrl = [[CustomNavViewController alloc] initWithRootViewController:ctrl];
+    navCtrl.modalPresentationStyle = UIModalPresentationFullScreen;
+    [self.naviController presentViewController:navCtrl animated:YES completion:nil];
+}
+
+- (void)toRecordView:(LiveListModel *)listModel {
+
+    [self requestVideoList:listModel];
+}
+
+- (void)requestVideoList:(LiveListModel *)listModel {
+    [KSNetworkingManager queryVideoRequest:KS_GET roomUid:listModel.roomUid success:^(NSDictionary * _Nonnull dic) {
+        
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *videoList = [dic arrayValueForKey:@"data"];
+            NSMutableArray *videoArray = [NSMutableArray array];
+            for (NSDictionary *parm in videoList) {
+                LiveVideoModel *model = [[LiveVideoModel alloc] initWithDictionary:parm];
+                [videoArray addObject:model];
+            }
+            [self showVideoView:videoArray];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)showVideoView:(NSMutableArray *)videoArray {
+    LiveVideoListView *videoView = [LiveVideoListView shareInstance];
+    [videoView configSource:[videoArray mutableCopy] callback:^(NSString *videoUrl) {
+        [self playVideoWithUrl:videoUrl];
+    }];
+    [videoView showView];
+}
+
+
+/**
+ 设置没有数据时的显示
+ 
+ @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, kScreenWidth, kScreenHeight - 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;
+}
+
+#pragma mark ---- lazying
+- (NSMutableArray *)dataArray {
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+
+#pragma mark ------ WMPlayer
+- (void)playVideoWithUrl:(NSString *)fileUrl {
+    fileUrl = [fileUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
+    _playerFrame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+    _wmPlayer = [[WMPlayer alloc] initWithFrame:_playerFrame];
+    WMPlayerModel *playModel = [[WMPlayerModel alloc] init];
+    playModel.videoURL = [NSURL URLWithString:fileUrl];
+    _wmPlayer.playerModel = playModel;
+    _wmPlayer.delegate = self;
+    _bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
+    _bgView.backgroundColor = [UIColor blackColor];
+    [[UIApplication sharedApplication].keyWindow addSubview:_bgView];
+    [[UIApplication sharedApplication].keyWindow addSubview:_wmPlayer];
+    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:_wmPlayer];
+    
+    [_wmPlayer play];
+}
+
+- (void)wmplayer:(WMPlayer *)wmplayer clickedCloseButton:(UIButton *)backBtn {
+    [wmplayer removePlayer];
+    [_bgView removeFromSuperview];
+    [self.naviController setNeedsStatusBarAppearanceUpdate];
+}
+
+- (void)wmplayer:(WMPlayer *)wmplayer clickedFullScreenButton:(UIButton *)fullScreenBtn {
+    self.isRatation = !self.isRatation;
+    
+    if (self.isRatation) {
+        [wmplayer removeFromSuperview];
+        [UIView animateWithDuration:1.0f animations:^{
+            wmplayer.transform = CGAffineTransformMakeRotation(M_PI_2);
+            
+        } completion:^(BOOL finished) {
+            wmplayer.frame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+            [[UIApplication sharedApplication].keyWindow addSubview:wmplayer];
+            [[UIApplication sharedApplication].keyWindow bringSubviewToFront:wmplayer];
+        }];
+    }
+    else {
+        [wmplayer removeFromSuperview];
+        
+        [UIView animateWithDuration:1.0f animations:^{
+            //        复原
+            wmplayer.transform = CGAffineTransformIdentity;
+            
+        } completion:^(BOOL finished) {
+            wmplayer.frame = CGRectMake(0, iPhoneXSafeTopMargin, kScreenWidth, kScreenHeight - iPhoneXSafeTopMargin - iPhoneXSafeBottomMargin);
+            [[UIApplication sharedApplication].keyWindow addSubview:wmplayer];
+            [[UIApplication sharedApplication].keyWindow bringSubviewToFront:wmplayer];
+        }];
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 20 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.h

@@ -0,0 +1,20 @@
+//
+//  LiveVideoCollectionViewCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/5.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^PlayCallback)(NSString * _Nonnull videoUrl);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface LiveVideoCollectionViewCell : UICollectionViewCell
+
+- (void)configWithUrl:(NSString *)videoUrl beginTime:(NSString *)beginTime endTime:(NSString *)endTime callback:(PlayCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 53 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.m

@@ -0,0 +1,53 @@
+//
+//  LiveVideoCollectionViewCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/5.
+//
+
+#import "LiveVideoCollectionViewCell.h"
+#import "KSVideoHelper.h"
+
+@interface LiveVideoCollectionViewCell ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *videoImageView;
+
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
+@property (nonatomic, copy) PlayCallback callback;
+
+@property (nonatomic, strong) NSString *videoUrl;
+
+@end
+
+@implementation LiveVideoCollectionViewCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)configWithUrl:(NSString *)videoUrl beginTime:(NSString *)beginTime endTime:(NSString *)endTime callback:(nonnull PlayCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.videoUrl = videoUrl;
+    [KSVideoHelper getVideoPreviewImageUrl:videoUrl forImageView:self.videoImageView placeholder:[UIImage imageNamed:@"liveVideo_placeholder"]];
+    NSDateFormatter *formatter = [NSObject getDateformatter];
+    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *beginDate = [formatter dateFromString:beginTime];
+    NSDate *endDate = [formatter dateFromString:endTime];
+    [formatter setDateFormat:@"yyyy/MM/dd HH:mm"];
+    NSString *beginStr = [formatter stringFromDate:beginDate];
+    [formatter setDateFormat:@"HH:mm"];
+    NSString *endStr = [formatter stringFromDate:endDate];
+    self.timeLabel.text = [NSString stringWithFormat:@"%@-%@",beginStr, endStr];
+}
+
+- (IBAction)playVideo:(id)sender {
+    if (self.callback) {
+        self.callback(self.videoUrl);
+    }
+}
+
+@end

+ 74 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoCollectionViewCell.xib

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <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="LiveVideoCollectionViewCell">
+            <rect key="frame" x="0.0" y="0.0" width="138" height="115"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                <rect key="frame" x="0.0" y="0.0" width="138" height="115"/>
+                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                <subviews>
+                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="liveVideo_placeholder" translatesAutoresizingMaskIntoConstraints="NO" id="DmP-YX-IFS">
+                        <rect key="frame" x="0.0" y="0.0" width="138" height="83"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="83" id="2Qn-R3-4xN"/>
+                        </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="2022/06/30 16:00-16:20" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UJe-B3-2zs">
+                        <rect key="frame" x="0.0" y="84" width="138" height="28"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="28" id="fBw-bH-CYS"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                        <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LqX-mV-A3H">
+                        <rect key="frame" x="0.0" y="0.0" width="138" height="115"/>
+                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                        <connections>
+                            <action selector="playVideo:" destination="gTV-IL-0wX" eventType="touchUpInside" id="Nx6-8u-E87"/>
+                        </connections>
+                    </button>
+                </subviews>
+            </view>
+            <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="LqX-mV-A3H" secondAttribute="bottom" id="2Me-Ti-Eyp"/>
+                <constraint firstItem="DmP-YX-IFS" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="3cL-K0-PhE"/>
+                <constraint firstItem="LqX-mV-A3H" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="4Iu-d1-m6u"/>
+                <constraint firstItem="UJe-B3-2zs" firstAttribute="top" secondItem="DmP-YX-IFS" secondAttribute="bottom" constant="1" id="CIo-7W-rUz"/>
+                <constraint firstAttribute="trailing" secondItem="UJe-B3-2zs" secondAttribute="trailing" id="ENC-gb-xfN"/>
+                <constraint firstItem="LqX-mV-A3H" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="Ujj-TM-Ypg"/>
+                <constraint firstItem="UJe-B3-2zs" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="dw9-3I-B2X"/>
+                <constraint firstAttribute="trailing" secondItem="DmP-YX-IFS" secondAttribute="trailing" id="ee4-k3-XXk"/>
+                <constraint firstItem="UJe-B3-2zs" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="g8t-3S-Qpk"/>
+                <constraint firstItem="DmP-YX-IFS" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="hYN-Az-fqz"/>
+                <constraint firstAttribute="trailing" secondItem="LqX-mV-A3H" secondAttribute="trailing" id="lfT-Cl-485"/>
+            </constraints>
+            <size key="customSize" width="186" height="120"/>
+            <connections>
+                <outlet property="timeLabel" destination="UJe-B3-2zs" id="hIP-3i-5gt"/>
+                <outlet property="videoImageView" destination="DmP-YX-IFS" id="ucJ-UF-NS1"/>
+            </connections>
+            <point key="canvasLocation" x="230.43478260869566" y="96.763392857142847"/>
+        </collectionViewCell>
+    </objects>
+    <resources>
+        <image name="liveVideo_placeholder" width="133" height="83"/>
+    </resources>
+</document>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.h

@@ -0,0 +1,24 @@
+//
+//  LiveVideoListView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^PlayVideoCallback)(NSString * _Nonnull videoUrl);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface LiveVideoListView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)configSource:(NSMutableArray *)videoList callback:(PlayVideoCallback)callback;
+
+- (void)showView;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 122 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.m

@@ -0,0 +1,122 @@
+//
+//  LiveVideoListView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "LiveVideoListView.h"
+#import "LiveVideoCollectionViewCell.h"
+#import "LiveVideoModel.h"
+
+@interface LiveVideoListView ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
+
+@property (weak, nonatomic) IBOutlet UIView *videoContainer;
+@property (weak, nonatomic) IBOutlet UIView *emptyView;
+
+@property (nonatomic, strong) UICollectionView *collectionView;
+
+@property (nonatomic, strong) NSMutableArray *dataArray;
+
+@property (nonatomic, copy) PlayVideoCallback callback;
+
+@end
+
+@implementation LiveVideoListView
+
++ (instancetype)shareInstance {
+    LiveVideoListView *view = [[[NSBundle mainBundle] loadNibNamed:@"LiveVideoListView" owner:nil options:nil] firstObject];
+    view.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight);
+    [view configUI];
+    return view;
+}
+
+- (void)configUI {
+    [self.videoContainer addSubview:self.collectionView];
+    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.top.mas_equalTo(self.videoContainer);
+        make.left.mas_equalTo(self.videoContainer.mas_left).offset(0);
+        make.right.mas_equalTo(self.videoContainer.mas_right).offset(-0);
+    }];
+}
+
+
+
+- (void)configSource:(NSMutableArray *)videoList callback:(PlayVideoCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.dataArray = [NSMutableArray arrayWithArray:videoList];
+    if (self.dataArray.count == 0) {
+        self.collectionView.hidden = YES;
+        self.emptyView.hidden = NO;
+    }
+    else {
+        self.collectionView.hidden = NO;
+        self.emptyView.hidden = YES;
+        [self.collectionView reloadData];
+    }
+}
+
+- (void)showView {
+    [[NSObject getKeyWindow] addSubview:self];
+}
+
+- (IBAction)hideAlert:(id)sender {
+    [self removeFromSuperview];
+}
+
+#pragma mark ---- collection data source
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+    return 1;
+}
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    LiveVideoModel *model = self.dataArray[indexPath.item];
+    LiveVideoCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LiveVideoCollectionViewCell" forIndexPath:indexPath];
+    MJWeakSelf;
+    [cell configWithUrl:model.url beginTime:model.startTime endTime:model.endTime callback:^(NSString * _Nonnull videoUrl) {
+        if (weakSelf.callback) {
+            weakSelf.callback(videoUrl);
+        }
+    }];
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+    LiveVideoModel *model = self.dataArray[indexPath.item];
+    if (self.callback) {
+        self.callback(model.url);
+    }
+}
+
+#pragma mark ---- lazying
+- (UICollectionView *)collectionView {
+    if (!_collectionView) {
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
+        layout.itemSize = CGSizeMake(138, 115);
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 10, 14);
+        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+        _collectionView.backgroundColor = [UIColor clearColor];
+        _collectionView.dataSource = self;
+        _collectionView.showsVerticalScrollIndicator = NO;
+        _collectionView.showsHorizontalScrollIndicator = NO;
+        [_collectionView registerNib:[UINib nibWithNibName:@"LiveVideoCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"LiveVideoCollectionViewCell"];
+        _collectionView.bounces = NO;
+    }
+    return _collectionView;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 133 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/LiveVideoListView.xib

@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <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="LiveVideoListView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="670"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4bm-sH-wbR">
+                    <rect key="frame" x="47" y="174.5" width="320" height="321"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="liveVidel_left" translatesAutoresizingMaskIntoConstraints="NO" id="P8H-fm-GHN">
+                            <rect key="frame" x="17" y="23" width="4" height="18"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="4" id="5ZF-zh-7uO"/>
+                                <constraint firstAttribute="height" constant="18" id="Oku-To-K3r"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="视频列表" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="04Q-Ps-2sy">
+                            <rect key="frame" x="28" y="17" width="70" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="30" id="gv8-m6-28D"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                            <nil key="textColor"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Bux-7O-XGM">
+                            <rect key="frame" x="280" y="0.0" width="40" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="1bX-M3-dvN"/>
+                                <constraint firstAttribute="width" constant="40" id="8t8-Do-48n"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" image="check_cancle"/>
+                            <connections>
+                                <action selector="hideAlert:" destination="iN0-l3-epB" eventType="touchUpInside" id="tRN-2d-MzO"/>
+                            </connections>
+                        </button>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zhv-nU-ZGW">
+                            <rect key="frame" x="0.0" y="69" width="320" height="233"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4F5-NA-ybj">
+                                    <rect key="frame" x="40" y="52.5" width="240" height="128"/>
+                                    <subviews>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="wd_img_zwsj" translatesAutoresizingMaskIntoConstraints="NO" id="PbO-9h-sk9">
+                                            <rect key="frame" x="55" y="0.0" width="130" height="115"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" secondItem="PbO-9h-sk9" secondAttribute="height" multiplier="26:23" id="RGU-CZ-cfq"/>
+                                                <constraint firstAttribute="width" constant="130" id="eqR-X9-pEf"/>
+                                            </constraints>
+                                        </imageView>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="暂无数据" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="put-p9-mpX">
+                                            <rect key="frame" x="91.5" y="115" width="57.5" height="17"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                            <color key="textColor" red="0.71764705882352942" green="0.71764705882352942" blue="0.71764705882352942" alpha="1" colorSpace="calibratedRGB"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                    <constraints>
+                                        <constraint firstItem="put-p9-mpX" firstAttribute="centerX" secondItem="4F5-NA-ybj" secondAttribute="centerX" id="1up-kZ-JHr"/>
+                                        <constraint firstItem="PbO-9h-sk9" firstAttribute="centerX" secondItem="4F5-NA-ybj" secondAttribute="centerX" id="2MD-X8-nIF"/>
+                                        <constraint firstAttribute="height" constant="128" id="Al3-Os-A0s"/>
+                                        <constraint firstItem="PbO-9h-sk9" firstAttribute="top" secondItem="4F5-NA-ybj" secondAttribute="top" id="MxM-I3-9pY"/>
+                                        <constraint firstItem="put-p9-mpX" firstAttribute="top" secondItem="PbO-9h-sk9" secondAttribute="bottom" id="UTt-nm-NkK"/>
+                                        <constraint firstAttribute="width" constant="240" id="ghS-to-5zH"/>
+                                    </constraints>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="4F5-NA-ybj" firstAttribute="centerY" secondItem="zhv-nU-ZGW" secondAttribute="centerY" id="6kO-dH-mqM"/>
+                                <constraint firstItem="4F5-NA-ybj" firstAttribute="centerX" secondItem="zhv-nU-ZGW" secondAttribute="centerX" id="ByB-kZ-RNz"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="321" id="68o-Wk-o8I"/>
+                        <constraint firstItem="04Q-Ps-2sy" firstAttribute="centerY" secondItem="P8H-fm-GHN" secondAttribute="centerY" id="BaP-Zk-PEI"/>
+                        <constraint firstItem="zhv-nU-ZGW" firstAttribute="leading" secondItem="4bm-sH-wbR" secondAttribute="leading" id="LO0-h8-nYQ"/>
+                        <constraint firstItem="zhv-nU-ZGW" firstAttribute="top" secondItem="04Q-Ps-2sy" secondAttribute="bottom" constant="22" id="RRq-0z-hHg"/>
+                        <constraint firstItem="Bux-7O-XGM" firstAttribute="top" secondItem="4bm-sH-wbR" secondAttribute="top" id="YG6-Gc-Orn"/>
+                        <constraint firstAttribute="bottom" secondItem="zhv-nU-ZGW" secondAttribute="bottom" constant="19" id="ZtJ-5P-8nd"/>
+                        <constraint firstItem="04Q-Ps-2sy" firstAttribute="leading" secondItem="P8H-fm-GHN" secondAttribute="trailing" constant="7" id="eL7-y8-qpI"/>
+                        <constraint firstAttribute="trailing" secondItem="Bux-7O-XGM" secondAttribute="trailing" id="kKr-tl-q6h"/>
+                        <constraint firstAttribute="trailing" secondItem="zhv-nU-ZGW" secondAttribute="trailing" id="mW8-ZM-1G6"/>
+                        <constraint firstAttribute="width" constant="320" id="nrI-SC-q9a"/>
+                        <constraint firstItem="P8H-fm-GHN" firstAttribute="leading" secondItem="4bm-sH-wbR" secondAttribute="leading" constant="17" id="rdL-Nx-d2r"/>
+                        <constraint firstItem="P8H-fm-GHN" firstAttribute="top" secondItem="4bm-sH-wbR" secondAttribute="top" constant="23" id="tkb-q2-zPA"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="8"/>
+                        </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="calibratedRGB"/>
+            <constraints>
+                <constraint firstItem="4bm-sH-wbR" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="GY7-Io-sso"/>
+                <constraint firstItem="4bm-sH-wbR" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="hnu-EE-vJs"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="emptyView" destination="4F5-NA-ybj" id="qhc-74-4m3"/>
+                <outlet property="videoContainer" destination="zhv-nU-ZGW" id="bbD-WT-fvy"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="277.23214285714283"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="check_cancle" width="14" height="14"/>
+        <image name="liveVidel_left" width="4" height="18"/>
+        <image name="wd_img_zwsj" width="260" height="230"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.h

@@ -0,0 +1,21 @@
+//
+//  UnderwayLiveCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import <UIKit/UIKit.h>
+#import "LiveListModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^JoinLiveRoom)(LiveListModel *listModel);
+
+@interface UnderwayLiveCell : UITableViewCell
+
+- (void)configWithSource:(LiveListModel *)source callback:(JoinLiveRoom)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 76 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.m

@@ -0,0 +1,76 @@
+//
+//  UnderwayLiveCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/7/4.
+//
+
+#import "UnderwayLiveCell.h"
+
+@interface UnderwayLiveCell ()
+
+@property (weak, nonatomic) IBOutlet UILabel *liveTitleLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *liveDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *endTimeLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *liveImage;
+
+@property (nonatomic, strong) LiveListModel *sourceModel;
+
+@property (nonatomic, copy) JoinLiveRoom callback;
+
+@end
+
+@implementation UnderwayLiveCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+    [self configGroup];
+
+}
+
+- (void)configWithSource:(LiveListModel *)source callback:(JoinLiveRoom)callback {
+    self.sourceModel = source;
+    if (callback) {
+        self.callback = callback;
+    }
+    self.liveTitleLabel.text = [NSString returnNoNullStringWithString:source.roomTitle];
+    self.liveDesc.text = [NSString returnNoNullStringWithString:source.liveRemark];
+    NSString *endTime = source.liveEndTime;
+    NSDateFormatter *formater = [NSObject getDateformatter];
+    [formater setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *endDate = [formater dateFromString:endTime];
+    [formater setDateFormat:@"yyyy/MM/dd HH:mm"];
+    self.endTimeLabel.text = [NSString returnNoNullStringWithString:[formater stringFromDate:endDate]];
+}
+
+
+- (void)configGroup {
+    NSMutableArray *imageArray = [NSMutableArray array];
+    NSArray *imgNameArray = @[@"live_image1",@"live_image2",@"live_image3",@"live_image4",@"live_image5"];
+    for (NSString *imgName in imgNameArray) {
+        UIImage *image = [UIImage imageNamed:imgName];
+        [imageArray addObject:image];
+    }
+    self.liveImage.animationDuration = 1.0f;
+    self.liveImage.animationImages = imageArray;
+    self.liveImage.animationRepeatCount = 0;
+    
+}
+
+- (IBAction)toLiveRoom:(id)sender {
+    if (self.callback) {
+        self.callback(self.sourceModel);
+    }
+}
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 167 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/LiveList/View/UnderwayLiveCell.xib

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <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="191" id="KGk-i7-Jjw" customClass="UnderwayLiveCell">
+            <rect key="frame" x="0.0" y="0.0" width="371" height="191"/>
+            <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="371" height="191"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1kk-vU-DVt">
+                        <rect key="frame" x="14" y="0.0" width="343" height="179"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="temp_live" translatesAutoresizingMaskIntoConstraints="NO" id="BeT-lD-5Zn">
+                                <rect key="frame" x="11" y="21" width="22" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="22" id="Y8B-bw-hne"/>
+                                    <constraint firstAttribute="height" constant="22" id="aHa-JC-96z"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="如何培养孩子练习的兴趣和效率" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="osp-u7-TJw">
+                                <rect key="frame" x="41" y="21" width="291" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="uNZ-dx-40c"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O2h-wL-rXB">
+                                <rect key="frame" x="11" y="125" width="321" height="1"/>
+                                <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="1" id="v55-m4-833"/>
+                                </constraints>
+                            </view>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_time" translatesAutoresizingMaskIntoConstraints="NO" id="Qka-li-AcD">
+                                <rect key="frame" x="11" y="146" width="16" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="16" id="d8t-9O-jiP"/>
+                                    <constraint firstAttribute="width" constant="16" id="p3v-MS-XIR"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间:2021/09/17 14:00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ycn-Hn-PNV">
+                                <rect key="frame" x="34" y="146" width="171.5" height="16"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dgP-2w-cbb">
+                                <rect key="frame" x="253" y="140" width="80" height="28"/>
+                                <subviews>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vv0-Dw-PPX">
+                                        <rect key="frame" x="6" y="9" width="12" height="10"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="12" id="CwF-pQ-Jeu"/>
+                                            <constraint firstAttribute="height" constant="10" id="GT7-7H-emJ"/>
+                                        </constraints>
+                                    </imageView>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="进入直播" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JLp-dd-Yjq">
+                                        <rect key="frame" x="18" y="6" width="54" height="16"/>
+                                        <fontDescription key="fontDescription" type="system" weight="medium" pointSize="13"/>
+                                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BRX-i1-BgR">
+                                        <rect key="frame" x="0.0" y="0.0" width="80" height="28"/>
+                                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                        <connections>
+                                            <action selector="toLiveRoom:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="IAc-18-EaP"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <color key="backgroundColor" red="1" green="0.50196078431372548" blue="0.43529411764705883" alpha="1" colorSpace="calibratedRGB"/>
+                                <constraints>
+                                    <constraint firstItem="vv0-Dw-PPX" firstAttribute="centerY" secondItem="dgP-2w-cbb" secondAttribute="centerY" id="43q-Pd-kgZ"/>
+                                    <constraint firstAttribute="bottom" secondItem="BRX-i1-BgR" secondAttribute="bottom" id="7Ze-pG-N0C"/>
+                                    <constraint firstItem="BRX-i1-BgR" firstAttribute="leading" secondItem="dgP-2w-cbb" secondAttribute="leading" id="GGq-Nk-hDn"/>
+                                    <constraint firstItem="vv0-Dw-PPX" firstAttribute="leading" secondItem="dgP-2w-cbb" secondAttribute="leading" constant="6" id="H82-yV-AeT"/>
+                                    <constraint firstAttribute="width" constant="80" id="T0N-Lw-8aR"/>
+                                    <constraint firstItem="BRX-i1-BgR" firstAttribute="top" secondItem="dgP-2w-cbb" secondAttribute="top" id="Txa-DQ-wqj"/>
+                                    <constraint firstAttribute="trailing" secondItem="BRX-i1-BgR" secondAttribute="trailing" id="UPD-tl-Q5P"/>
+                                    <constraint firstItem="JLp-dd-Yjq" firstAttribute="centerY" secondItem="dgP-2w-cbb" secondAttribute="centerY" id="b70-Nf-P2P"/>
+                                    <constraint firstAttribute="trailing" secondItem="JLp-dd-Yjq" secondAttribute="trailing" constant="8" id="j7K-ye-1Y6"/>
+                                    <constraint firstAttribute="height" constant="28" id="rxc-JV-1w2"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="14"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </view>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="如何让孩子在家养成良好的器乐练习习惯" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a6h-BK-CuM">
+                                <rect key="frame" x="11" y="51" width="321" height="63"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="28" id="60S-1t-58T"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="a6h-BK-CuM" firstAttribute="top" secondItem="BeT-lD-5Zn" secondAttribute="bottom" constant="8" id="37X-tF-JuP"/>
+                            <constraint firstItem="osp-u7-TJw" firstAttribute="centerY" secondItem="BeT-lD-5Zn" secondAttribute="centerY" id="6XF-Oo-IJm"/>
+                            <constraint firstItem="BeT-lD-5Zn" firstAttribute="top" secondItem="1kk-vU-DVt" secondAttribute="top" constant="21" id="8Vj-nb-EV1"/>
+                            <constraint firstItem="O2h-wL-rXB" firstAttribute="leading" secondItem="1kk-vU-DVt" secondAttribute="leading" constant="11" id="IF1-Y0-8ub"/>
+                            <constraint firstItem="osp-u7-TJw" firstAttribute="centerY" secondItem="BeT-lD-5Zn" secondAttribute="centerY" id="IWr-76-JZO"/>
+                            <constraint firstAttribute="trailing" secondItem="O2h-wL-rXB" secondAttribute="trailing" constant="11" id="JXp-zK-e8R"/>
+                            <constraint firstItem="Qka-li-AcD" firstAttribute="top" secondItem="O2h-wL-rXB" secondAttribute="bottom" constant="20" id="L7B-bs-2gF"/>
+                            <constraint firstItem="dgP-2w-cbb" firstAttribute="centerY" secondItem="Ycn-Hn-PNV" secondAttribute="centerY" id="MHN-w9-4qc"/>
+                            <constraint firstItem="Ycn-Hn-PNV" firstAttribute="leading" secondItem="Qka-li-AcD" secondAttribute="trailing" constant="7" id="PzM-VV-Cah"/>
+                            <constraint firstAttribute="trailing" secondItem="osp-u7-TJw" secondAttribute="trailing" constant="11" id="SW3-BZ-Y8L"/>
+                            <constraint firstAttribute="trailing" secondItem="dgP-2w-cbb" secondAttribute="trailing" constant="10" id="azL-Zt-faM"/>
+                            <constraint firstAttribute="trailing" secondItem="a6h-BK-CuM" secondAttribute="trailing" constant="11" id="csR-mM-FAp"/>
+                            <constraint firstItem="osp-u7-TJw" firstAttribute="leading" secondItem="BeT-lD-5Zn" secondAttribute="trailing" constant="8" id="dVp-hJ-F0c"/>
+                            <constraint firstAttribute="bottom" secondItem="Qka-li-AcD" secondAttribute="bottom" constant="17" id="dbE-Jf-Ocj"/>
+                            <constraint firstItem="Ycn-Hn-PNV" firstAttribute="centerY" secondItem="Qka-li-AcD" secondAttribute="centerY" id="gc2-aD-CEN"/>
+                            <constraint firstItem="O2h-wL-rXB" firstAttribute="top" secondItem="a6h-BK-CuM" secondAttribute="bottom" constant="11" id="o7N-5a-aot"/>
+                            <constraint firstItem="a6h-BK-CuM" firstAttribute="leading" secondItem="1kk-vU-DVt" secondAttribute="leading" constant="11" id="p2K-e1-6u1"/>
+                            <constraint firstItem="Qka-li-AcD" firstAttribute="leading" secondItem="1kk-vU-DVt" secondAttribute="leading" constant="11" id="tml-Yz-RyC"/>
+                            <constraint firstItem="BeT-lD-5Zn" firstAttribute="leading" secondItem="1kk-vU-DVt" secondAttribute="leading" constant="11" id="wxN-7m-Ro9"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="1kk-vU-DVt" secondAttribute="trailing" constant="14" id="3XV-nC-aaL"/>
+                    <constraint firstItem="1kk-vU-DVt" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="8NJ-bd-DVE"/>
+                    <constraint firstItem="1kk-vU-DVt" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="pJb-I9-BzA"/>
+                    <constraint firstAttribute="bottom" secondItem="1kk-vU-DVt" secondAttribute="bottom" constant="12" id="y63-7E-uvU"/>
+                </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="endTimeLabel" destination="Ycn-Hn-PNV" id="zoi-ug-9v4"/>
+                <outlet property="liveDesc" destination="a6h-BK-CuM" id="kXS-iq-dVT"/>
+                <outlet property="liveImage" destination="vv0-Dw-PPX" id="avy-Cv-a1c"/>
+                <outlet property="liveTitleLabel" destination="osp-u7-TJw" id="maz-Qp-RXX"/>
+            </connections>
+            <point key="canvasLocation" x="168.84057971014494" y="143.63839285714286"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="course_time" width="16" height="16"/>
+        <image name="temp_live" width="22" height="22"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 40 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MinePageViewController.m

@@ -30,6 +30,9 @@
 
 @property (nonatomic, strong) MinePageTopView *topView;
 
+@property (nonatomic, strong) NSMutableArray *subjectList;
+
+
 @end
 
 @implementation MinePageViewController
@@ -122,6 +125,7 @@
     [super viewWillAppear:animated];
     self.navigationController.interactivePopGestureRecognizer.enabled = YES;
     [self requestTeachMessage];
+    [self requestSubjectList];
     if (self.listViewArray.count > self.categoryView.selectedIndex) {
         id value = self.listViewArray[self.categoryView.selectedIndex];
         if ([value isKindOfClass:[MinePageCourseView class]]) {
@@ -148,6 +152,39 @@
     return [[JXPagerListRefreshView alloc] initWithDelegate:self];
 }
 
+- (void)requestSubjectList {
+    [KSNetworkingManager querySubjectItemRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *dataArray = [NSMutableArray array];
+            dataArray = [dic arrayValueForKey:@"data"];
+            NSMutableArray *subjectArray = [NSMutableArray array];
+            for (NSDictionary *parm in dataArray) {
+                NSMutableDictionary *subjectSource = [NSMutableDictionary dictionary];
+                [subjectSource setValue:[parm stringValueForKey:@"id"] forKey:@"subjectId"];
+                [subjectSource setValue:[parm stringValueForKey:@"name"] forKey:@"subjectName"];
+                [subjectArray addObject:subjectSource];
+            }
+            self.subjectList = [subjectArray mutableCopy];
+            [self refreshSubjectMessage];
+        }
+        else{
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)refreshSubjectMessage {
+    for (NSInteger index = 0; index < self.listViewArray.count; index++) {
+        id view = self.listViewArray[index];
+        if ([view isKindOfClass:[MinePageCourseView class]]) {
+            MinePageCourseView *courseView = (MinePageCourseView *)view;
+            courseView.subjectList = [self.subjectList mutableCopy];
+        }
+    }
+}
+
 #pragma mark - JXPagerViewDelegate
 
 - (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView {
@@ -225,6 +262,9 @@
         else {
             listView.musicianStatus = @"PASS";
         }
+        if (self.subjectList) {
+            listView.subjectList = [self.subjectList mutableCopy];
+        }
         [listView beginFirstRefresh];
         return listView;
     }

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.h

@@ -20,6 +20,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, assign) BOOL liveFlag; // 是否有直播权限
 
+@property (nonatomic, strong) NSMutableArray *subjectList;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 76 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.m

@@ -18,6 +18,9 @@
 #import "AccompanyDetailViewController.h"
 #import "KSFullDatePicker.h"
 #import "CourseTimeSegView.h"
+#import "MyMusicSearchView.h"
+#import "KSChoosePicker.h"
+#import "KSAccompanyWebViewController.h"
 
 @interface MinePageCourseView ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -46,6 +49,12 @@
 
 @property (nonatomic, strong) NSDateFormatter *dateFormatter;
 
+@property (nonatomic, strong) MyMusicSearchView *searchView;
+
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, strong) NSString *subjectIds;
+
 @end
 
 @implementation MinePageCourseView
@@ -179,7 +188,7 @@
         }];
     }
     else if (self.selectIndex == 4) { // 乐谱
-        [KSNetworkingManager musicListRequest:KS_POST auditStatus:@"PASS" page:self.pages rows:self.rows search:@"" success:^(NSDictionary * _Nonnull dic) {
+        [KSNetworkingManager musicListRequest:KS_POST auditStatus:@"PASS" page:self.pages rows:self.rows search:self.searchKey subjectIds:self.subjectIds success:^(NSDictionary * _Nonnull dic) {
             [self endRefresh];
             if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
                 NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
@@ -237,13 +246,19 @@
     if (self.selectIndex == 1) {
         topHeight = 50.0f + 34.0f;
     }
-    
+    else if (self.selectIndex == 4) {
+        topHeight = 50.0f + 50.0f;
+    }
     self.tableView.frame = CGRectMake(0, topHeight, self.bounds.size.width, self.bounds.size.height - topHeight);
     if (![self.subviews containsObject:self.uploadView]) {
         [self addSubview:self.uploadView];
         if (self.selectIndex == 1) {
             [self addSubview:self.timeSortView];
         }
+        if (self.selectIndex == 4) {
+            [self addSubview:self.searchView];
+            self.uploadView.frame = CGRectMake(0, 50.0f, KPortraitWidth, 50.0f);
+        }
         if (self.selectIndex == 1 || self.selectIndex == 2) {
             if (self.teacherAuthPass == NO) {
                 [self showAuthView];
@@ -366,7 +381,12 @@
         [self.naviController pushViewController:ctrl animated:YES];
     }
     else if (self.selectIndex == 4) { // 曲谱详情
-        
+        MusicMessageModel *model = self.dataArray[indexPath.row];
+        KSAccompanyWebViewController *detailCtrl = [[KSAccompanyWebViewController alloc] init];
+        detailCtrl.url = [NSString stringWithFormat:@"%@/accompany?id=%.0f&client=teacher",hostURL, model.internalBaseClassIdentifier];
+        detailCtrl.hiddenNavBar = YES;
+        detailCtrl.parmDic = @{@"isOpenLight" : @(YES), @"orientation" : @(0),@"isHideTitle" : @(YES)};
+        [self.naviController pushViewController:detailCtrl animated:YES];
     }
 }
 
@@ -732,6 +752,59 @@
     }
 }
 
+- (MyMusicSearchView *)searchView {
+    if (!_searchView) {
+        _searchView = [MyMusicSearchView shareInstance];
+        CGFloat topHeight = 50.0f;
+        _searchView.frame = CGRectMake(0, 0, kScreenWidth, 50);
+        MJWeakSelf;
+        [_searchView musicSearchAction:^(NSString * _Nonnull searchKey, BOOL isChooseSubject) {
+            if (isChooseSubject) {
+                [weakSelf searchSubject];
+            }
+            else {
+                [weakSelf evaluateSource:searchKey];
+            }
+        }];
+    }
+    return _searchView;
+}
+
+- (void)evaluateSource:(NSString *)searchKey {
+    self.searchKey = searchKey;
+    [self refreshAndRequestData];
+}
+
+- (void)searchSubject {
+    if (self.subjectList.count) {
+        NSMutableArray *nameArray = [NSMutableArray array];
+        [nameArray addObject:@"全部"];
+        for (NSDictionary *parm in self.subjectList) {
+            [nameArray addObject:[parm stringValueForKey:@"subjectName"]];
+        }
+        MJWeakSelf;
+        KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"声部" sourceData:nameArray chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+            if (chooseIndex == 0) {
+                weakSelf.searchView.sortTitleLabel.text = @"声部";
+                weakSelf.subjectIds = nil;
+            }
+            else {
+                weakSelf.searchView.sortTitleLabel.text = returnValue;
+                NSDictionary *parm = self.subjectList[chooseIndex-1];
+                weakSelf.subjectIds = [parm stringValueForKey:@"subjectId"];
+            }
+            self.searchView.arrowUp = NO;
+            [weakSelf refreshAndRequestData];
+        } cancel:^{
+            self.searchView.arrowUp = NO;
+        }];
+        [picker showPicker];
+    }
+    else {
+        [self MBPShow:@"无声部信息"];
+        self.searchView.arrowUp = NO;
+    }
+}
 /*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.

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

@@ -229,6 +229,13 @@
     }
 }
 
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.section == 2 && self.fansGroupArray.count != 0) {
+        MinePageGroupModel *model = self.fansGroupArray[indexPath.row];
+        [self chatAction:model.internalBaseClassIdentifier groupName:model.name];
+    }
+}
+
 - (void)createStyleAction {
     MyStyleViewController *style = [[MyStyleViewController alloc] init];
     [self.naviController pushViewController:style animated:YES];

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

@@ -42,7 +42,7 @@
     if (self) {
         self.backgroundColor = HexRGB(0xf6f8f9);
         UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
-        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 12, 14);
         
         self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
         self.collectionView.backgroundColor = HexRGB(0xf6f8f9);

+ 3 - 59
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/SettingBodyView.xib

@@ -14,7 +14,7 @@
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bvI-vo-wNV">
-                    <rect key="frame" x="14" y="15" width="386" height="258"/>
+                    <rect key="frame" x="14" y="15" width="386" height="208"/>
                     <subviews>
                         <view tag="1007" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="66O-io-Yxa">
                             <rect key="frame" x="0.0" y="0.0" width="386" height="50"/>
@@ -152,61 +152,8 @@
                                 <outletCollection property="gestureRecognizers" destination="WVN-s2-eTZ" appends="YES" id="cfU-f6-1Uf"/>
                             </connections>
                         </view>
-                        <view tag="1010" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="anE-I3-Co0">
-                            <rect key="frame" x="0.0" y="150" width="386" height="50"/>
-                            <subviews>
-                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="意见反馈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gdi-Lt-ODx">
-                                    <rect key="frame" x="12" y="15" width="75" height="20"/>
-                                    <constraints>
-                                        <constraint firstAttribute="width" constant="75" id="HaX-ES-Gkh"/>
-                                    </constraints>
-                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                                    <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                    <nil key="highlightedColor"/>
-                                </label>
-                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="setting_next" translatesAutoresizingMaskIntoConstraints="NO" id="c8g-WQ-uUX">
-                                    <rect key="frame" x="365" y="19.5" width="6" height="11"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="11" id="IHy-yQ-oEC"/>
-                                        <constraint firstAttribute="width" constant="6" id="x1o-dJ-m06"/>
-                                    </constraints>
-                                </imageView>
-                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tJS-EA-XLf">
-                                    <rect key="frame" x="11" y="49" width="366" height="1"/>
-                                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="1" id="web-FY-XzO"/>
-                                    </constraints>
-                                </view>
-                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ey3-eE-jhE">
-                                    <rect key="frame" x="355" y="0.0" width="0.0" height="49"/>
-                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                                    <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" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-                            <gestureRecognizers/>
-                            <constraints>
-                                <constraint firstItem="Ey3-eE-jhE" firstAttribute="top" secondItem="anE-I3-Co0" secondAttribute="top" id="F7e-V6-10C"/>
-                                <constraint firstAttribute="trailing" secondItem="c8g-WQ-uUX" secondAttribute="trailing" constant="15" id="Ka3-jW-ThB"/>
-                                <constraint firstItem="Gdi-Lt-ODx" firstAttribute="centerY" secondItem="anE-I3-Co0" secondAttribute="centerY" id="M6E-7F-P1c"/>
-                                <constraint firstItem="tJS-EA-XLf" firstAttribute="top" secondItem="Ey3-eE-jhE" secondAttribute="bottom" id="Nng-PD-Jr8"/>
-                                <constraint firstItem="tJS-EA-XLf" firstAttribute="leading" secondItem="anE-I3-Co0" secondAttribute="leading" constant="11" id="Rdb-lC-JTm"/>
-                                <constraint firstItem="c8g-WQ-uUX" firstAttribute="centerY" secondItem="anE-I3-Co0" secondAttribute="centerY" id="bjN-gV-V2S"/>
-                                <constraint firstAttribute="bottom" secondItem="tJS-EA-XLf" secondAttribute="bottom" id="i3c-nv-M6o"/>
-                                <constraint firstItem="Ey3-eE-jhE" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Gdi-Lt-ODx" secondAttribute="trailing" constant="15" id="nO8-gs-cTi"/>
-                                <constraint firstAttribute="height" constant="50" id="srD-tv-hTJ"/>
-                                <constraint firstItem="c8g-WQ-uUX" firstAttribute="leading" secondItem="Ey3-eE-jhE" secondAttribute="trailing" constant="10" id="u1f-U1-COB"/>
-                                <constraint firstItem="Gdi-Lt-ODx" firstAttribute="leading" secondItem="anE-I3-Co0" secondAttribute="leading" constant="12" id="wz1-IN-C5E"/>
-                                <constraint firstAttribute="trailing" secondItem="tJS-EA-XLf" secondAttribute="trailing" constant="9" id="xlZ-iu-jF2"/>
-                            </constraints>
-                            <connections>
-                                <outletCollection property="gestureRecognizers" destination="hfQ-Uy-nSc" appends="YES" id="cKc-XC-g09"/>
-                            </connections>
-                        </view>
                         <view tag="1011" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fae-Ws-ND6">
-                            <rect key="frame" x="0.0" y="200" width="386" height="50"/>
+                            <rect key="frame" x="0.0" y="150" width="386" height="50"/>
                             <subviews>
                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="关于我们" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7NY-Jl-Fvk">
                                     <rect key="frame" x="12" y="15" width="75" height="20"/>
@@ -253,17 +200,14 @@
                     <constraints>
                         <constraint firstAttribute="trailing" secondItem="l7Z-Gj-hWL" secondAttribute="trailing" id="7lq-jO-way"/>
                         <constraint firstAttribute="trailing" secondItem="fae-Ws-ND6" secondAttribute="trailing" id="9EJ-XW-BHg"/>
-                        <constraint firstAttribute="trailing" secondItem="anE-I3-Co0" secondAttribute="trailing" id="9WJ-kR-FAO"/>
                         <constraint firstAttribute="trailing" secondItem="66O-io-Yxa" secondAttribute="trailing" id="Bu8-cb-AIo"/>
                         <constraint firstItem="IrL-hq-2eU" firstAttribute="leading" secondItem="bvI-vo-wNV" secondAttribute="leading" id="CLc-rU-xPU"/>
                         <constraint firstAttribute="bottom" secondItem="fae-Ws-ND6" secondAttribute="bottom" constant="8" id="Ddq-qc-uO8"/>
                         <constraint firstItem="66O-io-Yxa" firstAttribute="leading" secondItem="bvI-vo-wNV" secondAttribute="leading" id="Hkj-Fz-5iB"/>
-                        <constraint firstItem="fae-Ws-ND6" firstAttribute="top" secondItem="anE-I3-Co0" secondAttribute="bottom" id="Ib7-m9-A9b"/>
                         <constraint firstItem="l7Z-Gj-hWL" firstAttribute="leading" secondItem="bvI-vo-wNV" secondAttribute="leading" id="Kbc-Dl-7SL"/>
-                        <constraint firstItem="anE-I3-Co0" firstAttribute="leading" secondItem="bvI-vo-wNV" secondAttribute="leading" id="Qbx-VX-hTt"/>
-                        <constraint firstItem="anE-I3-Co0" firstAttribute="top" secondItem="l7Z-Gj-hWL" secondAttribute="bottom" id="Rtv-Wk-ot8"/>
                         <constraint firstItem="IrL-hq-2eU" firstAttribute="top" secondItem="66O-io-Yxa" secondAttribute="bottom" id="SAO-fg-84E"/>
                         <constraint firstAttribute="trailing" secondItem="IrL-hq-2eU" secondAttribute="trailing" id="WW8-th-rjC"/>
+                        <constraint firstItem="fae-Ws-ND6" firstAttribute="top" secondItem="l7Z-Gj-hWL" secondAttribute="bottom" id="bG6-pf-m96"/>
                         <constraint firstItem="l7Z-Gj-hWL" firstAttribute="leading" secondItem="bvI-vo-wNV" secondAttribute="leading" id="cfZ-dB-AYb"/>
                         <constraint firstItem="l7Z-Gj-hWL" firstAttribute="top" secondItem="IrL-hq-2eU" secondAttribute="bottom" id="due-IM-u9J"/>
                         <constraint firstAttribute="trailing" secondItem="l7Z-Gj-hWL" secondAttribute="trailing" id="l5Q-fq-1lq"/>

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.h

@@ -26,6 +26,7 @@ typedef NS_ENUM(NSInteger, MINEVIEWTYPE) {
     MINEVIEWTYPE_FINISHCOURSE, // 已上课程
     MINEVIEWTYPE_UNFINISHCOURSE, // 未上课程
     MINEVIEWTYPE_USERSETTING,   // 用户设置
+    MINEVIEWTYPE_FEEDBACK,      // 意见反馈
 };
 
 typedef void(^MineViewCallback)(MINEVIEWTYPE type);

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.m

@@ -212,7 +212,7 @@
 }
 
 - (CGFloat)getViewHeight {
-    return 90 + 15 + 180 + 15 + 250 + self.descViewHeight.constant+10;
+    return 90 + 15 + 180 + 15 + 300 + self.descViewHeight.constant+10;
 }
 
 - (IBAction)hideTipsButton:(id)sender {

+ 58 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineBodyView.xib

@@ -515,7 +515,7 @@
                     </userDefinedRuntimeAttributes>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="f2F-rL-Oml">
-                    <rect key="frame" x="14" y="335" width="386" height="250"/>
+                    <rect key="frame" x="14" y="335" width="386" height="300"/>
                     <subviews>
                         <view tag="1009" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="587-LV-G4K">
                             <rect key="frame" x="0.0" y="0.0" width="386" height="50"/>
@@ -752,11 +752,59 @@
                                 <outletCollection property="gestureRecognizers" destination="bm8-bO-Esk" appends="YES" id="fdy-6M-Mvk"/>
                             </connections>
                         </view>
+                        <view tag="1018" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IAv-KK-u9M">
+                            <rect key="frame" x="0.0" y="250" width="386" height="50"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_feedback" translatesAutoresizingMaskIntoConstraints="NO" id="4kV-at-PJ6">
+                                    <rect key="frame" x="10" y="11" width="28" height="28"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="28" id="0MD-rS-Ib0"/>
+                                        <constraint firstAttribute="height" constant="28" id="wXF-Pl-AIe"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="意见反馈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="C9o-9e-Bza">
+                                    <rect key="frame" x="42" y="16" width="61.5" height="18"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                    <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="lCg-Kh-gOY">
+                                    <rect key="frame" x="362" y="19.5" width="6" height="11"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="6" id="Qpo-Mj-z2U"/>
+                                        <constraint firstAttribute="height" constant="11" id="g3s-O2-IaE"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6L8-G7-Erd">
+                                    <rect key="frame" x="352" y="25" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <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" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <gestureRecognizers/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="50" id="Cg1-A2-vG8"/>
+                                <constraint firstItem="C9o-9e-Bza" firstAttribute="leading" secondItem="4kV-at-PJ6" secondAttribute="trailing" constant="4" id="Dey-Yg-diJ"/>
+                                <constraint firstItem="4kV-at-PJ6" firstAttribute="centerY" secondItem="IAv-KK-u9M" secondAttribute="centerY" id="F1K-6F-eSB"/>
+                                <constraint firstItem="lCg-Kh-gOY" firstAttribute="centerY" secondItem="IAv-KK-u9M" secondAttribute="centerY" id="Orw-PT-VO9"/>
+                                <constraint firstItem="lCg-Kh-gOY" firstAttribute="centerY" secondItem="6L8-G7-Erd" secondAttribute="centerY" id="jox-qF-bej"/>
+                                <constraint firstItem="lCg-Kh-gOY" firstAttribute="leading" secondItem="6L8-G7-Erd" secondAttribute="trailing" constant="10" id="mch-Jq-oD7"/>
+                                <constraint firstAttribute="trailing" secondItem="lCg-Kh-gOY" secondAttribute="trailing" constant="18" id="pIK-3b-Fub"/>
+                                <constraint firstItem="4kV-at-PJ6" firstAttribute="leading" secondItem="IAv-KK-u9M" secondAttribute="leading" constant="10" id="v2g-n5-BUc"/>
+                                <constraint firstItem="C9o-9e-Bza" firstAttribute="centerY" secondItem="4kV-at-PJ6" secondAttribute="centerY" id="zrO-pD-Tcv"/>
+                            </constraints>
+                            <connections>
+                                <outletCollection property="gestureRecognizers" destination="u3X-92-Ynd" appends="YES" id="uSG-iD-8UE"/>
+                            </connections>
+                        </view>
                     </subviews>
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
                         <constraint firstAttribute="trailing" secondItem="bLM-S7-kvB" secondAttribute="trailing" id="28v-3O-zCx"/>
                         <constraint firstItem="BEZ-ci-TDO" firstAttribute="top" secondItem="587-LV-G4K" secondAttribute="bottom" id="3pU-7I-KQv"/>
+                        <constraint firstItem="IAv-KK-u9M" firstAttribute="top" secondItem="4LP-I2-ILK" secondAttribute="bottom" id="4YM-ZZ-FA3"/>
                         <constraint firstAttribute="trailing" secondItem="BEZ-ci-TDO" secondAttribute="trailing" id="5t9-BH-n6t"/>
                         <constraint firstItem="BEZ-ci-TDO" firstAttribute="leading" secondItem="f2F-rL-Oml" secondAttribute="leading" id="6R2-Ae-xjs"/>
                         <constraint firstItem="587-LV-G4K" firstAttribute="leading" secondItem="f2F-rL-Oml" secondAttribute="leading" id="7U9-Rv-Hoe"/>
@@ -765,8 +813,10 @@
                         <constraint firstAttribute="trailing" secondItem="Pj0-Ce-zhw" secondAttribute="trailing" id="JYo-IJ-TK0"/>
                         <constraint firstItem="4LP-I2-ILK" firstAttribute="top" secondItem="Pj0-Ce-zhw" secondAttribute="bottom" id="JzB-PI-TGr"/>
                         <constraint firstAttribute="trailing" secondItem="4LP-I2-ILK" secondAttribute="trailing" id="Mo1-up-C8f"/>
-                        <constraint firstAttribute="height" constant="250" id="Oax-s9-suf"/>
+                        <constraint firstAttribute="trailing" secondItem="IAv-KK-u9M" secondAttribute="trailing" id="NWY-O3-O5I"/>
+                        <constraint firstAttribute="height" constant="300" id="Oax-s9-suf"/>
                         <constraint firstItem="4LP-I2-ILK" firstAttribute="leading" secondItem="f2F-rL-Oml" secondAttribute="leading" id="V8s-sf-E8f"/>
+                        <constraint firstItem="IAv-KK-u9M" firstAttribute="leading" secondItem="f2F-rL-Oml" secondAttribute="leading" id="aFe-zS-l4W"/>
                         <constraint firstItem="bLM-S7-kvB" firstAttribute="top" secondItem="BEZ-ci-TDO" secondAttribute="bottom" id="aYh-dH-lna"/>
                         <constraint firstItem="Pj0-Ce-zhw" firstAttribute="leading" secondItem="f2F-rL-Oml" secondAttribute="leading" id="fz9-0a-2Fc"/>
                         <constraint firstAttribute="trailing" secondItem="587-LV-G4K" secondAttribute="trailing" id="t6f-Rd-2hW"/>
@@ -1008,6 +1058,11 @@
                 <action selector="unfinishCourse:" destination="iN0-l3-epB" id="bTp-gW-9fv"/>
             </connections>
         </tapGestureRecognizer>
+        <tapGestureRecognizer id="u3X-92-Ynd">
+            <connections>
+                <action selector="clickAction:" destination="iN0-l3-epB" id="F43-5x-hKl"/>
+            </connections>
+        </tapGestureRecognizer>
     </objects>
     <resources>
         <image name="auth_detail" width="6" height="9"/>
@@ -1017,6 +1072,7 @@
         <image name="mine_boardcastCourse" width="34" height="34"/>
         <image name="mine_card" width="28" height="28"/>
         <image name="mine_device" width="28" height="28"/>
+        <image name="mine_feedback" width="28" height="28"/>
         <image name="mine_help" width="28" height="28"/>
         <image name="mine_homepage" width="34" height="34"/>
         <image name="mine_mien" width="34" height="34"/>