Jelajahi Sumber

升级RTC sdk 5.3.1.2 修复SDK存在的问题:1.音频启动失败。2.50069导致发布音视频失败的问题

Steven 2 tahun lalu
induk
melakukan
d61808dd5a
100 mengubah file dengan 4134 tambahan dan 191 penghapusan
  1. 194 14
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/Contents.json
  3. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/Contents.json
  4. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/classroomPlayer_close@2x.png
  5. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/classroomPlayer_close@3x.png
  6. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/Contents.json
  7. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/classroomPlayer_pause@2x.png
  8. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/classroomPlayer_pause@3x.png
  9. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/Contents.json
  10. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/classroomPlayer_play@2x.png
  11. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/classroomPlayer_play@3x.png
  12. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/Contents.json
  13. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/classroomPlayer_refresh@2x.png
  14. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/classroomPlayer_refresh@3x.png
  15. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/Contents.json
  16. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/classroomPlayer_volume@2x.png
  17. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/classroomPlayer_volume@3x.png
  18. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/Contents.json
  19. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/coursewarePlayer_packUp@2x.png
  20. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/coursewarePlayer_packUp@3x.png
  21. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/Contents.json
  22. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/wareSlider_image@2x.png
  23. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/wareSlider_image@3x.png
  24. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_courseware_lessen.imageset/Contents.json
  25. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_courseware_lessen.imageset/tool_courseware_lessen@2x.png
  26. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_courseware_lessen.imageset/tool_courseware_lessen@3x.png
  27. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_coursewares.imageset/Contents.json
  28. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_coursewares.imageset/tool_courseware@2x.png
  29. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_coursewares.imageset/tool_courseware@3x.png
  30. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/search_grey.imageset/Contents.json
  31. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/search_grey.imageset/search_grey@2x.png
  32. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/search_grey.imageset/search_grey@3x.png
  33. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_courseware.imageset/Contents.json
  34. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_courseware.imageset/tool_courseware@2x.png
  35. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_courseware.imageset/tool_courseware@3x.png
  36. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_image.imageset/Contents.json
  37. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_image.imageset/choose_image@2x.png
  38. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_image.imageset/choose_image@3x.png
  39. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_back.imageset/Contents.json
  40. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_back.imageset/courseware_back@2x.png
  41. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_back.imageset/courseware_back@3x.png
  42. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_cancle.imageset/Contents.json
  43. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_cancle.imageset/courseware_cancle@2x.png
  44. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_cancle.imageset/courseware_cancle@3x.png
  45. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_tips.imageset/Contents.json
  46. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_tips.imageset/courseware_tips@2x.png
  47. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_tips.imageset/courseware_tips@3x.png
  48. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/unchoose_image.imageset/Contents.json
  49. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/unchoose_image.imageset/unchoose_image@2x.png
  50. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/unchoose_image.imageset/unchoose_image@3x.png
  51. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/WhiteBoardButton/whiteboard_staff.imageset/Contents.json
  52. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/WhiteBoardButton/whiteboard_staff.imageset/whiteboard_staff@2x.png
  53. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/WhiteBoardButton/whiteboard_staff.imageset/whiteboard_staff@3x.png
  54. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseViewController.m
  55. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m
  56. 35 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSHudLoagingManager.h
  57. 112 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSHudLoagingManager.m
  58. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  59. 38 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  60. 15 14
      KulexiuForTeacher/KulexiuForTeacher/Common/Define/PrefixHeader.pch
  61. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/KSChatComplainController.m
  62. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/ChatUserInfo/ChatUserInfo.m
  63. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/ChatUserInfo/RecentPracticeModel.m
  64. 217 11
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m
  65. 57 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.h
  66. 324 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.m
  67. 292 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.xib
  68. 25 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.h
  69. 150 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.m
  70. 125 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.xib
  71. 35 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/KSWareSliderView.h
  72. 127 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/KSWareSliderView.m
  73. 19 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.h
  74. 41 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.m
  75. 87 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.xib
  76. 34 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.h
  77. 245 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.m
  78. 226 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.xib
  79. 7 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/TeachTool/TeachToolView.h
  80. 85 141
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/TeachTool/TeachToolView.m
  81. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.m
  82. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/CreateLiveViewController.m
  83. 7 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m
  84. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Controller/CoursewareViewController.h
  85. 273 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Controller/CoursewareViewController.m
  86. 36 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Model/CoursewareListModel.h
  87. 197 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Model/CoursewareListModel.m
  88. 25 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Protocal/CoursewareTableDelegate.h
  89. 52 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Protocal/CoursewareTableDelegate.m
  90. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.h
  91. 44 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.m
  92. 46 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.xib
  93. 18 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.h
  94. 70 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.m
  95. 127 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.xib
  96. 32 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.h
  97. 78 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.m
  98. 96 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.xib
  99. 23 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareSearchView.h
  100. 61 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareSearchView.m

+ 194 - 14
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -585,6 +585,18 @@
 		BC542E4328407AD200633781 /* UserSettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC542E4228407AD200633781 /* UserSettingViewController.m */; };
 		BC542E4628407B3D00633781 /* UseBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC542E4528407B3D00633781 /* UseBodyView.m */; };
 		BC542E4828407B4400633781 /* UseBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC542E4728407B4400633781 /* UseBodyView.xib */; };
+		BC56C95529233D0500AF301F /* CoursewareTableDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C95429233D0500AF301F /* CoursewareTableDelegate.m */; };
+		BC56C95829233F1700AF301F /* CoursewareBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C95729233F1700AF301F /* CoursewareBottomView.m */; };
+		BC56C95A29233F1D00AF301F /* CoursewareBottomView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC56C95929233F1D00AF301F /* CoursewareBottomView.xib */; };
+		BC56C95D2923412800AF301F /* CoursewareViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C95C2923412800AF301F /* CoursewareViewModel.m */; };
+		BC56C96529235BFE00AF301F /* CoursewareNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C96429235BFE00AF301F /* CoursewareNavView.m */; };
+		BC56C96729235C0500AF301F /* CoursewareNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC56C96629235C0500AF301F /* CoursewareNavView.xib */; };
+		BC56C96A2923736200AF301F /* KSHudLoagingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C9692923736200AF301F /* KSHudLoagingManager.m */; };
+		BC56C97329238CBA00AF301F /* CoursewareAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C97229238CBA00AF301F /* CoursewareAlertView.m */; };
+		BC56C97529238CC300AF301F /* CoursewareAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC56C97429238CC300AF301F /* CoursewareAlertView.xib */; };
+		BC56C97829238D6300AF301F /* CoursewareListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C97629238D6200AF301F /* CoursewareListModel.m */; };
+		BC56C97C2923A3FD00AF301F /* CoursewareAlertCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC56C97A2923A3FD00AF301F /* CoursewareAlertCell.m */; };
+		BC56C97D2923A3FD00AF301F /* CoursewareAlertCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC56C97B2923A3FD00AF301F /* CoursewareAlertCell.xib */; };
 		BC5756B128B60096002302D8 /* HomeAuthAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5756B028B60095002302D8 /* HomeAuthAlertView.m */; };
 		BC5756B328B600A3002302D8 /* HomeAuthAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC5756B228B600A3002302D8 /* HomeAuthAlertView.xib */; };
 		BC58E7D3281B9630004B0893 /* PublicNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC58E7D2281B9630004B0893 /* PublicNoticeView.m */; };
@@ -689,6 +701,9 @@
 		BC7663092827C95200C91A1D /* KSUploadManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7663082827C95200C91A1D /* KSUploadManager.m */; };
 		BC7705FD287676D3003EFA7F /* HomeActionView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7705FC287676D3003EFA7F /* HomeActionView.m */; };
 		BC7705FF287676DC003EFA7F /* HomeActionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7705FE287676DC003EFA7F /* HomeActionView.xib */; };
+		BC7B0F5029271B5E0044CF61 /* CourseWarePreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7B0F4F29271B5E0044CF61 /* CourseWarePreviewView.m */; };
+		BC7B0F5229271B650044CF61 /* CourseWarePreviewView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7B0F5129271B650044CF61 /* CourseWarePreviewView.xib */; };
+		BC7B0F5529276D980044CF61 /* KSWareSliderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7B0F5429276D980044CF61 /* KSWareSliderView.m */; };
 		BC7CFF9F2817CBD400CAEB21 /* WithdrawViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFF9E2817CBD400CAEB21 /* WithdrawViewController.m */; };
 		BC7CFFA22817D72200CAEB21 /* IncomeListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFA02817D72100CAEB21 /* IncomeListModel.m */; };
 		BC7CFFA52817E37300CAEB21 /* IncomeCountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFA42817E37300CAEB21 /* IncomeCountViewController.m */; };
@@ -711,6 +726,11 @@
 		BC7CFFD5281801A800CAEB21 /* CardBandBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */; };
 		BC7CFFD7281801B700CAEB21 /* CardBandBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */; };
 		BC7E770C2900DD8E00EB37AF /* HomeDragButton.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7E770A2900DD8E00EB37AF /* HomeDragButton.m */; };
+		BC81F0E529232C11004106AF /* CoursewareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC81F0E429232C11004106AF /* CoursewareViewController.m */; };
+		BC81F0E929232D01004106AF /* CoursewareListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC81F0E729232D01004106AF /* CoursewareListCell.m */; };
+		BC81F0EA29232D01004106AF /* CoursewareListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC81F0E829232D01004106AF /* CoursewareListCell.xib */; };
+		BC81F0ED29233220004106AF /* CoursewareSearchView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC81F0EC29233220004106AF /* CoursewareSearchView.m */; };
+		BC81F0EF29233228004106AF /* CoursewareSearchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC81F0EE29233228004106AF /* CoursewareSearchView.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 */; };
@@ -758,6 +778,8 @@
 		BC9070A728C71C8700237958 /* MyCreateGroupHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9070A628C71C8700237958 /* MyCreateGroupHeadView.m */; };
 		BC9070A928C71C8E00237958 /* MyCreateGroupHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9070A828C71C8E00237958 /* MyCreateGroupHeadView.xib */; };
 		BC9473FD282A5E71004B3B27 /* NoticeSourceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9473FB282A5E71004B3B27 /* NoticeSourceModel.m */; };
+		BC965AE82925D1D700AB90B0 /* ClassroomCoursewarePlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC965AE72925D1D700AB90B0 /* ClassroomCoursewarePlayView.m */; };
+		BC965AEA2926332D00AB90B0 /* ClassroomCoursewarePlayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC965AE92926332D00AB90B0 /* ClassroomCoursewarePlayView.xib */; };
 		BCA1134828A22A66007FAFB9 /* HomeHotMusicCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA1134628A22A66007FAFB9 /* HomeHotMusicCollectionCell.m */; };
 		BCA1134928A22A66007FAFB9 /* HomeHotMusicCollectionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA1134728A22A66007FAFB9 /* HomeHotMusicCollectionCell.xib */; };
 		BCA1134C28A23221007FAFB9 /* HomeHotMusicCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA1134B28A23221007FAFB9 /* HomeHotMusicCellView.m */; };
@@ -2097,6 +2119,26 @@
 		BC542E4428407B3D00633781 /* UseBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UseBodyView.h; sourceTree = "<group>"; };
 		BC542E4528407B3D00633781 /* UseBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UseBodyView.m; sourceTree = "<group>"; };
 		BC542E4728407B4400633781 /* UseBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UseBodyView.xib; sourceTree = "<group>"; };
+		BC56C95329233D0500AF301F /* CoursewareTableDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareTableDelegate.h; sourceTree = "<group>"; };
+		BC56C95429233D0500AF301F /* CoursewareTableDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareTableDelegate.m; sourceTree = "<group>"; };
+		BC56C95629233F1700AF301F /* CoursewareBottomView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareBottomView.h; sourceTree = "<group>"; };
+		BC56C95729233F1700AF301F /* CoursewareBottomView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareBottomView.m; sourceTree = "<group>"; };
+		BC56C95929233F1D00AF301F /* CoursewareBottomView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareBottomView.xib; sourceTree = "<group>"; };
+		BC56C95B2923412800AF301F /* CoursewareViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareViewModel.h; sourceTree = "<group>"; };
+		BC56C95C2923412800AF301F /* CoursewareViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareViewModel.m; sourceTree = "<group>"; };
+		BC56C96329235BFE00AF301F /* CoursewareNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareNavView.h; sourceTree = "<group>"; };
+		BC56C96429235BFE00AF301F /* CoursewareNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareNavView.m; sourceTree = "<group>"; };
+		BC56C96629235C0500AF301F /* CoursewareNavView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareNavView.xib; sourceTree = "<group>"; };
+		BC56C9682923736200AF301F /* KSHudLoagingManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSHudLoagingManager.h; sourceTree = "<group>"; };
+		BC56C9692923736200AF301F /* KSHudLoagingManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSHudLoagingManager.m; sourceTree = "<group>"; };
+		BC56C97129238CBA00AF301F /* CoursewareAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareAlertView.h; sourceTree = "<group>"; };
+		BC56C97229238CBA00AF301F /* CoursewareAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareAlertView.m; sourceTree = "<group>"; };
+		BC56C97429238CC300AF301F /* CoursewareAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareAlertView.xib; sourceTree = "<group>"; };
+		BC56C97629238D6200AF301F /* CoursewareListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoursewareListModel.m; sourceTree = "<group>"; };
+		BC56C97729238D6200AF301F /* CoursewareListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoursewareListModel.h; sourceTree = "<group>"; };
+		BC56C9792923A3FD00AF301F /* CoursewareAlertCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareAlertCell.h; sourceTree = "<group>"; };
+		BC56C97A2923A3FD00AF301F /* CoursewareAlertCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareAlertCell.m; sourceTree = "<group>"; };
+		BC56C97B2923A3FD00AF301F /* CoursewareAlertCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareAlertCell.xib; sourceTree = "<group>"; };
 		BC5756AF28B60095002302D8 /* HomeAuthAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeAuthAlertView.h; sourceTree = "<group>"; };
 		BC5756B028B60095002302D8 /* HomeAuthAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeAuthAlertView.m; sourceTree = "<group>"; };
 		BC5756B228B600A3002302D8 /* HomeAuthAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeAuthAlertView.xib; sourceTree = "<group>"; };
@@ -2244,6 +2286,11 @@
 		BC7705FB287676D3003EFA7F /* HomeActionView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeActionView.h; sourceTree = "<group>"; };
 		BC7705FC287676D3003EFA7F /* HomeActionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeActionView.m; sourceTree = "<group>"; };
 		BC7705FE287676DC003EFA7F /* HomeActionView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeActionView.xib; sourceTree = "<group>"; };
+		BC7B0F4E29271B5E0044CF61 /* CourseWarePreviewView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseWarePreviewView.h; sourceTree = "<group>"; };
+		BC7B0F4F29271B5E0044CF61 /* CourseWarePreviewView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseWarePreviewView.m; sourceTree = "<group>"; };
+		BC7B0F5129271B650044CF61 /* CourseWarePreviewView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseWarePreviewView.xib; sourceTree = "<group>"; };
+		BC7B0F5329276D980044CF61 /* KSWareSliderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSWareSliderView.h; sourceTree = "<group>"; };
+		BC7B0F5429276D980044CF61 /* KSWareSliderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSWareSliderView.m; sourceTree = "<group>"; };
 		BC7CFF9D2817CBD400CAEB21 /* WithdrawViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WithdrawViewController.h; sourceTree = "<group>"; };
 		BC7CFF9E2817CBD400CAEB21 /* WithdrawViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WithdrawViewController.m; sourceTree = "<group>"; };
 		BC7CFFA02817D72100CAEB21 /* IncomeListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomeListModel.m; sourceTree = "<group>"; };
@@ -2280,6 +2327,14 @@
 		BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardBandBodyView.xib; sourceTree = "<group>"; };
 		BC7E770A2900DD8E00EB37AF /* HomeDragButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeDragButton.m; sourceTree = "<group>"; };
 		BC7E770B2900DD8E00EB37AF /* HomeDragButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeDragButton.h; sourceTree = "<group>"; };
+		BC81F0E329232C11004106AF /* CoursewareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareViewController.h; sourceTree = "<group>"; };
+		BC81F0E429232C11004106AF /* CoursewareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareViewController.m; sourceTree = "<group>"; };
+		BC81F0E629232D01004106AF /* CoursewareListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareListCell.h; sourceTree = "<group>"; };
+		BC81F0E729232D01004106AF /* CoursewareListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareListCell.m; sourceTree = "<group>"; };
+		BC81F0E829232D01004106AF /* CoursewareListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareListCell.xib; sourceTree = "<group>"; };
+		BC81F0EB29233220004106AF /* CoursewareSearchView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareSearchView.h; sourceTree = "<group>"; };
+		BC81F0EC29233220004106AF /* CoursewareSearchView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareSearchView.m; sourceTree = "<group>"; };
+		BC81F0EE29233228004106AF /* CoursewareSearchView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareSearchView.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>"; };
@@ -2353,6 +2408,9 @@
 		BC9070A828C71C8E00237958 /* MyCreateGroupHeadView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyCreateGroupHeadView.xib; sourceTree = "<group>"; };
 		BC9473FB282A5E71004B3B27 /* NoticeSourceModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoticeSourceModel.m; sourceTree = "<group>"; };
 		BC9473FC282A5E71004B3B27 /* NoticeSourceModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoticeSourceModel.h; sourceTree = "<group>"; };
+		BC965AE62925D1D700AB90B0 /* ClassroomCoursewarePlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassroomCoursewarePlayView.h; sourceTree = "<group>"; };
+		BC965AE72925D1D700AB90B0 /* ClassroomCoursewarePlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ClassroomCoursewarePlayView.m; sourceTree = "<group>"; };
+		BC965AE92926332D00AB90B0 /* ClassroomCoursewarePlayView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ClassroomCoursewarePlayView.xib; sourceTree = "<group>"; };
 		BCA1134528A22A66007FAFB9 /* HomeHotMusicCollectionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeHotMusicCollectionCell.h; sourceTree = "<group>"; };
 		BCA1134628A22A66007FAFB9 /* HomeHotMusicCollectionCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeHotMusicCollectionCell.m; sourceTree = "<group>"; };
 		BCA1134728A22A66007FAFB9 /* HomeHotMusicCollectionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeHotMusicCollectionCell.xib; sourceTree = "<group>"; };
@@ -3246,6 +3304,8 @@
 		2779309627E30F2D0010E277 /* Base */ = {
 			isa = PBXGroup;
 			children = (
+				BC56C9682923736200AF301F /* KSHudLoagingManager.h */,
+				BC56C9692923736200AF301F /* KSHudLoagingManager.m */,
 				BCC583D328A9FA8100BAB4CF /* CloudLoadingSource */,
 				BC71D28A288811BF0010F14B /* TabbarAnimation */,
 				BC023801286594EA005560CA /* KSTipsAlert.h */,
@@ -3709,15 +3769,15 @@
 		2779315827E30FC00010E277 /* KSInputView */ = {
 			isa = PBXGroup;
 			children = (
-				2779315927E30FC00010E277 /* UITextField_Toolbar.m */,
+				2779315F27E30FC00010E277 /* SkipTextField.h */,
 				2779315A27E30FC00010E277 /* SkipTextField.m */,
 				2779315B27E30FC00010E277 /* SkipTextProtocol.h */,
 				2779315C27E30FC00010E277 /* SkipTextView.h */,
-				2779315D27E30FC00010E277 /* UITextView_Toolbar.m */,
-				2779315E27E30FC00010E277 /* UITextField_Toolbar.h */,
-				2779315F27E30FC00010E277 /* SkipTextField.h */,
 				2779316027E30FC00010E277 /* SkipTextView.m */,
+				2779315E27E30FC00010E277 /* UITextField_Toolbar.h */,
+				2779315927E30FC00010E277 /* UITextField_Toolbar.m */,
 				2779316127E30FC00010E277 /* UITextView_Toolbar.h */,
+				2779315D27E30FC00010E277 /* UITextView_Toolbar.m */,
 			);
 			path = KSInputView;
 			sourceTree = "<group>";
@@ -4150,6 +4210,7 @@
 		277935FE27E32BBF0010E277 /* Mine */ = {
 			isa = PBXGroup;
 			children = (
+				BC81F0DF29232BFD004106AF /* Courseware */,
 				BCB9FA502872BA6D005D766B /* LiveList */,
 				BC4BCE622823990100522C8B /* AddressList */,
 				BC7CFFBF2817F1EE00CAEB21 /* BankCard */,
@@ -4915,9 +4976,9 @@
 			isa = PBXGroup;
 			children = (
 				BC0A2295284751F80065C1AB /* AccompanyProgressView.h */,
+				BC0A2298284751F80065C1AB /* AccompanyProgressView.m */,
 				BC0A2296284751F80065C1AB /* DownloadStatusCell.h */,
 				BC0A2297284751F80065C1AB /* DownloadStatusCell.m */,
-				BC0A2298284751F80065C1AB /* AccompanyProgressView.m */,
 				BC0A2299284751F80065C1AB /* DownloadStatusCell.xib */,
 			);
 			path = DownloadView;
@@ -5352,6 +5413,37 @@
 			path = images;
 			sourceTree = "<group>";
 		};
+		BC56C94E29233C9700AF301F /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				BC56C95B2923412800AF301F /* CoursewareViewModel.h */,
+				BC56C95C2923412800AF301F /* CoursewareViewModel.m */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		BC56C94F29233CB000AF301F /* Protocal */ = {
+			isa = PBXGroup;
+			children = (
+				BC56C95329233D0500AF301F /* CoursewareTableDelegate.h */,
+				BC56C95429233D0500AF301F /* CoursewareTableDelegate.m */,
+			);
+			path = Protocal;
+			sourceTree = "<group>";
+		};
+		BC56C96B2923773E00AF301F /* CoursewareView */ = {
+			isa = PBXGroup;
+			children = (
+				BC56C97129238CBA00AF301F /* CoursewareAlertView.h */,
+				BC56C97229238CBA00AF301F /* CoursewareAlertView.m */,
+				BC56C97429238CC300AF301F /* CoursewareAlertView.xib */,
+				BC56C9792923A3FD00AF301F /* CoursewareAlertCell.h */,
+				BC56C97A2923A3FD00AF301F /* CoursewareAlertCell.m */,
+				BC56C97B2923A3FD00AF301F /* CoursewareAlertCell.xib */,
+			);
+			path = CoursewareView;
+			sourceTree = "<group>";
+		};
 		BC5E4AD7291E5E26001BBCD2 /* Widget */ = {
 			isa = PBXGroup;
 			children = (
@@ -5425,20 +5517,20 @@
 		BC5E4AF0291E5E26001BBCD2 /* toneTuning */ = {
 			isa = PBXGroup;
 			children = (
-				BC5E4AF1291E5E26001BBCD2 /* TuningNavView.xib */,
-				BC5E4AF2291E5E26001BBCD2 /* TunerSettingView.h */,
-				BC5E4AF3291E5E26001BBCD2 /* TuningNavView.m */,
-				BC5E4AF4291E5E26001BBCD2 /* TuningForkSettingView.xib */,
 				BC5E4AF5291E5E26001BBCD2 /* DialPlateView.h */,
-				BC5E4AF6291E5E26001BBCD2 /* TuningForkSettingView.h */,
+				BC5E4AFB291E5E26001BBCD2 /* DialPlateView.m */,
 				BC5E4AF7291E5E26001BBCD2 /* ToneTuningBodyView.h */,
-				BC5E4AF8291E5E26001BBCD2 /* TunerSettingView.xib */,
+				BC5E4AFD291E5E26001BBCD2 /* ToneTuningBodyView.m */,
+				BC5E4AFE291E5E26001BBCD2 /* ToneTuningBodyView.xib */,
+				BC5E4AF2291E5E26001BBCD2 /* TunerSettingView.h */,
 				BC5E4AF9291E5E26001BBCD2 /* TunerSettingView.m */,
+				BC5E4AF8291E5E26001BBCD2 /* TunerSettingView.xib */,
+				BC5E4AF6291E5E26001BBCD2 /* TuningForkSettingView.h */,
 				BC5E4AFA291E5E26001BBCD2 /* TuningForkSettingView.m */,
-				BC5E4AFB291E5E26001BBCD2 /* DialPlateView.m */,
+				BC5E4AF4291E5E26001BBCD2 /* TuningForkSettingView.xib */,
 				BC5E4AFC291E5E26001BBCD2 /* TuningNavView.h */,
-				BC5E4AFD291E5E26001BBCD2 /* ToneTuningBodyView.m */,
-				BC5E4AFE291E5E26001BBCD2 /* ToneTuningBodyView.xib */,
+				BC5E4AF3291E5E26001BBCD2 /* TuningNavView.m */,
+				BC5E4AF1291E5E26001BBCD2 /* TuningNavView.xib */,
 			);
 			path = toneTuning;
 			sourceTree = "<group>";
@@ -5789,6 +5881,55 @@
 			path = HomeDragButton;
 			sourceTree = "<group>";
 		};
+		BC81F0DF29232BFD004106AF /* Courseware */ = {
+			isa = PBXGroup;
+			children = (
+				BC81F0E029232BFD004106AF /* Controller */,
+				BC56C94F29233CB000AF301F /* Protocal */,
+				BC56C94E29233C9700AF301F /* ViewModel */,
+				BC81F0E129232BFD004106AF /* Model */,
+				BC81F0E229232BFD004106AF /* View */,
+			);
+			path = Courseware;
+			sourceTree = "<group>";
+		};
+		BC81F0E029232BFD004106AF /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BC81F0E329232C11004106AF /* CoursewareViewController.h */,
+				BC81F0E429232C11004106AF /* CoursewareViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BC81F0E129232BFD004106AF /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BC56C97729238D6200AF301F /* CoursewareListModel.h */,
+				BC56C97629238D6200AF301F /* CoursewareListModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BC81F0E229232BFD004106AF /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BC81F0E629232D01004106AF /* CoursewareListCell.h */,
+				BC81F0E729232D01004106AF /* CoursewareListCell.m */,
+				BC81F0E829232D01004106AF /* CoursewareListCell.xib */,
+				BC81F0EB29233220004106AF /* CoursewareSearchView.h */,
+				BC81F0EC29233220004106AF /* CoursewareSearchView.m */,
+				BC81F0EE29233228004106AF /* CoursewareSearchView.xib */,
+				BC56C95629233F1700AF301F /* CoursewareBottomView.h */,
+				BC56C95729233F1700AF301F /* CoursewareBottomView.m */,
+				BC56C95929233F1D00AF301F /* CoursewareBottomView.xib */,
+				BC56C96329235BFE00AF301F /* CoursewareNavView.h */,
+				BC56C96429235BFE00AF301F /* CoursewareNavView.m */,
+				BC56C96629235C0500AF301F /* CoursewareNavView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		BC8B641828F3E8D800A08D16 /* AwardAlert */ = {
 			isa = PBXGroup;
 			children = (
@@ -6081,6 +6222,21 @@
 			path = WindowAlertManager;
 			sourceTree = "<group>";
 		};
+		BC965AE52925D1D700AB90B0 /* CoursewarePlayView */ = {
+			isa = PBXGroup;
+			children = (
+				BC965AE62925D1D700AB90B0 /* ClassroomCoursewarePlayView.h */,
+				BC965AE72925D1D700AB90B0 /* ClassroomCoursewarePlayView.m */,
+				BC965AE92926332D00AB90B0 /* ClassroomCoursewarePlayView.xib */,
+				BC7B0F4E29271B5E0044CF61 /* CourseWarePreviewView.h */,
+				BC7B0F4F29271B5E0044CF61 /* CourseWarePreviewView.m */,
+				BC7B0F5129271B650044CF61 /* CourseWarePreviewView.xib */,
+				BC7B0F5329276D980044CF61 /* KSWareSliderView.h */,
+				BC7B0F5429276D980044CF61 /* KSWareSliderView.m */,
+			);
+			path = CoursewarePlayView;
+			sourceTree = "<group>";
+		};
 		BCA1136928A4D6E6007FAFB9 /* AnimationSource */ = {
 			isa = PBXGroup;
 			children = (
@@ -6225,6 +6381,8 @@
 		BCB633DE27F6A18100ACFDCF /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC965AE52925D1D700AB90B0 /* CoursewarePlayView */,
+				BC56C96B2923773E00AF301F /* CoursewareView */,
 				BC0A22BB284752900065C1AB /* WhiteboardList */,
 				BC0A22AC2847523E0065C1AB /* MemberList */,
 				BC0A228E284751F80065C1AB /* AccompanyDisplay */,
@@ -7117,6 +7275,7 @@
 				BC41104F280678ED00800BD9 /* HomeworkSortView.xib in Resources */,
 				275FA56427F31AEE00EB6240 /* MinePageHeadView.xib in Resources */,
 				BC71D294288811BF0010F14B /* tabbar5.json in Resources */,
+				BC56C97529238CC300AF301F /* CoursewareAlertView.xib in Resources */,
 				BCC583F528A9FA8100BAB4CF /* cloud_animation_8.png in Resources */,
 				BCA1134E28A23229007FAFB9 /* HomeHotMusicCellView.xib in Resources */,
 				275B173127EB27960081FDEF /* GroupCreateView.xib in Resources */,
@@ -7145,6 +7304,7 @@
 				BCEA752D2819134400886A86 /* CardBindResultBodyView.xib in Resources */,
 				BC1365BD280D163200EB03E2 /* MyVideoSearchView.xib in Resources */,
 				BC14A61428A0AC880086395C /* MineTeachToolView.xib in Resources */,
+				BC56C96729235C0500AF301F /* CoursewareNavView.xib in Resources */,
 				BC02BCEC28B324FE005CB483 /* LiveMemberSeatCell.xib in Resources */,
 				27F9030127E864AE00C08A19 /* NetworkBodyView.xib in Resources */,
 				BCB14112288A49710022C13A /* HomeButtonView.xib in Resources */,
@@ -7191,6 +7351,7 @@
 				BC4BCE6D28239EEB00522C8B /* MyAddressListCell.xib in Resources */,
 				27BC3B2B27F2DB9600D81E30 /* MusicUploadView.xib in Resources */,
 				BCED5CC328508F28009A42DE /* ShareLiveCellContentView.xib in Resources */,
+				BC56C95A29233F1D00AF301F /* CoursewareBottomView.xib in Resources */,
 				BC3673DA28A606A500059721 /* accomapny_animation_0.png in Resources */,
 				BC2456F4286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib in Resources */,
 				BCA1134928A22A66007FAFB9 /* HomeHotMusicCollectionCell.xib in Resources */,
@@ -7209,6 +7370,7 @@
 				2723B68E27F1686100E0B90B /* HomeNavView.xib in Resources */,
 				BC71D1F22887FDD40010F14B /* img_16.png in Resources */,
 				BCDB093F2805C0EF00D0BDAD /* NewClassPopCell.xib in Resources */,
+				BC56C97D2923A3FD00AF301F /* CoursewareAlertCell.xib in Resources */,
 				BCAD01C22872F5560002CC40 /* LiveVideoListView.xib in Resources */,
 				275E3DE927F4679E0010EC30 /* LiveRoomHeadView.xib in Resources */,
 				BC6BEAA3288A4C2A00022109 /* KSHomeButton.xib in Resources */,
@@ -7243,6 +7405,7 @@
 				BC8B6E562856ED0600866917 /* iOS集成升级必读.pdf in Resources */,
 				BC8B6E6A28575DEE00866917 /* MusicDisplayView.xib in Resources */,
 				BCB9FA21286D53A1005D766B /* ScanNavView.xib in Resources */,
+				BC7B0F5229271B650044CF61 /* CourseWarePreviewView.xib in Resources */,
 				BC71D1EB2887FDD40010F14B /* img_1.png in Resources */,
 				BC3673DB28A606A500059721 /* live_animation_1.png in Resources */,
 				BCC583FB28A9FA8100BAB4CF /* cloud_animation_27.png in Resources */,
@@ -7321,6 +7484,7 @@
 				BC71D1EE2887FDD40010F14B /* img_13.png in Resources */,
 				BCF1BA5B27F5CF3C00FA36C4 /* LiveSeatApplyCell.xib in Resources */,
 				2780C92427E4903500A95A4F /* PasswordBodyView.xib in Resources */,
+				BC81F0EF29233228004106AF /* CoursewareSearchView.xib in Resources */,
 				27F902FF27E864AE00C08A19 /* KSNetworkAlert.xib in Resources */,
 				BCE70D3828C6DA9300DE7A69 /* MyStyleEditHeadView.xib in Resources */,
 				BC71D2092887FDD40010F14B /* img_21.png in Resources */,
@@ -7361,6 +7525,7 @@
 				BC2858302809451B0024697C /* EvaluateCouseCell.xib in Resources */,
 				BC8B6E6D285836B600866917 /* high_staff.png in Resources */,
 				BC71D1F72887FDD40010F14B /* img_15.png in Resources */,
+				BC81F0EA29232D01004106AF /* CoursewareListCell.xib in Resources */,
 				BC71D1F92887FDD40010F14B /* img_5.png in Resources */,
 				BCA724002806AEA000DA0D0D /* AccompanyHomeworkCell.xib in Resources */,
 				BC7CFFD22817FF6D00CAEB21 /* CardDisplayView.xib in Resources */,
@@ -7368,6 +7533,7 @@
 				27F9CB0127EC3D42003E0FE4 /* GroupListViewCell.xib in Resources */,
 				BCDE358A2897B48E00A9A560 /* shareImage@2x.png in Resources */,
 				BC8B6E582856ED0600866917 /* UMSocialSDKResources.bundle in Resources */,
+				BC965AEA2926332D00AB90B0 /* ClassroomCoursewarePlayView.xib in Resources */,
 				BC1191F8280EBC8600A716F7 /* AccompanyDetailBottomView.xib in Resources */,
 				BCDE3596289B960A00A9A560 /* HomeAlbumView.xib in Resources */,
 				BCA9CE3027FD8A9900D558C6 /* AccompanyNavView.xib in Resources */,
@@ -7519,6 +7685,7 @@
 				BC14A61C28A0B5B40086395C /* MineActionView.m in Sources */,
 				BCC9F43127F69BD200647449 /* NormalAlertView.m in Sources */,
 				BCB9FA562872BA85005D766B /* LiveListViewController.m in Sources */,
+				BC56C97329238CBA00AF301F /* CoursewareAlertView.m in Sources */,
 				2779321F27E30FC30010E277 /* ShoppCatView.m in Sources */,
 				277931CD27E30FC20010E277 /* KSPremissionAlert.m in Sources */,
 				2779323927E30FC30010E277 /* LLCollectionViewCell.m in Sources */,
@@ -7532,6 +7699,7 @@
 				BCA1135328A242FD007FAFB9 /* HomeBannerView.m in Sources */,
 				BC8831042873D67C00C702A0 /* LiveVideoCollectionViewCell.m in Sources */,
 				BC12638428FEB5B900509E90 /* RecentMusicView.m in Sources */,
+				BC56C95529233D0500AF301F /* CoursewareTableDelegate.m in Sources */,
 				BC5E4B1E291E5E26001BBCD2 /* SmallToolBodyView.m in Sources */,
 				BCB633F527F6A18200ACFDCF /* NewClassRoomViewController.m in Sources */,
 				BC4BCE6C28239EEB00522C8B /* MyAddressListCell.m in Sources */,
@@ -7576,6 +7744,7 @@
 				BC41104228066E5500800BD9 /* EvaluateCourseListViewController.m in Sources */,
 				BC41103B28066D2E00800BD9 /* HomeworkBodyView.m in Sources */,
 				BC9070A228C7159800237958 /* MyStyleNavView.m in Sources */,
+				BC81F0E929232D01004106AF /* CoursewareListCell.m in Sources */,
 				275E8A6F27E18F2300DD3F6E /* ViewController.m in Sources */,
 				BC8B6E7928585C2400866917 /* KSUMShareManager.m in Sources */,
 				BCC03F9228054DC300461B7C /* KSVideoHelper.m in Sources */,
@@ -7618,6 +7787,7 @@
 				BCB635B627F6FB0A00ACFDCF /* SeatTipsView.m in Sources */,
 				BCB9FA672872C8F0005D766B /* FinishedLiveCell.m in Sources */,
 				277935EB27E32A930010E277 /* KSBaseWKWebViewController.m in Sources */,
+				BC56C96529235BFE00AF301F /* CoursewareNavView.m in Sources */,
 				BCA1134C28A23221007FAFB9 /* HomeHotMusicCellView.m in Sources */,
 				275B172627EB1C6C0081FDEF /* KSBaseTableViewController.m in Sources */,
 				BC5E4B1C291E5E26001BBCD2 /* TunerForkManager.swift in Sources */,
@@ -7658,6 +7828,7 @@
 				2779324127E30FC30010E277 /* VoNetWorking.m in Sources */,
 				275E3DF127F467D80010EC30 /* SeatContentView.m in Sources */,
 				BCE6A09F27F84E4500C97704 /* MineIntroduceCell.m in Sources */,
+				BC81F0E529232C11004106AF /* CoursewareViewController.m in Sources */,
 				BC12638C28FEB5E600509E90 /* ChatUserInfo.m in Sources */,
 				BCF1BA5A27F5CF3C00FA36C4 /* LiveSeatApplyCell.m in Sources */,
 				BCC9F43527F69BD200647449 /* DisplayCommandMessage.m in Sources */,
@@ -7673,6 +7844,7 @@
 				BCF61BE128041FC90000ACFE /* UIView+ExtensionForDotLine.m in Sources */,
 				BCC9F42F27F69BD200647449 /* HTTPUtility.m in Sources */,
 				275FA1A327E7311700CFEA2E /* KSRCIMDataSource.m in Sources */,
+				BC56C97C2923A3FD00AF301F /* CoursewareAlertCell.m in Sources */,
 				275B171727EB1B930081FDEF /* KSSearchHistoryMessageController.m in Sources */,
 				275E3DE227F467410010EC30 /* KSChatEmojiCollectionCell.m in Sources */,
 				BCA1134828A22A66007FAFB9 /* HomeHotMusicCollectionCell.m in Sources */,
@@ -7729,6 +7901,7 @@
 				2779323F27E30FC30010E277 /* VoMemoryCache.m in Sources */,
 				BCB9FA40286DA337005D766B /* GuideViewController.m in Sources */,
 				BCC9F44B27F69BD200647449 /* KSIMService.m in Sources */,
+				BC7B0F5029271B5E0044CF61 /* CourseWarePreviewView.m in Sources */,
 				277931C027E30FC20010E277 /* ArchiveTools.m in Sources */,
 				BC1263A428FF98BB00509E90 /* HomeNewMusicView.m in Sources */,
 				BCDE359E289BC03E00A9A560 /* HomeAlbumModel.m in Sources */,
@@ -7851,6 +8024,7 @@
 				BC7CFFB22817E6DB00CAEB21 /* KSMutilDatePicker.m in Sources */,
 				277931FE27E30FC30010E277 /* UIImage+Addtions.m in Sources */,
 				BCED5CAA284F5D8D009A42DE /* FriendListModel.m in Sources */,
+				BC7B0F5529276D980044CF61 /* KSWareSliderView.m in Sources */,
 				BCC9F41727F69BD200647449 /* ChatAreaView.m in Sources */,
 				BCEA752B2819133E00886A86 /* CardBindResultBodyView.m in Sources */,
 				2779322827E30FC30010E277 /* KeyChainTools.m in Sources */,
@@ -7925,6 +8099,7 @@
 				277931D727E30FC20010E277 /* UIImage+ResizeImage.m in Sources */,
 				BC7CFFA92817E3BD00CAEB21 /* IncomeCountTopView.m in Sources */,
 				2779329927E30FEB0010E277 /* MSSBrowseActionSheetCell.m in Sources */,
+				BC965AE82925D1D700AB90B0 /* ClassroomCoursewarePlayView.m in Sources */,
 				277931C727E30FC20010E277 /* NSMutableString+KSSafe.m in Sources */,
 				BCA353D82858B18100377661 /* StudentHomeworkList.m in Sources */,
 				BCC9F44527F69BD200647449 /* Whiteboard.m in Sources */,
@@ -8002,6 +8177,7 @@
 				27F9CB1127EC60D0003E0FE4 /* GroupListModel.m in Sources */,
 				27FC2F5F27F1930400FCC239 /* KSStarView.m in Sources */,
 				BC24570D286C436E00D1F7C0 /* KSCloudBeatView.m in Sources */,
+				BC81F0ED29233220004106AF /* CoursewareSearchView.m in Sources */,
 				BCC9F44427F69BD200647449 /* NodePlayMessage.m in Sources */,
 				2779320A27E30FC30010E277 /* HomeButton.m in Sources */,
 				BC5E4B27291E5E26001BBCD2 /* TunerSettingView.m in Sources */,
@@ -8028,6 +8204,7 @@
 				27A2F63027E70E57009E2380 /* UserInfo.m in Sources */,
 				BCEA751A2818D59300886A86 /* BankNameModel.m in Sources */,
 				BC02BCE428B324C9005CB483 /* LiveApplyControlView.m in Sources */,
+				BC56C96A2923736200AF301F /* KSHudLoagingManager.m in Sources */,
 				BC8A2CF828476C3000122BBE /* MusicScoreViewController.m in Sources */,
 				BC0A2282284751DF0065C1AB /* MetronomeAlertView.m in Sources */,
 				BCB9FA1F286D539A005D766B /* ScanNavView.m in Sources */,
@@ -8154,9 +8331,11 @@
 				277931EF27E30FC20010E277 /* NSObject+Parse.m in Sources */,
 				2779362927E33BE40010E277 /* WeakWebViewScriptMessageDelegate.m in Sources */,
 				BCD6D15F281950F2009A773E /* UserBankCard.m in Sources */,
+				BC56C95D2923412800AF301F /* CoursewareViewModel.m in Sources */,
 				BC1191ED280E55CB00A716F7 /* EvaluateDetailModel.m in Sources */,
 				275E3DA927F45A8A0010EC30 /* KSLiveStreamVideo.m in Sources */,
 				BC60E3BD287D294C00B05441 /* AccountDeleteViewController.m in Sources */,
+				BC56C95829233F1700AF301F /* CoursewareBottomView.m in Sources */,
 				BC6BEAAA288E3D7400022109 /* HomeNewHeadView.m in Sources */,
 				BCC9F43E27F69BD200647449 /* AccompanyDownloadMessage.m in Sources */,
 				277D431A27E9991200107DB7 /* ModifyViewController.m in Sources */,
@@ -8170,6 +8349,7 @@
 				277931C327E30FC20010E277 /* NSArray+KSSafe.m in Sources */,
 				BCB9FA42286DA337005D766B /* GuideListView.m in Sources */,
 				BCE6A09527F823DC00C97704 /* MinePageMusicCell.m in Sources */,
+				BC56C97829238D6300AF301F /* CoursewareListModel.m in Sources */,
 				27D83F3F27F3EA8A00062476 /* MinePageCourseView.m in Sources */,
 				BCC9F41D27F69BD200647449 /* RecentSharedVideoCell.m in Sources */,
 				BC8B6E87285888B100866917 /* MyMusicRoomBodyView.m in Sources */,

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/Contents.json

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

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/classroomPlayer_close@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_close.imageset/classroomPlayer_close@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/classroomPlayer_pause@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_pause.imageset/classroomPlayer_pause@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/classroomPlayer_play@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_play.imageset/classroomPlayer_play@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/classroomPlayer_refresh@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_refresh.imageset/classroomPlayer_refresh@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/classroomPlayer_volume@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/classroomPlayer_volume.imageset/classroomPlayer_volume@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/coursewarePlayer_packUp@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/coursewarePlayer_packUp.imageset/coursewarePlayer_packUp@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/Contents.json

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/wareSlider_image@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/coursewarePlayer/wareSlider_image.imageset/wareSlider_image@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_courseware_lessen.imageset/tool_courseware_lessen@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_courseware_lessen.imageset/tool_courseware_lessen@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_coursewares.imageset/tool_courseware@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Classroom/tool_coursewares.imageset/tool_courseware@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/search_grey.imageset/search_grey@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/search_grey.imageset/search_grey@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_courseware.imageset/tool_courseware@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/TeachTool/tool_courseware.imageset/tool_courseware@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_image.imageset/choose_image@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_image.imageset/choose_image@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_back.imageset/courseware_back@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_back.imageset/courseware_back@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_cancle.imageset/courseware_cancle@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_cancle.imageset/courseware_cancle@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_tips.imageset/courseware_tips@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/courseware_tips.imageset/courseware_tips@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/unchoose_image.imageset/unchoose_image@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/unchoose_image.imageset/unchoose_image@3x.png


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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/WhiteBoardButton/whiteboard_staff.imageset/whiteboard_staff@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/WhiteBoardButton/whiteboard_staff.imageset/whiteboard_staff@3x.png


+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseViewController.m

@@ -317,7 +317,7 @@
     return isExistenceNetwork;
 }
 
--(void)MBPShow:(NSString*)str{
+-(void)MBPShow:(NSString*)str {
     [MBProgressHUD hideHUD];
     MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
     hud.removeFromSuperViewOnHide =YES;

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m

@@ -1160,7 +1160,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         }
     } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
         [self removehub];
-        if ([NSString isEmptyString:descMessaeg]) {
+        if (![NSString isEmptyString:descMessaeg]) {
             [self MBPShow:descMessaeg];
         }
         [self fileChooseErrorCallback];
@@ -1181,7 +1181,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             imageUrl = url;
             [self submitUrlWith:imageUrl videoUrl:videoUrl];
         } faliure:^(NSError * _Nullable error, NSString *descMessaeg) {
-            if ([NSString isEmptyString:descMessaeg]) {
+            if (![NSString isEmptyString:descMessaeg]) {
                 [self MBPShow:descMessaeg];
             }
             [self fileChooseErrorCallback];
@@ -1211,7 +1211,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         [self videoUploadCallback:fileUrl firstFrameImg:imgUrl];
     } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
         [self hudTipWillShow:NO];
-        if ([NSString isEmptyString:descMessaeg]) {
+        if (![NSString isEmptyString:descMessaeg]) {
             [self MBPShow:descMessaeg];
         }
         [self videoUploadCallback:@"" firstFrameImg:@""];
@@ -1344,7 +1344,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             }
         } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
             [self removehub];
-            if ([NSString isEmptyString:descMessaeg]) {
+            if (![NSString isEmptyString:descMessaeg]) {
                 [self MBPShow:descMessaeg];
             }
             [self fileChooseErrorCallback];

+ 35 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSHudLoagingManager.h

@@ -0,0 +1,35 @@
+//
+//  KSHudLoagingManager.h
+//  GuanYueTeam
+//
+//  Created by 王智 on 2022/11/14.
+//
+
+#import <Foundation/Foundation.h>
+
+#define LOADING_MANAGER ([KSHudLoagingManager shareInstance])
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSHudLoagingManager : NSObject
+
++ (instancetype)shareInstance;
+
+- (void)showHUD;
+
+- (void)removeHUD;
+
+- (void)MBPShow:(NSString*)str inView:(UIView *)displayView;
+
+- (void)MBShowAUTOHidingInWindow:(NSString *)str;
+
+- (void)MBShowInWindow:(NSString *)str;
+
+// 提示后续操作
+- (void)KSShowMsg:(NSString *)message inView:(UIView *)displayView promptCompletion:(void(^)(void))promptCompletion;
+// 提示后续操作
+- (void)KSShowMsg:(NSString *)message promptCompletion:(void(^)(void))promptCompletion;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 112 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSHudLoagingManager.m

@@ -0,0 +1,112 @@
+//
+//  KSHudLoagingManager.m
+//  GuanYueTeam
+//
+//  Created by 王智 on 2022/11/14.
+//
+
+#import "KSHudLoagingManager.h"
+#import <MBProgressHUD/MBProgressHUD.h>
+#import "UIView+Hints.h"
+#define PROMPT_TIME  1.5f
+
+@interface KSHudLoagingManager ()
+
+@property (nonatomic, strong) MBProgressHUD *HUD;
+
+@end
+
+@implementation KSHudLoagingManager
+
++ (instancetype)shareInstance {
+    
+    static KSHudLoagingManager *manager = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        manager = [[KSHudLoagingManager alloc] init];
+    });
+    return manager;
+}
+
+- (void)showHUD {
+    dispatch_main_async_safe(^{
+        [self removeLoadingView];
+        UIWindow *window = [[UIApplication sharedApplication ] keyWindow];
+        self.HUD = [window addHUDActivityViewToView:nil
+                                                       HintsText:@"加载中..."
+                                                           Image:nil
+                                                  hideAfterDelay:15.0f
+                                                         HaveDim:NO];
+        self.HUD.mode = MBProgressHUDModeIndeterminate;//显示菊花
+        
+        [window bringSubviewToFront:self.HUD];
+    });
+}
+
+- (void)removeHUD {
+    dispatch_delay_block(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC), ^{
+        [self removeLoadingView];
+    });
+}
+
+- (void)removeLoadingView {
+    if (self.HUD) {
+        [self.HUD removeFromSuperview];
+    }
+    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
+}
+
+- (void)MBPShow:(NSString *)str inView:(UIView *)displayView {
+    [self showHud:str inView:displayView autoHide:YES];
+}
+
+- (void)showHud:(NSString *)str inView:(UIView *)displayView autoHide:(BOOL)autoHide {
+    [self removeLoadingView];
+    self.HUD = [MBProgressHUD showHUDAddedTo:displayView animated:YES];
+    self.HUD.removeFromSuperViewOnHide =YES;
+    self.HUD.mode = MBProgressHUDModeText;
+    self.HUD.label.text = str;
+    self.HUD.label.numberOfLines = 0;
+    self.HUD.minSize = CGSizeMake(132.f, 60.0f);
+    self.HUD.label.textColor = [UIColor whiteColor];
+    self.HUD.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
+    self.HUD.bezelView.backgroundColor = HexRGBAlpha(0x000000, 0.8f);
+    if (autoHide) {
+        double hiddenTime = str.length > 15 ? 3.0f : 1.5f;
+        [self.HUD hideAnimated:YES afterDelay:hiddenTime];
+    }
+}
+
+
+- (void)MBShowInWindow:(NSString *)str {
+    [self showHud:str inView:[NSObject getKeyWindow] autoHide:NO];
+}
+
+- (void)MBShowAUTOHidingInWindow:(NSString *)str {
+    [self showHud:str inView:[NSObject getKeyWindow] autoHide:YES];
+}
+
+- (void)KSShowMsg:(NSString *)message promptCompletion:(void (^)(void))promptCompletion {
+    [self KSShowMsg:message inView:[NSObject getKeyWindow] promptCompletion:promptCompletion];
+    
+}
+
+- (void)KSShowMsg:(NSString *)message inView:(UIView *)displayView promptCompletion:(void (^)(void))promptCompletion {
+    [self removeLoadingView];
+    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:displayView animated:YES];
+    hud.removeFromSuperViewOnHide = YES;
+    hud.mode = MBProgressHUDModeText;
+    hud.label.text = message;
+    hud.label.numberOfLines = 0;
+    hud.label.textColor = [UIColor whiteColor];
+    hud.minSize = CGSizeMake(132.0f, 40.0f);
+    hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
+    hud.bezelView.backgroundColor = HexRGBAlpha(0x000000, 0.8);
+    [hud hideAnimated:YES afterDelay:PROMPT_TIME];
+    
+    dispatch_delay_block(DISPATCH_TIME_NOW, (int64_t)(PROMPT_TIME * NSEC_PER_SEC), ^{
+        promptCompletion();
+    });
+}
+
+@end

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -1301,5 +1301,27 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)defaultSubjectRequest:(NSString *)post subjectId:(NSString *)subjectId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+
+#pragma mark ----- 课件相关
+// /api-teacher/courseCourseware/page
+
+/// 课件查询
+/// @param post post
+/// @param status 是否有效, 0:失效 1:有效 不传查全部
+/// @param searchKey 搜索
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)courseCoursewareRequest:(NSString *)post status:(NSString *)status searchKey:(NSString *)searchKey page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/courseCourseware/remove
+
+/// 批量删除课件
+/// @param post post
+/// @param ids 曲谱id
+/// @param success 成功
+/// @param faliure 失败
++ (void)courseCoursewareRemoveRequest:(NSString *)post ids:(NSString *)ids success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 @end
 NS_ASSUME_NONNULL_END

+ 38 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -2408,4 +2408,42 @@
     [parm setValue:subjectId forKey:@"subjectId"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
+
+
+#pragma mark ----- 课件相关
+// /api-teacher/courseCourseware/page
+
+/// 课件查询
+/// @param post post
+/// @param status 是否有效, 0:失效 1:有效 不传查全部
+/// @param searchKey 搜索
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)courseCoursewareRequest:(NSString *)post status:(NSString *)status searchKey:(NSString *)searchKey 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/courseCourseware/page"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:status forKey:@"status"];
+    [parm setValue:searchKey forKey:@"idAndName"];
+    [parm setValue:@(page) forKey:@"page"];
+    [parm setValue:@(rows) forKey:@"rows"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/courseCourseware/remove
+
+/// 批量删除课件
+/// @param post post
+/// @param ids 曲谱id
+/// @param success 成功
+/// @param faliure 失败
++ (void)courseCoursewareRemoveRequest:(NSString *)post ids:(NSString *)ids success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/courseCourseware/page"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:ids forKey:@"ids"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
 @end

+ 15 - 14
KulexiuForTeacher/KulexiuForTeacher/Common/Define/PrefixHeader.pch

@@ -35,6 +35,7 @@
 #import "NSObject+KSDateFormatter.h"
 
 #import "KSUploadManager.h"
+#import "KSHudLoagingManager.h"
 
 #define FIRST_LOGIN_KEY (@"FirstLoginKey")
 
@@ -135,13 +136,13 @@ shouldPrevent = NO; \
 
 //#ifdef DEBUG
 
-//#define hostURL (@"https://dev.colexiu.com")
-//#define SEALCLASSHOST (@"https://dev.colexiu.com/api-classroom")
-//#define WEBHOST (@"https://dev.colexiu.com/teacher")
-//#define SOCKET_URL (@"wss://dev.colexiu.com/audioAnalysis")
-//#define JSPUSH_ENVIRONMENT (NO)
-//#define RCIM_KEY (@"0vnjpoad0jbdz")
-//#define SUBMIT_UUID (YES)
+#define hostURL (@"https://dev.colexiu.com")
+#define SEALCLASSHOST (@"https://dev.colexiu.com/api-classroom")
+#define WEBHOST (@"https://dev.colexiu.com/teacher")
+#define SOCKET_URL (@"wss://dev.colexiu.com/audioAnalysis")
+#define JSPUSH_ENVIRONMENT (NO)
+#define RCIM_KEY (@"0vnjpoad0jbdz")
+#define SUBMIT_UUID (YES)
 
 // 预生产环境
 //#define hostURL (@"https://ponline.colexiu.com")
@@ -154,13 +155,13 @@ shouldPrevent = NO; \
 
 //#else
 
-#define hostURL (@"https://online.colexiu.com")
-#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
-#define WEBHOST (@"https://online.colexiu.com/teacher")
-#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
-#define JSPUSH_ENVIRONMENT (YES)
-#define RCIM_KEY (@"e5t4ouvpe42pa")
-#define SUBMIT_UUID (YES)
+//#define hostURL (@"https://online.colexiu.com")
+//#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
+//#define WEBHOST (@"https://online.colexiu.com/teacher")
+//#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
+//#define JSPUSH_ENVIRONMENT (YES)
+//#define RCIM_KEY (@"e5t4ouvpe42pa")
+//#define SUBMIT_UUID (YES)
 
 
 //#endif

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/KSChatComplainController.m

@@ -78,7 +78,7 @@
         [self uplodMessage:attachments content:content];
     } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
         [self removehub];
-        if ([NSString isEmptyString:descMessaeg]) {
+        if (![NSString isEmptyString:descMessaeg]) {
             [self MBPShow:descMessaeg];
         }
     }];

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/ChatUserInfo/ChatUserInfo.m

@@ -155,6 +155,10 @@ NSString *const kChatUserInfoUsername = @"username";
 - (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;
 }
 

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Model/ChatUserInfo/RecentPracticeModel.m

@@ -259,6 +259,10 @@ NSString *const kRecentPracticeModelSubmitAuditTime = @"submitAuditTime";
 - (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;
 }
 

+ 217 - 11
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m

@@ -50,6 +50,10 @@
 
 #import "UIImage+ResizeImage.h"
 #import "AccompanyView.h"
+#import "CoursewareAlertView.h"
+
+#import "ClassroomCoursewarePlayView.h"
+
 
 #define MAXBIGPHOTONUMBER (3)
 #define MAXPHOTONUMBER (3)
@@ -64,7 +68,7 @@
 #define TTimeLableWidth   (180)
 #define TTimeLableHeight  (20)
 
-@interface NewClassroomViewController ()<ClassTitleViewDelegate, RCRTCRoomEventDelegate, KSWhiteboardControlDelegate, ClassroomDelegate, ClassroomMainContainerDelegate, UIGestureRecognizerDelegate, RCRTCStatusReportDelegate,ClassVideoListViewDelegate, ClassMemberListViewDelegate, WhiteboardListViewDelegate,ClassroomTimerManagerDelegate, FullVideoViewDelegate, TeachToolViewDelegate, LLPhotoBrowserDelegate,RCRTCEngineEventDelegate>
+@interface NewClassroomViewController ()<ClassTitleViewDelegate, RCRTCRoomEventDelegate, KSWhiteboardControlDelegate, ClassroomDelegate, ClassroomMainContainerDelegate, UIGestureRecognizerDelegate, RCRTCStatusReportDelegate,ClassVideoListViewDelegate, ClassMemberListViewDelegate, WhiteboardListViewDelegate,ClassroomTimerManagerDelegate, FullVideoViewDelegate, TeachToolViewDelegate, LLPhotoBrowserDelegate,RCRTCEngineEventDelegate,RCRTCAudioMixerAudioPlayDelegate>
 
 @property (nonatomic, strong) ClassTitleView *titleView;
 @property (nonatomic, strong) ClassroomMainContainer *containerView;
@@ -129,6 +133,12 @@
 
 @property (nonatomic, assign) NSInteger soundVolume; // 伴奏音量
 
+@property (nonatomic, strong) CoursewareAlertView *coursewareView;
+
+@property (nonatomic, strong) ClassroomCoursewarePlayView *playerView;
+
+@property (nonatomic, strong) NSString *musicUrl;
+
 @end
 
 
@@ -146,6 +156,7 @@
     [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
     [RCRTCEngine sharedInstance].statusReportDelegate = self;
     [RCRTCEngine sharedInstance].delegate = self;
+    [RCRTCAudioMixer sharedInstance].delegate = self;
     _isPushChooseView = NO;
     if (_isPushChooseView)  {
         NSLog(@"-----");
@@ -501,8 +512,12 @@
         [ClassroomService sharedService].currentRoom.isPlaySong = NO;
         [self unplayBeatNodeRefreshStream]; // 刷新音频流播放
     }
+    self.toolView.isLessen = NO;
     self.hud = [self createProgressHUD];
     [self.wBoardCtrl.wbView leaveRoom];
+    if (self.playerView.isDisplay) {
+        [self.playerView hideView];
+    }
     [[LoginHelper sharedInstance] logout:^{
     } error:^(RCRTCCode code) {
     }];
@@ -544,6 +559,7 @@
         [self.hud hideAnimated:YES];
         [RCRTCEngine sharedInstance].statusReportDelegate = self;
         [RCRTCEngine sharedInstance].delegate = self;
+        [RCRTCAudioMixer sharedInstance].delegate = self;
         self.songName = nil;
         self.songId = nil;
     } error:^(RCRTCCode code) {
@@ -908,11 +924,10 @@
     [self memberListView];
     [self.view addSubview:self.videoListView];
     [self.view addSubview:self.toolView];
-//    NSString *teacherType = UserDefault(TeacherTypeKey);
-//    CGFloat width = [teacherType isEqualToString:@"1"] ? 450 : 350;
-    CGFloat width = 350;
+
+    CGFloat width = 400;
     [self.toolView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.right.mas_equalTo(self.containerView.emptyView.mas_right).mas_offset(-10);
+        make.right.mas_equalTo(self.containerView.emptyView.mas_right).mas_offset(-5);
         make.width.mas_equalTo(width);
         make.height.mas_equalTo(65);
         make.bottom.mas_equalTo(self.containerView.emptyView.mas_bottom).offset(-7);
@@ -1382,7 +1397,6 @@
         [[ClassroomService sharedService] enableMutilMemberDevice:NO type:type songId:[songId intValue] soundVolume:self.soundVolume forUser:@""];
         
         [ClassroomService sharedService].currentRoom.isPlaySong = NO;
-        self.toolView.accompanyButton.selected = NO;
     }
     else if (action == ACCOMPANYACTION_PLAYSONG) {
         // 如果之前有播放节拍器
@@ -1404,7 +1418,6 @@
         [[ClassroomService sharedService] enableMutilMemberDevice:YES type:type songId:[songId intValue] soundVolume:self.soundVolume forUser:@""];
         [self changeSongPlayDisplay:@""];
         [ClassroomService sharedService].currentRoom.isPlaySong = YES;
-        self.toolView.accompanyButton.selected = YES;
         // 同步主屏显示
         [self recordSongMessageWithSongId:songId songName:songName isAccompany:isAccompany];
     }
@@ -1648,7 +1661,6 @@
                             
                             DeviceType type = weakSelf.isAccompany ? DeviceTypeAccompany : DeviceTypeMusicScore;
                             [[ClassroomService sharedService] enableMutilMemberDevice:NO type:type songId:[weakSelf.songId intValue] soundVolume:self.soundVolume forUser:@""];
-                            weakSelf.toolView.accompanyButton.selected = NO;
                             weakSelf.accompanyView.isPlaying = NO;
                         }
 
@@ -1714,7 +1726,6 @@
                                 
                                 // 重置全部节拍器按钮 和伴奏按钮
                                 self.toolView.nodePlayButton.selected = NO;
-                                self.toolView.accompanyButton.selected = NO;
                                 self.accompanyView.isPlaying = NO;
                             }
                         }];
@@ -1789,7 +1800,6 @@
                         if (hasPlayStudent == NO) {
                             [ClassroomService sharedService].currentRoom.isPlaySong = NO;
                             // 重置全员伴奏按钮
-                            weakSelf.toolView.accompanyButton.selected = NO;
                             weakSelf.accompanyView.isPlaying = NO;
                             [weakSelf unplayBeatNodeRefreshStream]; // 刷新音频流播放
                         }
@@ -1834,6 +1844,7 @@
 }
 
 #pragma mark ------- 教学工具
+
 - (TeachToolView *)toolView {
     if (!_toolView) {
         _toolView = [[TeachToolView alloc] init];
@@ -1893,6 +1904,10 @@
                 [self renderMainContainerView];
             });
             [self.whiteboardListView removeFromSuperview];
+            
+            if (self.playerView.isDisplay) {
+                [self.containerView bringSubviewToFront:self.playerView];
+            }
         }
             break;
         case TeachToolTagLibrary:  // 选择伴奏曲库
@@ -2002,7 +2017,6 @@
                         DeviceType type = self.isAccompany ? DeviceTypeAccompany : DeviceTypeMusicScore;
                         
                         [[ClassroomService sharedService] enableMutilMemberDevice:NO type:type songId:[self.songId intValue] soundVolume:self.soundVolume forUser:@""];
-                        weakSelf.toolView.accompanyButton.selected = NO;
                         weakSelf.accompanyView.isPlaying = NO;
                     }
                 }];
@@ -2026,6 +2040,18 @@
             }
         }
             break;
+        case TeachToolTagCourseware: // 播放
+        {
+            if (self.toolView.isLessen) {
+                self.toolView.isLessen = NO;
+                [self.playerView showInView:self.containerView];
+                [self.containerView bringSubviewToFront:self.playerView];
+            }
+            else {
+                [self.coursewareView showView];
+            }
+        }
+            break;
         default:
             break;
     }
@@ -2104,6 +2130,28 @@
 }
 
 
+- (CoursewareAlertView *)coursewareView {
+    if (!_coursewareView) {
+        _coursewareView = [CoursewareAlertView shareInstance];
+        [_coursewareView configUI];
+        MJWeakSelf;
+        [_coursewareView chooseCoursewareCallback:^(NSString * _Nonnull musicUrl, NSString * _Nonnull musicName) {
+            [weakSelf showMusicMessage:musicName musicUrl:musicUrl];
+        }];
+    }
+    return _coursewareView;
+}
+
+- (void)showMusicMessage:(NSString *)sognName musicUrl:(NSString *)musicUrl {
+    [self.coursewareView hideView];
+    if (![NSString isEmptyString:musicUrl]) {
+        [self startMixWithUrl:musicUrl songName:sognName];
+    }
+    else {
+        [self.tipsView showTipsMessage:@"当前曲目无音频资源" inView:self.view];
+    }
+    
+}
 
 #pragma mark ------ 创建MBProgress
 - (MBProgressHUD *)createProgressHUD {
@@ -2124,4 +2172,162 @@
         [self.tipsView showTipsMessage:@"音频设备启动失败,请尝试重启设备后重新进入" inView:self.view];
     }
 }
+
+#pragma mark ----- 混音功能
+- (void)startMixWithUrl:(NSString *)remoteUrl songName:(NSString *)songName {
+    [self showPlayViewWithSongName:songName];
+    [self mixWithUrl:remoteUrl];
+}
+
+- (void)mixWithUrl:(NSString *)remoteUrl {
+    self.musicUrl = remoteUrl;
+    [[RCRTCAudioMixer sharedInstance] stop];
+    [[RCRTCAudioMixer sharedInstance] startMixingWithURL:[NSURL URLWithString:[remoteUrl getUrlEndcodeString]] playback:YES mixerMode:RCRTCMixerModeMixing loopCount:NSUIntegerMax];
+}
+
+- (void)startPlay {
+    [[RCRTCAudioMixer sharedInstance] resume];
+}
+
+- (void)stopPlay {
+    [[RCRTCAudioMixer sharedInstance] pause];
+}
+
+- (void)canclePlay {
+    [[RCRTCAudioMixer sharedInstance] stop];
+}
+
+#pragma mark ---- RCRTCAudioMixerAudioPlayDelegate - AudioMixer 的播放代理
+/*!
+ 当前播放进度
+
+ @param progress 播放进度 range [0,1]
+ @discussion
+ 当前播放进度
+
+ @remarks 代理
+ */
+- (void)didReportPlayingProgress:(float)progress {
+    NSLog(@"当前播放进度 - %@", @(progress));
+    self.playerView.progress = progress;
+}
+
+/*!
+ 混音状态
+
+ @param mixingState 混音状态
+ @param mixingReason 混音状态改变的原因
+ @discussion
+ 当前混音状态
+ Add from 5.1.3
+
+ @remarks 代理
+ */
+- (void)didAudioMixingStateChanged:(RCRTCAudioMixingState)mixingState reason:(RCRTCAudioMixingReason)mixingReason{
+    if (mixingState == RCRTCMixingStatePlaying){
+        // 开始混音,可能的原因有:
+        if (mixingReason == RCRTCMixingReasonStartedByUser){
+            // 调用了开始混音方法 startMix
+        }else if (mixingReason == RCRTCMixingReasonStartNewLoop){
+            // 调用了 startMix 传入的loopCount < 0(无限循环)或 > 1时,自动开始下一次混音。
+        }else if (mixingReason == RCRTCMixingReasonResumedByUser){
+            // 调用了 resume 方法继续开始混音
+            
+        }else if (mixingReason == RCRTCMixingReasonFileLoaded){
+            // 本地或网络混音文件已加载完成(SDK 必须等待资源加载完成后才能播放混音文件),该回调要求 SDK 版本 ≧ 5.2.5.1。
+            NSLog(@"------加载完成");
+            self.playerView.playerStatus = COURSESWARESTATUS_PAUSE;
+            [[RCRTCAudioMixer sharedInstance] pause];
+            // 获取时长
+            NSInteger duration = [[RCRTCAudioMixer sharedInstance] duration];
+            NSLog(@"----- duration %zd",duration);
+            self.playerView.totalMusicTime = duration;
+        }
+    }else if(mixingState == RCRTCMixingStateStop){
+        self.playerView.playerStatus = COURSESWARESTATUS_PAUSE;
+        // 混音完成,可能的原因有:
+        if (mixingReason == RCRTCMixingReasonAllLoopsCompleted){
+            // 调用 startMix方法时,传入的 loopCount > 0,并且 loopCount 次数的混音已经完成
+        }else if (mixingReason == RCRTCMixingReasonOneLoopCompleted){
+            // 调用 startMix方法时,传入的 loopCount < 0(无限循环)或 > 1,混音完成一次。接下来会继续自动开始下一次混音。
+        }else if (mixingReason == RCRTCMixingReasonStoppedByUser){
+            // 调用 stopMix 方法停止混音
+        }
+    }else if (mixingState == RCRTCMixingStatePause){
+        // 暂停了混音,mixingReason 为 RCRTCMixingReasonPausedByUser
+        self.playerView.playerStatus = COURSESWARESTATUS_PAUSE;
+        
+    }else if (mixingState == RCRTCMixingStateFailed){
+        // 加载失败,mixingReason 为 RCRTCMixingReasonCanNotOpen
+        self.playerView.playerStatus = COURSESWARESTATUS_FAILED;
+    }
+}
+
+- (void)showPlayViewWithSongName:(NSString *)songName {
+    [self.playerView configWithImageName:songName];
+    CGRect frame = [self getWBoardFrame];
+    self.playerView.frame = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
+    [self.playerView showInView:self.containerView];
+    [self.containerView bringSubviewToFront:self.playerView];
+}
+
+- (ClassroomCoursewarePlayView *)playerView {
+    if (!_playerView) {
+        _playerView = [ClassroomCoursewarePlayView shareInstance];
+        MJWeakSelf;
+        [_playerView coursewarePlayAction:^(COURSEPLAYERACTION action, NSInteger volume, float progress) {
+            [weakSelf playerAction:action volume:volume progress:progress];
+        }];
+    }
+    return _playerView;
+}
+
+- (void)playerAction:(COURSEPLAYERACTION)action volume:(NSInteger)volume progress:(float)progress {
+    
+    switch (action) {
+        case COURSEPLAYERACTION_PLAY:
+        {
+            [self startPlay];
+        }
+            break;
+        case COURSEPLAYERACTION_PAUSE:
+        {
+            [self stopPlay];
+        }
+            break;
+        case COURSEPLAYERACTION_CANCLE:
+        {
+            [self canclePlay];
+            [self.playerView hideView];
+        }
+            break;
+        case COURSEPLAYERACTION_RELOAD:
+        {
+            [self mixWithUrl:self.musicUrl];
+        }
+            break;
+        case COURSEPLAYERACTION_HIDEVIEW:
+        {
+            self.toolView.isLessen = YES;
+        }
+            break;
+        case COURSEPLAYERACTION_CHANGEPROGRESS:
+        {
+            [[RCRTCAudioMixer sharedInstance] setPlayProgress:progress];
+        }
+            break;
+        case COURSEPLAYERACTION_VOLUME:
+        {
+            [RCRTCAudioMixer sharedInstance].mixingVolume = volume;
+            [RCRTCAudioMixer sharedInstance].playingVolume = volume;
+        }
+        default:
+            break;
+    }
+}
+
+- (void)changeVolume:(float)volume {
+    
+}
+
 @end

+ 57 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.h

@@ -0,0 +1,57 @@
+//
+//  ClassroomCoursewarePlayView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/17.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSInteger, COURSESWARESTATUS) {
+    COURSESWARESTATUS_LOADING,
+    COURSESWARESTATUS_FAILED,
+    COURSESWARESTATUS_PLAYING,
+    COURSESWARESTATUS_PAUSE,
+};
+
+typedef NS_ENUM(NSInteger, COURSEPLAYERACTION) {
+    COURSEPLAYERACTION_CANCLE,
+    COURSEPLAYERACTION_PLAY,
+    COURSEPLAYERACTION_PAUSE,
+    COURSEPLAYERACTION_RELOAD,
+    COURSEPLAYERACTION_HIDEVIEW,
+    COURSEPLAYERACTION_CHANGEPROGRESS,
+    COURSEPLAYERACTION_VOLUME,
+};
+
+typedef void(^CoursewarePlayerCallback)(COURSEPLAYERACTION action, NSInteger volume, float progress);
+
+@interface ClassroomCoursewarePlayView : UIView
+
+@property (nonatomic, assign) COURSESWARESTATUS playerStatus;
+
+@property (nonatomic, assign) float progress;
+
+@property (nonatomic, assign) NSInteger totalMusicTime;
+
+@property (nonatomic, assign) BOOL isDisplay;
+
+// 是否缩小
+@property (nonatomic, assign) BOOL isLessen;
+
++ (instancetype)shareInstance;
+
+
+- (void)configWithImageName:(NSString *)imageName;
+
+- (void)showInView:(UIView *)displayView;
+
+- (void)hideView;
+
+- (void)coursewarePlayAction:(CoursewarePlayerCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 324 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.m

@@ -0,0 +1,324 @@
+//
+//  ClassroomCoursewarePlayView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/17.
+//
+
+#import "ClassroomCoursewarePlayView.h"
+#import "KSWareSliderView.h"
+
+@interface ClassroomCoursewarePlayView ()<KSWareSliderDelegate>
+
+@property (weak, nonatomic) IBOutlet UILabel *musicNameLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
+
+
+@property (weak, nonatomic) IBOutlet UIImageView *closeImageView;
+
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
+@property (weak, nonatomic) IBOutlet UISlider *playProgress;
+
+@property (weak, nonatomic) IBOutlet UIButton *volumeButton;
+
+@property (weak, nonatomic) IBOutlet UIView *headView;
+
+@property (weak, nonatomic) IBOutlet UIView *fullView;
+
+@property (weak, nonatomic) IBOutlet UIView *fullContainer;
+
+@property (nonatomic, copy) CoursewarePlayerCallback callback;
+
+@property (weak, nonatomic) IBOutlet UIButton *playButton;
+
+@property (nonatomic, assign) NSInteger musicVolume;
+
+@property (weak, nonatomic) IBOutlet UIImageView *pickUpImage;
+@property (weak, nonatomic) IBOutlet UILabel *pickUpTitle;
+
+
+@property (nonatomic, strong) KSWareSliderView *volumeSlider;
+
+@property (nonatomic, assign) BOOL isShowSlider;
+
+@property (weak, nonatomic) IBOutlet UIView *sliderBgView;
+
+@property (nonatomic, assign) CGRect currentFrame;
+
+@end
+
+@implementation ClassroomCoursewarePlayView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    CGFloat width = 0.0f;
+    CGFloat height = 0.0f;
+    
+    height = KLandscapeWidth / 4.0f * 3;
+    if (height > KLandscapeHeight) {
+        height = KLandscapeHeight;
+    }
+    width = height / 3.0f * 4;
+
+    CGRect frame = CGRectMake((KLandscapeWidth - width) / 2.0f, 0, width, height);
+    self.currentFrame = frame;
+    CAGradientLayer *headLayer = [self createGradientLayerFromColor:HexRGB(0xFFEBD3) startPoint:CGPointMake(0.5, 0) endColor:HexRGB(0xFFD5AA) endPoint:CGPointMake(0.5, 1) bounds:CGRectMake(0, 0, CGRectGetWidth(frame), 34)];
+    headLayer.masksToBounds = YES;
+    [self.headView.layer addSublayer:headLayer];
+    self.headView.hidden = NO;
+    
+    CAGradientLayer *fullLayer = [self createGradientLayerFromColor:HexRGB(0xFFEBD3) startPoint:CGPointMake(0.5, 0) endColor:HexRGB(0xFFD5AA) endPoint:CGPointMake(0.5, 1) bounds:CGRectMake(0, 0, CGRectGetWidth(frame), 72)];
+    headLayer.masksToBounds = YES;
+    [self.fullView.layer addSublayer:fullLayer];
+    self.fullView.hidden = YES;
+    self.fullContainer.hidden = YES;
+    self.musicVolume = 100;
+    self.progress = 0;
+    [self.playProgress setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateNormal];
+    [self.playProgress setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateFocused];
+    [self addSubview:self.volumeSlider];
+    self.volumeSlider.volumeValue = self.musicVolume;
+    self.isShowSlider = NO;
+    
+}
+
++ (instancetype)shareInstance {
+    ClassroomCoursewarePlayView *view = [[[NSBundle mainBundle] loadNibNamed:@"ClassroomCoursewarePlayView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)coursewarePlayAction:(CoursewarePlayerCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)configWithImageName:(NSString *)imageName {
+    self.musicNameLabel.text = [NSString returnNoNullStringWithString:imageName];
+    self.playerStatus = COURSESWARESTATUS_LOADING;
+}
+
+- (void)showInView:(UIView *)displayView {
+    self.isDisplay = YES;
+    [displayView addSubview:self];
+}
+
+- (void)hideView {
+    self.isDisplay = NO;
+    self.isShowSlider = NO;
+    [self removeFromSuperview];
+}
+
+- (void)setPlayerStatus:(COURSESWARESTATUS)playerStatus {
+    _playerStatus = playerStatus;
+    switch (playerStatus) {
+        case COURSESWARESTATUS_LOADING:
+        {
+            self.statusLabel.text = @"正在加载…";
+            self.headView.hidden = NO;
+            self.fullView.hidden = YES;
+            self.fullContainer.hidden = YES;
+        }
+            break;
+        case COURSESWARESTATUS_FAILED:
+        {
+            self.statusLabel.text = @"重新加载";
+            self.headView.hidden = NO;
+            self.fullView.hidden = YES;
+            self.fullContainer.hidden = YES;
+        }
+            break;
+        case COURSESWARESTATUS_PAUSE:
+        {
+            self.statusLabel.text = @"暂停播放";
+            self.headView.hidden = YES;
+            self.fullView.hidden = NO;
+            self.fullContainer.hidden = NO;
+            [self.playButton setImage:[UIImage imageNamed:@"classroomPlayer_play"] forState:UIControlStateNormal];
+        }
+            break;
+        case COURSESWARESTATUS_PLAYING:
+        {
+            self.statusLabel.text = @"正在播放";
+            self.headView.hidden = YES;
+            self.fullView.hidden = NO;
+            self.fullContainer.hidden = NO;
+            [self.playButton setImage:[UIImage imageNamed:@"classroomPlayer_pause"] forState:UIControlStateNormal];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (CAGradientLayer *)createGradientLayerFromColor:(UIColor *)fromColor startPoint:(CGPoint)startPoint endColor:(UIColor *)endColor endPoint:(CGPoint)endPoint bounds:(CGRect)bounds {
+    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
+    gradientLayer.colors = @[(__bridge id)fromColor.CGColor, (__bridge id)endColor.CGColor];
+    gradientLayer.startPoint = startPoint;
+    gradientLayer.endPoint = endPoint;
+    gradientLayer.frame = bounds;
+    gradientLayer.locations = @[@(0),@(1.0f)];
+    return gradientLayer;
+}
+
+- (IBAction)playAction:(id)sender {
+    if (self.playerStatus == COURSESWARESTATUS_PAUSE) {
+        if (self.callback) {
+            self.playerStatus = COURSESWARESTATUS_PLAYING;
+            self.callback(COURSEPLAYERACTION_PLAY, self.musicVolume,0);
+        }
+    }
+    else if (self.playerStatus == COURSESWARESTATUS_PLAYING) {
+        if (self.callback) {
+            self.playerStatus = COURSESWARESTATUS_PAUSE;
+            self.callback(COURSEPLAYERACTION_PAUSE, self.musicVolume,0);
+        }
+    }
+}
+
+- (IBAction)closeAction:(id)sender {
+    if (self.callback) {
+        self.playerStatus = COURSESWARESTATUS_LOADING;
+        self.callback(COURSEPLAYERACTION_CANCLE, self.musicVolume,0);
+    }
+}
+
+
+- (IBAction)reloadAction:(id)sender {
+    
+    if (self.playerStatus == COURSESWARESTATUS_FAILED) {
+        if (self.callback) {
+            self.playerStatus = COURSESWARESTATUS_LOADING;
+            self.callback(COURSEPLAYERACTION_RELOAD, self.musicVolume,0);
+        }
+    }
+    else { // 收起
+        if (self.callback) {
+            self.callback(COURSEPLAYERACTION_HIDEVIEW, self.musicVolume,0);
+        }
+        [self hideView];
+    }
+}
+
+- (void)setTotalMusicTime:(NSInteger)totalMusicTime {
+    _totalMusicTime = totalMusicTime;
+    self.timeLabel.text = [NSString stringWithFormat:@"00:00/%@",[self fullTimeDesc]];
+}
+
+- (void)setProgress:(float)progress {
+    _progress = progress;
+    [self.playProgress setValue:progress];
+    [self displayTimeView];
+    
+}
+
+- (NSString *)fullTimeDesc {
+    NSInteger duration = self.totalMusicTime;
+    NSString *timeDesc = @"00:00";
+    if (duration / 60 > 0) {
+        NSInteger secondTime = duration % 60;
+        NSString *secondStr = @"";
+        if (secondTime < 10) {
+            secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
+        } else {
+            secondStr = [NSString stringWithFormat:@"%zd",secondTime];
+        }
+        timeDesc = [NSString stringWithFormat:@"%2ld:%@", duration / 60, secondStr];
+    }
+    else {
+        NSInteger secondTime = duration % 60;
+        NSString *secondStr = @"";
+        if (secondTime < 10) {
+            secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
+        } else {
+            secondStr = [NSString stringWithFormat:@"%zd",secondTime];
+        }
+        timeDesc = [NSString stringWithFormat:@"00:%@", secondStr];
+    }
+    return timeDesc;
+}
+
+- (void)displayTimeView {
+    NSInteger duration = self.totalMusicTime;
+    NSInteger currentDuration = duration * self.progress;
+    NSString *timeDesc = @"00:00";
+    if (currentDuration / 60 > 0) {
+        NSInteger secondTime = currentDuration % 60;
+        NSString *secondStr = @"";
+        if (secondTime < 10) {
+            secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
+        } else {
+            secondStr = [NSString stringWithFormat:@"%zd",secondTime];
+        }
+        timeDesc = [NSString stringWithFormat:@"%2ld:%@", currentDuration / 60, secondStr];
+    }
+    else {
+        NSInteger secondTime = currentDuration % 60;
+        NSString *secondStr = @"";
+        if (secondTime < 10) {
+            secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
+        } else {
+            secondStr = [NSString stringWithFormat:@"%zd",secondTime];
+        }
+        timeDesc = [NSString stringWithFormat:@"00:%@", secondStr];
+    }
+   
+    self.timeLabel.text = [NSString stringWithFormat:@"%@/%@",timeDesc, [self fullTimeDesc]];
+}
+
+- (IBAction)progressValueChange:(UISlider *)sender {
+    float progress = sender.value;
+    if (self.callback) {
+        self.callback(COURSEPLAYERACTION_CHANGEPROGRESS, self.musicVolume, progress);
+    }
+}
+
+- (KSWareSliderView *)volumeSlider {
+    if (!_volumeSlider) {
+        _volumeSlider = [[KSWareSliderView alloc] initWithFrame:CGRectZero];
+        _volumeSlider.delegate = self;
+        _volumeSlider.backgroundColor = HexRGB(0xffffff);
+        _volumeSlider.volumeValue = self.musicVolume;
+        _volumeSlider.isVertical = YES;
+    }
+    return _volumeSlider;
+}
+
+- (IBAction)sliderDIsplay:(id)sender {
+    self.isShowSlider = !_isShowSlider;
+}
+
+- (void)setIsShowSlider:(BOOL)isShowSlider {
+    _isShowSlider = isShowSlider;
+    if (isShowSlider) {
+        [self.sliderBgView addSubview:self.volumeSlider];
+        [self.volumeSlider mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.right.mas_equalTo(self.sliderBgView.mas_right).offset(-8);
+            make.top.mas_equalTo(42);
+            make.width.mas_equalTo(20);
+            make.height.mas_equalTo(115);
+        }];
+    }
+    else {
+        [self.volumeSlider removeFromSuperview];
+    }
+}
+
+#pragma mark ----- volumeSlider delegate
+- (void)volumeChangeAction:(NSInteger)volume {
+    self.musicVolume = volume;
+    if (self.callback) {
+        self.callback(COURSEPLAYERACTION_VOLUME, self.musicVolume, 0);
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 292 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/ClassroomCoursewarePlayView.xib

@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="ClassroomCoursewarePlayView">
+            <rect key="frame" x="0.0" y="0.0" width="531" height="290"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OaN-q2-i4U">
+                    <rect key="frame" x="22" y="80" width="481" height="72"/>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zAZ-da-i7T">
+                    <rect key="frame" x="22" y="80" width="481" height="200"/>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="200" id="7tc-SW-Dwu"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rcE-0S-yHa">
+                    <rect key="frame" x="22" y="80" width="481" height="72"/>
+                    <subviews>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EwS-cB-M8K">
+                            <rect key="frame" x="10" y="40" width="24" height="24"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" image="classroomPlayer_play"/>
+                            <connections>
+                                <action selector="playAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="KTo-n3-u4S"/>
+                            </connections>
+                        </button>
+                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="QR0-eU-5GG">
+                            <rect key="frame" x="40" y="37" width="287.66666666666669" height="31"/>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <color key="minimumTrackTintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <color key="maximumTrackTintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <color key="thumbTintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <connections>
+                                <action selector="progressValueChange:" destination="iN0-l3-epB" eventType="valueChanged" id="skv-UR-ZQX"/>
+                            </connections>
+                        </slider>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="音量" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V5z-eo-NrV">
+                            <rect key="frame" x="425" y="44.666666666666671" width="27" height="15"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="27" id="mi5-g2-hTi"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00/00:00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DeM-YG-4KI">
+                            <rect key="frame" x="331.66666666666669" y="44" width="66.333333333333314" height="16"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="16" id="FFx-bE-hlc"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                            <color key="textColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mpd-Vf-7Ld">
+                            <rect key="frame" x="453" y="42" width="20" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="L6X-In-GDl"/>
+                                <constraint firstAttribute="width" constant="20" id="LbT-lu-LwZ"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" image="classroomPlayer_volume"/>
+                            <connections>
+                                <action selector="sliderDIsplay:" destination="iN0-l3-epB" eventType="touchUpInside" id="8Ym-qt-pBA"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="bottom" secondItem="EwS-cB-M8K" secondAttribute="bottom" constant="8" id="2qQ-Uk-GZM"/>
+                        <constraint firstItem="mpd-Vf-7Ld" firstAttribute="centerY" secondItem="QR0-eU-5GG" secondAttribute="centerY" id="2sn-7d-Af8"/>
+                        <constraint firstItem="V5z-eo-NrV" firstAttribute="leading" secondItem="DeM-YG-4KI" secondAttribute="trailing" constant="27" id="3O3-fA-NlU"/>
+                        <constraint firstItem="QR0-eU-5GG" firstAttribute="centerY" secondItem="EwS-cB-M8K" secondAttribute="centerY" id="Bgp-a4-sjq"/>
+                        <constraint firstAttribute="height" constant="72" id="GxK-yp-g12"/>
+                        <constraint firstAttribute="trailing" secondItem="mpd-Vf-7Ld" secondAttribute="trailing" constant="8" id="VsM-QX-LC8"/>
+                        <constraint firstItem="mpd-Vf-7Ld" firstAttribute="leading" secondItem="V5z-eo-NrV" secondAttribute="trailing" constant="1" id="VtC-23-hwT"/>
+                        <constraint firstItem="EwS-cB-M8K" firstAttribute="leading" secondItem="rcE-0S-yHa" secondAttribute="leading" constant="10" id="cUB-zP-Ybs"/>
+                        <constraint firstItem="QR0-eU-5GG" firstAttribute="leading" secondItem="EwS-cB-M8K" secondAttribute="trailing" constant="8" id="cfR-tA-OSV"/>
+                        <constraint firstItem="DeM-YG-4KI" firstAttribute="leading" secondItem="QR0-eU-5GG" secondAttribute="trailing" constant="6" id="hMH-Fg-GnJ"/>
+                        <constraint firstItem="V5z-eo-NrV" firstAttribute="centerY" secondItem="DeM-YG-4KI" secondAttribute="centerY" id="ip4-F4-Dnz"/>
+                        <constraint firstItem="mpd-Vf-7Ld" firstAttribute="centerY" secondItem="V5z-eo-NrV" secondAttribute="centerY" id="qog-fV-rjQ"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="F2i-SO-g43">
+                    <rect key="frame" x="22" y="80" width="481" height="34"/>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YBK-dv-EjA">
+                    <rect key="frame" x="22" y="80" width="481" height="34"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="课件:诀爱(《苍兰诀》主题曲)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="431-HZ-CHW">
+                            <rect key="frame" x="10" y="8" width="274" height="17"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="17" id="lrH-GZ-6SQ"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                            <color key="textColor" red="1" green="0.50196078431372548" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="正在加载…" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0wG-ub-mKO">
+                            <rect key="frame" x="289" y="9.3333333333333286" width="65" height="14.333333333333336"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="65" id="bOw-D8-Pjg"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vCA-n2-l4L">
+                            <rect key="frame" x="416" y="0.0" width="55" height="33"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coursewarePlayer_packUp" translatesAutoresizingMaskIntoConstraints="NO" id="vT1-3A-zhP">
+                                    <rect key="frame" x="38" y="8" width="17" height="17"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="17" id="BOh-iH-r4a"/>
+                                        <constraint firstAttribute="width" constant="17" id="bVq-bN-XGy"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="收起" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vAc-CI-dD2">
+                                    <rect key="frame" x="5" y="8" width="29" height="17"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="17" id="6rl-SB-jeL"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                    <color key="textColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Zwv-xc-nc5">
+                                    <rect key="frame" x="0.0" y="0.0" width="55" height="33"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="reloadAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="n8d-tj-Rio"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="vT1-3A-zhP" secondAttribute="trailing" id="5xw-Lj-Cng"/>
+                                <constraint firstAttribute="width" constant="55" id="CVC-hI-pyY"/>
+                                <constraint firstAttribute="trailing" secondItem="Zwv-xc-nc5" secondAttribute="trailing" id="Gft-eQ-Evo"/>
+                                <constraint firstItem="vT1-3A-zhP" firstAttribute="centerY" secondItem="vAc-CI-dD2" secondAttribute="centerY" id="Vhx-rT-BLs"/>
+                                <constraint firstAttribute="bottom" secondItem="Zwv-xc-nc5" secondAttribute="bottom" id="agl-hQ-e8K"/>
+                                <constraint firstItem="vAc-CI-dD2" firstAttribute="leading" secondItem="vCA-n2-l4L" secondAttribute="leading" constant="5" id="eZu-kB-q5T"/>
+                                <constraint firstItem="Zwv-xc-nc5" firstAttribute="top" secondItem="vCA-n2-l4L" secondAttribute="top" id="ig1-5j-tVE"/>
+                                <constraint firstItem="Zwv-xc-nc5" firstAttribute="leading" secondItem="vCA-n2-l4L" secondAttribute="leading" id="k49-Rv-Olt"/>
+                                <constraint firstItem="vT1-3A-zhP" firstAttribute="leading" secondItem="vAc-CI-dD2" secondAttribute="trailing" constant="4" id="rOs-a7-BWn"/>
+                                <constraint firstItem="vT1-3A-zhP" firstAttribute="centerY" secondItem="vCA-n2-l4L" secondAttribute="centerY" id="v2Y-P1-z9B"/>
+                                <constraint firstAttribute="height" constant="33" id="yWd-p0-Yaa"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gHd-sv-vuT">
+                            <rect key="frame" x="359" y="0.0" width="55" height="33"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="classroomPlayer_close" translatesAutoresizingMaskIntoConstraints="NO" id="fsI-i7-OTI">
+                                    <rect key="frame" x="38" y="8" width="17" height="17"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="17" id="PjV-8S-fFR"/>
+                                        <constraint firstAttribute="width" constant="17" id="wJW-yz-BPj"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="关闭" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a4q-Ot-nR4">
+                                    <rect key="frame" x="5" y="8" width="29" height="17"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="17" id="2nx-dF-ov2"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                    <color key="textColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kt3-9L-XuX">
+                                    <rect key="frame" x="0.0" y="0.0" width="55" height="33"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="0PL-uv-mgx"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="33" id="13R-Qd-kOc"/>
+                                <constraint firstAttribute="width" constant="55" id="6He-re-nYO"/>
+                                <constraint firstAttribute="trailing" secondItem="fsI-i7-OTI" secondAttribute="trailing" id="7C4-S8-1GT"/>
+                                <constraint firstItem="fsI-i7-OTI" firstAttribute="leading" secondItem="a4q-Ot-nR4" secondAttribute="trailing" constant="4" id="8Rq-X1-27s"/>
+                                <constraint firstItem="a4q-Ot-nR4" firstAttribute="leading" secondItem="gHd-sv-vuT" secondAttribute="leading" constant="5" id="9tL-Xs-wAK"/>
+                                <constraint firstItem="fsI-i7-OTI" firstAttribute="centerY" secondItem="a4q-Ot-nR4" secondAttribute="centerY" id="JSm-q9-4ZA"/>
+                                <constraint firstAttribute="bottom" secondItem="kt3-9L-XuX" secondAttribute="bottom" id="OzQ-1U-mHl"/>
+                                <constraint firstItem="fsI-i7-OTI" firstAttribute="centerY" secondItem="gHd-sv-vuT" secondAttribute="centerY" id="g26-kx-iqf"/>
+                                <constraint firstItem="kt3-9L-XuX" firstAttribute="leading" secondItem="gHd-sv-vuT" secondAttribute="leading" id="gEr-fd-FIV"/>
+                                <constraint firstAttribute="trailing" secondItem="kt3-9L-XuX" secondAttribute="trailing" id="qOX-OS-JIa"/>
+                                <constraint firstItem="kt3-9L-XuX" firstAttribute="top" secondItem="gHd-sv-vuT" secondAttribute="top" id="wCC-P5-1ul"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="34" id="8WY-VO-Onu"/>
+                        <constraint firstAttribute="trailing" secondItem="vCA-n2-l4L" secondAttribute="trailing" constant="10" id="CsP-HT-moF"/>
+                        <constraint firstItem="431-HZ-CHW" firstAttribute="top" secondItem="YBK-dv-EjA" secondAttribute="top" constant="8" id="JUK-9a-fBM"/>
+                        <constraint firstItem="gHd-sv-vuT" firstAttribute="top" secondItem="YBK-dv-EjA" secondAttribute="top" id="YG8-tU-VAG"/>
+                        <constraint firstItem="vCA-n2-l4L" firstAttribute="leading" secondItem="gHd-sv-vuT" secondAttribute="trailing" constant="2" id="h0S-CN-p6P"/>
+                        <constraint firstItem="0wG-ub-mKO" firstAttribute="leading" secondItem="431-HZ-CHW" secondAttribute="trailing" constant="5" id="jmg-a7-raU"/>
+                        <constraint firstItem="0wG-ub-mKO" firstAttribute="centerY" secondItem="431-HZ-CHW" secondAttribute="centerY" id="n6k-yh-gV1"/>
+                        <constraint firstItem="gHd-sv-vuT" firstAttribute="leading" secondItem="0wG-ub-mKO" secondAttribute="trailing" constant="5" id="sxH-Z6-11t"/>
+                        <constraint firstItem="431-HZ-CHW" firstAttribute="leading" secondItem="YBK-dv-EjA" secondAttribute="leading" constant="10" id="waB-mf-t8R"/>
+                        <constraint firstItem="vCA-n2-l4L" firstAttribute="top" secondItem="YBK-dv-EjA" secondAttribute="top" id="wj2-TH-VnL"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="OaN-q2-i4U" firstAttribute="trailing" secondItem="rcE-0S-yHa" secondAttribute="trailing" id="74w-JL-1Be"/>
+                <constraint firstItem="rcE-0S-yHa" firstAttribute="leading" secondItem="YBK-dv-EjA" secondAttribute="leading" id="Aut-X3-nlF"/>
+                <constraint firstItem="rcE-0S-yHa" firstAttribute="top" secondItem="YBK-dv-EjA" secondAttribute="top" id="BAx-fx-gvq"/>
+                <constraint firstItem="OaN-q2-i4U" firstAttribute="bottom" secondItem="rcE-0S-yHa" secondAttribute="bottom" id="BOJ-HS-U4y"/>
+                <constraint firstItem="F2i-SO-g43" firstAttribute="bottom" secondItem="YBK-dv-EjA" secondAttribute="bottom" id="EvR-ck-Wj0"/>
+                <constraint firstItem="OaN-q2-i4U" firstAttribute="leading" secondItem="rcE-0S-yHa" secondAttribute="leading" id="MYf-eX-RuA"/>
+                <constraint firstItem="F2i-SO-g43" firstAttribute="top" secondItem="YBK-dv-EjA" secondAttribute="top" id="Mxa-1z-h4l"/>
+                <constraint firstItem="F2i-SO-g43" firstAttribute="trailing" secondItem="YBK-dv-EjA" secondAttribute="trailing" id="ZXZ-Ia-82I"/>
+                <constraint firstAttribute="trailing" secondItem="YBK-dv-EjA" secondAttribute="trailing" constant="28" id="dNO-b4-MVi"/>
+                <constraint firstItem="YBK-dv-EjA" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="80" id="jsl-bi-Toy"/>
+                <constraint firstItem="zAZ-da-i7T" firstAttribute="leading" secondItem="rcE-0S-yHa" secondAttribute="leading" id="kH1-Wj-qnp"/>
+                <constraint firstItem="OaN-q2-i4U" firstAttribute="top" secondItem="rcE-0S-yHa" secondAttribute="top" id="myo-Iy-r9G"/>
+                <constraint firstItem="YBK-dv-EjA" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="22" id="n6f-k1-ZK4"/>
+                <constraint firstItem="F2i-SO-g43" firstAttribute="leading" secondItem="YBK-dv-EjA" secondAttribute="leading" id="nkQ-3B-20n"/>
+                <constraint firstItem="zAZ-da-i7T" firstAttribute="trailing" secondItem="rcE-0S-yHa" secondAttribute="trailing" id="o76-He-48h"/>
+                <constraint firstItem="rcE-0S-yHa" firstAttribute="trailing" secondItem="YBK-dv-EjA" secondAttribute="trailing" id="q3z-ql-RB8"/>
+                <constraint firstItem="zAZ-da-i7T" firstAttribute="top" secondItem="rcE-0S-yHa" secondAttribute="top" id="wke-IQ-uF2"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="closeImageView" destination="fsI-i7-OTI" id="YvI-LX-uP2"/>
+                <outlet property="fullContainer" destination="rcE-0S-yHa" id="Jbh-gv-JLJ"/>
+                <outlet property="fullView" destination="OaN-q2-i4U" id="O27-zJ-ATW"/>
+                <outlet property="headView" destination="F2i-SO-g43" id="FcX-lX-pL9"/>
+                <outlet property="musicNameLabel" destination="431-HZ-CHW" id="Fl4-Tr-QiB"/>
+                <outlet property="pickUpImage" destination="vT1-3A-zhP" id="4ON-Ni-cMl"/>
+                <outlet property="pickUpTitle" destination="vAc-CI-dD2" id="8Xb-lU-Ltw"/>
+                <outlet property="playButton" destination="EwS-cB-M8K" id="wPa-4R-LM0"/>
+                <outlet property="playProgress" destination="QR0-eU-5GG" id="SdF-Na-FIH"/>
+                <outlet property="sliderBgView" destination="zAZ-da-i7T" id="8Yb-Yk-HlQ"/>
+                <outlet property="statusLabel" destination="0wG-ub-mKO" id="2Ju-ZD-A6f"/>
+                <outlet property="timeLabel" destination="DeM-YG-4KI" id="QXb-rm-0A1"/>
+                <outlet property="volumeButton" destination="mpd-Vf-7Ld" id="05i-ye-YKX"/>
+            </connections>
+            <point key="canvasLocation" x="45.38461538461538" y="-113.03317535545023"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="classroomPlayer_close" width="21" height="21"/>
+        <image name="classroomPlayer_play" width="24" height="24"/>
+        <image name="classroomPlayer_volume" width="20" height="20"/>
+        <image name="coursewarePlayer_packUp" width="17" height="17"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 25 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.h

@@ -0,0 +1,25 @@
+//
+//  CourseWarePreviewView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/18.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ChooseCoursewareImageCallback)(NSString *imageUrl, CGSize imageSize);
+
+@interface CourseWarePreviewView : UIView
+
+
++ (instancetype)shareInstance;
+
+- (void)configImageWithImageSource:(NSMutableArray *)imageSourceArray showInView:(UIView *)displayView;
+
+- (void)chooseImageCallback:(ChooseCoursewareImageCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 150 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.m

@@ -0,0 +1,150 @@
+//
+//  CourseWarePreviewView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/18.
+//
+
+#import "CourseWarePreviewView.h"
+#define IMAGEWIDTH (375)
+
+@interface CourseWarePreviewView ()<UIScrollViewDelegate>
+
+@property (nonatomic, strong) NSMutableArray *imageUrlArray;
+
+@property (weak, nonatomic) IBOutlet UIView *imageContainerView;
+
+@property (nonatomic, strong) UIScrollView *imageScrollView;
+
+@property (weak, nonatomic) IBOutlet UILabel *pageDescLabel;
+
+@property (nonatomic, assign) NSInteger chooseIndex;
+
+@property (nonatomic, assign) CGFloat maxHeight;
+
+@property (nonatomic, strong) NSMutableArray *sizeArray;
+
+@property (nonatomic, copy) ChooseCoursewareImageCallback callback;
+
+@end
+
+@implementation CourseWarePreviewView
+
++ (instancetype)shareInstance {
+    CourseWarePreviewView *view = [[[NSBundle mainBundle] loadNibNamed:@"CourseWarePreviewView" owner:nil options:nil] firstObject];
+    [view configUI];
+    return view;
+}
+
+- (void)configUI {
+    [self.imageContainerView addSubview:self.imageScrollView];
+    [self.imageScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.imageContainerView);
+    }];
+    self.imageScrollView.pagingEnabled = YES;
+    
+}
+
+- (void)configImageWithImageSource:(NSMutableArray *)imageSourceArray showInView:(UIView *)displayView {
+    self.imageUrlArray = imageSourceArray;
+    self.chooseIndex = 0;
+    if (imageSourceArray.count > 1) {
+        self.pageDescLabel.hidden = NO;
+        self.pageDescLabel.text = [NSString stringWithFormat:@"1/%zd",imageSourceArray.count];
+    }
+    else {
+        self.pageDescLabel.hidden = YES;
+    }
+    [self displayView];
+    [self showInView:displayView];
+}
+
+- (void)chooseImageCallback:(ChooseCoursewareImageCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)displayView {
+    self.sizeArray = [NSMutableArray array];
+    for (NSInteger index = 0; index < self.imageUrlArray.count; index++) {
+        NSString *imageUrl = self.imageUrlArray[index];
+        UIImageView *previewView = [[UIImageView alloc] init];
+        [previewView sd_setImageWithURL:[NSURL URLWithString:[imageUrl getUrlEndcodeString]] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
+            CGSize imageSize = CGSizeMake(image.size.width, image.size.height);
+            NSLog(@"-------- get frame ");
+            [self.sizeArray addObject:@{@"width": @(IMAGEWIDTH), @"height" :@(IMAGEWIDTH / imageSize.width * imageSize.height)}];
+            
+            if (self.maxHeight < imageSize.height) {
+                self.maxHeight = imageSize.height;
+                [self.imageScrollView setContentSize:CGSizeMake(IMAGEWIDTH*self.imageUrlArray.count, self.maxHeight)];
+            }
+            previewView.frame = CGRectMake(IMAGEWIDTH*index, 0, IMAGEWIDTH, IMAGEWIDTH / imageSize.width * imageSize.height);
+        }];
+        [self.imageScrollView addSubview:previewView];
+    }
+}
+
+- (void)showInView:(UIView *)displayView {
+    [displayView addSubview:self];
+}
+
+- (void)hideView {
+    [self removeFromSuperview];
+}
+
+- (IBAction)cancleAction:(id)sender {
+    [self hideView];
+}
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        NSString *url = self.imageUrlArray[self.chooseIndex];
+        NSDictionary *dic = self.sizeArray[self.chooseIndex];
+        CGSize size = CGSizeMake([dic floatValueForKey:@"width"], [dic floatValueForKey:@"height"]);
+        self.callback(url, size);
+    }
+    [self hideView];
+}
+
+
+
+#pragma mark ---- lazying
+- (UIScrollView *)imageScrollView {
+    if (!_imageScrollView) {
+        _imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero];
+        _imageScrollView.backgroundColor = [UIColor whiteColor];
+        _imageScrollView.showsHorizontalScrollIndicator = YES;
+        _imageScrollView.showsVerticalScrollIndicator = YES;
+        _imageScrollView.delegate = self;
+    }
+    return _imageScrollView;
+}
+
+- (NSMutableArray *)sizeArray {
+    if (!_sizeArray) {
+        _sizeArray = [NSMutableArray array];
+    }
+    return _sizeArray;
+}
+
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+    CGFloat space = scrollView.contentOffset.x;
+    CGFloat index = space / IMAGEWIDTH;
+    self.chooseIndex = index;
+}
+
+- (void)setChooseIndex:(NSInteger)chooseIndex {
+    _chooseIndex = chooseIndex;
+    self.pageDescLabel.text = [NSString stringWithFormat:@"%zd/%zd", chooseIndex+1,self.imageUrlArray.count];
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 125 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/CourseWarePreviewView.xib

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="CourseWarePreviewView">
+            <rect key="frame" x="0.0" y="0.0" width="539" height="353"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vRl-7R-hcQ">
+                    <rect key="frame" x="82" y="37.666666666666657" width="375" height="278"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FlF-uT-0of">
+                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="课件预览" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mm5-YP-Z5X">
+                                    <rect key="frame" x="13" y="12" width="66" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="WZM-pg-h9a"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                    <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="Cfa-lS-AFF">
+                                    <rect key="frame" x="326" y="0.0" width="44" height="44"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="44" id="nT4-4v-QvT"/>
+                                        <constraint firstAttribute="width" constant="44" id="rKK-od-bJm"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="cancle_white"/>
+                                    <connections>
+                                        <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="2XH-3r-Wh6"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" red="0.31764705882352939" green="0.30980392156862746" blue="0.37254901960784315" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstItem="Mm5-YP-Z5X" firstAttribute="leading" secondItem="FlF-uT-0of" secondAttribute="leading" constant="13" id="1yi-9x-b9k"/>
+                                <constraint firstAttribute="trailing" secondItem="Cfa-lS-AFF" secondAttribute="trailing" constant="5" id="Dp9-c2-0t1"/>
+                                <constraint firstItem="Cfa-lS-AFF" firstAttribute="top" secondItem="FlF-uT-0of" secondAttribute="top" id="KSf-ch-p4e"/>
+                                <constraint firstAttribute="height" constant="44" id="iiP-Ps-nAz"/>
+                                <constraint firstItem="Mm5-YP-Z5X" firstAttribute="top" secondItem="FlF-uT-0of" secondAttribute="top" constant="12" id="mJx-ww-4yT"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oy5-K4-kPd">
+                            <rect key="frame" x="0.0" y="44" width="375" height="234"/>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1/3" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r36-jK-cKK">
+                            <rect key="frame" x="347.66666666666669" y="51.000000000000007" width="19.333333333333314" height="19.999999999999993"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="L9I-xN-GkD"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <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="LyG-QW-ikz">
+                            <rect key="frame" x="103" y="226.00000000000003" width="169" height="33.999999999999972"/>
+                            <color key="backgroundColor" red="0.396078431372549" green="0.38823529411764707" blue="0.46274509803921571" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="169" id="hrB-w6-uoH"/>
+                                <constraint firstAttribute="height" constant="34" id="vSV-xr-eDB"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="确认"/>
+                            <connections>
+                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="SEt-jZ-khu"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="FlF-uT-0of" firstAttribute="top" secondItem="vRl-7R-hcQ" secondAttribute="top" id="04f-qc-TU8"/>
+                        <constraint firstAttribute="trailing" secondItem="FlF-uT-0of" secondAttribute="trailing" id="Fl6-iR-hYA"/>
+                        <constraint firstAttribute="bottom" secondItem="oy5-K4-kPd" secondAttribute="bottom" id="JS1-44-mzH"/>
+                        <constraint firstItem="FlF-uT-0of" firstAttribute="leading" secondItem="vRl-7R-hcQ" secondAttribute="leading" id="OHK-6l-hza"/>
+                        <constraint firstItem="oy5-K4-kPd" firstAttribute="top" secondItem="FlF-uT-0of" secondAttribute="bottom" id="PLJ-tb-Hj0"/>
+                        <constraint firstAttribute="bottom" secondItem="LyG-QW-ikz" secondAttribute="bottom" constant="18" id="ZPz-5a-0m7"/>
+                        <constraint firstItem="r36-jK-cKK" firstAttribute="top" secondItem="FlF-uT-0of" secondAttribute="bottom" constant="7" id="Zgv-HX-OLj"/>
+                        <constraint firstItem="LyG-QW-ikz" firstAttribute="centerX" secondItem="vRl-7R-hcQ" secondAttribute="centerX" id="eXF-iA-meD"/>
+                        <constraint firstAttribute="height" constant="278" id="iG2-BN-Vdg"/>
+                        <constraint firstItem="oy5-K4-kPd" firstAttribute="leading" secondItem="vRl-7R-hcQ" secondAttribute="leading" id="nUv-eT-gnv"/>
+                        <constraint firstAttribute="width" constant="375" id="wWa-5d-xEM"/>
+                        <constraint firstAttribute="trailing" secondItem="oy5-K4-kPd" secondAttribute="trailing" id="xFE-O5-3DU"/>
+                        <constraint firstAttribute="trailing" secondItem="r36-jK-cKK" secondAttribute="trailing" constant="8" id="yXn-cf-Y2H"/>
+                    </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="vRl-7R-hcQ" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Dqx-fZ-kSM"/>
+                <constraint firstItem="vRl-7R-hcQ" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="vY5-4S-wwL"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="imageContainerView" destination="oy5-K4-kPd" id="kFx-TR-Kpo"/>
+                <outlet property="pageDescLabel" destination="r36-jK-cKK" id="LRf-ha-1kx"/>
+            </connections>
+            <point key="canvasLocation" x="231.53846153846152" y="-124.0521327014218"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="cancle_white" width="16" height="15"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 35 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/KSWareSliderView.h

@@ -0,0 +1,35 @@
+//
+//  KSWareSliderView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/18.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol KSWareSliderDelegate <NSObject>
+
+@optional
+- (void)volumeChangeAction:(NSInteger)volume;
+- (void)beginSwip;
+- (void)endSwip;
+
+@end
+
+@interface KSWareSliderView : UIView
+
+@property (nonatomic, assign) BOOL isVertical;
+@property (strong, nonatomic) NSNumberFormatter *numberFormatter;
+@property (nonatomic, assign) CGFloat minValue;
+@property (nonatomic, assign) CGFloat maxValue;
+@property (nonatomic, strong) UIColor *minimumTrackTintColor;
+@property (nonatomic, strong) UIColor *maxmumTrackTintColor;
+@property (nonatomic, assign) NSInteger volumeValue;
+
+@property (nonatomic, unsafe_unretained)id<KSWareSliderDelegate>delegate;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 127 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewarePlayView/KSWareSliderView.m

@@ -0,0 +1,127 @@
+//
+//  KSWareSliderView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/18.
+//
+
+#import "KSWareSliderView.h"
+#import "KSTrackingSlider.h"
+
+@interface KSWareSliderView ()<KSTrackingSliderDelegate>
+
+@property (nonatomic, strong) KSTrackingSlider *sliderBar;
+
+@end
+
+@implementation KSWareSliderView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self setUpWithFrame:frame];
+    }
+    return self;
+}
+
+- (void)setUpWithFrame:(CGRect)frame {
+    self.backgroundColor = [UIColor whiteColor];
+    self.layer.cornerRadius = 10.0f;
+    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
+    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
+    [formatter setRoundingMode:NSNumberFormatterRoundHalfUp];
+    [formatter setMaximumFractionDigits:0];
+    [formatter setMinimumFractionDigits:0];
+    _numberFormatter = formatter;
+
+    [self addSubview:self.sliderBar];
+//    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
+//    [self addGestureRecognizer:gesture];
+}
+
+- (void)tapAction {
+    
+}
+
+- (void)setVolumeValue:(NSInteger)volumeValue {
+    _volumeValue = volumeValue;
+    self.sliderBar.value = volumeValue;
+    if (self.delegate && [self.delegate respondsToSelector:@selector(volumeChangeAction:)]) {
+        [self.delegate volumeChangeAction:volumeValue];
+    }
+}
+
+
+- (KSTrackingSlider *)sliderBar {
+    if (!_sliderBar) {
+        _sliderBar = [[KSTrackingSlider alloc] initWithFrame:CGRectMake(-32, 57, 84, 20)];
+        _sliderBar.tintColor = HexRGB(0xFF8000);
+        _sliderBar.minimumTrackTintColor = HexRGB(0xFF8000);
+        _sliderBar.maximumTrackTintColor = HexRGB(0xd8d8d8);
+        _sliderBar.delegate = self;
+        _sliderBar.minimumValue = 0;
+        _sliderBar.maximumValue = 100;
+        [_sliderBar setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateNormal];
+        [_sliderBar setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateFocused];
+    }
+    return _sliderBar;
+}
+
+- (void)currentValueOfSlider:(KSTrackingSlider *)slider {
+    self.volumeValue = [_numberFormatter stringFromNumber:@(slider.value)].integerValue;
+}
+
+- (void)beginSwipSlider:(KSTrackingSlider *)slider {
+    if (self.delegate && [self.delegate respondsToSelector:@selector(beginSwip)]) {
+        [self.delegate beginSwip];
+    }
+}
+
+- (void)endSwipSlider:(KSTrackingSlider *)slider {
+    if (self.delegate && [self.delegate respondsToSelector:@selector(endSwip)]) {
+        [self.delegate endSwip];
+    }
+}
+
+- (void)setIsVertical:(BOOL)isVertical{
+    _isVertical = isVertical;
+    if (_isVertical == YES) {
+        self.sliderBar.transform = CGAffineTransformMakeRotation(-M_PI_2);
+    } else {
+        
+    }
+}
+- (void)setNumberFormatter:(NSNumberFormatter *)numberFormatter
+{
+    _numberFormatter = numberFormatter;
+}
+- (void)setMinValue:(CGFloat)minValue{
+    _minValue = minValue;
+    _sliderBar.minimumValue = minValue;
+}
+- (void)setMaxValue:(CGFloat)maxValue{
+    _maxValue = maxValue;
+    _sliderBar.maximumValue = maxValue;
+}
+- (void)setMinimumTrackTintColor:(UIColor *)minimumTrackTintColor{
+    _minimumTrackTintColor = minimumTrackTintColor;
+    _sliderBar.minimumTrackTintColor = minimumTrackTintColor;
+}
+- (void)setMaxmumTrackTintColor:(UIColor *)maxmumTrackTintColor{
+    _maxmumTrackTintColor = maxmumTrackTintColor;
+    _sliderBar.maximumTrackTintColor = maxmumTrackTintColor;
+}
+
+// 解决在UIScrollView中滑动冲突的问题
+- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
+    return CGRectContainsPoint(self.sliderBar.frame, point);
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 19 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.h

@@ -0,0 +1,19 @@
+//
+//  CoursewareAlertCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+#import "CoursewareListModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CoursewareAlertCell : UITableViewCell
+
+- (void)cofigCellWithModel:(CoursewareListModel *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 41 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.m

@@ -0,0 +1,41 @@
+//
+//  CoursewareAlertCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareAlertCell.h"
+
+@interface CoursewareAlertCell ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *musicImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *musicName;
+
+@property (weak, nonatomic) IBOutlet UIImageView *chooseImage;
+
+@end
+
+@implementation CoursewareAlertCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)cofigCellWithModel:(CoursewareListModel *)model {
+    NSString *imageName = model.isChoose ? @"choose_image" : @"unchoose_image";
+    [self.chooseImage setImage:[UIImage imageNamed:imageName]];
+    [self.musicImage sd_setImageWithURL:[NSURL URLWithString:[model.titleImg getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"music_logo"]];
+    self.musicName.text = [NSString returnNoNullStringWithString:model.musicSheetName];
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 87 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertCell.xib

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="82" id="KGk-i7-Jjw" customClass="CoursewareAlertCell">
+            <rect key="frame" x="0.0" y="0.0" width="415" height="82"/>
+            <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="415" height="82"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Bwp-dr-mtN">
+                        <rect key="frame" x="15" y="0.0" width="378" height="74"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="music_logo" translatesAutoresizingMaskIntoConstraints="NO" id="afo-el-lA1">
+                                <rect key="frame" x="8" y="19" width="36" height="36"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="36" id="Q9v-4N-1gh"/>
+                                    <constraint firstAttribute="height" constant="36" id="uDk-qg-miA"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="4"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第一期课件8-01.MP3" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="45A-8v-3ET">
+                                <rect key="frame" x="58" y="27" width="276" height="20"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="unchoose_image" translatesAutoresizingMaskIntoConstraints="NO" id="hpI-3r-2Pz">
+                                <rect key="frame" x="344" y="28" width="18" height="18"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="18" id="1XR-BW-SKR"/>
+                                    <constraint firstAttribute="height" constant="18" id="j2G-yS-KI3"/>
+                                </constraints>
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" red="0.31764705882352939" green="0.30980392156862746" blue="0.37254901960784315" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstItem="hpI-3r-2Pz" firstAttribute="centerY" secondItem="Bwp-dr-mtN" secondAttribute="centerY" id="VrC-YM-icG"/>
+                            <constraint firstItem="hpI-3r-2Pz" firstAttribute="leading" secondItem="45A-8v-3ET" secondAttribute="trailing" constant="10" id="ZQk-5C-LND"/>
+                            <constraint firstItem="45A-8v-3ET" firstAttribute="centerY" secondItem="Bwp-dr-mtN" secondAttribute="centerY" id="fLA-ZO-8h7"/>
+                            <constraint firstItem="afo-el-lA1" firstAttribute="leading" secondItem="Bwp-dr-mtN" secondAttribute="leading" constant="8" id="fuS-gA-kwE"/>
+                            <constraint firstAttribute="trailing" secondItem="hpI-3r-2Pz" secondAttribute="trailing" constant="16" id="lq2-6Y-lzc"/>
+                            <constraint firstItem="afo-el-lA1" firstAttribute="centerY" secondItem="Bwp-dr-mtN" secondAttribute="centerY" id="trU-IL-Aws"/>
+                            <constraint firstItem="45A-8v-3ET" firstAttribute="leading" secondItem="afo-el-lA1" secondAttribute="trailing" constant="14" id="y3n-GP-KOd"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="Bwp-dr-mtN" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="KzP-gk-kYY"/>
+                    <constraint firstItem="Bwp-dr-mtN" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="15" id="Tsl-ke-t7B"/>
+                    <constraint firstAttribute="bottom" secondItem="Bwp-dr-mtN" secondAttribute="bottom" constant="8" id="bKd-sB-x5q"/>
+                    <constraint firstAttribute="trailing" secondItem="Bwp-dr-mtN" secondAttribute="trailing" constant="22" id="d5Q-x0-I2i"/>
+                </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="chooseImage" destination="hpI-3r-2Pz" id="7PY-i5-69G"/>
+                <outlet property="musicImage" destination="afo-el-lA1" id="iy1-49-gOD"/>
+                <outlet property="musicName" destination="45A-8v-3ET" id="p3V-FU-WC7"/>
+            </connections>
+            <point key="canvasLocation" x="157.69230769230768" y="1.4218009478672986"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="music_logo" width="41" height="40"/>
+        <image name="unchoose_image" width="18" height="18"/>
+    </resources>
+</document>

+ 34 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.h

@@ -0,0 +1,34 @@
+//
+//  CoursewareAlertView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ChooseMusicCallback)(NSString *musicUrl, NSString *musicName);
+
+typedef void(^ChooseImageCallback)(NSString *musicImages);
+
+@interface CoursewareAlertView : UIView
+
+@property (nonatomic, assign) BOOL isShow;
+
++ (instancetype)shareInstance;
+
+- (void)showView;
+
+- (void)hideView;
+
+- (void)configUI;
+
+- (void)chooseMusicImageCallback:(ChooseImageCallback)callback;
+
+- (void)chooseCoursewareCallback:(ChooseMusicCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 245 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.m

@@ -0,0 +1,245 @@
+//
+//  CoursewareAlertView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareAlertView.h"
+#import "CoursewareListModel.h"
+#import "CoursewareAlertCell.h"
+
+@interface CoursewareAlertView ()<UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource>
+
+@property (weak, nonatomic) IBOutlet UITextField *textField;
+
+@property (weak, nonatomic) IBOutlet UIView *tableContainer;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, strong) NSString *searchKey;
+
+@property (nonatomic, assign) NSInteger pages;  // 页数
+
+@property (nonatomic, assign) NSInteger rows;   // 每页条数
+
+@property (nonatomic, assign) BOOL isLoadMore; // 是否能够加载更多
+
+@property (nonatomic, strong) NSMutableArray *sourceArray;
+
+@property (nonatomic, assign) NSInteger lastChooseIndex;
+
+@property (nonatomic, copy) ChooseMusicCallback callback;
+
+@property (nonatomic, copy) ChooseImageCallback imageCallback;
+
+@end
+
+@implementation CoursewareAlertView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.textField.delegate = self;
+    self.textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"请输入课件名称" attributes:@{NSForegroundColorAttributeName:HexRGB(0xCCCCCC)}];
+}
+
+- (void)resetParamenter {
+    self.pages = 1;
+    self.rows = 10;
+    self.isLoadMore = YES;
+    self.sourceArray = [NSMutableArray array];
+}
+
++ (instancetype)shareInstance {
+    CoursewareAlertView *view = [[[NSBundle mainBundle] loadNibNamed:@"CoursewareAlertView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)showView {
+    _isShow = YES;
+    [[NSObject getKeyWindow] addSubview:self];
+}
+
+- (void)chooseCoursewareCallback:(ChooseMusicCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)chooseMusicImageCallback:(ChooseImageCallback)callback {
+    if (callback) {
+        self.imageCallback = callback;
+    }
+}
+
+- (void)configUI {
+    [self.tableContainer addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.tableContainer);
+    }];
+    MJWeakSelf;
+    self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+        [weakSelf.tableView.mj_footer resetNoMoreData];
+        [weakSelf searchMusic];
+    }];
+    self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+        if (weakSelf.isLoadMore) {
+            weakSelf.pages += 1;
+            [weakSelf requestData];
+        }
+        else {
+            [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+        }
+    }];
+    [self loadFirstData];
+}
+
+- (void)loadFirstData {
+    [self requestData];
+    self.lastChooseIndex = 0;
+}
+
+- (IBAction)searchAction:(id)sender {
+    [self endEditing:YES];
+    self.searchKey = self.textField.text;
+    [self searchMusic];
+}
+
+- (void)searchMusic {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)requestData {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager courseCoursewareRequest:KS_POST status:@"1" searchKey:self.searchKey page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        [self endRefresh];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *dataArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in dataArray) {
+                CoursewareListModel *model = [[CoursewareListModel alloc] initWithDictionary:parm];
+                [self.sourceArray addObject:model];
+            }
+            if (dataArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        [self refreshTable];
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+        [self endRefresh];
+    }];
+    
+}
+
+- (void)refreshTable {
+    CoursewareListModel *model = self.sourceArray[self.lastChooseIndex];
+    model.isChoose = YES;
+    [self.tableView reloadData];
+}
+
+- (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];
+    });
+}
+
+#pragma mark -- textfield delegate
+- (BOOL)textFieldShouldReturn:(UITextField *)textField {
+    [self endEditing:YES];
+    return YES;
+}
+
+- (void)textFieldDidEndEditing:(UITextField *)textField {
+    self.searchKey = textField.text;
+    [self searchMusic];
+}
+
+#pragma mark --- table data source
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.sourceArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    CoursewareListModel *model = self.sourceArray[indexPath.row];
+    CoursewareAlertCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CoursewareAlertCell"];
+    [cell cofigCellWithModel:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+    if (indexPath.row != self.lastChooseIndex) {
+        CoursewareListModel *model = self.sourceArray[indexPath.row];
+        model.isChoose = YES;
+        
+        CoursewareListModel *lastModel = self.sourceArray[self.lastChooseIndex];
+        lastModel.isChoose = NO;
+        
+        [tableView reloadRowsAtIndexPaths:@[indexPath, [NSIndexPath indexPathForRow:self.lastChooseIndex inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
+        self.lastChooseIndex = indexPath.row;
+    }
+    
+}
+
+#pragma mark ---- lazying
+- (NSMutableArray *)sourceArray {
+    if (!_sourceArray) {
+        _sourceArray = [NSMutableArray array];
+    }
+    return _sourceArray;
+}
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.backgroundColor = [UIColor clearColor];
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        _tableView.rowHeight = UITableViewAutomaticDimension;
+        _tableView.rowHeight = 60;
+        
+        [_tableView registerNib:[UINib nibWithNibName:@"CoursewareAlertCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CoursewareAlertCell"];
+    }
+    
+    return _tableView;
+}
+
+
+- (IBAction)cancleAction:(id)sender {
+    [self hideView];
+}
+
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        CoursewareListModel *lastModel = self.sourceArray[self.lastChooseIndex];
+        self.callback(lastModel.mp3url, lastModel.musicSheetName);
+    }
+    
+    if (self.imageCallback) {
+        CoursewareListModel *lastModel = self.sourceArray[self.lastChooseIndex];
+        self.imageCallback(lastModel.musicImg);
+    }
+}
+
+- (void)hideView {
+    [self removeFromSuperview];
+    _isShow = NO;
+}
+
+/*
+ // Only override drawRect: if you perform custom drawing.
+ // An empty implementation adversely affects performance during animation.
+ - (void)drawRect:(CGRect)rect {
+ // Drawing code
+ }
+ */
+
+@end

+ 226 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/CoursewareView/CoursewareAlertView.xib

@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="CoursewareAlertView">
+            <rect key="frame" x="0.0" y="0.0" width="695" height="370"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="e2w-pY-a9i">
+                    <rect key="frame" x="160" y="44" width="375" height="274"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cEX-Ks-dIJ">
+                            <rect key="frame" x="0.0" y="0.0" width="375" height="47"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我的课件" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ovf-8k-LcX">
+                                    <rect key="frame" x="13" y="13.666666666666664" width="66" height="20"/>
+                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                    <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="VuV-HT-4i3">
+                                    <rect key="frame" x="326" y="0.0" width="44" height="44"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="44" id="H6r-HA-b2m"/>
+                                        <constraint firstAttribute="width" constant="44" id="S6X-lw-Ej9"/>
+                                    </constraints>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" image="cancle_white"/>
+                                    <connections>
+                                        <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="8Zz-3t-RTl"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" red="0.31764705882352939" green="0.30980392156862746" blue="0.37254901960784315" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="VuV-HT-4i3" secondAttribute="trailing" constant="5" id="8tW-Xt-JmG"/>
+                                <constraint firstItem="Ovf-8k-LcX" firstAttribute="leading" secondItem="cEX-Ks-dIJ" secondAttribute="leading" constant="13" id="Hj9-i6-dCd"/>
+                                <constraint firstItem="VuV-HT-4i3" firstAttribute="top" secondItem="cEX-Ks-dIJ" secondAttribute="top" id="SFB-5X-Xa1"/>
+                                <constraint firstAttribute="height" constant="47" id="iEC-1B-9Qw"/>
+                                <constraint firstItem="Ovf-8k-LcX" firstAttribute="centerY" secondItem="cEX-Ks-dIJ" secondAttribute="centerY" id="trC-cA-Tb3"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eer-ey-gVa">
+                            <rect key="frame" x="14" y="47" width="349" height="54"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bQ5-at-sgo">
+                                    <rect key="frame" x="0.0" y="10" width="349" height="34"/>
+                                    <subviews>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="search_grey" translatesAutoresizingMaskIntoConstraints="NO" id="wKj-5J-6KL">
+                                            <rect key="frame" x="12" y="9" width="16" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="16" id="3uK-qp-feq"/>
+                                                <constraint firstAttribute="height" constant="16" id="4fI-4D-wvr"/>
+                                            </constraints>
+                                        </imageView>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zaH-hB-C7E">
+                                            <rect key="frame" x="36" y="10" width="0.6666666666666643" height="14"/>
+                                            <color key="backgroundColor" red="0.84705882352941175" green="0.84705882352941175" blue="0.84705882352941175" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="0.5" id="Lys-KF-MqL"/>
+                                                <constraint firstAttribute="height" constant="14" id="lTl-Ly-imP"/>
+                                            </constraints>
+                                        </view>
+                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YYe-GB-O17">
+                                            <rect key="frame" x="296" y="5" width="48" height="24"/>
+                                            <color key="backgroundColor" red="0.20784313725490194" green="0.20392156862745098" blue="0.24313725490196078" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="48" id="LrK-VO-FkC"/>
+                                                <constraint firstAttribute="height" constant="24" id="NeA-i5-BQs"/>
+                                            </constraints>
+                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                            <state key="normal" title="搜索"/>
+                                            <userDefinedRuntimeAttributes>
+                                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                                    <real key="value" value="12"/>
+                                                </userDefinedRuntimeAttribute>
+                                            </userDefinedRuntimeAttributes>
+                                            <connections>
+                                                <action selector="searchAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="ikW-11-tfx"/>
+                                            </connections>
+                                        </button>
+                                        <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入课件名称" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="aS4-Jh-TVC">
+                                            <rect key="frame" x="46.666666666666643" y="0.0" width="234.33333333333337" height="34"/>
+                                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                            <textInputTraits key="textInputTraits"/>
+                                        </textField>
+                                    </subviews>
+                                    <color key="backgroundColor" red="0.31764705879999999" green="0.30980392159999998" blue="0.37254901959999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstItem="YYe-GB-O17" firstAttribute="leading" secondItem="aS4-Jh-TVC" secondAttribute="trailing" constant="15" id="Baa-w1-tgg"/>
+                                        <constraint firstItem="aS4-Jh-TVC" firstAttribute="top" secondItem="bQ5-at-sgo" secondAttribute="top" id="Ko8-aA-2ny"/>
+                                        <constraint firstAttribute="bottom" secondItem="aS4-Jh-TVC" secondAttribute="bottom" id="PlF-2m-n4Z"/>
+                                        <constraint firstItem="wKj-5J-6KL" firstAttribute="centerY" secondItem="bQ5-at-sgo" secondAttribute="centerY" id="QEN-TC-92y"/>
+                                        <constraint firstAttribute="trailing" secondItem="YYe-GB-O17" secondAttribute="trailing" constant="5" id="Svt-3h-90f"/>
+                                        <constraint firstItem="zaH-hB-C7E" firstAttribute="centerY" secondItem="bQ5-at-sgo" secondAttribute="centerY" id="Sze-wR-7Ga"/>
+                                        <constraint firstAttribute="height" constant="34" id="Ynd-nW-6Vn"/>
+                                        <constraint firstItem="aS4-Jh-TVC" firstAttribute="leading" secondItem="zaH-hB-C7E" secondAttribute="trailing" constant="10" id="aMx-RN-dOd"/>
+                                        <constraint firstItem="YYe-GB-O17" firstAttribute="centerY" secondItem="bQ5-at-sgo" secondAttribute="centerY" id="pud-5P-ccv"/>
+                                        <constraint firstItem="wKj-5J-6KL" firstAttribute="leading" secondItem="bQ5-at-sgo" secondAttribute="leading" constant="12" id="sbO-Hk-hzd"/>
+                                        <constraint firstItem="zaH-hB-C7E" firstAttribute="leading" secondItem="wKj-5J-6KL" secondAttribute="trailing" constant="8" id="stD-pe-0xH"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="17"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="bQ5-at-sgo" firstAttribute="centerY" secondItem="eer-ey-gVa" secondAttribute="centerY" id="acw-6a-siP"/>
+                                <constraint firstAttribute="height" constant="54" id="h9d-w4-TR3"/>
+                                <constraint firstItem="bQ5-at-sgo" firstAttribute="leading" secondItem="eer-ey-gVa" secondAttribute="leading" id="mFL-iF-vXS"/>
+                                <constraint firstAttribute="trailing" secondItem="bQ5-at-sgo" secondAttribute="trailing" id="pGO-Zf-24b"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xdK-Q2-bVX">
+                            <rect key="frame" x="0.0" y="216" width="375" height="58"/>
+                            <subviews>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dbh-R3-fsd">
+                                    <rect key="frame" x="12" y="12" width="169.66666666666666" height="34"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="34" id="4WU-kS-qTe"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" title="取消"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="4"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="ddq-Zo-NU9"/>
+                                    </connections>
+                                </button>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Sfr-FX-3xp">
+                                    <rect key="frame" x="193.66666666666669" y="12" width="169.33333333333331" height="34"/>
+                                    <color key="backgroundColor" red="0.396078431372549" green="0.38823529411764707" blue="0.46274509803921571" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="34" id="Mqb-RV-Mcw"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <state key="normal" title="确认"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="4"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="fDp-8F-Ump"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" red="0.20784313725490194" green="0.20392156862745098" blue="0.24313725490196078" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="dbh-R3-fsd" firstAttribute="leading" secondItem="xdK-Q2-bVX" secondAttribute="leading" constant="12" id="VCa-5F-Sj9"/>
+                                <constraint firstItem="Sfr-FX-3xp" firstAttribute="leading" secondItem="dbh-R3-fsd" secondAttribute="trailing" constant="12" id="Xjd-oB-kFd"/>
+                                <constraint firstAttribute="trailing" secondItem="Sfr-FX-3xp" secondAttribute="trailing" constant="12" id="Zet-aG-dvr"/>
+                                <constraint firstAttribute="bottom" secondItem="dbh-R3-fsd" secondAttribute="bottom" constant="12" id="k07-nc-AVe"/>
+                                <constraint firstAttribute="bottom" secondItem="Sfr-FX-3xp" secondAttribute="bottom" constant="12" id="sYk-tX-xPs"/>
+                                <constraint firstItem="Sfr-FX-3xp" firstAttribute="width" secondItem="dbh-R3-fsd" secondAttribute="width" id="sZV-a5-iGI"/>
+                                <constraint firstAttribute="height" constant="58" id="uUn-6B-S41"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0J2-Rc-Lxn">
+                            <rect key="frame" x="0.0" y="101" width="375" height="110"/>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" red="0.20784313725490194" green="0.20392156862745098" blue="0.24313725490196078" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="xdK-Q2-bVX" secondAttribute="trailing" id="1D3-Ug-yIk"/>
+                        <constraint firstItem="cEX-Ks-dIJ" firstAttribute="top" secondItem="e2w-pY-a9i" secondAttribute="top" id="1ox-fB-HNx"/>
+                        <constraint firstItem="cEX-Ks-dIJ" firstAttribute="leading" secondItem="e2w-pY-a9i" secondAttribute="leading" id="8JH-Wn-khq"/>
+                        <constraint firstAttribute="trailing" secondItem="eer-ey-gVa" secondAttribute="trailing" constant="12" id="Czu-Dt-fok"/>
+                        <constraint firstAttribute="trailing" secondItem="cEX-Ks-dIJ" secondAttribute="trailing" id="EVn-fW-pXK"/>
+                        <constraint firstAttribute="bottom" secondItem="xdK-Q2-bVX" secondAttribute="bottom" id="GZa-zW-fX1"/>
+                        <constraint firstItem="xdK-Q2-bVX" firstAttribute="leading" secondItem="e2w-pY-a9i" secondAttribute="leading" id="Jkd-d3-fmd"/>
+                        <constraint firstItem="0J2-Rc-Lxn" firstAttribute="top" secondItem="eer-ey-gVa" secondAttribute="bottom" id="OMD-be-72m"/>
+                        <constraint firstAttribute="width" constant="375" id="Rrv-P2-Jfb"/>
+                        <constraint firstAttribute="trailing" secondItem="0J2-Rc-Lxn" secondAttribute="trailing" id="Vkc-gN-7oS"/>
+                        <constraint firstItem="0J2-Rc-Lxn" firstAttribute="leading" secondItem="e2w-pY-a9i" secondAttribute="leading" id="ZCC-d7-vE1"/>
+                        <constraint firstItem="xdK-Q2-bVX" firstAttribute="top" secondItem="0J2-Rc-Lxn" secondAttribute="bottom" constant="5" id="d81-zB-EaP"/>
+                        <constraint firstItem="eer-ey-gVa" firstAttribute="top" secondItem="cEX-Ks-dIJ" secondAttribute="bottom" id="fUn-Yp-92J"/>
+                        <constraint firstItem="eer-ey-gVa" firstAttribute="leading" secondItem="e2w-pY-a9i" secondAttribute="leading" constant="14" id="lni-td-Yef"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="e2w-pY-a9i" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="44" id="EwU-Ow-cdO"/>
+                <constraint firstAttribute="bottom" secondItem="e2w-pY-a9i" secondAttribute="bottom" constant="52" id="KaF-yd-6zB"/>
+                <constraint firstItem="e2w-pY-a9i" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Kar-PX-gmD"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="tableContainer" destination="0J2-Rc-Lxn" id="4oW-IC-tbG"/>
+                <outlet property="textField" destination="aS4-Jh-TVC" id="xDN-VI-9OL"/>
+            </connections>
+            <point key="canvasLocation" x="213.07692307692307" y="-152.84360189573459"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="cancle_white" width="16" height="15"/>
+        <image name="search_grey" width="16" height="16"/>
+    </resources>
+</document>

+ 7 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/TeachTool/TeachToolView.h

@@ -15,6 +15,7 @@ typedef NS_ENUM(NSInteger, TeachToolTag) {
     TeachToolTagAccompany,    // 伴奏操作
     TeachToolTagNode,         // 节拍器设置
     TeachToolTagPlay,         // 节拍器播放
+    TeachToolTagCourseware,   // 课件
 };
 
 NS_ASSUME_NONNULL_BEGIN
@@ -36,16 +37,18 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, strong) UIButton *videoButton;
 
-@property (nonatomic, strong) UIButton *libraryButton;
-
-@property (nonatomic, strong) UIButton *accompanyButton;
-
 @property (nonatomic, strong) UIButton *nodeSettingButton;
 
+@property (nonatomic, strong) UIButton *coursewareButton;
+
 @property (nonatomic, strong) UIButton *nodePlayButton;
 
 @property (nonatomic, strong) UIButton *toolButton;
 
+// 是否缩小
+@property (nonatomic, assign) BOOL isLessen;
+
+
 - (void)resetDefaultButton;
 
 - (void)hiddenToolViewWithAnimation:(BOOL)needAnimation;

+ 85 - 141
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/View/TeachTool/TeachToolView.m

@@ -20,6 +20,8 @@
 @property (nonatomic, strong) NSArray *buttonHighlightedImageArray;
 @property (nonatomic, strong) NSArray *buttonCloseImageArray;
 @property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, strong) UIImageView *lessenImage;
 @end
 
 
@@ -30,7 +32,7 @@
     if (self) {
         self.backgroundColor = [UIColor clearColor];
         self.layer.cornerRadius = 6;
-        [self.buttonArray addObjectsFromArray:@[self.whiteboardButton, self.videoButton,self.libraryButton, self.accompanyButton, self.nodeSettingButton, self.nodePlayButton,self.toolButton]];
+        [self.buttonArray addObjectsFromArray:@[self.whiteboardButton, self.videoButton, self.nodeSettingButton, self.nodePlayButton,self.coursewareButton,self.toolButton]];
         [self addSubViews];
     }
     return self;
@@ -43,116 +45,59 @@
         make.left.bottom.bottom.mas_equalTo(self.bgView);
         make.right.mas_equalTo(self.bgView.mas_right).offset(-90);
     }];
-    /*
-    NSString *teacherType = UserDefault(TeacherTypeKey);
-    if ([teacherType isEqualToString:@"1"]) {
-        [self.bgView addSubview:self.whiteboardButton];
-        [self.bgView addSubview:self.videoButton];
-        [self.bgView addSubview:self.libraryButton];
-        [self.bgView addSubview:self.accompanyButton];
-        [self.bgView addSubview:self.nodeSettingButton];
-        [self.bgView addSubview:self.nodePlayButton];
-        [self addSubview:self.toolButton];
-
-        [self setDefaultButtons];
-        // 白板视
-        [self.whiteboardButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.mas_left).offset(7);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        
-        // 视频
-        [self.videoButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.whiteboardButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        self.videoButton.selected = YES;
-
-        // 伴奏曲库
-        [self.libraryButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.videoButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        
-        
-        // 伴奏播放
-        [self.accompanyButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.libraryButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        
-        
-        // 节拍器设置
-        [self.nodeSettingButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.accompanyButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        
-        
-        // 群体节拍器
-        [self.nodePlayButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.nodeSettingButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-        
-    }
-    else {*/
-        [self.bgView addSubview:self.whiteboardButton];
-        [self.bgView addSubview:self.videoButton];
-        [self.bgView addSubview:self.nodeSettingButton];
-        [self.bgView addSubview:self.nodePlayButton];
-        [self addSubview:self.toolButton];
-
-        [self setDefaultButtons];
-        // 白板视
-        [self.whiteboardButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.mas_left).offset(7);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-
-        // 视频
-        [self.videoButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.whiteboardButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-
-        self.videoButton.selected = YES;
-
-        // 节拍器设置
-        [self.nodeSettingButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.videoButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-
-
-        // 群体节拍器
-        [self.nodePlayButton mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(self.nodeSettingButton.mas_right).offset(TButtonSpace);
-            make.width.mas_equalTo(TButtonWidth);
-            make.height.mas_equalTo(TButtonHeight);
-            make.centerY.mas_equalTo(self.mas_centerY);
-        }];
-    /*
-    }
-    */
+    
+    [self.bgView addSubview:self.whiteboardButton];
+    [self.bgView addSubview:self.videoButton];
+    [self.bgView addSubview:self.nodeSettingButton];
+    [self.bgView addSubview:self.nodePlayButton];
+    [self.bgView addSubview:self.coursewareButton];
+    [self addSubview:self.toolButton];
+    
+    [self setDefaultButtons];
+    // 白板视
+    [self.whiteboardButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left).offset(7);
+        make.width.mas_equalTo(TButtonWidth);
+        make.height.mas_equalTo(TButtonHeight);
+        make.centerY.mas_equalTo(self.mas_centerY);
+    }];
+    
+    // 视频
+    [self.videoButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.whiteboardButton.mas_right).offset(TButtonSpace);
+        make.width.mas_equalTo(TButtonWidth);
+        make.height.mas_equalTo(TButtonHeight);
+        make.centerY.mas_equalTo(self.mas_centerY);
+    }];
+    
+    self.videoButton.selected = YES;
+    
+    // 节拍器设置
+    [self.nodeSettingButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.videoButton.mas_right).offset(TButtonSpace);
+        make.width.mas_equalTo(TButtonWidth);
+        make.height.mas_equalTo(TButtonHeight);
+        make.centerY.mas_equalTo(self.mas_centerY);
+    }];
+    
+    
+    // 群体节拍器
+    [self.nodePlayButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.nodeSettingButton.mas_right).offset(TButtonSpace);
+        make.width.mas_equalTo(TButtonWidth);
+        make.height.mas_equalTo(TButtonHeight);
+        make.centerY.mas_equalTo(self.mas_centerY);
+    }];
+    // 课件
+    [self.coursewareButton mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.nodePlayButton.mas_right).offset(TButtonSpace);
+        make.width.mas_equalTo(TButtonWidth);
+        make.height.mas_equalTo(TButtonHeight);
+        make.centerY.mas_equalTo(self.mas_centerY);
+    }];
+    
+    
+    
     // 教学工具
     [self.toolButton mas_makeConstraints:^(MASConstraintMaker *make) {
         make.right.mas_equalTo(self.mas_right);
@@ -164,9 +109,9 @@
 }
 
 - (void)setDefaultButtons {
-    self.buttonImageArray = @[@"tool_whiteboard",@"tool_video", @"tool_musicLibrary", @"tool_accompanyOff", @"node_setting", @"node_play", @"tool_funcation"];
-    self.buttonHighlightedImageArray = @[@"tool_whiteboard_selected", @"tool_video_selected", @"tool_musicLibrary", @"tool_accompanyOn", @"node_setting", @"node_stop", @"tool_funcation"];
-    self.buttonCloseImageArray = @[@"tool_whiteboard_selected",@"tool_video_selected",  @"tool_musicLibrary", @"tool_accompanyOn", @"node_setting", @"node_stop", @"tool_funcation"];
+    self.buttonImageArray = @[@"tool_whiteboard",@"tool_video", @"node_setting", @"node_play", @"tool_coursewares",@"tool_funcation"];
+    self.buttonHighlightedImageArray = @[@"tool_whiteboard_selected", @"tool_video_selected", @"node_setting", @"node_stop",@"tool_coursewares", @"tool_funcation"];
+    self.buttonCloseImageArray = @[@"tool_whiteboard_selected",@"tool_video_selected", @"node_setting", @"node_stop", @"tool_coursewares",@"tool_funcation"];
     for (int i = 0; i < self.buttonImageArray.count; i++) {
         UIButton *button = [self.buttonArray objectAtIndex:i];
         button.selected = NO;
@@ -178,9 +123,8 @@
 
 
 - (void)displayToolView {
-//    NSString *teacherType = UserDefault(TeacherTypeKey);
-//    CGFloat width = [teacherType isEqualToString:@"1"] ? 450 : 350;
-    CGFloat width = 350;
+
+    CGFloat width = 400;
     [UIView animateWithDuration:0.3f animations:^{
         [self mas_updateConstraints:^(MASConstraintMaker *make) {
             make.width.mas_equalTo(width);
@@ -190,6 +134,7 @@
     }];
 }
 
+
 - (void)hiddenToolViewWithAnimation:(BOOL)needAnimation {
     self.toolButton.selected = NO;
     if (needAnimation) {
@@ -217,7 +162,6 @@
 - (void)resetDefaultButton {
     self.whiteboardButton.selected = NO;
     self.videoButton.selected = YES;
-    self.accompanyButton.selected = NO;
     self.nodePlayButton.selected = NO;
     [self hiddenToolViewWithAnimation:YES];
 }
@@ -262,26 +206,6 @@
     return _videoButton;
 }
 
-- (UIButton *)libraryButton {
-    if (!_libraryButton) {
-        _libraryButton = [[UIButton alloc] init];
-        _libraryButton.enabled = YES;
-        _libraryButton.tag = TeachToolTagLibrary;
-        [_libraryButton addTarget:self action:@selector(tapEvent:) forControlEvents:UIControlEventTouchUpInside];
-    }
-    return _libraryButton;
-}
-
-- (UIButton *)accompanyButton {
-    if (!_accompanyButton) {
-        _accompanyButton = [[UIButton alloc] init];
-        _accompanyButton.enabled = YES;
-        _accompanyButton.tag = TeachToolTagAccompany;
-        [_accompanyButton addTarget:self action:@selector(tapEvent:) forControlEvents:UIControlEventTouchUpInside];
-    }
-    return _accompanyButton;
-}
-
 - (UIButton *)nodeSettingButton {
     if (!_nodeSettingButton) {
         _nodeSettingButton = [[UIButton alloc] init];
@@ -302,6 +226,15 @@
     return _nodePlayButton;
 }
 
+- (UIButton *)coursewareButton {
+    if (!_coursewareButton) {
+        _coursewareButton = [[UIButton alloc] init];
+        _coursewareButton.enabled = YES;
+        _coursewareButton.tag = TeachToolTagCourseware;
+        [_coursewareButton addTarget:self action:@selector(tapEvent:) forControlEvents:UIControlEventTouchUpInside];
+    }
+    return _coursewareButton;
+}
 
 - (UIButton *)toolButton {
     if (!_toolButton) {
@@ -321,9 +254,7 @@
 
 - (UIView *)bgView {
     if (!_bgView) {
-//        NSString *teacherType = UserDefault(TeacherTypeKey);
-//        CGFloat width = [teacherType isEqualToString:@"1"] ? 450 : 350;
-        CGFloat width = 350;
+        CGFloat width = 400;
         _bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, 65)];
         _bgView.backgroundColor = [UIColor clearColor];
         _bgView.layer.cornerRadius = 22.0f;
@@ -337,6 +268,19 @@
     }
     return _buttonArray;
 }
+
+- (void)setIsLessen:(BOOL)isLessen {
+    _isLessen = isLessen;
+    if (isLessen) {
+        [self.coursewareButton setImage:[UIImage imageNamed:@"tool_courseware_lessen"] forState:UIControlStateNormal];
+        [self.coursewareButton setImage:[UIImage imageNamed:@"tool_courseware_lessen"] forState:UIControlStateSelected];
+    }
+    else {
+        [self.coursewareButton setImage:[UIImage imageNamed:@"tool_coursewares"] forState:UIControlStateNormal];
+        [self.coursewareButton setImage:[UIImage imageNamed:@"tool_coursewares"] forState:UIControlStateSelected];
+    }
+}
+
 /*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.m

@@ -167,6 +167,10 @@ NSString *const kFeeRecordModelUserId = @"userId";
 - (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;
 }
 

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Live/Controller/CreateLiveViewController.m

@@ -120,7 +120,7 @@
         [self uploadCoverImage:avatarUrl liveTilte:title content:content];
     } faliure:^(NSError * _Nullable error, NSString *descMessaeg) {
         [self removehub];
-        if ([NSString isEmptyString:descMessaeg]) {
+        if (![NSString isEmptyString:descMessaeg]) {
             [self MBPShow:descMessaeg];
         }
     }];

+ 7 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Controller/MineViewController.m

@@ -36,6 +36,7 @@
 #import "EvaluateCourseListViewController.h"
 
 #import "BadgeIntroduceView.h"
+#import "CoursewareViewController.h"
 
 @interface MineViewController ()<UIScrollViewDelegate>
 
@@ -489,6 +490,12 @@
             [self.navigationController pushViewController:webCtrl animated:YES];
         }
             break;
+        case MINENAVATYPE_COURSEWARE:
+        {
+            CoursewareViewController *ctrl = [[CoursewareViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
         default:
             break;
     }

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Controller/CoursewareViewController.h

@@ -0,0 +1,16 @@
+//
+//  CoursewareViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CoursewareViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 273 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Controller/CoursewareViewController.m

@@ -0,0 +1,273 @@
+//
+//  CoursewareViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareViewController.h"
+#import "CoursewareSearchView.h"
+#import "CoursewareTableDelegate.h"
+#import "CoursewareBottomView.h"
+#import "UIButton+EnlargeEdge.h"
+#import "CoursewareNavView.h"
+#import "CoursewareViewModel.h"
+#import "KSBaseWKWebViewController.h"
+
+@interface CoursewareViewController ()<CoursewareViewModelDelegate>
+
+@property (nonatomic, strong) CoursewareNavView *navView;
+
+@property (nonatomic, strong) CoursewareSearchView *searchView;
+
+@property (nonatomic, strong) CoursewareBottomView *bottomView;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, strong) CoursewareTableDelegate *tableDelegate;
+
+@property (nonatomic, strong) UIButton *rightButton;
+
+@property (nonatomic, assign) BOOL isModify;
+
+@property (nonatomic, strong) CoursewareViewModel *viewModel;
+
+@end
+
+@implementation CoursewareViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    self.ks_prefersNavigationBarHidden = YES;
+    [self configUI];
+    [self loadData];
+}
+
+- (void)configUI {
+    
+    [self.scrollView removeFromSuperview];
+    self.view.backgroundColor = HexRGB(0xf8f9fc);
+    [self.view addSubview:self.navView];
+    [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(kNaviBarHeight);
+    }];
+    
+    [self.view addSubview:self.searchView];
+    [self.searchView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.navView.mas_bottom);
+        make.height.mas_equalTo(54.0f);
+    }];
+    [self.view addSubview:self.bottomView];
+    [self.bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self.view);
+        make.height.mas_equalTo(iPhoneXSafeBottomMargin);
+    }];
+    self.bottomView.hidden = YES;
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.searchView.mas_bottom);
+        make.bottom.mas_equalTo(self.bottomView.mas_top);
+    }];
+    
+    MJWeakSelf;
+    self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+        [weakSelf.tableView.mj_footer resetNoMoreData];
+        [weakSelf.viewModel refreshAndRequest];
+    }];
+    self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+        if (weakSelf.viewModel.isLoadMore) {
+            [weakSelf.viewModel loadNextPage];
+        }
+        else {
+            [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+        }
+    }];
+    self.viewModel.delegate = self;
+}
+
+
+- (void)loadData {
+    [self.viewModel refreshAndRequest];
+}
+
+- (void)changeButtonStatus {
+    self.navView.isModify = self.isModify;
+}
+
+- (void)chooseAllCourseware {
+    [self.viewModel chooseAllMusic];
+}
+
+- (void)searchAction:(NSString *)searchKey {
+    self.viewModel.searchKey = searchKey;
+    [self.viewModel refreshAndRequest];
+}
+
+- (void)deleteCoursewareAction {
+    [self.viewModel removeCoursewareAction];
+}
+
+- (void)showMusicDetail:(NSString *)musicId {
+    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+    ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/music-detail?id=",musicId];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+#pragma mark --- viewModel delegate
+- (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)loadSourceSuccess:(NSArray *)sourceArray {
+    self.tableDelegate.dataArray = sourceArray;
+    [self.tableView reloadData];
+}
+
+
+#pragma mark -- setter
+
+- (void)setIsModify:(BOOL)isModify {
+    _isModify = isModify;
+    self.tableDelegate.isModify = isModify;
+    if (isModify) {
+        [self.bottomView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(100);
+        }];
+        self.bottomView.hidden = NO;
+    }
+    else {
+        [self.bottomView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(iPhoneXSafeBottomMargin);
+        }];
+        self.bottomView.hidden = YES;
+    }
+    [self changeButtonStatus];
+    [self.tableView reloadData];
+}
+
+
+
+#pragma mark ----- lazying
+- (CoursewareNavView *)navView {
+    if (!_navView) {
+        _navView = [CoursewareNavView shareInstance];
+        MJWeakSelf;
+        [_navView coursewareActionCallback:^(NAVACTION action) {
+            [weakSelf navViewAction:action];
+        }];
+    }
+    return _navView;
+}
+
+- (void)navViewAction:(NAVACTION)action {
+    switch (action) {
+        case NAVACTION_BACK:
+        {
+            [self backAction];
+        }
+            break;
+        case NAVACTION_CANCLE:
+        {
+            self.isModify = NO;
+            [self.viewModel resetAllChooseStatus];
+        }
+            break;
+        case NAVACTION_EDIT:
+        {
+            self.isModify = YES;
+        }
+            break;
+        case NAVACTION_CHOOSE:
+        {
+            [self chooseAllCourseware];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (CoursewareViewModel *)viewModel {
+    if (!_viewModel) {
+        _viewModel = [[CoursewareViewModel alloc] init];
+    }
+    return _viewModel;
+}
+
+- (CoursewareSearchView *)searchView {
+    if (!_searchView) {
+        _searchView = [CoursewareSearchView shareInstance];
+        MJWeakSelf;
+        [_searchView searchActionCallback:^(NSString * _Nullable searchKey) {
+            [weakSelf searchAction:searchKey];
+        }];
+    }
+    return _searchView;
+}
+
+- (CoursewareTableDelegate *)tableDelegate {
+    if (!_tableDelegate) {
+        _tableDelegate = [[CoursewareTableDelegate alloc] init];
+        MJWeakSelf;
+        [_tableDelegate showMusicCallback:^(NSString * _Nonnull musicId) {
+            [weakSelf showMusicDetail:musicId];
+        }];
+    }
+    return _tableDelegate;
+}
+
+
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.backgroundColor = HexRGB(0xf8f9fc);
+        _tableView.showsVerticalScrollIndicator = NO;
+        _tableView.delegate = self.tableDelegate;
+        _tableView.dataSource = self.tableDelegate;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        _tableView.rowHeight = UITableViewAutomaticDimension;
+        _tableView.rowHeight = 60;
+        
+        UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, 10)];
+        headView.backgroundColor = HexRGB(0xf8f9fc);
+        _tableView.tableHeaderView = headView;
+        
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, 10)];
+        bottomView.backgroundColor = HexRGB(0xf8f9fc);
+        _tableView.tableFooterView = bottomView;
+        
+        [_tableView registerNib:[UINib nibWithNibName:@"CoursewareListCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CoursewareListCell"];
+    }
+    
+    return _tableView;
+}
+
+- (CoursewareBottomView *)bottomView {
+    if (!_bottomView) {
+        _bottomView = [CoursewareBottomView shareInstance];
+        MJWeakSelf;
+        [_bottomView deleteCoursewareAction:^{
+            [weakSelf deleteCoursewareAction];
+        }];
+    }
+    return _bottomView;
+}
+
+/*
+#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/Courseware/Model/CoursewareListModel.h

@@ -0,0 +1,36 @@
+//
+//  CoursewareListModel.h
+//
+//  Created by Steven  on 2022/11/15
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface CoursewareListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *mp3url;
+@property (nonatomic, assign) double musicStatus;
+@property (nonatomic, strong) NSString *delFlag;
+@property (nonatomic, strong) NSString *titleImg;
+@property (nonatomic, strong) NSString *clientType;
+@property (nonatomic, assign) double musicSheetId;
+@property (nonatomic, strong) NSString *paymentType;
+@property (nonatomic, strong) NSString *userId;
+@property (nonatomic, strong) NSString *musicImg;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *username;
+@property (nonatomic, strong) NSString *musicSheetName;
+@property (nonatomic, assign) double status;
+@property (nonatomic, strong) NSString *updateTime;
+
+@property (nonatomic, assign) BOOL isChoose;  // 是否选择
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 197 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Model/CoursewareListModel.m

@@ -0,0 +1,197 @@
+//
+//  CoursewareListModel.m
+//
+//  Created by Steven  on 2022/11/15
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "CoursewareListModel.h"
+
+
+NSString *const kCoursewareListModelId = @"id";
+NSString *const kCoursewareListModelMp3url = @"mp3url";
+NSString *const kCoursewareListModelMusicStatus = @"musicStatus";
+NSString *const kCoursewareListModelDelFlag = @"delFlag";
+NSString *const kCoursewareListModelTitleImg = @"titleImg";
+NSString *const kCoursewareListModelClientType = @"clientType";
+NSString *const kCoursewareListModelMusicSheetId = @"musicSheetId";
+NSString *const kCoursewareListModelPaymentType = @"paymentType";
+NSString *const kCoursewareListModelUserId = @"userId";
+NSString *const kCoursewareListModelMusicImg = @"musicImg";
+NSString *const kCoursewareListModelCreateTime = @"createTime";
+NSString *const kCoursewareListModelUsername = @"username";
+NSString *const kCoursewareListModelMusicSheetName = @"musicSheetName";
+NSString *const kCoursewareListModelStatus = @"status";
+NSString *const kCoursewareListModelUpdateTime = @"updateTime";
+
+
+@interface CoursewareListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation CoursewareListModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize mp3url = _mp3url;
+@synthesize musicStatus = _musicStatus;
+@synthesize delFlag = _delFlag;
+@synthesize titleImg = _titleImg;
+@synthesize clientType = _clientType;
+@synthesize musicSheetId = _musicSheetId;
+@synthesize paymentType = _paymentType;
+@synthesize userId = _userId;
+@synthesize musicImg = _musicImg;
+@synthesize createTime = _createTime;
+@synthesize username = _username;
+@synthesize musicSheetName = _musicSheetName;
+@synthesize status = _status;
+@synthesize updateTime = _updateTime;
+
+
++ (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.internalBaseClassIdentifier = [self objectOrNilForKey:kCoursewareListModelId fromDictionary:dict];
+            self.mp3url = [self objectOrNilForKey:kCoursewareListModelMp3url fromDictionary:dict];
+            self.musicStatus = [[self objectOrNilForKey:kCoursewareListModelMusicStatus fromDictionary:dict] doubleValue];
+            self.delFlag = [self objectOrNilForKey:kCoursewareListModelDelFlag fromDictionary:dict];
+            self.titleImg = [self objectOrNilForKey:kCoursewareListModelTitleImg fromDictionary:dict];
+            self.clientType = [self objectOrNilForKey:kCoursewareListModelClientType fromDictionary:dict];
+            self.musicSheetId = [[self objectOrNilForKey:kCoursewareListModelMusicSheetId fromDictionary:dict] doubleValue];
+            self.paymentType = [self objectOrNilForKey:kCoursewareListModelPaymentType fromDictionary:dict];
+            self.userId = [self objectOrNilForKey:kCoursewareListModelUserId fromDictionary:dict];
+            self.musicImg = [self objectOrNilForKey:kCoursewareListModelMusicImg fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kCoursewareListModelCreateTime fromDictionary:dict];
+            self.username = [self objectOrNilForKey:kCoursewareListModelUsername fromDictionary:dict];
+            self.musicSheetName = [self objectOrNilForKey:kCoursewareListModelMusicSheetName fromDictionary:dict];
+            self.status = [[self objectOrNilForKey:kCoursewareListModelStatus fromDictionary:dict] doubleValue];
+            self.updateTime = [self objectOrNilForKey:kCoursewareListModelUpdateTime fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kCoursewareListModelId];
+    [mutableDict setValue:self.mp3url forKey:kCoursewareListModelMp3url];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.musicStatus] forKey:kCoursewareListModelMusicStatus];
+    [mutableDict setValue:self.delFlag forKey:kCoursewareListModelDelFlag];
+    [mutableDict setValue:self.titleImg forKey:kCoursewareListModelTitleImg];
+    [mutableDict setValue:self.clientType forKey:kCoursewareListModelClientType];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.musicSheetId] forKey:kCoursewareListModelMusicSheetId];
+    [mutableDict setValue:self.paymentType forKey:kCoursewareListModelPaymentType];
+    [mutableDict setValue:self.userId forKey:kCoursewareListModelUserId];
+    [mutableDict setValue:self.musicImg forKey:kCoursewareListModelMusicImg];
+    [mutableDict setValue:self.createTime forKey:kCoursewareListModelCreateTime];
+    [mutableDict setValue:self.username forKey:kCoursewareListModelUsername];
+    [mutableDict setValue:self.musicSheetName forKey:kCoursewareListModelMusicSheetName];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.status] forKey:kCoursewareListModelStatus];
+    [mutableDict setValue:self.updateTime forKey:kCoursewareListModelUpdateTime];
+
+    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.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kCoursewareListModelId];
+    self.mp3url = [aDecoder decodeObjectForKey:kCoursewareListModelMp3url];
+    self.musicStatus = [aDecoder decodeDoubleForKey:kCoursewareListModelMusicStatus];
+    self.delFlag = [aDecoder decodeObjectForKey:kCoursewareListModelDelFlag];
+    self.titleImg = [aDecoder decodeObjectForKey:kCoursewareListModelTitleImg];
+    self.clientType = [aDecoder decodeObjectForKey:kCoursewareListModelClientType];
+    self.musicSheetId = [aDecoder decodeDoubleForKey:kCoursewareListModelMusicSheetId];
+    self.paymentType = [aDecoder decodeObjectForKey:kCoursewareListModelPaymentType];
+    self.userId = [aDecoder decodeObjectForKey:kCoursewareListModelUserId];
+    self.musicImg = [aDecoder decodeObjectForKey:kCoursewareListModelMusicImg];
+    self.createTime = [aDecoder decodeObjectForKey:kCoursewareListModelCreateTime];
+    self.username = [aDecoder decodeObjectForKey:kCoursewareListModelUsername];
+    self.musicSheetName = [aDecoder decodeObjectForKey:kCoursewareListModelMusicSheetName];
+    self.status = [aDecoder decodeDoubleForKey:kCoursewareListModelStatus];
+    self.updateTime = [aDecoder decodeObjectForKey:kCoursewareListModelUpdateTime];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kCoursewareListModelId];
+    [aCoder encodeObject:_mp3url forKey:kCoursewareListModelMp3url];
+    [aCoder encodeDouble:_musicStatus forKey:kCoursewareListModelMusicStatus];
+    [aCoder encodeObject:_delFlag forKey:kCoursewareListModelDelFlag];
+    [aCoder encodeObject:_titleImg forKey:kCoursewareListModelTitleImg];
+    [aCoder encodeObject:_clientType forKey:kCoursewareListModelClientType];
+    [aCoder encodeDouble:_musicSheetId forKey:kCoursewareListModelMusicSheetId];
+    [aCoder encodeObject:_paymentType forKey:kCoursewareListModelPaymentType];
+    [aCoder encodeObject:_userId forKey:kCoursewareListModelUserId];
+    [aCoder encodeObject:_musicImg forKey:kCoursewareListModelMusicImg];
+    [aCoder encodeObject:_createTime forKey:kCoursewareListModelCreateTime];
+    [aCoder encodeObject:_username forKey:kCoursewareListModelUsername];
+    [aCoder encodeObject:_musicSheetName forKey:kCoursewareListModelMusicSheetName];
+    [aCoder encodeDouble:_status forKey:kCoursewareListModelStatus];
+    [aCoder encodeObject:_updateTime forKey:kCoursewareListModelUpdateTime];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    CoursewareListModel *copy = [[CoursewareListModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.mp3url = [self.mp3url copyWithZone:zone];
+        copy.musicStatus = self.musicStatus;
+        copy.delFlag = [self.delFlag copyWithZone:zone];
+        copy.titleImg = [self.titleImg copyWithZone:zone];
+        copy.clientType = [self.clientType copyWithZone:zone];
+        copy.musicSheetId = self.musicSheetId;
+        copy.paymentType = [self.paymentType copyWithZone:zone];
+        copy.userId = [self.userId copyWithZone:zone];
+        copy.musicImg = [self.musicImg copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.username = [self.username copyWithZone:zone];
+        copy.musicSheetName = [self.musicSheetName copyWithZone:zone];
+        copy.status = self.status;
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 25 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Protocal/CoursewareTableDelegate.h

@@ -0,0 +1,25 @@
+//
+//  CoursewareTableDelegate.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^ShowMusicDetailCallback)(NSString *musicId);
+
+@interface CoursewareTableDelegate : NSObject<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, strong) NSArray *dataArray;
+
+@property (nonatomic, assign) BOOL isModify;
+
+- (void)showMusicCallback:(ShowMusicDetailCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 52 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Protocal/CoursewareTableDelegate.m

@@ -0,0 +1,52 @@
+//
+//  CoursewareTableDelegate.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareTableDelegate.h"
+#import "CoursewareListCell.h"
+#import "CoursewareListModel.h"
+
+@interface CoursewareTableDelegate ()
+
+@property (nonatomic, copy) ShowMusicDetailCallback callback;
+
+@end
+
+@implementation CoursewareTableDelegate
+- (void)showMusicCallback:(ShowMusicDetailCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    CoursewareListModel *model = self.dataArray[indexPath.row];
+    CoursewareListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CoursewareListCell"];
+    [cell configSource:model isModify:self.isModify];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (self.isModify) { // 修改情况下 选择和未选择
+        CoursewareListModel *model = self.dataArray[indexPath.row];
+        model.isChoose = !model.isChoose;
+        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
+    }
+    else {
+        // 跳转到中间页面
+        CoursewareListModel *model = self.dataArray[indexPath.row];
+        if (self.callback) {
+            self.callback([NSString stringWithFormat:@"%.0f",model.musicSheetId]);
+        }
+    }
+}
+
+
+@end

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.h

@@ -0,0 +1,22 @@
+//
+//  CoursewareBottomView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^CoursewareDeleteCallback)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CoursewareBottomView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)deleteCoursewareAction:(CoursewareDeleteCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 44 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.m

@@ -0,0 +1,44 @@
+//
+//  CoursewareBottomView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareBottomView.h"
+
+@interface CoursewareBottomView ()
+
+@property (nonatomic, copy) CoursewareDeleteCallback callback;
+
+@end
+
+@implementation CoursewareBottomView
+
++ (instancetype)shareInstance {
+    CoursewareBottomView *view = [[[NSBundle mainBundle] loadNibNamed:@"CoursewareBottomView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)deleteCoursewareAction:(CoursewareDeleteCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)deletewareAction:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 46 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareBottomView.xib

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="CoursewareBottomView">
+            <rect key="frame" x="0.0" y="0.0" width="390" height="100"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7qU-IX-ADx">
+                    <rect key="frame" x="28" y="16" width="334" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="YEg-80-onV"/>
+                    </constraints>
+                    <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="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="deletewareAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="bTZ-GA-ga6"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="7qU-IX-ADx" secondAttribute="bottom" constant="40" id="4fF-hx-Ln8"/>
+                <constraint firstAttribute="trailing" secondItem="7qU-IX-ADx" secondAttribute="trailing" constant="28" id="GUh-JL-RMx"/>
+                <constraint firstItem="7qU-IX-ADx" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="vRt-4l-u7v"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="84.615384615384613" y="-24.881516587677723"/>
+        </view>
+    </objects>
+</document>

+ 18 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.h

@@ -0,0 +1,18 @@
+//
+//  CoursewareListCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CoursewareListCell : UITableViewCell
+
+- (void)configSource:(id)source isModify:(BOOL)isModify;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.m

@@ -0,0 +1,70 @@
+//
+//  CoursewareListCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareListCell.h"
+#import "CoursewareListModel.h"
+
+@interface CoursewareListCell ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *musicLogoImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *musicNameLabel;
+@property (weak, nonatomic) IBOutlet UIView *expireView;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *expireWidth;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *chooseImageLeading;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *chooseImageWidth;
+
+@property (weak, nonatomic) IBOutlet UIImageView *chooseImage;
+
+@end
+
+@implementation CoursewareListCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)configSource:(id)source isModify:(BOOL)isModify {
+    if (isModify) {
+        self.chooseImage.hidden = NO;
+        self.chooseImageWidth.constant = 18.0f;
+    }
+    else {
+        self.chooseImage.hidden = YES;
+        self.chooseImageWidth.constant = 0.0f;
+    }
+    if ([source isKindOfClass:[CoursewareListModel class]]) {
+        CoursewareListModel *model = source;
+        NSString *imageName = model.isChoose ? @"choose_image" : @"unchoose_image";
+        [self.chooseImage setImage:[UIImage imageNamed:imageName]];
+        
+        if (model.status == 1) { // 有效
+            self.expireView.hidden = YES;
+            self.expireWidth.constant = 0.0f;
+            self.chooseImageLeading.constant = 0.0f;
+        }
+        else { // 无效
+            self.expireView.hidden = NO;
+            self.expireWidth.constant = 65.0f;
+            self.chooseImageLeading.constant = 5.0f;
+        }
+        [self.musicLogoImage sd_setImageWithURL:[NSURL URLWithString:[model.titleImg getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"music_logo"]];
+        self.musicNameLabel.text = [NSString returnNoNullStringWithString:model.musicSheetName];
+    }
+    
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 127 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareListCell.xib

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="74" id="KGk-i7-Jjw" customClass="CoursewareListCell">
+            <rect key="frame" x="0.0" y="0.0" width="408" height="74"/>
+            <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="408" height="74"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3i5-2a-HuF">
+                        <rect key="frame" x="14" y="0.0" width="380" height="66"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="music_logo" translatesAutoresizingMaskIntoConstraints="NO" id="OII-Wk-Tvi">
+                                <rect key="frame" x="8" y="15" width="36" height="36"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="36" id="qB5-c5-Dbp"/>
+                                    <constraint firstAttribute="width" constant="36" id="uiE-AX-9TJ"/>
+                                </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="5"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Letting Go.MP3" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1zb-Mt-LbN">
+                                <rect key="frame" x="54" y="22" width="113" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="yMH-Ny-kS2"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                <color key="textColor" red="0.10196078431372549" green="0.10196078431372549" blue="0.10196078431372549" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="unchoose_image" translatesAutoresizingMaskIntoConstraints="NO" id="eiR-Jq-366">
+                                <rect key="frame" x="348" y="24" width="18" height="18"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="18" id="dkv-tv-w9I"/>
+                                    <constraint firstAttribute="width" constant="18" id="qB7-tw-Mb9"/>
+                                </constraints>
+                            </imageView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CoE-Yv-a6J">
+                                <rect key="frame" x="278" y="18" width="65" height="30"/>
+                                <subviews>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="courseware_tips" translatesAutoresizingMaskIntoConstraints="NO" id="Ub7-3O-XTL">
+                                        <rect key="frame" x="2" y="8.6666666666666679" width="13" height="13"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="13" id="Csz-sm-IuN"/>
+                                            <constraint firstAttribute="height" constant="13" id="xVG-By-u63"/>
+                                        </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="V1P-VE-fcl">
+                                        <rect key="frame" x="20" y="7" width="43" height="16"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                        <color key="textColor" red="1" green="0.50196078431372548" blue="0.17254901960784313" alpha="1" colorSpace="calibratedRGB"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                </subviews>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <constraints>
+                                    <constraint firstItem="V1P-VE-fcl" firstAttribute="leading" secondItem="Ub7-3O-XTL" secondAttribute="trailing" constant="5" id="0Uy-j2-bhF"/>
+                                    <constraint firstItem="Ub7-3O-XTL" firstAttribute="centerY" secondItem="CoE-Yv-a6J" secondAttribute="centerY" id="5om-gt-8Aq"/>
+                                    <constraint firstAttribute="height" constant="30" id="GGP-62-3YP"/>
+                                    <constraint firstItem="V1P-VE-fcl" firstAttribute="centerY" secondItem="Ub7-3O-XTL" secondAttribute="centerY" id="GMa-pa-1MO"/>
+                                    <constraint firstItem="Ub7-3O-XTL" firstAttribute="leading" secondItem="CoE-Yv-a6J" secondAttribute="leading" constant="2" id="MJm-qx-dLh"/>
+                                    <constraint firstAttribute="trailing" secondItem="V1P-VE-fcl" secondAttribute="trailing" constant="2" id="aj9-i0-EgX"/>
+                                    <constraint firstAttribute="width" constant="65" id="uql-UW-2JW"/>
+                                </constraints>
+                            </view>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="1zb-Mt-LbN" firstAttribute="centerY" secondItem="OII-Wk-Tvi" secondAttribute="centerY" id="2oy-cb-b7X"/>
+                            <constraint firstItem="eiR-Jq-366" firstAttribute="centerY" secondItem="CoE-Yv-a6J" secondAttribute="centerY" id="Hdw-UC-1Zx"/>
+                            <constraint firstItem="CoE-Yv-a6J" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1zb-Mt-LbN" secondAttribute="trailing" constant="15" id="Hzd-Db-dsg"/>
+                            <constraint firstItem="eiR-Jq-366" firstAttribute="centerY" secondItem="3i5-2a-HuF" secondAttribute="centerY" id="KYa-zz-tX8"/>
+                            <constraint firstItem="1zb-Mt-LbN" firstAttribute="leading" secondItem="OII-Wk-Tvi" secondAttribute="trailing" constant="10" id="Oks-av-TSs"/>
+                            <constraint firstItem="OII-Wk-Tvi" firstAttribute="leading" secondItem="3i5-2a-HuF" secondAttribute="leading" constant="8" id="XDa-Io-ad8"/>
+                            <constraint firstItem="eiR-Jq-366" firstAttribute="leading" secondItem="CoE-Yv-a6J" secondAttribute="trailing" constant="5" id="YEz-Oz-jtj"/>
+                            <constraint firstItem="OII-Wk-Tvi" firstAttribute="centerY" secondItem="3i5-2a-HuF" secondAttribute="centerY" id="pxi-lm-nh0"/>
+                            <constraint firstAttribute="trailing" secondItem="eiR-Jq-366" secondAttribute="trailing" constant="14" id="wjZ-VU-7t5"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="3i5-2a-HuF" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="69V-N2-rQx"/>
+                    <constraint firstItem="3i5-2a-HuF" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="94h-PV-vSK"/>
+                    <constraint firstAttribute="bottom" secondItem="3i5-2a-HuF" secondAttribute="bottom" constant="8" id="GlJ-EO-KbJ"/>
+                    <constraint firstAttribute="trailing" secondItem="3i5-2a-HuF" secondAttribute="trailing" constant="14" id="gaY-jw-8yY"/>
+                </constraints>
+            </tableViewCellContentView>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="chooseImage" destination="eiR-Jq-366" id="wMd-pc-iXs"/>
+                <outlet property="chooseImageLeading" destination="YEz-Oz-jtj" id="hQL-d7-mtP"/>
+                <outlet property="chooseImageWidth" destination="qB7-tw-Mb9" id="zip-CU-Yht"/>
+                <outlet property="expireView" destination="CoE-Yv-a6J" id="xe9-DZ-D3c"/>
+                <outlet property="expireWidth" destination="uql-UW-2JW" id="oHc-gY-X6h"/>
+                <outlet property="musicLogoImage" destination="OII-Wk-Tvi" id="119-nJ-sCq"/>
+                <outlet property="musicNameLabel" destination="1zb-Mt-LbN" id="iQV-gc-rcp"/>
+            </connections>
+            <point key="canvasLocation" x="152.30769230769229" y="3.5545023696682461"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="courseware_tips" width="13" height="13"/>
+        <image name="music_logo" width="41" height="40"/>
+        <image name="unchoose_image" width="18" height="18"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 32 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.h

@@ -0,0 +1,32 @@
+//
+//  CoursewareNavView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSInteger, NAVACTION) {
+    NAVACTION_BACK,   // 返回
+    NAVACTION_CANCLE, // 取消
+    NAVACTION_EDIT,   // 编辑
+    NAVACTION_CHOOSE, // 全选
+};
+
+typedef void(^CoursewareNavCallback)(NAVACTION action);
+
+@interface CoursewareNavView : UIView
+
+@property (nonatomic, assign) BOOL isModify;
+
++ (instancetype)shareInstance;
+
+- (void)coursewareActionCallback:(CoursewareNavCallback)callback;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 78 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.m

@@ -0,0 +1,78 @@
+//
+//  CoursewareNavView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareNavView.h"
+
+@interface CoursewareNavView ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *leftImage;
+
+@property (weak, nonatomic) IBOutlet UIButton *rightButton;
+
+@property (nonatomic, copy) CoursewareNavCallback callback;
+
+@end
+
+@implementation CoursewareNavView
+
++ (instancetype)shareInstance {
+    CoursewareNavView *view = [[[NSBundle mainBundle] loadNibNamed:@"CoursewareNavView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)coursewareActionCallback:(CoursewareNavCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+
+- (IBAction)leftButtonAction:(id)sender {
+    if (_isModify) {
+        self.callback(NAVACTION_CANCLE);
+    }
+    else {
+        self.callback(NAVACTION_BACK);
+    }
+    
+}
+
+- (IBAction)rightButtonAction:(id)sender {
+    if (_isModify) {
+        self.callback(NAVACTION_CHOOSE);
+    }
+    else {
+        self.callback(NAVACTION_EDIT);
+    }
+}
+
+
+- (void)setIsModify:(BOOL)isModify {
+    _isModify = isModify;
+    if (isModify) {
+        [self.leftImage setImage:[UIImage imageNamed:@"courseware_cancle"]];
+        [self.rightButton setTitleColor:HexRGB(0x2dc7aa) forState:UIControlStateNormal];
+        [self.rightButton setTitle:@"全选" forState:UIControlStateNormal];
+        [self.rightButton.titleLabel setFont:[UIFont systemFontOfSize:14.0f weight:UIFontWeightMedium]];
+    }
+    else {
+        [self.leftImage setImage:[UIImage imageNamed:@"courseware_back"]];
+        [self.rightButton setTitleColor:HexRGB(0x666666) forState:UIControlStateNormal];
+        [self.rightButton setTitle:@"编辑" forState:UIControlStateNormal];
+        [self.rightButton.titleLabel setFont:[UIFont systemFontOfSize:14.0f]];
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 96 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareNavView.xib

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <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="CoursewareNavView">
+            <rect key="frame" x="0.0" y="0.0" width="390" height="80"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4d8-Ly-c2O">
+                    <rect key="frame" x="0.0" y="36" width="390" height="44"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="courseware_back" translatesAutoresizingMaskIntoConstraints="NO" id="RBb-xf-7jh">
+                            <rect key="frame" x="14" y="11" width="22" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="QHG-yf-OlY"/>
+                                <constraint firstAttribute="width" constant="22" id="ptb-bW-XtJ"/>
+                            </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="E4C-H4-Yvk">
+                            <rect key="frame" x="158.33333333333334" y="11.666666666666664" width="73.666666666666657" height="21"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QWg-bm-59t">
+                            <rect key="frame" x="320" y="0.0" width="60" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="60" id="FZR-Yq-X0B"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="编辑">
+                                <color key="titleColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                            </state>
+                            <connections>
+                                <action selector="rightButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="g2b-Ga-nQU"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xaI-g1-Agm">
+                            <rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="44" id="roV-F6-Rt9"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="leftButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="y0t-jL-hMC"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="RBb-xf-7jh" firstAttribute="centerY" secondItem="4d8-Ly-c2O" secondAttribute="centerY" id="3fQ-fQ-G8H"/>
+                        <constraint firstItem="E4C-H4-Yvk" firstAttribute="centerX" secondItem="4d8-Ly-c2O" secondAttribute="centerX" id="7VC-As-1WS"/>
+                        <constraint firstItem="E4C-H4-Yvk" firstAttribute="centerY" secondItem="4d8-Ly-c2O" secondAttribute="centerY" id="9rh-5O-CUV"/>
+                        <constraint firstItem="xaI-g1-Agm" firstAttribute="top" secondItem="4d8-Ly-c2O" secondAttribute="top" id="Hce-Yz-W2E"/>
+                        <constraint firstItem="RBb-xf-7jh" firstAttribute="leading" secondItem="4d8-Ly-c2O" secondAttribute="leading" constant="14" id="KkX-Lj-n2C"/>
+                        <constraint firstAttribute="bottom" secondItem="QWg-bm-59t" secondAttribute="bottom" id="Mai-lB-lJe"/>
+                        <constraint firstAttribute="height" constant="44" id="WcK-Ru-tzV"/>
+                        <constraint firstItem="QWg-bm-59t" firstAttribute="top" secondItem="4d8-Ly-c2O" secondAttribute="top" id="ZTj-a5-Opq"/>
+                        <constraint firstAttribute="bottom" secondItem="xaI-g1-Agm" secondAttribute="bottom" id="aHS-0L-wV1"/>
+                        <constraint firstItem="xaI-g1-Agm" firstAttribute="leading" secondItem="4d8-Ly-c2O" secondAttribute="leading" id="irj-oa-Ldz"/>
+                        <constraint firstAttribute="trailing" secondItem="QWg-bm-59t" secondAttribute="trailing" constant="10" id="l09-Q0-TPm"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="4d8-Ly-c2O" secondAttribute="trailing" id="EU0-Qp-bN3"/>
+                <constraint firstItem="4d8-Ly-c2O" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="VUE-du-6Bg"/>
+                <constraint firstAttribute="bottom" secondItem="4d8-Ly-c2O" secondAttribute="bottom" id="ram-iL-82O"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="leftImage" destination="RBb-xf-7jh" id="qhC-yn-u5l"/>
+                <outlet property="rightButton" destination="QWg-bm-59t" id="H99-TE-u3n"/>
+            </connections>
+            <point key="canvasLocation" x="187.69230769230768" y="-95.97156398104265"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="courseware_back" width="22" height="22"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 23 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareSearchView.h

@@ -0,0 +1,23 @@
+//
+//  CoursewareSearchView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^CoursewareSearchCallback)(NSString * _Nullable searchKey);
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+@interface CoursewareSearchView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)searchActionCallback:(CoursewareSearchCallback)calback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 61 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/View/CoursewareSearchView.m

@@ -0,0 +1,61 @@
+//
+//  CoursewareSearchView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/11/15.
+//
+
+#import "CoursewareSearchView.h"
+
+@interface CoursewareSearchView ()<UITextFieldDelegate>
+
+@property (weak, nonatomic) IBOutlet UITextField *textField;
+
+@property (nonatomic, copy) CoursewareSearchCallback callback;
+
+@end
+
+@implementation CoursewareSearchView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.textField.delegate = self;
+}
+
++ (instancetype)shareInstance {
+    CoursewareSearchView *view = [[[NSBundle mainBundle] loadNibNamed:@"CoursewareSearchView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)searchActionCallback:(CoursewareSearchCallback)calback {
+    if (calback) {
+        self.callback = calback;
+    }
+}
+
+- (IBAction)searchAction:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        self.callback(self.textField.text);
+    }
+}
+
+- (BOOL)textFieldShouldReturn:(UITextField *)textField {
+    [self endEditing:YES];
+    return YES;
+}
+
+
+- (void)textFieldDidEndEditing:(UITextField *)textField {
+    if (self.callback) {
+        self.callback(textField.text);
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini