Browse Source

UI 调整

Steven 3 years ago
parent
commit
8cb80fa1be
100 changed files with 2853 additions and 533 deletions
  1. 144 6
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. BIN
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate
  3. 116 68
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  4. 34 12
      KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m
  5. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/Icon.png
  6. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadApp_76pt.png
  7. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadApp_76pt@2x.png
  8. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadNotifications_20pt.png
  9. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadNotifications_20pt@2x.png
  10. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadProApp_83.5pt@2x.png
  11. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight5_29pt.png
  12. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight5_29pt@2x.png
  13. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight7_40pt.png
  14. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight7_40pt@2x.png
  15. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneApp_60pt@2x.png
  16. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneApp_60pt@3x.png
  17. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneNotification_20pt@2x.png
  18. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneNotification_20pt@3x.png
  19. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight5_29pt@2x.png
  20. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight5_29pt@3x.png
  21. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight7_40pt@3x.png
  22. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/iconiPhoneSpootlight7_40pt@2x.png
  23. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/edit_button.imageset/edit_button@2x.png
  24. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/edit_button.imageset/edit_button@3x.png
  25. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/course_musicRoom.imageset/Contents.json
  26. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/course_musicRoom.imageset/course_musicRoom@2x.png
  27. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/course_musicRoom.imageset/course_musicRoom@3x.png
  28. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/homework_next.imageset/Contents.json
  29. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/homework_next.imageset/homework_next@2x.png
  30. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/homework_next.imageset/homework_next@3x.png
  31. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_musicRoom.imageset/home_musicRoom@2x.png
  32. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_musicRoom.imageset/home_musicRoom@3x.png
  33. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneGroup.imageset/Contents.json
  34. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneGroup.imageset/mine_noneGroup@2x.png
  35. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneGroup.imageset/mine_noneGroup@3x.png
  36. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneIntroduce.imageset/Contents.json
  37. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneIntroduce.imageset/mine_noneIntroduce@2x.png
  38. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneIntroduce.imageset/mine_noneIntroduce@3x.png
  39. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneVideo.imageset/Contents.json
  40. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneVideo.imageset/mine_noneVideo@2x.png
  41. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/Style/mine_noneVideo.imageset/mine_noneVideo@3x.png
  42. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/klx_logo.imageset/klx_logo@2x.png
  43. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/klx_logo.imageset/klx_logo@3x.png
  44. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/upAlert_bg.imageset/Contents.json
  45. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/upAlert_bg.imageset/upAlert_bg@2x.png
  46. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/upAlert_bg.imageset/upAlert_bg@3x.png
  47. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/BaseAlertView.h
  48. 20 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/BaseAlertView.m
  49. 1057 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAccompanyWebViewController.m
  50. 12 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m
  51. 0 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  52. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.h
  53. 81 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.m
  54. 148 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.xib
  55. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSTipsAlert.h
  56. 45 25
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSTipsAlert.xib
  57. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSUpdateAlert.h
  58. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSUpdateAlert.xib
  59. 40 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.h
  60. 435 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.m
  61. 9 4
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSButtonStatusView.m
  62. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSFullDatePicker.m
  63. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/KSImageAlert.h
  64. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/UMShare/KSUMShareManager.h
  65. 89 39
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/UMShare/KSUMShareManager.m
  66. 9 9
      KulexiuForTeacher/KulexiuForTeacher/Info.plist
  67. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSChatListViewController.m
  68. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupSettingViewController.m
  69. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/KSChatListSearchView.m
  70. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/KSChatListSearchView.xib
  71. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m
  72. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/AccompanyCourse/View/AccompanyStudentEvaCell.xib
  73. 19 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/Controller/CourseViewController.m
  74. 3 22
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/Controller/MusicRoomViewController.m
  75. 7 24
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomCourseInfoCell.m
  76. 70 105
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomCourseInfoCell.xib
  77. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomStudentCell.m
  78. 13 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomStudentCell.xib
  79. 55 9
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m
  80. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/Controller/EvaluateCourseListViewController.m
  81. 0 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/View/EvaluateCourseBodyView.m
  82. 10 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/View/EvaluateSortView.xib
  83. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Controller/HomeworkListViewController.m
  84. 0 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkBodyView.m
  85. 10 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkSortView.xib
  86. 0 11
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.m
  87. 5 40
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.xib
  88. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m
  89. 3 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html
  90. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.xib
  91. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.m
  92. 7 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.xib
  93. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.m
  94. 2 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.m
  95. 25 13
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.h
  96. 169 89
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.m
  97. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.m
  98. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/WithdrawApplyBodyView.xib
  99. 3 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/Controller/MyMusicViewController.m
  100. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MusicShareDisplayView.xib

+ 144 - 6
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -479,9 +479,28 @@
 		BC1365C9280D476500EB03E2 /* NotiferMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC1365C7280D476500EB03E2 /* NotiferMessageCell.xib */; };
 		BC1365CC280D478F00EB03E2 /* NotiferMessageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1365CB280D478F00EB03E2 /* NotiferMessageModel.m */; };
 		BC1365CF280D48B800EB03E2 /* HomeworkListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1365CE280D48B800EB03E2 /* HomeworkListModel.m */; };
+		BC2456E3286BE85A00D1F7C0 /* MineStyleEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456E2286BE85A00D1F7C0 /* MineStyleEmptyView.m */; };
+		BC2456E5286BE86600D1F7C0 /* MineStyleEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2456E4286BE86600D1F7C0 /* MineStyleEmptyView.xib */; };
+		BC2456E9286BEF8000D1F7C0 /* MineEmptyGroupCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456E7286BEF8000D1F7C0 /* MineEmptyGroupCell.m */; };
+		BC2456EA286BEF8000D1F7C0 /* MineEmptyGroupCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2456E8286BEF8000D1F7C0 /* MineEmptyGroupCell.xib */; };
+		BC2456EE286BEFC600D1F7C0 /* MineEmptyIntroduceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456EC286BEFC600D1F7C0 /* MineEmptyIntroduceCell.m */; };
+		BC2456EF286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2456ED286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib */; };
+		BC2456F3286BEFDA00D1F7C0 /* MineEmptyVideoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456F1286BEFDA00D1F7C0 /* MineEmptyVideoCell.m */; };
+		BC2456F4286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2456F2286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib */; };
+		BC2456F7286C421700D1F7C0 /* KSVideoRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456F6286C421700D1F7C0 /* KSVideoRecordManager.m */; };
+		BC245704286C434800D1F7C0 /* MidiPlayerEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456FC286C434800D1F7C0 /* MidiPlayerEngine.m */; };
+		BC245705286C434800D1F7C0 /* GCDTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456FD286C434800D1F7C0 /* GCDTimer.m */; };
+		BC245706286C434800D1F7C0 /* CoreAudioUtils.c in Sources */ = {isa = PBXBuildFile; fileRef = BC2456FE286C434800D1F7C0 /* CoreAudioUtils.c */; };
+		BC245707286C434800D1F7C0 /* CAudioUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456FF286C434800D1F7C0 /* CAudioUnit.m */; };
+		BC24570C286C436E00D1F7C0 /* KSCloudBeatView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC245709286C436E00D1F7C0 /* KSCloudBeatView.xib */; };
+		BC24570D286C436E00D1F7C0 /* KSCloudBeatView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC24570B286C436E00D1F7C0 /* KSCloudBeatView.m */; };
+		BC245710286C437D00D1F7C0 /* synthgms.sf2 in Resources */ = {isa = PBXBuildFile; fileRef = BC24570F286C437D00D1F7C0 /* synthgms.sf2 */; };
 		BC28582F2809451B0024697C /* EvaluateCouseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC28582D2809451B0024697C /* EvaluateCouseCell.m */; };
 		BC2858302809451B0024697C /* EvaluateCouseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC28582E2809451B0024697C /* EvaluateCouseCell.xib */; };
 		BC285833280947BA0024697C /* EvaluateSortView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC285832280947BA0024697C /* EvaluateSortView.m */; };
+		BC32E109286AB142001434DD /* BaseAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC32E108286AB142001434DD /* BaseAlertView.m */; };
+		BC32E10C286AB31C001434DD /* KSPublicAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC32E10B286AB31C001434DD /* KSPublicAlertView.m */; };
+		BC32E10E286AB326001434DD /* KSPublicAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC32E10D286AB326001434DD /* KSPublicAlertView.xib */; };
 		BC332DB3284866BE005AEF95 /* KSOrderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC332DB1284866BE005AEF95 /* KSOrderManager.m */; };
 		BC3DE082280D88670027DC0E /* EvaluateListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3DE081280D88670027DC0E /* EvaluateListModel.m */; };
 		BC3DE088280D89E90027DC0E /* EvaluateDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3DE087280D89E90027DC0E /* EvaluateDetailViewController.m */; };
@@ -668,6 +687,7 @@
 		BCB908FD2850C9CB00F5FF69 /* MusicChooseSearchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB908FC2850C9CB00F5FF69 /* MusicChooseSearchView.xib */; };
 		BCB909042851E25D00F5FF69 /* KSShareChooseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB909032851E25D00F5FF69 /* KSShareChooseViewController.m */; };
 		BCB909072851E32C00F5FF69 /* ShareChooseMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB909062851E32C00F5FF69 /* ShareChooseMainView.m */; };
+		BCB9FA13286C7C6C005D766B /* KSShareGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB9FA12286C7C6C005D766B /* KSShareGroupViewController.m */; };
 		BCC03F88280460C000461B7C /* InstrumentHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC03F86280460C000461B7C /* InstrumentHeaderView.m */; };
 		BCC03F89280460C000461B7C /* InstrumentHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCC03F87280460C000461B7C /* InstrumentHeaderView.xib */; };
 		BCC03F8C280526B300461B7C /* MyStyleVideoChooseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC03F8B280526B300461B7C /* MyStyleVideoChooseView.m */; };
@@ -740,7 +760,7 @@
 		BCC9F44627F69BD200647449 /* RoomMember.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F3F827F69BD200647449 /* RoomMember.m */; };
 		BCC9F44727F69BD200647449 /* ClassSongMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F3F927F69BD200647449 /* ClassSongMessage.m */; };
 		BCC9F44827F69BD200647449 /* Classroom.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F3FA27F69BD200647449 /* Classroom.m */; };
-		BCC9F44927F69BD200647449 /* ClassroomService.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F40027F69BD200647449 /* ClassroomService.m */; };
+		BCC9F44927F69BD200647449 /* x.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F40027F69BD200647449 /* x.m */; };
 		BCC9F44A27F69BD200647449 /* RTCService.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F40227F69BD200647449 /* RTCService.m */; };
 		BCC9F44B27F69BD200647449 /* KSIMService.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC9F40627F69BD200647449 /* KSIMService.m */; };
 		BCD457A5286319660010B493 /* CourseTimeSegView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD457A4286319660010B493 /* CourseTimeSegView.m */; };
@@ -1712,11 +1732,42 @@
 		BC1365CB280D478F00EB03E2 /* NotiferMessageModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotiferMessageModel.m; sourceTree = "<group>"; };
 		BC1365CD280D48B700EB03E2 /* HomeworkListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeworkListModel.h; sourceTree = "<group>"; };
 		BC1365CE280D48B800EB03E2 /* HomeworkListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeworkListModel.m; sourceTree = "<group>"; };
+		BC2456E1286BE85A00D1F7C0 /* MineStyleEmptyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineStyleEmptyView.h; sourceTree = "<group>"; };
+		BC2456E2286BE85A00D1F7C0 /* MineStyleEmptyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineStyleEmptyView.m; sourceTree = "<group>"; };
+		BC2456E4286BE86600D1F7C0 /* MineStyleEmptyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineStyleEmptyView.xib; sourceTree = "<group>"; };
+		BC2456E6286BEF8000D1F7C0 /* MineEmptyGroupCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineEmptyGroupCell.h; sourceTree = "<group>"; };
+		BC2456E7286BEF8000D1F7C0 /* MineEmptyGroupCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineEmptyGroupCell.m; sourceTree = "<group>"; };
+		BC2456E8286BEF8000D1F7C0 /* MineEmptyGroupCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineEmptyGroupCell.xib; sourceTree = "<group>"; };
+		BC2456EB286BEFC600D1F7C0 /* MineEmptyIntroduceCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineEmptyIntroduceCell.h; sourceTree = "<group>"; };
+		BC2456EC286BEFC600D1F7C0 /* MineEmptyIntroduceCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineEmptyIntroduceCell.m; sourceTree = "<group>"; };
+		BC2456ED286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineEmptyIntroduceCell.xib; sourceTree = "<group>"; };
+		BC2456F0286BEFDA00D1F7C0 /* MineEmptyVideoCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineEmptyVideoCell.h; sourceTree = "<group>"; };
+		BC2456F1286BEFDA00D1F7C0 /* MineEmptyVideoCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineEmptyVideoCell.m; sourceTree = "<group>"; };
+		BC2456F2286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineEmptyVideoCell.xib; sourceTree = "<group>"; };
+		BC2456F5286C421700D1F7C0 /* KSVideoRecordManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSVideoRecordManager.h; sourceTree = "<group>"; };
+		BC2456F6286C421700D1F7C0 /* KSVideoRecordManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSVideoRecordManager.m; sourceTree = "<group>"; };
+		BC2456FC286C434800D1F7C0 /* MidiPlayerEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MidiPlayerEngine.m; sourceTree = "<group>"; };
+		BC2456FD286C434800D1F7C0 /* GCDTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDTimer.m; sourceTree = "<group>"; };
+		BC2456FE286C434800D1F7C0 /* CoreAudioUtils.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; path = CoreAudioUtils.c; sourceTree = "<group>"; };
+		BC2456FF286C434800D1F7C0 /* CAudioUnit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAudioUnit.m; sourceTree = "<group>"; };
+		BC245700286C434800D1F7C0 /* MidiPlayerEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MidiPlayerEngine.h; sourceTree = "<group>"; };
+		BC245701286C434800D1F7C0 /* CoreAudioUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioUtils.h; sourceTree = "<group>"; };
+		BC245702286C434800D1F7C0 /* GCDTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDTimer.h; sourceTree = "<group>"; };
+		BC245703286C434800D1F7C0 /* CAudioUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAudioUnit.h; sourceTree = "<group>"; };
+		BC245709286C436E00D1F7C0 /* KSCloudBeatView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSCloudBeatView.xib; sourceTree = "<group>"; };
+		BC24570A286C436E00D1F7C0 /* KSCloudBeatView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSCloudBeatView.h; sourceTree = "<group>"; };
+		BC24570B286C436E00D1F7C0 /* KSCloudBeatView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSCloudBeatView.m; sourceTree = "<group>"; };
+		BC24570F286C437D00D1F7C0 /* synthgms.sf2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = synthgms.sf2; sourceTree = "<group>"; };
 		BC28582C2809451B0024697C /* EvaluateCouseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EvaluateCouseCell.h; sourceTree = "<group>"; };
 		BC28582D2809451B0024697C /* EvaluateCouseCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EvaluateCouseCell.m; sourceTree = "<group>"; };
 		BC28582E2809451B0024697C /* EvaluateCouseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EvaluateCouseCell.xib; sourceTree = "<group>"; };
 		BC285831280947BA0024697C /* EvaluateSortView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EvaluateSortView.h; sourceTree = "<group>"; };
 		BC285832280947BA0024697C /* EvaluateSortView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EvaluateSortView.m; sourceTree = "<group>"; };
+		BC32E107286AB142001434DD /* BaseAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BaseAlertView.h; sourceTree = "<group>"; };
+		BC32E108286AB142001434DD /* BaseAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BaseAlertView.m; sourceTree = "<group>"; };
+		BC32E10A286AB31C001434DD /* KSPublicAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSPublicAlertView.h; sourceTree = "<group>"; };
+		BC32E10B286AB31C001434DD /* KSPublicAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPublicAlertView.m; sourceTree = "<group>"; };
+		BC32E10D286AB326001434DD /* KSPublicAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSPublicAlertView.xib; sourceTree = "<group>"; };
 		BC332DB1284866BE005AEF95 /* KSOrderManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSOrderManager.m; sourceTree = "<group>"; };
 		BC332DB2284866BE005AEF95 /* KSOrderManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSOrderManager.h; sourceTree = "<group>"; };
 		BC3DE080280D88660027DC0E /* EvaluateListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EvaluateListModel.h; sourceTree = "<group>"; };
@@ -2021,6 +2072,8 @@
 		BCB909032851E25D00F5FF69 /* KSShareChooseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSShareChooseViewController.m; sourceTree = "<group>"; };
 		BCB909052851E32C00F5FF69 /* ShareChooseMainView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShareChooseMainView.h; sourceTree = "<group>"; };
 		BCB909062851E32C00F5FF69 /* ShareChooseMainView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareChooseMainView.m; sourceTree = "<group>"; };
+		BCB9FA11286C7C6C005D766B /* KSShareGroupViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSShareGroupViewController.h; sourceTree = "<group>"; };
+		BCB9FA12286C7C6C005D766B /* KSShareGroupViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSShareGroupViewController.m; sourceTree = "<group>"; };
 		BCC03F85280460C000461B7C /* InstrumentHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InstrumentHeaderView.h; sourceTree = "<group>"; };
 		BCC03F86280460C000461B7C /* InstrumentHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InstrumentHeaderView.m; sourceTree = "<group>"; };
 		BCC03F87280460C000461B7C /* InstrumentHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = InstrumentHeaderView.xib; sourceTree = "<group>"; };
@@ -2165,7 +2218,7 @@
 		BCC9F3FD27F69BD200647449 /* ClassSongMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassSongMessage.h; sourceTree = "<group>"; };
 		BCC9F3FE27F69BD200647449 /* RoomMember.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMember.h; sourceTree = "<group>"; };
 		BCC9F3FF27F69BD200647449 /* ClassroomDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassroomDefine.h; sourceTree = "<group>"; };
-		BCC9F40027F69BD200647449 /* ClassroomService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ClassroomService.m; sourceTree = "<group>"; };
+		BCC9F40027F69BD200647449 /* x.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = x.m; sourceTree = "<group>"; };
 		BCC9F40227F69BD200647449 /* RTCService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RTCService.m; sourceTree = "<group>"; };
 		BCC9F40327F69BD200647449 /* RTCService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCService.h; sourceTree = "<group>"; };
 		BCC9F40527F69BD200647449 /* KSIMService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSIMService.h; sourceTree = "<group>"; };
@@ -2637,12 +2690,21 @@
 				BCE6A09C27F84E4500C97704 /* MineIntroduceCell.h */,
 				BCE6A09D27F84E4500C97704 /* MineIntroduceCell.m */,
 				BCE6A09E27F84E4500C97704 /* MineIntroduceCell.xib */,
+				BC2456EB286BEFC600D1F7C0 /* MineEmptyIntroduceCell.h */,
+				BC2456EC286BEFC600D1F7C0 /* MineEmptyIntroduceCell.m */,
+				BC2456ED286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib */,
 				BCE6A0A127F8517900C97704 /* MineVideoCell.h */,
 				BCE6A0A227F8517900C97704 /* MineVideoCell.m */,
 				BCE6A0A327F8517900C97704 /* MineVideoCell.xib */,
+				BC2456F0286BEFDA00D1F7C0 /* MineEmptyVideoCell.h */,
+				BC2456F1286BEFDA00D1F7C0 /* MineEmptyVideoCell.m */,
+				BC2456F2286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib */,
 				BCE6A0A627F852CD00C97704 /* MineFansGroupCell.h */,
 				BCE6A0A727F852CD00C97704 /* MineFansGroupCell.m */,
 				BCE6A0A827F852CD00C97704 /* MineFansGroupCell.xib */,
+				BC2456E6286BEF8000D1F7C0 /* MineEmptyGroupCell.h */,
+				BC2456E7286BEF8000D1F7C0 /* MineEmptyGroupCell.m */,
+				BC2456E8286BEF8000D1F7C0 /* MineEmptyGroupCell.xib */,
 				BCE6A08827F823A300C97704 /* AccompanyCourseCell.h */,
 				BCE6A08927F823A300C97704 /* AccompanyCourseCell.m */,
 				BCE6A08A27F823A300C97704 /* AccompanyCourseCell.xib */,
@@ -2655,6 +2717,9 @@
 				BCE6A09227F823DC00C97704 /* MinePageMusicCell.h */,
 				BCE6A09327F823DC00C97704 /* MinePageMusicCell.m */,
 				BCE6A09427F823DC00C97704 /* MinePageMusicCell.xib */,
+				BC2456E1286BE85A00D1F7C0 /* MineStyleEmptyView.h */,
+				BC2456E2286BE85A00D1F7C0 /* MineStyleEmptyView.m */,
+				BC2456E4286BE86600D1F7C0 /* MineStyleEmptyView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -2732,6 +2797,8 @@
 				275FA1A527E7327300CFEA2E /* KSWebSocketManager.m */,
 				275FA19E27E7250700CFEA2E /* KSAccompanyWebViewController.h */,
 				275FA19F27E7250700CFEA2E /* KSAccompanyWebViewController.m */,
+				BC2456F5286C421700D1F7C0 /* KSVideoRecordManager.h */,
+				BC2456F6286C421700D1F7C0 /* KSVideoRecordManager.m */,
 				275FA19527E723D600CFEA2E /* KSLocalWebViewController.h */,
 				275FA19627E723D700CFEA2E /* KSLocalWebViewController.m */,
 				2779362727E33BE30010E277 /* WeakWebViewScriptMessageDelegate.h */,
@@ -2757,6 +2824,11 @@
 				BCA9CE1627FD339D00D558C6 /* AuthDisplayView.xib */,
 				BC332DB2284866BE005AEF95 /* KSOrderManager.h */,
 				BC332DB1284866BE005AEF95 /* KSOrderManager.m */,
+				BC32E107286AB142001434DD /* BaseAlertView.h */,
+				BC32E108286AB142001434DD /* BaseAlertView.m */,
+				BC32E10A286AB31C001434DD /* KSPublicAlertView.h */,
+				BC32E10B286AB31C001434DD /* KSPublicAlertView.m */,
+				BC32E10D286AB326001434DD /* KSPublicAlertView.xib */,
 			);
 			path = Base;
 			sourceTree = "<group>";
@@ -2764,6 +2836,7 @@
 		2779309A27E30F760010E277 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				BC8C599228698E7C00542CF5 /* WindowAlertManager */,
 				BC8B6E7628585BE900866917 /* UMShare */,
 				BC8B6E6F285838AB00866917 /* QRCodeGenerate */,
 				27A2F62727E6C995009E2380 /* KSImageAlert.h */,
@@ -3421,6 +3494,9 @@
 		277935D927E325B90010E277 /* Module */ = {
 			isa = PBXGroup;
 			children = (
+				BC24570E286C437D00D1F7C0 /* SoundFontFile */,
+				BC245708286C436E00D1F7C0 /* beat */,
+				BC2456FB286C434800D1F7C0 /* MidiPlayer */,
 				BCB908FE2851BE8700F5FF69 /* ShareInChat */,
 				BCB633D527F6A18100ACFDCF /* Classroom */,
 				BCC9F35A27F69BD100647449 /* SealClass */,
@@ -4407,6 +4483,39 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC2456FB286C434800D1F7C0 /* MidiPlayer */ = {
+			isa = PBXGroup;
+			children = (
+				BC245703286C434800D1F7C0 /* CAudioUnit.h */,
+				BC2456FF286C434800D1F7C0 /* CAudioUnit.m */,
+				BC2456FE286C434800D1F7C0 /* CoreAudioUtils.c */,
+				BC245701286C434800D1F7C0 /* CoreAudioUtils.h */,
+				BC245702286C434800D1F7C0 /* GCDTimer.h */,
+				BC2456FD286C434800D1F7C0 /* GCDTimer.m */,
+				BC245700286C434800D1F7C0 /* MidiPlayerEngine.h */,
+				BC2456FC286C434800D1F7C0 /* MidiPlayerEngine.m */,
+			);
+			path = MidiPlayer;
+			sourceTree = "<group>";
+		};
+		BC245708286C436E00D1F7C0 /* beat */ = {
+			isa = PBXGroup;
+			children = (
+				BC245709286C436E00D1F7C0 /* KSCloudBeatView.xib */,
+				BC24570A286C436E00D1F7C0 /* KSCloudBeatView.h */,
+				BC24570B286C436E00D1F7C0 /* KSCloudBeatView.m */,
+			);
+			path = beat;
+			sourceTree = "<group>";
+		};
+		BC24570E286C437D00D1F7C0 /* SoundFontFile */ = {
+			isa = PBXGroup;
+			children = (
+				BC24570F286C437D00D1F7C0 /* synthgms.sf2 */,
+			);
+			path = SoundFontFile;
+			sourceTree = "<group>";
+		};
 		BC41103228066C0D00800BD9 /* Homework */ = {
 			isa = PBXGroup;
 			children = (
@@ -5014,6 +5123,13 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC8C599228698E7C00542CF5 /* WindowAlertManager */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = WindowAlertManager;
+			sourceTree = "<group>";
+		};
 		BCA9CE1827FD5EBF00D558C6 /* LiveCourse */ = {
 			isa = PBXGroup;
 			children = (
@@ -5228,6 +5344,8 @@
 			children = (
 				BCB909022851E25D00F5FF69 /* KSShareChooseViewController.h */,
 				BCB909032851E25D00F5FF69 /* KSShareChooseViewController.m */,
+				BCB9FA11286C7C6C005D766B /* KSShareGroupViewController.h */,
+				BCB9FA12286C7C6C005D766B /* KSShareGroupViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -5548,7 +5666,7 @@
 			children = (
 				BCC9F3FF27F69BD200647449 /* ClassroomDefine.h */,
 				BCC9F3D227F69BD200647449 /* ClassroomService.h */,
-				BCC9F40027F69BD200647449 /* ClassroomService.m */,
+				BCC9F40027F69BD200647449 /* x.m */,
 				BCC9F3D327F69BD200647449 /* Message */,
 				BCC9F3F627F69BD200647449 /* Model */,
 			);
@@ -5864,6 +5982,7 @@
 				275FA56427F31AEE00EB6240 /* MinePageHeadView.xib in Resources */,
 				275B173127EB27960081FDEF /* GroupCreateView.xib in Resources */,
 				BCB908F82850C6EF00F5FF69 /* MusicChooseCell.xib in Resources */,
+				BC24570C286C436E00D1F7C0 /* KSCloudBeatView.xib in Resources */,
 				BCC9F43227F69BD200647449 /* class_stop.mp3 in Resources */,
 				2755C08E27ED5DB2007D9070 /* GroupApplyChooseCell.xib in Resources */,
 				BCF61BE9280425DA0000ACFE /* InstrumentChooseCell.xib in Resources */,
@@ -5907,6 +6026,7 @@
 				BC4BCE6D28239EEB00522C8B /* MyAddressListCell.xib in Resources */,
 				27BC3B2B27F2DB9600D81E30 /* MusicUploadView.xib in Resources */,
 				BCED5CC328508F28009A42DE /* ShareLiveCellContentView.xib in Resources */,
+				BC2456F4286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib in Resources */,
 				BCE6A09B27F83E8E00C97704 /* MinePageVideoCell.xib in Resources */,
 				BCE06F2D2818147000234817 /* KSConfirmAlertView.xib in Resources */,
 				BCA7C34428476533009D20EC /* KSBoardAddStaffView.xib in Resources */,
@@ -5961,6 +6081,7 @@
 				BC73A1F42809693F00FA8F6F /* EvaluateSortView.xib in Resources */,
 				27A54CF927E9BD8B007309A3 /* FeedbackBodyView.xib in Resources */,
 				BC542E4828407B4400633781 /* UseBodyView.xib in Resources */,
+				BC2456EA286BEF8000D1F7C0 /* MineEmptyGroupCell.xib in Resources */,
 				BCB6340527F6A2F000ACFDCF /* tock.wav in Resources */,
 				BCC03F9A2805681100461B7C /* MyLessonSearchView.xib in Resources */,
 				BCC03F9F280579A500461B7C /* MyLiveCourseCell.xib in Resources */,
@@ -5972,9 +6093,11 @@
 				BC5EB5B7280402CB00B4A3B0 /* MyStyleInstrumentCell.xib in Resources */,
 				BCFE54152817918600AD6786 /* MyIncomeListCell.xib in Resources */,
 				BCA9CE1727FD339D00D558C6 /* AuthDisplayView.xib in Resources */,
+				BC245710286C437D00D1F7C0 /* synthgms.sf2 in Resources */,
 				BCF1BA5B27F5CF3C00FA36C4 /* LiveSeatApplyCell.xib in Resources */,
 				2780C92427E4903500A95A4F /* PasswordBodyView.xib in Resources */,
 				27F902FF27E864AE00C08A19 /* KSNetworkAlert.xib in Resources */,
+				BC32E10E286AB326001434DD /* KSPublicAlertView.xib in Resources */,
 				BC7CFFAA2817E3BD00CAEB21 /* IncomeCountTopView.xib in Resources */,
 				BC0A22B82847523E0065C1AB /* MemberListCell.xib in Resources */,
 				BCA9CE3A27FD93EB00D558C6 /* AccompanyStudentEvaCell.xib in Resources */,
@@ -5986,6 +6109,7 @@
 				BC7CFFBB2817E9FC00CAEB21 /* stacked_line_chart.html in Resources */,
 				27A54CFE27E9BDC5007309A3 /* AboutUsBodyView.xib in Resources */,
 				BCA724052806AFF100DA0D0D /* AccompanyCourseInfoCell.xib in Resources */,
+				BC2456EF286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib in Resources */,
 				2779329827E30FEB0010E277 /* mss_browseLoading@3x.png in Resources */,
 				BC8B6E632856ED0700866917 /* TencentOpenApi_IOS_Bundle.bundle in Resources */,
 				27BC3B2627F2B76900D81E30 /* MusicMessageCell.xib in Resources */,
@@ -5993,6 +6117,7 @@
 				BC8B6E6D285836B600866917 /* high_staff.png in Resources */,
 				BCA724002806AEA000DA0D0D /* AccompanyHomeworkCell.xib in Resources */,
 				BC7CFFD22817FF6D00CAEB21 /* CardDisplayView.xib in Resources */,
+				BC2456E5286BE86600D1F7C0 /* MineStyleEmptyView.xib in Resources */,
 				27F9CB0127EC3D42003E0FE4 /* GroupListViewCell.xib in Resources */,
 				BC8B6E582856ED0600866917 /* UMSocialSDKResources.bundle in Resources */,
 				BC1191F8280EBC8600A716F7 /* AccompanyDetailBottomView.xib in Resources */,
@@ -6113,6 +6238,7 @@
 				277931F327E30FC20010E277 /* UIView+Hints.m in Sources */,
 				2779321927E30FC30010E277 /* UITextView_Toolbar.m in Sources */,
 				BC285833280947BA0024697C /* EvaluateSortView.m in Sources */,
+				BC32E109286AB142001434DD /* BaseAlertView.m in Sources */,
 				275E3DBF27F45EB90010EC30 /* KSLiveChatroomUserQuit.m in Sources */,
 				BCD6D16528195A91009A773E /* WithdrawApplyBodyView.m in Sources */,
 				BC0A2286284751DF0065C1AB /* KSTrackingSlider.m in Sources */,
@@ -6131,6 +6257,7 @@
 				BC4BCE702823A02F00522C8B /* AddressBottomView.m in Sources */,
 				277931EB27E30FC20010E277 /* NSArray+zh_SafeAccess.m in Sources */,
 				BCA724042806AFF100DA0D0D /* AccompanyCourseInfoCell.m in Sources */,
+				BC245704286C434800D1F7C0 /* MidiPlayerEngine.m in Sources */,
 				BCB633F527F6A18200ACFDCF /* NewClassRoomViewController.m in Sources */,
 				BC4BCE6C28239EEB00522C8B /* MyAddressListCell.m in Sources */,
 				BCD6D16228195A17009A773E /* WithdrawApplyViewController.m in Sources */,
@@ -6209,6 +6336,7 @@
 				BCB635B627F6FB0A00ACFDCF /* SeatTipsView.m in Sources */,
 				277935EB27E32A930010E277 /* KSBaseWKWebViewController.m in Sources */,
 				275B172627EB1C6C0081FDEF /* KSBaseTableViewController.m in Sources */,
+				BC2456E9286BEF8000D1F7C0 /* MineEmptyGroupCell.m in Sources */,
 				BCC9F43D27F69BD200647449 /* InviteUpgradeMessage.m in Sources */,
 				BC7CFFCD2817FE8C00CAEB21 /* BandCardViewController.m in Sources */,
 				BCB909072851E32C00F5FF69 /* ShareChooseMainView.m in Sources */,
@@ -6337,8 +6465,10 @@
 				BC0167A627FC06D600AE66A1 /* MyCourseViewController.m in Sources */,
 				BCA9CE3427FD93C700D558C6 /* AccompanyEvaluateCell.m in Sources */,
 				BCA353D62858B18100377661 /* Records.m in Sources */,
+				BC2456F3286BEFDA00D1F7C0 /* MineEmptyVideoCell.m in Sources */,
 				2779320127E30FC30010E277 /* KSStatusView.m in Sources */,
 				2779323027E30FC30010E277 /* ALCalendarPicker.m in Sources */,
+				BCB9FA13286C7C6C005D766B /* KSShareGroupViewController.m in Sources */,
 				2779323E27E30FC30010E277 /* VoCacheManager.m in Sources */,
 				277932E327E310070010E277 /* TZAssetCell.m in Sources */,
 				277931DE27E30FC20010E277 /* NSObject+AssociatedObject.m in Sources */,
@@ -6350,6 +6480,7 @@
 				277931D227E30FC20010E277 /* UIButton+Property.m in Sources */,
 				2779309927E30F480010E277 /* BaseViewController.m in Sources */,
 				BC5FF91728293C5600854D37 /* ReceiveListModel.m in Sources */,
+				BC245706286C434800D1F7C0 /* CoreAudioUtils.c in Sources */,
 				BC7CFFC92817F2FF00CAEB21 /* CashRecordListCell.m in Sources */,
 				BC7CFFBE2817F1D200CAEB21 /* MyBankCardViewController.m in Sources */,
 				BCA9CE1E27FD5F9D00D558C6 /* MyLiveCourseViewController.m in Sources */,
@@ -6435,7 +6566,7 @@
 				BC5EB5C42804087000B4A3B0 /* MyStyleBottomView.m in Sources */,
 				275E3DE027F467410010EC30 /* KSChatEmojiBoardView.m in Sources */,
 				BC542E4628407B3D00633781 /* UseBodyView.m in Sources */,
-				BCC9F44927F69BD200647449 /* ClassroomService.m in Sources */,
+				BCC9F44927F69BD200647449 /* x.m in Sources */,
 				277931CC27E30FC20010E277 /* KSGifRefreshFooter.m in Sources */,
 				2779321127E30FC30010E277 /* YKMultiLevelTableView.m in Sources */,
 				BCF1BA5127F5C4DD00FA36C4 /* KSLiveChatroomMemberCount.m in Sources */,
@@ -6458,6 +6589,7 @@
 				2755C07727EC945D007D9070 /* GroupMemberViewController.m in Sources */,
 				2773205227EDB75B008FAECA /* GroupNoticeCell.m in Sources */,
 				BC0238092865C601005560CA /* KSRCShopRushMessage.m in Sources */,
+				BC32E10C286AB31C001434DD /* KSPublicAlertView.m in Sources */,
 				BC5EB5B6280402CB00B4A3B0 /* MyStyleInstrumentCell.m in Sources */,
 				277931C527E30FC20010E277 /* NSObject+KSSwizzling.m in Sources */,
 				27A54CF727E9BD7C007309A3 /* FeedbackBodyView.m in Sources */,
@@ -6526,11 +6658,13 @@
 				BC02380F2865C6F9005560CA /* RCChatroomLikeCount.m in Sources */,
 				2779321727E30FC30010E277 /* UITextField_Toolbar.m in Sources */,
 				BCB633F927F6A18200ACFDCF /* ClassVideoListView.m in Sources */,
+				BC2456E3286BE85A00D1F7C0 /* MineStyleEmptyView.m in Sources */,
 				277D432F27E9A50800107DB7 /* PhoneChangeBodyView.m in Sources */,
 				277931EA27E30FC20010E277 /* UIAlertController+Extend.m in Sources */,
 				BCB908FB2850C9C300F5FF69 /* MusicChooseSearchView.m in Sources */,
 				BC0A22AA284751F80065C1AB /* FullVideoCell.m in Sources */,
 				BCC9F41627F69BD200647449 /* TimeStampMessage.m in Sources */,
+				BC2456EE286BEFC600D1F7C0 /* MineEmptyIntroduceCell.m in Sources */,
 				2779326C27E30FD80010E277 /* FSCalendarExtensions.m in Sources */,
 				BCF61BEC28042D1A0000ACFE /* InstrumentMessageModel.m in Sources */,
 				BC58E7DD281B969B004B0893 /* MinePageTopView.m in Sources */,
@@ -6550,6 +6684,7 @@
 				2755C06C27EC7F0E007D9070 /* KSChatComplainController.m in Sources */,
 				27F9CB1127EC60D0003E0FE4 /* GroupListModel.m in Sources */,
 				27FC2F5F27F1930400FCC239 /* KSStarView.m in Sources */,
+				BC24570D286C436E00D1F7C0 /* KSCloudBeatView.m in Sources */,
 				BCC9F44427F69BD200647449 /* NodePlayMessage.m in Sources */,
 				2779320A27E30FC30010E277 /* HomeButton.m in Sources */,
 				2773204E27EDB72B008FAECA /* LFPopupMenuDefaultConfig.m in Sources */,
@@ -6577,6 +6712,7 @@
 				BC8A2CF828476C3000122BBE /* MusicScoreViewController.m in Sources */,
 				BC0A2282284751DF0065C1AB /* MetronomeAlertView.m in Sources */,
 				2779330E27E3105F0010E277 /* DZNSegmentedControl.m in Sources */,
+				BC245707286C434800D1F7C0 /* CAudioUnit.m in Sources */,
 				277931D027E30FC20010E277 /* UILabel+QWTopLeftLabel.m in Sources */,
 				BCC9F40F27F69BD200647449 /* TextMessageCell.m in Sources */,
 				2708564E27ED6B7800EC8E72 /* ApplyMemberModel.m in Sources */,
@@ -6703,6 +6839,7 @@
 				BCC9F41D27F69BD200647449 /* RecentSharedVideoCell.m in Sources */,
 				BC8B6E87285888B100866917 /* MyMusicRoomBodyView.m in Sources */,
 				2779331D27E311A10010E277 /* KSNetworkingManager.m in Sources */,
+				BC245705286C434800D1F7C0 /* GCDTimer.m in Sources */,
 				2779362C27E33C2B0010E277 /* LoginBodyView.m in Sources */,
 				BC1191F3280EAB9600A716F7 /* AccompanyDetailViewController.m in Sources */,
 				277931DD27E30FC20010E277 /* UIImage+Resize.m in Sources */,
@@ -6711,6 +6848,7 @@
 				275E3DA327F441EC0010EC30 /* KSEnterLiveroomManager.m in Sources */,
 				2779323327E30FC30010E277 /* StateView.m in Sources */,
 				275E3DE427F467410010EC30 /* KSChatInputBarControl.m in Sources */,
+				BC2456F7286C421700D1F7C0 /* KSVideoRecordManager.m in Sources */,
 				BCC03F9E280579A500461B7C /* MyLiveCourseCell.m in Sources */,
 				27D5D5D527EDBCB900B4720C /* GroupNoticeModel.m in Sources */,
 				BCC9F41527F69BD200647449 /* MessageModel.m in Sources */,
@@ -6913,7 +7051,7 @@
 				GCC_PREFIX_HEADER = "$(SRCROOT)/KulexiuForTeacher/Common/Define/PrefixHeader.pch";
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = KulexiuForTeacher/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = "酷乐秀";
+				INFOPLIST_KEY_CFBundleDisplayName = "酷乐秀学院";
 				INFOPLIST_KEY_NSAppleMusicUsageDescription = "App需要您的同意访问媒体资料库权限,用于播放媒体服务";
 				INFOPLIST_KEY_NSCameraUsageDescription = "APP需要您的同意,访问您的相机,以便您正常使用上传图片、视频课程等服务";
 				INFOPLIST_KEY_NSMicrophoneUsageDescription = "App需要您的同意访问麦克风权限,用于您的语音服务、视频教学";
@@ -6973,7 +7111,7 @@
 				GCC_PREFIX_HEADER = "$(SRCROOT)/KulexiuForTeacher/Common/Define/PrefixHeader.pch";
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = KulexiuForTeacher/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = "酷乐秀";
+				INFOPLIST_KEY_CFBundleDisplayName = "酷乐秀学院";
 				INFOPLIST_KEY_NSAppleMusicUsageDescription = "App需要您的同意访问媒体资料库权限,用于播放媒体服务";
 				INFOPLIST_KEY_NSCameraUsageDescription = "APP需要您的同意,访问您的相机,以便您正常使用上传图片、视频课程等服务";
 				INFOPLIST_KEY_NSMicrophoneUsageDescription = "App需要您的同意访问麦克风权限,用于您的语音服务、视频教学";

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


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

@@ -195,22 +195,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "F0003F49-A484-4565-AE50-C3F3374E00CA"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1205"
-            endingLineNumber = "1205"
-            landmarkName = "-documentPicker:didPickDocumentAtURL:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "71FA8FBF-57FD-4D5B-94AE-AB18D5ACCB52"
             shouldBeEnabled = "No"
             ignoreCount = "0"
@@ -218,8 +202,8 @@
             filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1175"
-            endingLineNumber = "1175"
+            startingLineNumber = "1184"
+            endingLineNumber = "1184"
             landmarkName = "-documentPicker:didPickDocumentAtURL:"
             landmarkType = "7">
          </BreakpointContent>
@@ -234,8 +218,8 @@
             filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "336"
-            endingLineNumber = "336"
+            startingLineNumber = "337"
+            endingLineNumber = "337"
             landmarkName = "-configMessage:headSource:"
             landmarkType = "7">
          </BreakpointContent>
@@ -371,22 +355,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "DE48B630-3C8A-4149-8D5F-5820C13D1075"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/ClassroomService.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "357"
-            endingLineNumber = "357"
-            landmarkName = "-display:withInfo:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "4447F7D7-1B25-4FBA-9799-D9760D200B63"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
@@ -435,22 +403,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "D439BB2B-0855-4EF0-AE3F-1D5AFF3D592D"
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Common/Tools/UMShare/KSUMShareManager.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "87"
-            endingLineNumber = "87"
-            landmarkName = "-openShareView"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "E190F3BE-3EA1-4E3B-B738-644138404223"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
@@ -668,22 +620,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "4C7105CD-14E7-4AD1-83AC-D92E5AFA4148"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/Course/MusicRoom/Controller/MusicRoomViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "96"
-            endingLineNumber = "96"
-            landmarkName = "-requestStudentList"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "5B92F24C-589F-4C1C-A286-C93D3204DB38"
             shouldBeEnabled = "No"
             ignoreCount = "0"
@@ -725,5 +661,117 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "57E8E668-FAA7-46CA-B9E5-C3409F3E4E63"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/NotiferMessage/Controller/NotiferMessageViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "240"
+            endingLineNumber = "240"
+            landmarkName = "-toDetailViewWithTypeString:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "15D1244A-6788-434A-8201-E692667D7059"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "84"
+            endingLineNumber = "84"
+            landmarkName = "-operationDealCallbackMessage:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "289E6237-EF1C-4ACF-8BFF-6855E14AF4C6"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/SealClass/Services/Classroom/ClassroomService.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "220"
+            endingLineNumber = "220"
+            landmarkName = "-queryNoJoinRoomList:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "DCE33DC0-A81A-435E-9A5A-44028AAD5CE7"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "97"
+            endingLineNumber = "97"
+            landmarkName = "-setParmDic:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "6DC5AB8D-4C47-4AA6-8CEF-718ADDD5742E"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "311"
+            endingLineNumber = "311"
+            landmarkName = "-configMessage:headSource:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "8D42E391-ED0E-405D-ACB1-767DC454B3DE"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "347"
+            endingLineNumber = "347"
+            landmarkName = "-configMessage:headSource:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "F7171A21-1BB6-44FD-88C5-DDEDFC27482C"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "596"
+            endingLineNumber = "596"
+            landmarkName = "-chooseMediaWithType:maxCount:bucket:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 34 - 12
KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m

@@ -190,7 +190,7 @@
     /* 设置sina */
     [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Sina appKey:@"755965096"  appSecret:@"8a4d2b76bbb2006e62e21ac9014435da" redirectURL:nil];
     
-//    // 自定义分享类型
+    // 自定义分享类型
 //    [UMSocialUIManager addCustomPlatformWithoutFilted:UMSocialPlatformType_UserDefine_Begin+1 withPlatformIcon:[UIImage imageNamed:@"share_group"] withPlatformName:@"群聊"];
 //    [UMSocialUIManager addCustomPlatformWithoutFilted:UMSocialPlatformType_UserDefine_Begin+2 withPlatformIcon:[UIImage imageNamed:@"share_savePic"] withPlatformName:@"保存图片"];
 }
@@ -537,14 +537,14 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
             [navCtrl pushViewController:ctrl animated:YES];
         }
         else if ([headStr isEqualToString:@"H5"]) { // web
-            NSString *valueStr = [[memoStr componentsSeparatedByString:@"?"] lastObject];
+            NSString *valueStr = [[memoStr componentsSeparatedByString:@"H5?"] lastObject];
             KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
             webCtrl.url = valueStr;
             CustomNavViewController *navCtrl = self.tabBarController.selectedViewController;
             [navCtrl pushViewController:webCtrl animated:YES];
         }
         else if ([headStr isEqualToString:@"homework"]) { // 作业详情
-            NSString *valueStr = [[memoStr componentsSeparatedByString:@"?"] lastObject];
+            NSString *valueStr = [[memoStr componentsSeparatedByString:@"homework?"] lastObject];
             NSArray *parmArray = [valueStr componentsSeparatedByString:@"&"];
             NSString *courseId = nil;
             NSString *studentId = nil;
@@ -704,18 +704,40 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
         NSString *linkUrl = [[detailUrl componentsSeparatedByString:@"linkUrl="] lastObject];
         if (![NSString isEmptyString:linkUrl]) {
             linkUrl = [UrlDecode decodeStringWithString:linkUrl];
-            KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
-            webCtrl.url = linkUrl;
-            
-            UIViewController *vc = self.window.rootViewController;
-            if ([vc isKindOfClass:[KSTabBarViewController class]]) {
-                CustomNavViewController *navCtrl = self.tabBarController.selectedViewController;
-                [navCtrl pushViewController:webCtrl animated:YES];
+            // 转成 dic
+            NSData *jsonData = [linkUrl mj_JSONData];
+            NSError *error;
+            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
+            if (error) {
+                NSLog(@"jsonString解析失败:%@", error);
+                return NO;
             }
             else {
-                UserDefaultSetObjectForKey(linkUrl, WEB_URL);
+                NSString *action = [dict stringValueForKey:@"action"];
+                if ([action isEqualToString:@"app"]) {
+                    NSString *pageType = [dict stringValueForKey:@"pageTag"];
+                    if ([pageType isEqualToString:@""]) {
+                        NSDictionary *parm = [dict dictionaryValueForKey:@"params"];
+                        NSLog(@"%@",parm);
+                    }
+                }
+                else {  // 空 或者 h5
+                    NSString *webUrl = [dict stringValueForKey:@"url"];
+                    if (![NSString isEmptyString:webUrl]) {
+                        KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+                        webCtrl.url = webUrl;
+                        
+                        UIViewController *vc = self.window.rootViewController;
+                        if ([vc isKindOfClass:[KSTabBarViewController class]]) {
+                            CustomNavViewController *navCtrl = self.tabBarController.selectedViewController;
+                            [navCtrl pushViewController:webCtrl animated:YES];
+                        }
+                        else {
+                            UserDefaultSetObjectForKey(linkUrl, WEB_URL);
+                        }
+                    }
+                }
             }
-            
         }
     }
     NSLog(@"%@", detailUrl);

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/Icon.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadApp_76pt.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadApp_76pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadNotifications_20pt.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadNotifications_20pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadProApp_83.5pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight5_29pt.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight5_29pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight7_40pt.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPadSpootlight7_40pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneApp_60pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneApp_60pt@3x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneNotification_20pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneNotification_20pt@3x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight5_29pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight5_29pt@3x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/IconiPhoneSpootlight7_40pt@3x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/AppIcon.appiconset/iconiPhoneSpootlight7_40pt@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/edit_button.imageset/edit_button@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/edit_button.imageset/edit_button@3x.png


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

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/course_musicRoom.imageset/course_musicRoom@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/course_musicRoom.imageset/course_musicRoom@3x.png


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

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/homework_next.imageset/homework_next@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Course/homework_next.imageset/homework_next@3x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_musicRoom.imageset/home_musicRoom@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_musicRoom.imageset/home_musicRoom@3x.png


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

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

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


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


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

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

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


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


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

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

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


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


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


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


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

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

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


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


+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/BaseAlertView.h

@@ -0,0 +1,16 @@
+//
+//  BaseAlertView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/6/28.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BaseAlertView : UIView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 20 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/BaseAlertView.m

@@ -0,0 +1,20 @@
+//
+//  BaseAlertView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/6/28.
+//
+
+#import "BaseAlertView.h"
+
+@implementation BaseAlertView
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 1057 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAccompanyWebViewController.m

@@ -6,18 +6,1074 @@
 //
 
 #import "KSAccompanyWebViewController.h"
+#import "RecordCheckManager.h"
+#import "KSAQRecordManager.h"
+#import "KSWebSocketManager.h"
+#import "KSVideoRecordManager.h"
+#import "KSWebNavView.h"
 
-@interface KSAccompanyWebViewController ()
+#import "KSAudioSessionManager.h"
+#import "KSCloudBeatView.h"
+#import "MidiPlayerEngine.h"
 
+#define KSMidiSongFileKey (@"KSDownloadMidiSong")
+
+@interface KSAccompanyWebViewController ()<KSAQRecordManagerDelegate,KSAudioSessionManagerDelegate,PlayerEngineDelegate>
+
+@property (nonatomic, strong) KSAudioSessionManager *audioSessionManager;
+
+@property (nonatomic, assign) MetronomeType beatType;
+
+@property (nonatomic, strong) MidiPlayerEngine *playerEngine; // player
+
+@property (nonatomic, assign) BOOL initEngineSuccess; // 加载引擎是否成功
+
+@property (nonatomic, assign) float songOriginalSpeed;
+
+@property (nonatomic, assign) float currentSpeed; // 当前播放的速度
+
+@property (nonatomic, assign) BOOL isPlaying; // 是否正在播放的状态
+
+@property (nonatomic, strong) NSString *currentSongId; // song id
+
+@property (nonatomic, strong) NSDictionary *configEngineParm; // 初始化mid播放引擎的参数
+
+@property (nonatomic, strong) NSMutableDictionary *metronomeParm; // 节拍器播放的参数
+
+// 是否发送了musicXML信息
+@property (nonatomic, assign) BOOL hasSendStartMessage;
+
+@property (nonatomic, strong) KSAQRecordManager *AQManager;
+
+@property (nonatomic, strong) KSWebSocketManager *socketManager;
+
+@property (nonatomic, strong) NSMutableDictionary *evaluatParm;
+
+// 录制的message
+@property (nonatomic, strong) NSMutableDictionary *recordParm;
+
+// 评测开始时发送recordStart消息的标识
+@property (nonatomic, assign) BOOL isCompareStart;
+// 校音开始时发送 checkStart消息标识
+@property (nonatomic, assign) BOOL isSoundCheckStart;
+
+// 自定义UI控件容器
+@property (nonatomic, strong) UIView *viewContainer;
+
+@property (nonatomic, strong) KSVideoRecordManager *videoRecordManager;
+
+@property (nonatomic, strong) NSDictionary *endRecordParm;
+
+@property (nonatomic, assign) BOOL isCameraOpen;
 @end
 
 @implementation KSAccompanyWebViewController
 
+- (void)handerAudioInterruption {
+    if (_playerEngine) {
+        [self stopPlayAction];
+    }
+}
+
+- (void)resumeAudioSession {
+    // 恢复
+    if (_playerEngine) {
+        [self.playerEngine resumeAUGraph];
+    }
+}
+
+// 打断处理
+- (void)audioInterruption {
+    if (_videoRecordManager) {
+        [self.videoRecordManager resetSession];
+    }
+    [self handerAudioInterruption];
+}
+
+- (void)stopSession {
+    if (_videoRecordManager) {
+        [self.videoRecordManager stopSession];
+    }
+}
+
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
+    [self configAudioSession];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnterBackground) name:@"appEnterBackground" object:nil];
+}
+
+- (void)connectSocketService {
+    
+    MJWeakSelf;
+    self.socketManager.didReceiveMessage = ^(id  _Nonnull message) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            // api
+            NSMutableDictionary *sendMessage = [NSMutableDictionary dictionary];
+            [sendMessage setValue:@"sendResult" forKey:@"api"];
+            [sendMessage setValue:message forKey:@"content"];
+            // 服务返回数据传给H5
+            [weakSelf postMessage:sendMessage];
+        });
+    };
+    self.socketManager.connectionStatus = ^(BOOL isSuccess) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            
+            if (!isSuccess) {
+                NSLog(@"-----连接失败");
+                if (weakSelf.hasSendStartMessage) {
+                    if (weakSelf.AQManager.isRunning) {
+                        NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
+                                                   @"content" : @{@"reson":@"服务异常,请重试"}
+                        };
+                        [weakSelf postMessage:postParm];
+                        [weakSelf stopRecordService];
+                        weakSelf.isCompareStart = NO;
+                        weakSelf.isSoundCheckStart = NO;
+                    }
+                }
+                else if (weakSelf.evaluatParm) {
+                    NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:weakSelf.evaluatParm];
+                    NSLog(@"%@",sendParm);
+                    NSDictionary *valueDic = [weakSelf.evaluatParm dictionaryValueForKey:@"content"];
+                    [valueDic setValue:@"服务异常,请重试" forKey:@"reson"];
+                    NSLog(@"%@",valueDic);
+                    [sendParm setValue:valueDic forKey:@"content"];
+                    [weakSelf postMessage:sendParm];
+                    weakSelf.hasSendStartMessage = YES;
+                    weakSelf.isCompareStart = NO;
+                    weakSelf.isSoundCheckStart = NO;
+                }
+                else { // 其他断开
+                    if (weakSelf.AQManager.isRunning) {
+                        NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
+                                                   @"content" : @{@"reson":@"服务异常,请重试"}
+                        };
+                        [weakSelf postMessage:postParm];
+                        [weakSelf stopRecordService];
+                        weakSelf.isCompareStart = NO;
+                        weakSelf.isSoundCheckStart = NO;
+                    }
+                }
+            }
+            else {
+                NSLog(@"-----连接成功");
+                if (weakSelf.hasSendStartMessage == NO && weakSelf.evaluatParm) {
+                    NSDictionary *content = [weakSelf.evaluatParm dictionaryValueForKey:@"content"];
+                    NSString *sendData = [weakSelf configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
+                    [weakSelf sendDataToSocketService:sendData];
+                    [weakSelf postMessage:weakSelf.evaluatParm];
+                    weakSelf.hasSendStartMessage = YES;
+                    NSLog(@"---- send musicXML message");
+                }
+            }
+        });
+    };
+    [self.socketManager SRWebSocketOpen];
+}
+
+- (void)appEnterBackground {
+    NSDictionary *parm = @{@"api":@"suspendPlay"};
+    [self postMessage:parm];
+    [self handerAudioInterruption];
+}
+
+- (void)initWebView {
+    [self.view addSubview:self.navView];
+    CGFloat topHeight = kNaviBarHeight;
+    [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(kNaviBarHeight);
+    }];
+    if (self.hiddenNavBar) {
+        topHeight = 0.0f;
+        [self.navView mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.mas_equalTo(0);
+        }];
+    }
+    
+    [self.view addSubview:self.viewContainer];
+    [self.viewContainer mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    
+    if (self.myWebView == nil) {
+        
+        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
+        config.selectionGranularity = WKSelectionGranularityDynamic;
+        config.allowsInlineMediaPlayback = YES;
+        if (@available(iOS 10.0, *)) {
+            config.mediaTypesRequiringUserActionForPlayback = NO;
+        } else {
+            // Fallback on earlier versions
+            config.requiresUserActionForMediaPlayback = NO;
+        }
+        config.processPool = [KSBaseWKWebViewController singleWkProcessPool];
+        config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
+        //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
+        WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
+        //这个类主要用来做native与JavaScript的交互管理
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"COLEXIU"];
+        config.userContentController = wkUController;
+        
+        WKPreferences *preferences = [WKPreferences new];
+        // 是否支出javaScript
+        preferences.javaScriptEnabled = YES;
+        //不通过用户交互,是否可以打开窗口
+        preferences.javaScriptCanOpenWindowsAutomatically = YES;
+        config.preferences = preferences;
+        self.myWebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
+        self.myWebView.opaque = NO;
+        self.myWebView.UIDelegate = self;
+        self.myWebView.navigationDelegate = self;
+        self.myWebView.scrollView.bounces = NO;
+        self.myWebView.backgroundColor = [UIColor clearColor];
+        self.myWebView.scrollView.backgroundColor = [UIColor clearColor];
+        // 加载进度条和title
+        [self.myWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
+        [self.myWebView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
+        [self.view addSubview:self.myWebView];
+        [self.myWebView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.mas_equalTo(self.view);
+            make.top.mas_equalTo(self.view.mas_top).offset(topHeight);
+            make.bottom.mas_equalTo(self.view.mas_bottom);
+        }];
+        if (@available(iOS 11.0, *)) {
+            self.myWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        } else {
+            // Fallback on earlier versions
+        }
+        [self setupProgress];
+        // 修改userAgent
+        [self setUserAgent];
+    }
+    else {
+        [self.myWebView reload];
+    }
+}
+
+- (void)configRecordManager {
+    self.AQManager = [[KSAQRecordManager alloc] init];
+    self.AQManager.delegate = self;
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self connectSocketService];
+    if (self.isCameraOpen) {
+        [self.videoRecordManager configSessiondisplayInView:self.viewContainer];
+    }
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    if (_AQManager) {
+        [_AQManager freeAudioQueue];
+        _AQManager = nil;
+    }
+    if (_socketManager) {
+        [self.socketManager SRWebSocketClose];
+        _socketManager = nil;
+    }
+    [self stopSession];
+    
+    // 如果退出评测页面 清除 playerEngine
+    if (self.playerEngine) {
+        [self.playerEngine cleanup];
+        self.playerEngine = nil;
+    }
+    
+}
+
+- (void)sendDataToSocketService:(id)data {
+    if (_socketManager) {
+        [self.socketManager sendData:data];
+    }
+}
+
+#pragma mark --- WKScriptMessageHandler
+
+- (void)userContentController:(WKUserContentController *)userContentController
+      didReceiveScriptMessage:(WKScriptMessage *)message {
+    if ([message.name isEqualToString:@"COLEXIU"]) {
+        NSDictionary *parm = [self convertJsonStringToNSDictionary:message.body];
+        // 回到主线程
+        dispatch_async(dispatch_get_main_queue(), ^{
+             if ([[parm stringValueForKey:@"api"] isEqualToString:@"startEvaluating"]) { // 开始评测
+                  [self configRecordManager];
+                  self.hasSendStartMessage = NO;
+                  PREMISSIONTYPE isOk = [RecordCheckManager checkPermissionShowAlert:NO showInView:nil];
+                  if (isOk == PREMISSIONTYPE_YES) {
+                       self.evaluatParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+                       // 如果socket 连上了
+                       if (self.socketManager.socketReadyState == SR_OPEN) {
+                            NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                            NSString *sendData = [self configDataCommond:@"musicXml" body:content type:@"SOUND_COMPARE"];
+                            [self sendDataToSocketService:sendData];
+                            [self postMessage:parm];
+                            self.hasSendStartMessage = YES;
+                       }
+                       else {
+                            [self connectSocketService];
+                       }
+                  }
+                  else {
+                       NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
+                                                  @"content" : @{@"reson":@"没有麦克风权限"}
+                       };
+                       [self postMessage:postParm];
+                  }
+             }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"endEvaluating"]) {// 停止评测
+                 self.evaluatParm = nil;
+                 [self stopRecordService];
+                 [self postMessage:parm];
+                 [self sendEndMessage];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cancelEvaluating"]) { // 取消评测
+                 self.evaluatParm = nil;
+                 [self stopRecordService];
+                 [self postMessage:parm];
+                 [self sendEndMessage];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"startRecording"]) { //  开始录制
+//                 self.recordParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+                 [self postMessage:parm];
+                 self.isCompareStart = YES;
+                 [self startRecordService];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"endRecording"]) { // 停止录音
+                 self.recordParm = nil;
+                 [self stopRecordService];
+                 [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"pauseRecording"]) {
+                [self puaseRecordService];
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"resumeRecording"]) {
+                [self resumeRecordService];
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"isWiredHeadsetOn"]) {
+                [self configAudioDeviceType:parm];
+            }
+            // 发送消息给socket service
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"proxyMessage"]) {
+                 [self sendMessageToSocket:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"proxyServiceMessage"]) {
+                 NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                 NSString *sendData = [content mj_JSONString];
+                 NSLog(@"proxyServiceMessage ------- %@",sendData);
+                 [self sendDataToSocketService:sendData];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"openCamera"]) { // 开启摄像头
+                 PREMISSIONTYPE canOpenCamera = [RecordCheckManager checkCameraPremissionAvaiable:YES showInView:self.view];
+                 if (canOpenCamera == PREMISSIONTYPE_YES) {
+                      self.isCameraOpen = YES;
+                      [self.videoRecordManager configSessiondisplayInView:self.viewContainer];
+                      [self postMessage:parm];
+                 }
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"closeCamera"]) { // 关闭摄像头
+                self.isCameraOpen = NO;
+                if (self->_videoRecordManager) {
+                    [self.videoRecordManager removeDisplay];
+                }
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"startCapture"]) { // 开始录制
+                [RecordCheckManager checkPhotoLibraryPremissionAvaiable:YES showInView:self.view];
+                self.videoRecordManager.audioUrl = self.AQManager.audioUrl;
+                [self.videoRecordManager startRecord];
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"endCapture"]) { // 结束录制
+                if (self->_videoRecordManager) {
+                    self.endRecordParm = parm;
+                    [self.videoRecordManager stopRecord];
+                }
+                else {
+                    [self postMessage:parm];
+                }
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"setCaptureMode"]) {
+                NSString *modeString = [[parm dictionaryValueForKey:@"content"] stringValueForKey:@"mode"];
+                BOOL isIgnoreAudio = [modeString isEqualToString:@"evaluating"];
+                [self postMessage:parm];
+                [self.videoRecordManager setIgnoreAudio:isIgnoreAudio];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"startSoundCheck"]) { // 开始校音
+                [self configRecordManager];
+                [self postMessage:parm];
+                self.isCompareStart = NO;
+                self.isSoundCheckStart = YES;
+                [self startRecordService];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"endSoundCheck"]) {
+                // 结束校音
+                self.isSoundCheckStart = NO;
+                [self stopRecordService];
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"videoUpdate"]) { // 上传
+                NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+                NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:[sendParm dictionaryValueForKey:@"content"]];
+                if (self.videoRecordManager) {
+                    [self.videoRecordManager uploadRecordVideoSuccess:^(NSString * _Nonnull videoUrl) {
+                        [contentParm setValue:@"success" forKey:@"type"];
+                        [contentParm setValue:videoUrl forKey:@"filePath"];
+                        [contentParm setValue:@"上传成功" forKey:@"message"];
+                        [sendParm setValue:contentParm forKey:@"content"];
+                        
+                        [self postMessage:sendParm];
+                    } failure:^(NSString * _Nonnull desc) {
+                        [contentParm setValue:@"error" forKey:@"type"];
+                        [contentParm setValue:desc forKey:@"message"];
+                        [sendParm setValue:contentParm forKey:@"content"];
+                        [self postMessage:sendParm];
+                    }];
+                }
+            }
+#pragma mark -------- 云教练原生播放对接
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudDetail"]) { // 初始化方法
+                /**
+                 api: 'cloudDetail',
+                     content: {
+                         midi: '',
+                         denominator: 4,
+                         numerator: 4,
+                         // xml整体原始速度
+                         originalSpeed: 90,
+                         // 间隔(ms)
+                         interval: 50
+                     }
+                 */
+                
+                [self configAudioSession];
+                // 重置track num array
+                self.configEngineParm = [parm copy];
+                NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                NSString *midiUrl = [content stringValueForKey:@"midi"];
+                NSInteger denominator = [content integerValueForKey:@"denominator"];
+                NSInteger numerator = [content integerValueForKey:@"numerator"];
+                NSString *beatString = [NSString stringWithFormat:@"%zd/%zd", numerator,denominator];
+                self.beatType = [self getBeatTypeFromString:beatString];
+                
+                float originalSpeed = [content floatValueForKey:@"originalSpeed"];
+                self.songOriginalSpeed = originalSpeed;
+                self.currentSpeed = originalSpeed;
+                NSInteger reportInterval = [content integerValueForKey:@"interval"];
+                // 下载midi文件
+                BOOL hasSaveSong = [self checkSongHasSaveWithSongUrl:midiUrl];
+                NSString *fileName = [[midiUrl componentsSeparatedByString:@"/"] lastObject];
+                NSString *filePath = [self getFilePathWithName:fileName];
+                if (hasSaveSong) {
+                    [self configPlayerEngineWithSong:filePath reportTime:reportInterval];
+                }
+                else {
+                    MJWeakSelf;
+                    [self downloadMidiFile:midiUrl success:^{
+                        [weakSelf configPlayerEngineWithSong:filePath reportTime:reportInterval];
+                    } faliure:^{
+                        
+                    }];
+                }
+                        
+            }
+
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudGetMediaStatus"]) { // 获取播放状态
+            /**
+             api: 'cloudGetMediaStatus',
+                 content: {
+                     status: 'init' | 'play' | 'suspend'
+                 }
+             */
+                NSString *engineStatus = @"init";
+                if (self.initEngineSuccess) {
+                    if (self.isPlaying) {
+                        engineStatus = @"play";
+                    }
+                    else {
+                        engineStatus = @"suspend";
+                    }
+                }
+                NSMutableDictionary *valueDic = [NSMutableDictionary dictionaryWithDictionary:[parm dictionaryValueForKey:@"content"]];
+                [valueDic setValue:engineStatus forKey:@"status"];
+                NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+                [sendParm setValue:valueDic forKey:@"content"];
+                [self postMessage:sendParm];
+            }
+            // 播放、暂停、进度、播放结束、跳转指定位置
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudPlay"]) { // 播放
+                /**
+                 api: 'cloudPlay',
+                     content: {
+                         // 当前曲目id
+                         songID: 0,
+                         // xml整体原始速度
+                         originalSpeed: 90,
+                         // 当前选择速度
+                         speed: 90,
+                         // 开始时间(ms)
+                         startTime: 0
+                         // 播放频率
+                         hertz:440
+                     }
+                 */
+                NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                self.currentSongId = [content stringValueForKey:@"songID"];
+                float speed = [content floatValueForKey:@"speed"];
+                float originalSpeed = [content floatValueForKey:@"originalSpeed"];
+                double rate = speed / originalSpeed;
+                self.currentSpeed = speed;
+                float hertz = [content floatValueForKey:@"hertz"];
+                // 播放的hertz
+                [self.playerEngine adjustPitchByHZ:hertz];
+                
+                [self.playerEngine setMusicPlayerSpeed:rate];
+                Float64 startTime = [content doubleValueForKey:@"startTime"];
+                NSLog(@"------%@", [content stringValueForKey:@"startTime"]);
+                [self.playerEngine setProgressTime:(startTime/1000)];
+                // 播放
+                [self playAction];
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudSuspend"]) { // 暂停
+                 /**
+                  api: 'cloudSuspend',
+                  content: {
+                  // 当前曲目id
+                  songID: 0,
+                  }
+                  */
+                 [self stopPlayAction];
+                 [self postMessage:parm];
+                 
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudSetCurrentTime"]) { // // 跳转指定位置
+                /**
+                 api: 'cloudSetCurrentTime',
+                     content: {
+                         // 当前曲目id
+                         songID: 0,
+                         // 指定位置时间(ms)
+                         currentTime: 0
+                     }
+                 */
+                NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                Float64 currentTime = [content doubleValueForKey:@"currentTime"];
+                if (self.playerEngine) {
+                    [self.playerEngine setProgressTime:(currentTime/1000)];
+                }
+                [self postMessage:parm];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudChangeSpeed"]) { // 调速 范围(45-270整数)
+                /**
+                 api: 'cloudChangeSpeed',
+                     content: {
+                         // 当前曲目id
+                         songID: 0,
+                         // 调整速度
+                         speed: 90
+                         // xml整体原始速度
+                         originalSpeed: 90,
+                     }
+                 */
+                NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                float speed = [content floatValueForKey:@"speed"];
+                float originalSpeed = [content floatValueForKey:@"originalSpeed"];
+                double rate = speed / originalSpeed;
+                self.currentSpeed = speed;
+                [self.playerEngine setMusicPlayerSpeed:rate];
+                // 回报信息
+                [self postMessage:parm];
+            }
+            // 设置每个轨道音量
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudVolume"]) {
+                /**
+                 api: 'cloudVolume',
+                     content: {
+                         parts: [
+                             {
+                                 name: '',
+                                 volume: 90,//0-100
+                             }
+                         ]
+                     }
+                 */
+//                NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+//                for (NSDictionary *dic in [content arrayValueForKey:@"parts"]) {
+//                   NSInteger trackId = [self.playerEngine getSingleTrackNumByName:[dic stringValueForKey:@"name"]];
+//                    if (trackId >= 0) {
+//                        float volume = [dic floatValueForKey:@"volume"];
+//
+//                        [self.playerEngine volume:volume/100 WithTrack:(UInt32)trackId];
+//                    }
+//                }
+                [self postMessage:parm];
+                [self.playerEngine getAllTrackVolume];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudMetronome"]) { // 节拍器播放
+                 self.metronomeParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+                 NSDictionary *content = [parm dictionaryValueForKey:@"content"];
+                 NSInteger repeatCount = [content integerValueForKey:@"repeat"];
+                 NSInteger denominator = [content integerValueForKey:@"denominator"];
+                 NSInteger numerator = [content integerValueForKey:@"numerator"];
+                 NSInteger supplement = [content integerValueForKey:@"supplement"];
+                 NSString *beatString = [NSString stringWithFormat:@"%zd/%zd", numerator,denominator];
+                 self.beatType = [self getBeatTypeFromString:beatString];
+                 [self showBeatViewRepeatCount:repeatCount supplement:supplement];
+            }
+            else if ([[parm stringValueForKey:@"api"] isEqualToString:@"cloudDestroy"]) { // 销毁播放器
+                self.initEngineSuccess = NO;
+                // 重置track num array
+                self.isPlaying = NO;
+                if (self.playerEngine) {
+                    [self.playerEngine cleanup];
+                    self.playerEngine = nil;
+                }
+            }
+            else {
+                [super handleScriptMessageSource:parm];
+            }
+            
+        });
+    }
+}
+    
+
+- (void)showBeatViewRepeatCount:(NSInteger)repeatCount supplement:(NSInteger)supplement {
+    KSCloudBeatView *beatView = [KSCloudBeatView shareInstanceWithBeatType:self.beatType speed:self.currentSpeed repeatCount:repeatCount supplement:supplement];
+    MJWeakSelf;
+    [beatView startPlayWithEndCallback:^(BOOL isCancle) {
+        if (isCancle) { // 取消
+            [weakSelf sendEndMetronomeMessage:YES];
+        }
+        else { // 播放完成
+            [weakSelf sendEndMetronomeMessage:NO];
+        }
+    }];
+    [self.view addSubview:beatView];
+}
+
+
+- (void)sendEndMetronomeMessage:(BOOL)isCancel {
+    NSString *status = isCancel ? @"cancel" : @"finish";
+    NSMutableDictionary *valueDic = [NSMutableDictionary dictionaryWithDictionary:[self.metronomeParm dictionaryValueForKey:@"content"]];
+    [valueDic setValue:status forKey:@"status"];
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:self.metronomeParm];
+    [sendParm setValue:valueDic forKey:@"content"];
+    [self postMessage:sendParm];
+}
+
+- (void)downloadMidiFile:(NSString *)midiUrl success:(void(^)(void))success faliure:(void(^)(void))faliure {
+    [self showhud];
+    [KSNetworkingManager downloadFileRequestWithFileUrl:midiUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
+        
+    } success:^(NSURL * _Nonnull fileUrl) {
+        [self removehub];
+        if ([self saveMidiFileWithUrl:fileUrl midiUrl:midiUrl]) {
+            success();
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        faliure();
+    }];
+}
+
+- (BOOL)saveMidiFileWithUrl:(NSURL *)fileUrl midiUrl:(NSString *)midiUrl {
+    NSData *sourceData = [NSData dataWithContentsOfURL:fileUrl];
+    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
+    NSString *filePath= [cachePath stringByAppendingPathComponent:@"MidiSong"];
+    // 先创建子目录
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    if (![fileManager fileExistsAtPath:filePath]) {
+        [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
+    }else{
+        NSLog(@"已创建文件夹");
+    }
+    NSString *fileName = [[midiUrl componentsSeparatedByString:@"/"] lastObject];
+    NSString *tempPath = [filePath stringByAppendingPathComponent:fileName];
+    BOOL success = [sourceData writeToFile:tempPath atomically:NO];
+    return success;
+}
+
+- (NSString *)getFilePathWithName:(NSString *)fileName {
+    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
+    NSString *filePath= [cachePath stringByAppendingPathComponent:@"MidiSong"];
+    return [filePath stringByAppendingPathComponent:fileName];;
+}
+
+- (BOOL)checkSongHasSaveWithSongUrl:(NSString *)songUrl {
+    BOOL hasSaveFile = NO;
+    NSString *fileName = [[songUrl componentsSeparatedByString:@"/"] lastObject];
+    NSString *filePath = [self getFilePathWithName:fileName];
+    
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    if ([fileManager fileExistsAtPath:filePath]) {
+        hasSaveFile = YES;
+    }
+    return hasSaveFile;
+}
+
+
+- (void)sendMessageToSocket:(NSDictionary *)parm {
+    NSString *messageHeader = @"proxyMessage";
+    NSString *sendMessage = [self configDataCommond:messageHeader body:[parm dictionaryValueForKey:@"content"]];
+    [self sendDataToSocketService:sendMessage];
+}
+
+- (void)configAudioDeviceType:(NSDictionary *)parm {
+    AUDIODEVICE_TYPE type = [KSAQRecordManager queryAudioOutputDeviceType];
+    NSString *valueStr = @"";
+    BOOL checkIsWired = NO;
+    switch (type) {
+        case AUDIODEVICE_TYPE_HEADPHONE:
+        {
+            valueStr = @"有线耳机";
+            checkIsWired = YES;
+        }
+            break;
+        case AUDIODEVICE_TYPE_BLUETOOTH:
+        {
+            valueStr = @"蓝牙耳机";
+            checkIsWired = YES;
+        }
+            break;
+        case AUDIODEVICE_TYPE_NONE:
+        {
+            valueStr = @"";
+            checkIsWired = NO;
+        }
+            break;
+        default:
+            break;
+    }
+    NSMutableDictionary *valueDic = [NSMutableDictionary dictionaryWithDictionary:[parm dictionaryValueForKey:@"content"]];
+    [valueDic setValue:valueStr forKey:@"type"];
+    [valueDic setValue:[NSNumber numberWithBool:checkIsWired] forKey:@"checkIsWired"];
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+    [sendParm setValue:valueDic forKey:@"content"];
+    [self postMessage:sendParm];
+}
+
+- (void)startRecordService {
+    if (self.AQManager.isRunning) {
+        [self.AQManager stopRecord];
+    }
+    [self.AQManager startRecord];
+}
+
+- (void)stopRecordService {
+    if (self.AQManager.isRunning) {
+        [self.AQManager stopRecord];
+    }
+}
+
+- (void)puaseRecordService {
+    if (self.AQManager.isRunning) {
+        [self.AQManager pauserRecord];
+    }
+}
+
+- (void)resumeRecordService {
+    [self.AQManager resumeRecord];
+}
+
+- (void)sendEndMessage {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        // 上传停止的信息 发送给服务端
+        NSString *endMessage = @"recordEnd";
+        NSString *endData = [self configDataCommond:endMessage body:nil type:@"SOUND_COMPARE"];
+        [self sendDataToSocketService:endData];
+        self.isCompareStart = NO;
+        NSLog(@"---- send end message");
+    });
+}
+
+#pragma mark-------- KSAQRecordManagerDelegate
+- (void)audioRecordInterruption {
+    NSDictionary *postParm = @{@"api" : @"cancelEvaluating",
+                               @"content" : @{@"reson":@"录制错误,请重试"}
+    };
+    [self postMessage:postParm];
+}
+
+
+
+- (void)audioRouteChange:(AUDIODEVICE_TYPE)type {
+    NSString *valueStr = @"";
+    BOOL checkIsWired = NO;
+    switch (type) {
+        case AUDIODEVICE_TYPE_HEADPHONE:
+        {
+            valueStr = @"有线耳机";
+            checkIsWired = YES;
+        }
+            break;
+        case AUDIODEVICE_TYPE_BLUETOOTH:
+        {
+            valueStr = @"蓝牙耳机";
+            checkIsWired = YES;
+        }
+            break;
+        case AUDIODEVICE_TYPE_NONE:
+        {
+            valueStr = @"";
+            checkIsWired = NO;
+        }
+            break;
+        default:
+            break;
+    }
+    NSDictionary *postParm = @{@"api" : @"listenerWiredStatus",
+                               @"content" : @{@"type":valueStr,
+                                              @"checkIsWired":[NSNumber numberWithBool:checkIsWired]
+                               }
+    };
+    [self postMessage:postParm];
+}
+
+
+
+
+
+- (void)audioRecord:(KSAQRecordManager *)audioRecord didRecordAudioData:(void *)data length:(UInt32)length {
+    
+    if (self.socketManager.socketReadyState != SR_OPEN) {
+        return;
+    }
+    NSData *pushData = [[NSData alloc] initWithBytes:data length:length];
+    if (self.isCompareStart) { // 发送评测开始消息
+        dispatch_async(dispatch_get_main_queue(), ^{
+            NSDate *date = [NSDate date];
+            NSTimeInterval inteveral = [date timeIntervalSince1970];
+            double beginTime = inteveral - audioRecord.sampleTime;
+            NSDictionary *parm = @{
+                @"api" : @"recordStartTime",
+                @"content" : @{@"inteveral" : [NSNumber numberWithDouble:beginTime]}
+            };
+            [self postMessage:parm];
+        });
+        
+        NSLog(@"--------- send start message");
+        _isCompareStart = NO;
+        NSString *startMessage = @"recordStart";
+        NSString *startString = [self configDataCommond:startMessage body:nil type:@"SOUND_COMPARE"];
+        [self sendDataToSocketService:startString];
+         
+//         // 发送开始录制的消息给H5
+//         if (self.recordParm) {
+//              [self postMessage:self.recordParm];
+//         }
+    }
+    else if (self.isSoundCheckStart) { // 校音开始
+        
+        NSLog(@"--------- send check start message");
+        _isSoundCheckStart = NO;
+        NSString *checkStartMessage = @"start";
+        NSString *startString = [self configDataCommond:checkStartMessage body:nil type:@"PITCH_DETECTION"];
+        [self sendDataToSocketService:startString];
+    }
+        NSLog(@"--------- send audio data length %d", length);
+    [self sendDataToSocketService:pushData];
+}
+
+- (NSString *)configDataCommond:(NSString *)commond body:(id)bodyMessage type:(NSString *)dataType {
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    if (bodyMessage) {
+        [parm setValue:bodyMessage forKey:@"body"];
+    }
+    NSMutableDictionary *headerParm = [NSMutableDictionary dictionary];
+    if ([NSString isEmptyString:commond]) {
+        [headerParm setValue:@"" forKey:@"commond"];
+    }
+    else {
+        [headerParm setValue:commond forKey:@"commond"];
+    }
+    if (![NSString isEmptyString:dataType]) {
+        [headerParm setValue:dataType forKey:@"type"];
+    }
+    [headerParm setValue:@(200) forKey:@"status"];
+    [parm setValue:headerParm forKey:@"header"];
+    return [parm mj_JSONString];
 }
 
+
+- (NSString *)configDataCommond:(NSString *)commond body:(id)bodyMessage {
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    if (bodyMessage) {
+        [parm setValue:bodyMessage forKey:@"body"];
+    }
+    if ([NSString isEmptyString:commond]) {
+        [parm setValue:@{@"commond":@""} forKey:@"header"];
+    }
+    else {
+        [parm setValue:@{@"commond":commond} forKey:@"header"];
+    }
+    return [parm mj_JSONString];
+}
+
+- (KSWebSocketManager *)socketManager {
+    if (!_socketManager) {
+        _socketManager = [[KSWebSocketManager alloc] init];
+    }
+    return _socketManager;
+}
+
+#pragma mark --- lazying
+- (UIView *)viewContainer {
+    if (!_viewContainer) {
+        _viewContainer = [[UIView alloc] init];
+    }
+    return _viewContainer;
+}
+
+- (KSVideoRecordManager *)videoRecordManager {
+    if (!_videoRecordManager) {
+        MJWeakSelf;
+        _videoRecordManager = [[KSVideoRecordManager alloc] initSessionRecordCallback:^(BOOL isSuccess, NSString * _Nullable message) {
+            if (isSuccess) {
+                [weakSelf showSuccessMessage:message];
+            }
+            else {
+                if (![NSString isEmptyString:message]) {
+                    [weakSelf MBPShow:message];
+                }
+                
+            }
+        }];
+    }
+    return _videoRecordManager;
+}
+
+- (void)showSuccessMessage:(NSString *)message {
+    [self MBPShow:message];
+    // 成功
+    if (self.endRecordParm) {
+        [self postMessage:self.endRecordParm];
+        self.endRecordParm = nil;
+    }
+}
+
+- (MetronomeType)getBeatTypeFromString:(NSString *)typeString {
+    if ([typeString isEqualToString:@"1/4"]) {
+        return MetronomeType1V4;
+    }
+    else if ([typeString isEqualToString:@"2/4"]) {
+        return MetronomeType2V4;
+    }
+    else if ([typeString isEqualToString:@"3/4"]) {
+        return MetronomeType3V4;
+    }
+    else if ([typeString isEqualToString:@"4/4"]) {
+        return MetronomeType4V4;
+    }
+    else if ([typeString isEqualToString:@"3/8"]) {
+        return MetronomeType3V8;
+    }
+    else if ([typeString isEqualToString:@"6/8"]) {
+        return MetronomeType6V8;
+    }
+    else {
+        return MetronomeType4V4;
+    }
+}
+
+
+#pragma mark ------- midi 播放相关
+- (void)configPlayerEngineWithSong:(NSString *)songPath reportTime:(NSInteger)reportTime {
+    self.initEngineSuccess = NO;
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+        self.playerEngine = [[MidiPlayerEngine alloc] init];
+        self.playerEngine.reportTime = reportTime;
+        self.playerEngine.delegate = self;
+        [self.playerEngine configSoundFilePath:[[NSBundle mainBundle]
+                                                pathForResource:@"synthgms" ofType:@"sf2"]];
+        [self.playerEngine loadMIDIFileWithString:songPath];
+    });
+}
+
+- (void)configAudioSession {
+    self.audioSessionManager = [[KSAudioSessionManager alloc] init];
+    self.audioSessionManager.delegate = self;
+    [self.audioSessionManager configAudioSession:AUDIOCONFIG_PLAYANDRECORD];
+}
+
+#pragma mark ---- PlayerEngineDelegate
+/** 进度更新
+ api: 'cloudTimeUpdae',
+ content: {
+ // 当前曲目id
+ songID: 0,
+ // 当前位置时间(ms)
+ currentTime: 0
+ }
+ */
+/** 播放结束事件
+ api: 'cloudplayed',
+ content: {
+ // 当前曲目id
+ songID: 0,
+ }
+ */
+- (void)ProgressUpdated:(float)progress currentTime:(MusicTimeStamp)currentTime {
+    if (self.isPlaying == NO) {
+        return;
+    }
+    // 回调
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+    [sendParm setValue:@"cloudTimeUpdae" forKey:@"api"];
+    NSMutableDictionary *content = [NSMutableDictionary dictionary];
+    [content setValue:self.currentSongId forKey:@"songID"];
+    [content setValue:@(currentTime*1000) forKey:@"currentTime"];
+    [sendParm setValue:content forKey:@"content"];
+    [self postMessage:sendParm];
+//     NSLog(@"------time source %@", content);
+}
+
+- (void)playEnd {
+    [self stopPlayAction];
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+    [sendParm setValue:@"cloudplayed" forKey:@"api"];
+    NSMutableDictionary *content = [NSMutableDictionary dictionary];
+    [content setValue:self.currentSongId forKey:@"songID"];
+    [sendParm setValue:content forKey:@"content"];
+    [self postMessage:sendParm];
+}
+
+- (void)initPlayerEngineSuccess:(float)totalTime {
+    self.initEngineSuccess = YES;
+    if (self.configEngineParm) {
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:self.configEngineParm];
+        NSMutableDictionary *content = [NSMutableDictionary dictionaryWithDictionary:[sendParm dictionaryValueForKey:@"content"]];
+        [content setValue:@(totalTime*1000) forKey:@"midiDuration"];
+        [sendParm setValue:content forKey:@"content"];
+        [self postMessage:sendParm];
+        self.configEngineParm = nil;
+    }
+}
+
+// 总时长
+- (void)GetMusicTotalTime:(float)time {
+    
+}
+
+
+#pragma mark ----- 播放控制
+- (void)playAction {
+    self.isPlaying = YES;
+    [self.playerEngine playMIDIFile];
+}
+
+- (void)stopPlayAction {
+    self.isPlaying = NO;
+    if ([self.playerEngine isPlayingFile]) {
+        [self.playerEngine stopPlayingMIDIFile];
+    }
+}
 /*
 #pragma mark - Navigation
 

+ 12 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m

@@ -60,6 +60,8 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 @property (nonatomic, assign) CHOOSETYPE fileChooseType;
 
+@property (nonatomic, strong) NSString *bucketName;
+
 @end
 
 @implementation KSBaseWKWebViewController
@@ -76,7 +78,9 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     NSString *status = [notification object];
     NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
     [sendParm setValue:@"paymentOperation" forKey:@"api"];
-    [sendParm setValue:status forKey:@"status"];
+    NSMutableDictionary *content = [NSMutableDictionary dictionary];
+    [content setValue:status forKey:@"status"];
+    [sendParm setValue:content forKey:@"content"];
     [self postMessage:sendParm];
 }
 
@@ -504,6 +508,10 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             
         }
         else if ([[valueDic stringValueForKey:@"type"] isEqualToString:@"multi"]) { // 群聊
+            if ([NSString isEmptyString:targetId]) {
+                [self MBPShow:@"群组id不存在"];
+                return;
+            }
             KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
             ctrl.targetId = targetId;
             ctrl.conversationType = ConversationType_GROUP;
@@ -575,6 +583,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 }
 
 - (void)chooseDocumentWithType:(CHOOSETYPE)fileTyle bucket:(NSString *)bucket {
+    self.bucketName = bucket;
     self.fileChooseType = fileTyle;
     NSArray *documentTypes = @[@"public.content", @"public.text", @"public.source-code", @"public.image", @"public.audio", @"public.audiovisual-content", @"com.adobe.pdf", @"com.apple.keynote.key", @"com.microsoft.word.doc", @"com.microsoft.excel.xls", @"com.microsoft.powerpoint.ppt"];
     KSDocumentViewController *documentPickerViewController = [[KSDocumentViewController alloc] initWithDocumentTypes:documentTypes inMode:UIDocumentPickerModeImport];
@@ -623,7 +632,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     NSString *videoUrl = [content stringValueForKey:@"video"];
     NSString *imgStr = [content stringValueForKey:@"image"];
     UIImage *shareImage = [self imageWithBase64String:imgStr];
-    [KSUMShareManager shareInstanceWithImage:shareImage url:videoUrl shareTitle:shareTitle descMessage:descMessage shareType:shareType callback:^(BOOL isSuccess, NSString *descMessage) {
+    [KSUMShareManager shareInstanceWithImage:shareImage url:videoUrl shareTitle:shareTitle descMessage:descMessage shareType:shareType showInView:self callback:^(BOOL isSuccess, NSString *descMessage) {
         NSMutableDictionary *responParm = [NSMutableDictionary dictionary];
         [responParm setValue:[parm stringValueForKey:@"api"] forKey:@"api"];
         NSMutableDictionary *content = [NSMutableDictionary dictionary];
@@ -1238,6 +1247,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         [self showhud];
         NSString *suffix = [NSString stringWithFormat:@".%@",[[fileName componentsSeparatedByString:@"."] lastObject]];
         NSData *fileData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:fileUrl]];
+        [[KSUploadManager shareInstance] configBucketName:self.bucketName];
         [[KSUploadManager shareInstance] uploadFile:fileData fileName:@"file" fileSuffix:suffix successCallback:^(NSMutableArray * _Nonnull fileUrlArray) {
             [self removehub];
             NSString *fileUrl = [fileUrlArray lastObject];

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

@@ -1917,7 +1917,6 @@
         [parm setValue:@(soundVolume) forKey:@"soundVolume"];
     }
     
-    [parm setValue:musicScoreAccompanimentId forKey:@"musicScoreAccompanimentId"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.h

@@ -0,0 +1,21 @@
+//
+//  KSPublicAlertView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/6/28.
+//
+
+#import "BaseAlertView.h"
+
+typedef void(^AlertCallback)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSPublicAlertView : BaseAlertView
+
++ (instancetype)shareInstanceWithTitle:(NSString *)title descMessage:(NSString *)descMsg leftTitle:(NSString *)leftTitle rightTitle:(NSString *)rightTitle cancelAction:(AlertCallback)cancelCallback sureAction:(AlertCallback)sureCallback;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 81 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.m

@@ -0,0 +1,81 @@
+//
+//  KSPublicAlertView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/6/28.
+//
+
+#import "KSPublicAlertView.h"
+#import "UIView+Animation.h"
+
+@interface KSPublicAlertView ()
+
+@property (weak, nonatomic) IBOutlet UILabel *topTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *descLabel;
+
+@property (weak, nonatomic) IBOutlet UIButton *cancleButton;
+
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+
+@property (nonatomic, copy) AlertCallback cancelCallback;
+
+@property (nonatomic, copy) AlertCallback sureCallback;
+
+@end
+
+
+@implementation KSPublicAlertView
+
++ (instancetype)shareInstanceWithTitle:(NSString *)title descMessage:(NSString *)descMsg leftTitle:(NSString *)leftTitle rightTitle:(NSString *)rightTitle cancelAction:(AlertCallback)cancelCallback sureAction:(AlertCallback)sureCallback {
+    KSPublicAlertView *alertView = [[[NSBundle mainBundle] loadNibNamed:@"KSPublicAlertView" owner:nil options:nil] firstObject];
+    alertView.topTitle.text = title;
+    alertView.descLabel.text = descMsg;
+    [alertView.cancleButton setTitle:leftTitle forState:UIControlStateNormal];
+    [alertView.sureButton setTitle:rightTitle forState:UIControlStateNormal];
+    if (cancelCallback) {
+        alertView.cancelCallback = cancelCallback;
+    }
+    if (sureCallback) {
+        alertView.sureCallback = sureCallback;
+    }
+    [alertView showAlert];
+    return alertView;
+}
+
+- (void)showAlert {
+    [[NSObject getKeyWindow] addSubview:self];
+    [self mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.top.bottom.right.mas_equalTo([NSObject getKeyWindow]);
+    }];
+    [self setPopAnimation];
+}
+
+- (void)hiddenAction {
+    [self removeFromSuperview];
+}
+
+- (IBAction)cancleAction:(id)sender {
+    if (self.cancelCallback) {
+        self.cancelCallback();
+    }
+    [self hiddenAction];
+}
+
+- (IBAction)sureAction:(id)sender {
+    if (self.sureCallback) {
+        self.sureCallback();
+    }
+    [self hiddenAction];
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 148 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSPublicAlertView.xib

@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSPublicAlertView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="831"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3b9-KX-1f0">
+                    <rect key="frame" x="47" y="322.5" width="320" height="186.5"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="提示" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dY9-ag-CwK">
+                            <rect key="frame" x="27" y="18" width="273" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="30" id="TAa-cN-fF8"/>
+                            </constraints>
+                            <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="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L4C-eG-exs">
+                            <rect key="frame" x="162.5" y="125.5" width="144.5" height="44"/>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <state key="normal" title="确定">
+                                <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            </state>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="22"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Pgy-t6-4Ry"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yAc-6f-XSy">
+                            <rect key="frame" x="13" y="125.5" width="144.5" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="44" id="5K1-u8-Aw6"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <state key="normal" title="取消">
+                                <color key="titleColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                            </state>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="22"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="lY7-O5-Xqp"/>
+                            </connections>
+                        </button>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="75G-K8-Mgg">
+                            <rect key="frame" x="19" y="68" width="287" height="33.5"/>
+                            <string key="text">聊天功能已断开,是否重新连接?
+</string>
+                            <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>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hVM-RC-bSr">
+                            <rect key="frame" x="18" y="24" width="4" height="18"/>
+                            <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="18" id="xpH-rm-A2j"/>
+                                <constraint firstAttribute="width" constant="4" id="z6W-x6-koW"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="2"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="yAc-6f-XSy" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="13" id="A7x-aI-IyD"/>
+                        <constraint firstItem="L4C-eG-exs" firstAttribute="leading" secondItem="yAc-6f-XSy" secondAttribute="trailing" constant="5" id="Bh6-PY-p4S"/>
+                        <constraint firstItem="L4C-eG-exs" firstAttribute="height" secondItem="yAc-6f-XSy" secondAttribute="height" id="BnZ-2L-eok"/>
+                        <constraint firstAttribute="trailing" secondItem="dY9-ag-CwK" secondAttribute="trailing" constant="20" id="Ip9-L6-2Nn"/>
+                        <constraint firstAttribute="trailing" secondItem="75G-K8-Mgg" secondAttribute="trailing" constant="14" id="Ipw-PS-rsG"/>
+                        <constraint firstAttribute="bottom" secondItem="yAc-6f-XSy" secondAttribute="bottom" constant="17" id="UiJ-kA-PXC"/>
+                        <constraint firstItem="dY9-ag-CwK" firstAttribute="top" secondItem="3b9-KX-1f0" secondAttribute="top" constant="18" id="YCe-mx-ufc"/>
+                        <constraint firstItem="75G-K8-Mgg" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="19" id="Zgf-bs-adf"/>
+                        <constraint firstItem="75G-K8-Mgg" firstAttribute="top" secondItem="dY9-ag-CwK" secondAttribute="bottom" constant="20" id="aTo-Dm-iuu"/>
+                        <constraint firstItem="dY9-ag-CwK" firstAttribute="leading" secondItem="hVM-RC-bSr" secondAttribute="trailing" constant="5" id="d4n-7h-4Cm"/>
+                        <constraint firstItem="hVM-RC-bSr" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="18" id="fUG-ke-LAn"/>
+                        <constraint firstItem="dY9-ag-CwK" firstAttribute="centerY" secondItem="hVM-RC-bSr" secondAttribute="centerY" id="iW4-rB-oPc"/>
+                        <constraint firstAttribute="trailing" secondItem="L4C-eG-exs" secondAttribute="trailing" constant="13" id="phn-RV-9gH"/>
+                        <constraint firstAttribute="width" constant="320" id="q4k-AQ-LaT"/>
+                        <constraint firstItem="L4C-eG-exs" firstAttribute="bottom" secondItem="yAc-6f-XSy" secondAttribute="bottom" id="vyg-TN-SBp"/>
+                        <constraint firstItem="L4C-eG-exs" firstAttribute="width" secondItem="yAc-6f-XSy" secondAttribute="width" id="y46-NI-6sF"/>
+                        <constraint firstItem="L4C-eG-exs" firstAttribute="top" secondItem="75G-K8-Mgg" secondAttribute="bottom" constant="24" id="zGT-pp-1AG"/>
+                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="140" id="zrQ-iS-sC6"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="24"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.22" colorSpace="calibratedRGB"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="24"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="6"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="maskToBounces" value="NO"/>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="calibratedRGB"/>
+            <constraints>
+                <constraint firstItem="3b9-KX-1f0" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="84x-BF-hZR"/>
+                <constraint firstItem="3b9-KX-1f0" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="8s3-O0-UPX"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="cancleButton" destination="yAc-6f-XSy" id="gft-OU-gCQ"/>
+                <outlet property="descLabel" destination="75G-K8-Mgg" id="KFH-sk-nhd"/>
+                <outlet property="sureButton" destination="L4C-eG-exs" id="tY3-Sd-5cK"/>
+                <outlet property="topTitle" destination="dY9-ag-CwK" id="XN4-1j-Rmz"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="132.25446428571428"/>
+        </view>
+    </objects>
+</document>

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSTipsAlert.h

@@ -6,13 +6,13 @@
 //  Copyright © 2021 DayaMusic. All rights reserved.
 //
 
-#import <UIKit/UIKit.h>
+#import "BaseAlertView.h"
 
 typedef void(^TipsAlertCallback)(BOOL isSure);
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface KSTipsAlert : UIView
+@interface KSTipsAlert : BaseAlertView
 
 + (instancetype)shareInstanceWithTitle:(NSString *)title descMessage:(NSString *)descMessage leftTitle:(NSString *)leftTitle rightTitle:(NSString *)rightTitle callback:(TipsAlertCallback)callback;
 

+ 45 - 25
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSTipsAlert.xib

@@ -14,48 +14,67 @@
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ypl-H9-e3L">
-                    <rect key="frame" x="47" y="176" width="320" height="165.5"/>
+                    <rect key="frame" x="47" y="165.5" width="320" height="186.5"/>
                     <subviews>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="提示" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fjg-28-kfA">
-                            <rect key="frame" x="29" y="20" width="271" height="24"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="20"/>
-                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <rect key="frame" x="27" y="18" width="273" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="30" id="Oap-77-z3x"/>
+                            </constraints>
+                            <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="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x2J-5B-1Wq">
-                            <rect key="frame" x="235" y="120.5" width="60" height="40"/>
-                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <rect key="frame" x="162.5" y="125.5" width="144.5" height="44"/>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <state key="normal" title="确定">
-                                <color key="titleColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
+                                <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                             </state>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="22"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
                             <connections>
                                 <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="TIl-ub-i4Z"/>
                             </connections>
                         </button>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7Kd-Un-rMd">
-                            <rect key="frame" x="25" y="120.5" width="60" height="40"/>
+                            <rect key="frame" x="13" y="125.5" width="144.5" height="44"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="40" id="K0Z-aa-pVg"/>
-                                <constraint firstAttribute="width" constant="60" id="zKU-hs-uKq"/>
+                                <constraint firstAttribute="height" constant="44" id="K0Z-aa-pVg"/>
                             </constraints>
-                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <state key="normal" title="取消">
                                 <color key="titleColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
                             </state>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="22"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
                             <connections>
                                 <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="MQM-uv-Jkp"/>
                             </connections>
                         </button>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YM9-iV-JM6">
-                            <rect key="frame" x="16" y="67" width="288" height="38.5"/>
+                            <rect key="frame" x="19" y="68" width="287" height="33.5"/>
                             <string key="text">聊天功能已断开,是否重新连接?
 </string>
-                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <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>
                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="I5d-vy-DYW">
-                            <rect key="frame" x="20" y="24" width="4" height="18"/>
+                            <rect key="frame" x="18" y="24" width="4" height="18"/>
                             <color key="backgroundColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="4" id="9KX-ZB-vT4"/>
@@ -71,22 +90,23 @@
                     <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="320" id="2I4-8N-ncb"/>
-                        <constraint firstItem="7Kd-Un-rMd" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="25" id="2fu-SB-zQH"/>
-                        <constraint firstItem="fjg-28-kfA" firstAttribute="top" secondItem="ypl-H9-e3L" secondAttribute="top" constant="20" id="E7H-Vl-JqW"/>
-                        <constraint firstAttribute="trailing" secondItem="x2J-5B-1Wq" secondAttribute="trailing" constant="25" id="GJx-ee-74l"/>
+                        <constraint firstItem="7Kd-Un-rMd" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="13" id="2fu-SB-zQH"/>
+                        <constraint firstItem="fjg-28-kfA" firstAttribute="top" secondItem="ypl-H9-e3L" secondAttribute="top" constant="18" id="E7H-Vl-JqW"/>
+                        <constraint firstAttribute="trailing" secondItem="x2J-5B-1Wq" secondAttribute="trailing" constant="13" id="GJx-ee-74l"/>
                         <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="140" id="GSF-uC-Gz2"/>
-                        <constraint firstItem="x2J-5B-1Wq" firstAttribute="top" secondItem="YM9-iV-JM6" secondAttribute="bottom" constant="15" id="IDC-5m-0Tm"/>
-                        <constraint firstItem="YM9-iV-JM6" firstAttribute="top" secondItem="fjg-28-kfA" secondAttribute="bottom" constant="23" id="Ios-2z-QHw"/>
+                        <constraint firstItem="x2J-5B-1Wq" firstAttribute="top" secondItem="YM9-iV-JM6" secondAttribute="bottom" constant="24" id="IDC-5m-0Tm"/>
+                        <constraint firstItem="YM9-iV-JM6" firstAttribute="top" secondItem="fjg-28-kfA" secondAttribute="bottom" constant="20" id="Ios-2z-QHw"/>
                         <constraint firstItem="x2J-5B-1Wq" firstAttribute="width" secondItem="7Kd-Un-rMd" secondAttribute="width" id="PTM-XO-HCz"/>
-                        <constraint firstAttribute="trailing" secondItem="YM9-iV-JM6" secondAttribute="trailing" constant="16" id="Psf-V1-FR5"/>
+                        <constraint firstAttribute="trailing" secondItem="YM9-iV-JM6" secondAttribute="trailing" constant="14" id="Psf-V1-FR5"/>
+                        <constraint firstItem="fjg-28-kfA" firstAttribute="centerY" secondItem="I5d-vy-DYW" secondAttribute="centerY" id="R1Y-To-jlG"/>
                         <constraint firstItem="fjg-28-kfA" firstAttribute="leading" secondItem="I5d-vy-DYW" secondAttribute="trailing" constant="5" id="SDs-L9-pP2"/>
-                        <constraint firstItem="I5d-vy-DYW" firstAttribute="top" secondItem="ypl-H9-e3L" secondAttribute="top" constant="24" id="awt-qa-cOF"/>
-                        <constraint firstItem="I5d-vy-DYW" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="20" id="fxs-c1-c0a"/>
+                        <constraint firstItem="I5d-vy-DYW" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="18" id="fxs-c1-c0a"/>
+                        <constraint firstItem="x2J-5B-1Wq" firstAttribute="leading" secondItem="7Kd-Un-rMd" secondAttribute="trailing" constant="5" id="gxB-ts-aLK"/>
                         <constraint firstAttribute="trailing" secondItem="fjg-28-kfA" secondAttribute="trailing" constant="20" id="lSX-79-Ova"/>
-                        <constraint firstItem="YM9-iV-JM6" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="16" id="pcs-sK-TWX"/>
+                        <constraint firstItem="YM9-iV-JM6" firstAttribute="leading" secondItem="ypl-H9-e3L" secondAttribute="leading" constant="19" id="pcs-sK-TWX"/>
                         <constraint firstItem="x2J-5B-1Wq" firstAttribute="height" secondItem="7Kd-Un-rMd" secondAttribute="height" id="q3C-Y0-Xtu"/>
                         <constraint firstItem="x2J-5B-1Wq" firstAttribute="bottom" secondItem="7Kd-Un-rMd" secondAttribute="bottom" id="tyq-wv-hWX"/>
-                        <constraint firstAttribute="bottom" secondItem="7Kd-Un-rMd" secondAttribute="bottom" constant="5" id="vgB-5h-vtD"/>
+                        <constraint firstAttribute="bottom" secondItem="7Kd-Un-rMd" secondAttribute="bottom" constant="17" id="vgB-5h-vtD"/>
                     </constraints>
                     <userDefinedRuntimeAttributes>
                         <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSUpdateAlert.h

@@ -6,14 +6,14 @@
 //  Copyright © 2021 DayaMusic. All rights reserved.
 //
 
-#import <UIKit/UIKit.h>
+#import "BaseAlertView.h"
 
 
 typedef void(^UpdateCallback)(BOOL isSure);
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface KSUpdateAlert : UIView
+@interface KSUpdateAlert : BaseAlertView
 
 + (instancetype)shareInstance;
 

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSUpdateAlert.xib

@@ -61,7 +61,7 @@
                             <subviews>
                                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bQj-kr-1ay">
                                     <rect key="frame" x="24" y="-4" width="224" height="42"/>
-                                    <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="calibratedRGB"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="42" id="cef-4x-IAB"/>
                                     </constraints>
@@ -128,7 +128,7 @@
                     </userDefinedRuntimeAttributes>
                 </view>
                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="upAlert_bg" translatesAutoresizingMaskIntoConstraints="NO" id="2E8-CJ-lc7">
-                    <rect key="frame" x="71" y="255" width="272" height="121"/>
+                    <rect key="frame" x="71" y="199" width="272" height="177"/>
                 </imageView>
             </subviews>
             <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -153,7 +153,7 @@
         </view>
     </objects>
     <resources>
-        <image name="upAlert_bg" width="272" height="121"/>
+        <image name="upAlert_bg" width="272" height="177"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>

+ 40 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.h

@@ -0,0 +1,40 @@
+//
+//  KSVideoRecordManager.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/8/16.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef void(^KSVideoRecordCallback)(BOOL isSuccess, NSString * _Nullable message);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSVideoRecordManager : NSObject
+
+
+@property (nonatomic, strong) NSURL *audioUrl;
+
+@property (nonatomic, assign) BOOL ignoreAudio;
+
+- (instancetype)initSessionRecordCallback:(KSVideoRecordCallback)callback;
+
+- (void)configSessiondisplayInView:(UIView *)containerView;
+
+- (void)removeDisplay;
+
+- (void)stopSession;
+
+- (void)resetSession;
+
+- (void)startRecord;
+
+- (void)stopRecord;
+
+- (void)uploadRecordVideoSuccess:(void(^)(NSString *videoUrl))success failure:(void(^)(NSString *desc))faliure;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 435 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.m

@@ -0,0 +1,435 @@
+//
+//  KSVideoRecordManager.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/8/16.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import "KSVideoRecordManager.h"
+#import <AVFoundation/AVFoundation.h>
+#import <AssetsLibrary/AssetsLibrary.h>
+#import "TZImageManager.h"
+#import "KSVideoEditor.h"
+
+@interface KSVideoRecordManager ()<AVCaptureFileOutputRecordingDelegate>
+
+//会话 负责输入和输出设备之间的数据传递
+@property (nonatomic, strong) AVCaptureSession *captureSession;
+
+@property (nonatomic, strong) AVCaptureDeviceInput *videoCaptureDeviceInput;
+
+@property (nonatomic, strong) AVCaptureDeviceInput *audioCaptureDeviceInput;
+
+// 视频流输出
+@property (nonatomic, strong) AVCaptureMovieFileOutput *captureMovieFileOutput;
+
+// 相机拍摄预览图层
+@property (nonatomic, strong) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;
+
+@property (nonatomic, strong) NSURL *videoFileURL;
+
+@property (nonatomic, assign) BOOL recordEnable;
+
+// 是否正在录制
+@property (nonatomic, assign) BOOL isRecording;
+
+@property (nonatomic, copy) KSVideoRecordCallback callback;
+
+@property (nonatomic, strong) PHAsset *videoAsset;
+
+@property (nonatomic, strong) NSString *presentName;
+
+@property (strong, nonatomic) MBProgressHUD *HUD;
+
+@end
+
+@implementation KSVideoRecordManager
+
+- (instancetype)initSessionRecordCallback:(KSVideoRecordCallback)callback {
+    self = [super init];
+    if (self) {
+        if (callback) {
+            self.callback = callback;
+        }
+    }
+    return self;
+}
+
+- (void)setIgnoreAudio:(BOOL)ignoreAudio {
+    _ignoreAudio = ignoreAudio;
+    [self resetSession];
+}
+
+- (void)configSessiondisplayInView:(UIView *)containerView {
+    _captureSession = [[AVCaptureSession alloc] init];
+
+    // 设置YES 播放web伴奏会导致打断
+    _captureSession.automaticallyConfiguresApplicationAudioSession = NO;
+    // 初始化会话对象
+    if ([_captureSession canSetSessionPreset:AVCaptureSessionPresetInputPriority]) {
+        _captureSession.sessionPreset = AVCaptureSessionPresetInputPriority;
+    }
+    NSError *error = nil;
+    
+    // 获取视频输出对象
+    AVCaptureDevice *videoCaptureDevice = [self cameraDeviceWithPosition:(AVCaptureDevicePositionFront)];
+    if (!videoCaptureDevice) {
+        if (self.callback) {
+            self.callback(NO, @"获取后置摄像头失败!");
+        }
+    }
+    _videoCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error];
+    if (error) {
+        if (self.callback) {
+            self.callback(NO, @"获取视频设备输入出错!");
+        }
+        return;
+    }
+    if ([_captureSession canAddInput:_videoCaptureDeviceInput]) {
+        [_captureSession addInput:_videoCaptureDeviceInput];
+    }
+    else {
+        if (self.callback) {
+            self.callback(NO, @"无法添加视频输入对象");
+        }
+    }
+    if (_ignoreAudio == NO) {
+        // 获取音频输入对象
+        AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
+        _audioCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];
+        if (error) {
+            if (self.callback) {
+                self.callback(NO, @"获取音频设备输入出错!");
+            }
+            return;
+        }
+        //将设备输入添加到会话中
+        if ([_captureSession canAddInput:_audioCaptureDeviceInput]) {
+            [_captureSession addInput:_audioCaptureDeviceInput];
+        }
+        else {
+            if (self.callback) {
+                self.callback(NO, @"无法添加音频输入对象!");
+            }
+        }
+    }
+    
+    // 初始化设备输出对象
+    _captureMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
+    _captureMovieFileOutput.movieFragmentInterval = kCMTimeInvalid;
+    
+    //将设备输出添加到会话中
+    if ([_captureSession canAddOutput:_captureMovieFileOutput]) {
+        AVCaptureConnection *captureConnection = [_captureMovieFileOutput connectionWithMediaType:AVMediaTypeVideo];
+        //防抖功能
+        if ([captureConnection isVideoStabilizationSupported]) {
+            captureConnection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
+        }
+        [_captureSession addOutput:_captureMovieFileOutput];
+    }
+    
+    //创建视频预览图层
+    _captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
+    containerView.layer.masksToBounds = YES;
+    _captureVideoPreviewLayer.frame = containerView.bounds;
+    _captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
+    _captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
+    [containerView.layer addSublayer:_captureVideoPreviewLayer];
+    
+    // 一定要在添加了 input 和 output之后~
+    AVCaptureConnection *captureConnection = [_captureMovieFileOutput connectionWithMediaType:AVMediaTypeVideo];
+    captureConnection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
+    
+    [self.captureSession startRunning];
+}
+
+- (void)removeDisplay {
+    [self stopSession];
+    if (_captureVideoPreviewLayer) {
+        [_captureVideoPreviewLayer removeFromSuperlayer];
+    }
+}
+
+- (void)resetSession {
+    if (_ignoreAudio == NO) {
+        [_captureSession beginConfiguration];
+        if (_audioCaptureDeviceInput) {
+            [_captureSession removeInput:_audioCaptureDeviceInput];
+        }
+        
+        NSError *error = nil;
+        // 获取音频输入对象
+        AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
+        _audioCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];
+        if (error) {
+            if (self.callback) {
+                self.callback(NO, @"获取音频设备输入出错!");
+            }
+            return;
+        }
+        if ([_captureSession canAddInput:_audioCaptureDeviceInput]) {
+            [_captureSession addInput:_audioCaptureDeviceInput];
+        }
+        else {
+            if (self.callback) {
+                self.callback(NO, @"无法添加音频输入对象");
+            }
+        }
+        
+        [_captureSession commitConfiguration];
+        
+    }
+    [self.captureSession startRunning];
+    
+}
+
+- (void)stopSession {
+    if (_captureSession) {
+        [self.captureSession stopRunning];
+        self.captureSession = nil;
+    }
+}
+
+- (void)startRecord {
+    if (_captureMovieFileOutput) {
+        // 开始录制
+        [self.captureMovieFileOutput startRecordingToOutputFileURL:[NSURL fileURLWithPath:[self getRecordFilePath]] recordingDelegate:self];
+    }
+    
+}
+
+- (void)stopRecord {
+    if (_captureMovieFileOutput) {
+        [self.captureMovieFileOutput stopRecording];
+    }
+    [self resetSession];
+}
+
+
+- (void)removeVideoWithPath:(NSString *)videoUrl {
+    NSFileManager *fileMamager = [NSFileManager defaultManager];
+    if ([fileMamager fileExistsAtPath:videoUrl]) {
+        [fileMamager removeItemAtPath:videoUrl error:nil];
+    }
+}
+
+/**取得指定位置的摄像头*/
+- (AVCaptureDevice *)cameraDeviceWithPosition:(AVCaptureDevicePosition)position {
+    NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
+    for (AVCaptureDevice *camera in cameras) {
+        if ([camera position] == position) {
+            return camera;
+        }
+    }
+    return nil;
+}
+// 切换摄像头
+- (void)swapCameras {
+    // Assume the session is already running
+    NSArray *inputs =self.captureSession.inputs;
+    for (AVCaptureDeviceInput *input in inputs ) {
+        AVCaptureDevice *device = input.device;
+        if ( [device hasMediaType:AVMediaTypeVideo] ) {
+            AVCaptureDevicePosition position = device.position;
+            AVCaptureDevice *newCamera =nil;
+            AVCaptureDeviceInput *newInput =nil;
+            
+            if (position ==AVCaptureDevicePositionFront)
+                newCamera = [self cameraDeviceWithPosition:AVCaptureDevicePositionBack];
+            else
+                newCamera = [self cameraDeviceWithPosition:AVCaptureDevicePositionFront];
+            newInput = [AVCaptureDeviceInput deviceInputWithDevice:newCamera error:nil];
+            
+            // beginConfiguration ensures that pending changes are not applied immediately
+            [self.captureSession beginConfiguration];
+            
+            [self.captureSession removeInput:input];
+            [self.captureSession addInput:newInput];
+            
+            // Changes take effect once the outermost commitConfiguration is invoked.
+            [self.captureSession commitConfiguration];
+            break;
+        }
+    }
+}
+
+#pragma mark --------  AVCaptureFileOutputRecordingDelegate  ----------
+- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections {
+    NSLog(@"开始录制");
+    _isRecording = YES;
+}
+
+- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {
+    if (error) {
+        NSLog(@"error desc :%@", error.description);
+    }
+    NSLog(@"录制结束");
+    _isRecording = NO;
+    [self.captureSession stopRunning];
+    // 暂时存储文件地址
+    self.videoFileURL = outputFileURL;
+   // 保存文件
+    if (_ignoreAudio == NO) {
+        [self saveVideoToAsset:self.videoFileURL];
+    }
+    else {
+        [self addBackgroundMuisc:self.audioUrl];
+    }
+}
+
+// 生成文件 合并音轨
+- (void)addBackgroundMuisc:(NSURL *)audioUrl {
+    AVURLAsset* audioAsset =[AVURLAsset URLAssetWithURL:audioUrl options:nil];
+    
+    CMTime audioDuration = audioAsset.duration;
+    
+    float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
+    
+    NSLog(@"%f",audioDurationSeconds);
+    [KSVideoEditor addBackgroundMiusicWithVideoUrlStr:self.videoFileURL audioUrl:audioUrl start:0 end:audioDurationSeconds isOriginalSound:NO oriVolume:0 newVolume:100 completion:^(NSString * _Nonnull outPath, BOOL isSuccess) {
+        if (isSuccess) {
+            [self saveVideoToAsset:[NSURL fileURLWithPath:outPath]];
+        }
+        else {
+            
+        }
+    }];
+}
+
+
+
+// 保存到相册
+- (void)saveVideoToAsset:(NSURL *)videoUrl {
+    [MBProgressHUD ksShowHUDWithText:@"视频处理中..."];
+    [[TZImageManager manager] saveVideoWithUrl:videoUrl completion:^(PHAsset *asset, NSError *error) {
+        if (!error) {
+            self.videoAsset = asset;
+            dispatch_main_async_safe(^{
+                [MBProgressHUD ksHideHUD];
+                if (self.callback) {
+                    self.callback(YES, @"保存成功");
+                }
+                
+                // 删除文件
+                [self removeVideoWithPath:self.videoFileURL.path];
+                [self removeVideoWithPath:videoUrl.path];
+                // 重置
+                [self resetSession];
+                
+            });
+        }
+        else {
+            dispatch_main_async_safe(^{
+                [MBProgressHUD ksHideHUD];
+                if (self.callback) {
+                    self.callback(NO, @"保存视频错误");
+                }
+                // 删除文件
+                [self removeVideoWithPath:self.videoFileURL.path];
+                [self removeVideoWithPath:videoUrl.path];
+                // 重置
+                [self resetSession];
+                
+            });
+        }
+    }];
+}
+
+// 上传视频
+- (void)uploadRecordVideoSuccess:(void (^)(NSString * _Nonnull))success failure:(void (^)(NSString * _Nonnull))faliure {
+    if (self.videoAsset) {
+        dispatch_main_async_safe(^{
+            [MBProgressHUD ksShowHUDWithText:@"视频导出中..."];
+        });
+        [[TZImageManager manager] getVideoOutputPathWithAsset:self.videoAsset presetName:self.presentName success:^(NSString *outputPath) {
+            dispatch_main_async_safe(^{
+                [MBProgressHUD ksHideHUD];
+            });
+            NSLog(@"视频导出到本地完成,沙盒路径为:%@",outputPath);
+            NSData *outputData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:outputPath]]; //压缩后的视频
+            NSLog(@"导出后的视频:%@",[NSString stringWithFormat:@"%.2fM",(CGFloat)outputData.length/(1024*1024)]);
+            // 上传
+            dispatch_main_async_safe(^{
+                [self sendVideoActionWith:outputPath success:success failure:faliure];
+            });
+            
+        } failure:^(NSString *errorMessage, NSError *error) {
+            dispatch_main_async_safe(^{
+                [MBProgressHUD ksHideHUD];
+                faliure(@"视频导出失败");
+            });
+            NSLog(@"视频导出失败:%@,error:%@",errorMessage, error);
+            
+        }];
+    }
+    else {
+        faliure(@"未找到视频资源");
+    }
+}
+
+
+- (void)sendVideoActionWith:(NSString *)fileUrl success:(void (^)(NSString * _Nonnull))success failure:(void (^)(NSString * _Nonnull))faliure {
+    [self hudTipWillShow:YES];
+    NSData *fileData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:fileUrl]];
+    NSString *suffix = [NSString stringWithFormat:@".%@",[fileUrl pathExtension]];
+    [[KSUploadManager shareInstance] configBucketName:@"daya"];
+    [[KSUploadManager shareInstance] videoUpload:fileData fileName:@"video" fileSuffix:suffix progress:^(int64_t bytesWritten, int64_t totalBytes) {
+        // 显示进度
+        if (self.HUD) {
+            self.HUD.progress = bytesWritten / totalBytes;// progress是回调进度
+        }
+    } successCallback:^(NSMutableArray * _Nonnull fileUrlArray) {
+        [self hudTipWillShow:NO];
+        NSString *fileUrl = [fileUrlArray lastObject];
+        success(fileUrl);
+        
+    } faliure:^(NSError * _Nullable error, NSString * _Nullable descMessaeg) {
+        [self hudTipWillShow:NO];
+        faliure(descMessaeg);
+    }];
+}
+
+- (void)hudTipWillShow:(BOOL)willShow{
+    if (willShow) {
+        
+        UIWindow *keyWindow = [NSObject getKeyWindow];
+        if (!_HUD) {
+            _HUD = [MBProgressHUD showHUDAddedTo:keyWindow animated:YES];
+            _HUD.label.textColor = [UIColor whiteColor];
+            _HUD.mode = MBProgressHUDModeDeterminateHorizontalBar;
+            _HUD.label.text = @"正在上传视频...";
+            _HUD.contentColor = [UIColor whiteColor];
+            _HUD.removeFromSuperViewOnHide = YES;
+            _HUD.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
+            _HUD.bezelView.backgroundColor = [UIColor colorWithHexString:@"#000000" alpha:0.8];
+        }else{
+            _HUD.progress = 0;
+            [keyWindow addSubview:_HUD];
+            [_HUD showAnimated:YES];
+        }
+    }else{
+        [_HUD hideAnimated:YES];
+    }
+}
+
+
+#pragma mark ------ 设置录制地址
+- (NSString *)getRecordFilePath {
+    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AccompanyVideoData"];
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    BOOL isDir = FALSE;
+    BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
+    if(!(isDirExist && isDir)) {
+        BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
+        if(!bCreateDir){
+            NSLog(@"创建文件夹失败!");
+        }
+        NSLog(@"创建文件夹成功,文件路径%@",path);
+    }
+    NSString *songName = @"recordSong";
+    NSString *fileName = [NSString stringWithFormat:@"%@.mp4",songName];
+    NSString *filePath = [path stringByAppendingPathComponent:fileName];
+    return filePath;
+}
+@end

+ 9 - 4
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSButtonStatusView.m

@@ -36,13 +36,13 @@
         _desLabel.font = [UIFont systemFontOfSize:15.0f];
         _desLabel.textColor = HexRGB(0x999999);
         _desLabel.textAlignment = NSTextAlignmentCenter;
-        _desLabel.numberOfLines = 1;
+        _desLabel.numberOfLines = 2;
         [self addSubview:_desLabel];
         [_desLabel mas_makeConstraints:^(MASConstraintMaker *make) {
             make.centerX.mas_equalTo(self.mas_centerX);
             make.top.mas_equalTo(_imgView.mas_bottom).offset(0);
             make.width.mas_equalTo(280);
-            make.height.mas_equalTo(27);
+            make.height.mas_greaterThanOrEqualTo(27);
         }];
        
         
@@ -55,7 +55,7 @@
         [self addSubview:_sureButton];
         [_sureButton mas_makeConstraints:^(MASConstraintMaker *make) {
             make.centerX.mas_equalTo(self.mas_centerX);
-            make.top.mas_equalTo(_desLabel.mas_bottom).offset(10);
+            make.top.mas_equalTo(_desLabel.mas_bottom).offset(30);
             make.width.mas_equalTo(200);
             make.height.mas_equalTo(44);
         }];
@@ -77,7 +77,12 @@
 
 -(void)setText:(NSString *)strText
 {
-    _desLabel.text = strText;
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:4];//调整行间距
+    [paragraphStyle setAlignment:NSTextAlignmentCenter];
+    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:strText attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:15.0f],NSForegroundColorAttributeName:HexRGB(0x999999)}];
+    
+    [_desLabel setAttributedText:attr];
     [_desLabel sizeToFit];
 }
 

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSFullDatePicker.m

@@ -102,7 +102,7 @@ typedef NS_ENUM(NSInteger, PickViewTag) {
     self.frame = CGRectMake(0, 0, kScreen_Width, kScreen_Height);
     self.backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_Width, kScreen_Height)];
     self.backView.backgroundColor = HexRGBAlpha(0x363636, 0.55f);
-    
+    self.date = date;
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
     tap.delegate = self;
     [self.backView addGestureRecognizer:tap];
@@ -669,7 +669,7 @@ typedef NS_ENUM(NSInteger, PickViewTag) {
 #pragma mark resetDateTo current date
 - (void)resetDateToCurrentDate {
     
-    NSDate* nowDate = [NSDate date];
+    NSDate* nowDate = self.date;
     [self.yearPicker selectRow:[self.yearArray count]-100 inComponent:0 animated:YES];
     [self.monthPicker selectRow:[nowDate getMonth]-1 inComponent:0 animated:YES];
     [self.dayPicker selectRow:[nowDate getDay]-1 inComponent:0 animated:YES];

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/KSImageAlert.h

@@ -7,12 +7,13 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "BaseAlertView.h"
 
 typedef void(^AlertCallback)(BOOL isSure);
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface KSImageAlert : UIView
+@interface KSImageAlert : BaseAlertView
 @property (weak, nonatomic) IBOutlet UILabel *topTitle;
 
 @property (weak, nonatomic) IBOutlet UILabel *titleLabel;

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/UMShare/KSUMShareManager.h

@@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (instancetype)shareInstance;
 
-+ (instancetype)shareInstanceWithImage:(UIImage *)image url:(NSString *)url shareTitle:(NSString *)shareTitle descMessage:(NSString *)descMessage shareType:(KSSHARETYPE)type callback:(KSShareActionCallback)callback;
++ (instancetype)shareInstanceWithImage:(UIImage *)image url:(NSString *)url shareTitle:(NSString *)shareTitle descMessage:(NSString *)descMessage shareType:(KSSHARETYPE)type showInView:(UIViewController *)ctrl callback:(KSShareActionCallback)callback;
 
 
 @end

+ 89 - 39
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/UMShare/KSUMShareManager.m

@@ -8,6 +8,8 @@
 #import "KSUMShareManager.h"
 #import <UMShare/UMShare.h>
 #import <UShareUI/UShareUI.h>
+#import "TZImageManager.h"
+#import "KSShareGroupViewController.h"
 
 @interface KSUMShareManager ()
 
@@ -21,6 +23,8 @@
 
 @property (nonatomic, strong) UIImage *shareImage;
 
+@property (nonatomic, strong) UIViewController *displayCtrl;
+
 @property (nonatomic, assign) KSSHARETYPE shareType;
 
 @end
@@ -32,12 +36,13 @@
     return manager;
 }
 
-+ (instancetype)shareInstanceWithImage:(UIImage *)image url:(NSString *)url shareTitle:(NSString *)shareTitle descMessage:(NSString *)descMessage shareType:(KSSHARETYPE)type callback:(KSShareActionCallback)callback {
++ (instancetype)shareInstanceWithImage:(UIImage *)image url:(NSString *)url shareTitle:(NSString *)shareTitle descMessage:(NSString *)descMessage shareType:(KSSHARETYPE)type showInView:(UIViewController *)ctrl callback:(KSShareActionCallback)callback {
     KSUMShareManager *manager = [[self alloc] init];
     manager.shareType = type;
     manager.shareImage = image;
     manager.shareUrl = url;
     manager.shareTitle = shareTitle;
+    manager.displayCtrl = ctrl;
     manager.shareMessage = descMessage;
     if (callback) {
         manager.callback = callback;
@@ -48,51 +53,96 @@
 
 - (void)openShareView {
     [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) {
-        
-        //创建分享消息对象
-        UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
-        NSString *shareTitle = @"";
-        if (![NSString isEmptyString:self.shareTitle]) {
-            shareTitle = self.shareTitle;
-        }
-        NSString *descMessage = @"";
-        if (self.shareMessage) {
-            descMessage = self.shareMessage;
-        }
-        // 创建分享对象
-        if (self.shareType == KSSHARETYPE_IMAGE) {
-            UMShareImageObject *shareObj = [UMShareImageObject shareObjectWithTitle:shareTitle descr:descMessage thumImage:[UIImage imageNamed:@"shareImage"]];
-            shareObj.shareImage = self.shareImage;
-            //分享消息对象设置分享内容对象
-            messageObject.shareObject = shareObj;
-        }
-        else if (self.shareType == KSSHARETYPE_VODEO) {
-            UMShareWebpageObject *shareObj = [UMShareWebpageObject shareObjectWithTitle:shareTitle descr:descMessage thumImage:[UIImage imageNamed:@"shareImage"]];
-            //            NSString *shareUrl = [self.shareUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
-            shareObj.webpageUrl = self.shareUrl;
-            //分享消息对象设置分享内容对象
-            messageObject.shareObject = shareObj;
+        if (platformType == UMSocialPlatformType_UserDefine_Begin+1) { // 分享到群组
+            if (self.shareType == KSSHARETYPE_IMAGE) {
+                KSShareGroupViewController *shareGroupCtrl = [[KSShareGroupViewController alloc] init];
+                shareGroupCtrl.shareImage = self.shareImage;
+                MJWeakSelf;
+                [shareGroupCtrl shareGroupCallback:^(BOOL isSuccess, NSString *descMsg) {
+                    __strong typeof(weakSelf) strongSelf = weakSelf;
+                    if (strongSelf.callback) {
+                        strongSelf.callback(isSuccess,descMsg);
+                    }
+                }];
+                [self.displayCtrl.navigationController pushViewController:shareGroupCtrl animated:YES];
+            }
+            else {
+                if (self.callback) {
+                    self.callback(NO,@"仅支持图片分享到群组");
+                }
+            }
+            
         }
-        //调用分享接口
-        [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *error) {
-            if (error) {
-                NSLog(@"************分享失败 %@*********",error);
+        else if (platformType == UMSocialPlatformType_UserDefine_Begin+2) { // 图片保存到相册
+            if (self.shareType == KSSHARETYPE_IMAGE) {
+                // 判断相册权限
+                
+                [[TZImageManager manager] savePhotoWithImage:self.shareImage completion:^(PHAsset *asset, NSError *error) {
+                    if (!error) {
+                        if (self.callback) {
+                            self.callback(YES,@"保存成功");
+                        }
+                    }
+                    else {
+                        if (self.callback) {
+                            self.callback(NO,@"保存失败");
+                        }
+                    }
+                }];
+            }
+            else  {
                 if (self.callback) {
-                    self.callback(NO, @"分享失败");
+                    self.callback(NO,@"仅支持图片保存");
                 }
-            }else{
-                if ([data isKindOfClass:[UMSocialShareResponse class]]) {
-                    UMSocialShareResponse *resp = data;
-                    //分享结果消息
-                    NSLog(@"************分享成功 %@*********",resp.message);
+            }
+        }
+        else {
+            //创建分享消息对象
+            UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
+            NSString *shareTitle = @"";
+            if (![NSString isEmptyString:self.shareTitle]) {
+                shareTitle = self.shareTitle;
+            }
+            NSString *descMessage = @"";
+            if (self.shareMessage) {
+                descMessage = self.shareMessage;
+            }
+            // 创建分享对象
+            if (self.shareType == KSSHARETYPE_IMAGE) {
+                UMShareImageObject *shareObj = [UMShareImageObject shareObjectWithTitle:shareTitle descr:descMessage thumImage:[UIImage imageNamed:@"shareImage"]];
+                shareObj.shareImage = self.shareImage;
+                //分享消息对象设置分享内容对象
+                messageObject.shareObject = shareObj;
+            }
+            else if (self.shareType == KSSHARETYPE_VODEO) {
+                UMShareWebpageObject *shareObj = [UMShareWebpageObject shareObjectWithTitle:shareTitle descr:descMessage thumImage:[UIImage imageNamed:@"shareImage"]];
+                //            NSString *shareUrl = [self.shareUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
+                shareObj.webpageUrl = self.shareUrl;
+                //分享消息对象设置分享内容对象
+                messageObject.shareObject = shareObj;
+            }
+            //调用分享接口
+            [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *error) {
+                if (error) {
+                    NSLog(@"************分享失败 %@*********",error);
                     if (self.callback) {
-                        self.callback(YES,@"分享成功");
+                        self.callback(NO, @"分享失败");
                     }
                 }else{
-                    NSLog(@"response data is %@",data);
+                    if ([data isKindOfClass:[UMSocialShareResponse class]]) {
+                        UMSocialShareResponse *resp = data;
+                        //分享结果消息
+                        NSLog(@"************分享成功 %@*********",resp.message);
+                        if (self.callback) {
+                            self.callback(YES,@"分享成功");
+                        }
+                    }else{
+                        NSLog(@"response data is %@",data);
+                    }
                 }
-            }
-        }];
+            }];
+        }
+        
     }];
 }
 

+ 9 - 9
KulexiuForTeacher/KulexiuForTeacher/Info.plist

@@ -57,15 +57,15 @@
 	</array>
 	<key>LSApplicationQueriesSchemes</key>
 	<array>
-        <string>alipays</string>
-        <string>weixin</string>
-        <string>weixinULAPI</string>
-        <string>wechat</string>
-        <string>sinaweibohd</string>
-        <string>sinaweibo</string>
-        <string>sinaweibosso</string>
-        <string>weibosdk</string>
-        <string>weibosdk2.5</string>
+		<string>alipays</string>
+		<string>weixin</string>
+		<string>weixinULAPI</string>
+		<string>wechat</string>
+		<string>sinaweibohd</string>
+		<string>sinaweibo</string>
+		<string>sinaweibosso</string>
+		<string>weibosdk</string>
+		<string>weibosdk2.5</string>
 	</array>
 	<key>NSAppTransportSecurity</key>
 	<dict>

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSChatListViewController.m

@@ -224,7 +224,7 @@
         UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 260, 230)];
         [imgView setImage:[UIImage imageNamed:@"wd_img_zwsj"]];
         
-        UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 180, 280, 20)];
+        UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 260, 280, 20)];
         descLabel.text = @"暂无消息";
         descLabel.textColor = HexRGB(0x999999);
         descLabel.font = [UIFont systemFontOfSize:16];

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupSettingViewController.m

@@ -16,7 +16,7 @@
 #import "GroupNoticeViewController.h"
 #import "GroupApplyViewController.h"
 #import "ModifyNameViewController.h"
-#import "KSNormalAlertView.h"
+#import "KSPublicAlertView.h"
 
 @interface GroupSettingViewController ()
 
@@ -28,7 +28,7 @@
 
 @property (nonatomic, assign) NSInteger applyCount;
 
-@property (nonatomic, strong) KSNormalAlertView *alertView;
+@property (nonatomic, strong) KSPublicAlertView *alertView;
 
 @end
 
@@ -219,9 +219,9 @@
 
 - (void)showDismissAlert {
     MJWeakSelf;
-    self.alertView = [KSNormalAlertView ks_showAlertWithTitle:@"确认解散群聊吗" leftTitle:@"取消" rightTitle:@"确认" cancel:^{
+    self.alertView = [KSPublicAlertView shareInstanceWithTitle:@"提示" descMessage:@"确认解散群聊吗" leftTitle:@"取消" rightTitle:@"确定" cancelAction:^{
         
-    } confirm:^{
+    } sureAction:^{
         [weakSelf dismissGroup];
     }];
 }

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/KSChatListSearchView.m

@@ -20,7 +20,7 @@
 - (void)awakeFromNib {
     [super awakeFromNib];
     self.searchField.delegate = self;
-    self.searchField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"请输入群聊/学员名称" attributes:@{NSForegroundColorAttributeName:HexRGB(0x999999)}];
+    self.searchField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"查找聊天记录" attributes:@{NSForegroundColorAttributeName:HexRGB(0x999999)}];
 }
 
 

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/KSChatListSearchView.xib

@@ -23,7 +23,7 @@
                                 <constraint firstAttribute="height" constant="15" id="MAI-oj-HQ7"/>
                             </constraints>
                         </imageView>
-                        <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入群聊/学员名称" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="s9n-ZY-b4Y">
+                        <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="查找聊天记录" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="s9n-ZY-b4Y">
                             <rect key="frame" x="38" y="0.0" width="271" height="35"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
                             <fontDescription key="fontDescription" type="system" pointSize="13"/>

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Classroom/Controller/NewClassRoomViewController.m

@@ -502,7 +502,7 @@
 }
 
 - (void)reJoinRTCRoom {
-    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         NSString *roomId = [LoginHelper sharedInstance].roomId;
         NSString *userName = [LoginHelper sharedInstance].userName;
         [[ClassroomService sharedService] joinClassroom:roomId userName:userName isAudience:NO success:^(Classroom * _Nonnull classroom) {
@@ -768,7 +768,7 @@
 }
 
 - (void)teacherDidDisplay {
-    NSLog(@"teacherDidDisplay %@ ",[ClassroomService sharedService].currentRoom.teacher);
+    NSLog(@"teacherDidDisplay %@ ",[ClassroomService sharedService].currentRoom.teacher.userId);
     [self renderMainContainerView];
 }
 

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Course/AccompanyCourse/View/AccompanyStudentEvaCell.xib

@@ -36,7 +36,7 @@
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CS9-1I-B48">
                                 <rect key="frame" x="11" y="38" width="327" height="89"/>
                                 <subviews>
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EsB-Oa-Z2T">
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EsB-Oa-Z2T">
                                         <rect key="frame" x="9" y="11" width="312" height="0.0"/>
                                         <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                         <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>

+ 19 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Course/Controller/CourseViewController.m

@@ -404,6 +404,9 @@
         FSCalendarScope oldScope = [change[NSKeyValueChangeOldKey] unsignedIntegerValue];
         FSCalendarScope newScope = [change[NSKeyValueChangeNewKey] unsignedIntegerValue];
         NSLog(@"From %@ to %@",(oldScope==FSCalendarScopeWeek?@"week":@"month"),(newScope==FSCalendarScopeWeek?@"week":@"month"));
+        NSString *imgName = newScope == FSCalendarScopeWeek ? @"arrow_down" : @"arrow_up";
+        [self.calendarBottom.arrowImage setImage:[UIImage imageNamed:imgName]];
+
     } else {
         [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
     }
@@ -447,7 +450,7 @@
         
         MusicRoomCourseCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MusicRoomCourseCell"];
         MJWeakSelf;
-        [cell configWithSource:model callback:^(NSString * _Nonnull targetId) {
+        [cell configWithSource:model beforeTime:self.practiceStartTime callback:^(NSString * _Nonnull targetId) {
             [weakSelf chatAction:targetId groupName:@"" isGroup:YES];
         }];
         return cell;
@@ -495,7 +498,17 @@
 }
 
 - (void)adjustCourseAction:(TableCourseModel *)source {
-    KSFullDatePicker *adjustPicker = [[KSFullDatePicker alloc] initWithTitle:@"课程调整" date:[NSDate date] pickMode:KSDATEPICKER_MODE_DAY_TIME selectDateBlock:^(NSString *date) {
+    // 获取当前课程的时间
+    NSString *formatString = @"yyyy-MM-dd HH:mm:ss";
+    NSDateFormatter *dateFormat = [NSObject getDateformatter];
+    dateFormat.dateFormat = @"yyyy年MM月";
+    [dateFormat setDateFormat:formatString];
+    NSDate *courseBeginDate = [dateFormat dateFromString:source.startTime];
+    if (courseBeginDate == nil) {
+        courseBeginDate = [NSDate date];
+    }
+    
+    KSFullDatePicker *adjustPicker = [[KSFullDatePicker alloc] initWithTitle:@"课程调整" date:courseBeginDate pickMode:KSDATEPICKER_MODE_DAY_TIME selectDateBlock:^(NSString *date) {
         NSString *timeString = [NSString stringWithFormat:@"%@:00", date];
         [self adjustCourseWithSource:source time:timeString];
     } cancleBlock:^{
@@ -580,6 +593,10 @@
 }
 
 - (void)chatAction:(NSString *)targetId groupName:(NSString *)targetName isGroup:(BOOL)isGroup {
+    if ([NSString isEmptyString:targetId] && isGroup) {
+        [self MBPShow:@"群组id不存在"];
+        return;
+    }
     KSChatConversationViewController *conversationVC = [[KSChatConversationViewController alloc] init];
     conversationVC.targetId = targetId;
     conversationVC.title = targetName;

+ 3 - 22
KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/Controller/MusicRoomViewController.m

@@ -7,7 +7,6 @@
 
 #import "MusicRoomViewController.h"
 #import "MusicRoomDetailModel.h"
-#import "AccompanyNavView.h"
 #import "MusicRoomCourseInfoCell.h"
 #import "AccompanyDetailBottomView.h"
 #import "RecordCheckManager.h"
@@ -21,7 +20,6 @@
 
 @interface MusicRoomViewController ()<UITableViewDelegate,UITableViewDataSource>
 
-@property (nonatomic, strong) AccompanyNavView *navView;
 
 @property (nonatomic, assign) NSInteger joinRoomBeforeTime; // 上课开始时间
 
@@ -48,23 +46,16 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
-    self.ks_prefersNavigationBarHidden = YES;
+    [self allocTitle:@"课程详情"];
     [self configUI];
     [self requestCourseInfoMessage];
 }
 
 - (void)configUI {
-    [self.scrollView removeFromSuperview];
-    [self.view addSubview:self.navView];
-    CGFloat height = [self.navView getViewHeight];
-    [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.right.top.mas_equalTo(self.view);
-        make.height.mas_equalTo(height);
-    }];
     [self.view addSubview:self.tableView];
     [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.mas_equalTo(self.view);
-        make.top.mas_equalTo(self.view.mas_top).offset(kNaviBarHeight);
+        make.top.mas_equalTo(self.view.mas_top);
         make.bottom.mas_equalTo(self.view.mas_bottom).offset(-iPhoneXSafeBottomMargin);
     }];
 }
@@ -186,7 +177,7 @@
 
 - (void)chatAction:(NSString *)targetId {
     if ([NSString isEmptyString:targetId]) {
-        [self MBPShow:@"无群组信息"];
+        [self MBPShow:@"群组id不存在"];
         return;
     }
     KSChatConversationViewController *conversationVC = [[KSChatConversationViewController alloc] init];
@@ -228,16 +219,6 @@
 }
 
 #pragma mark ---- lazying
-- (AccompanyNavView *)navView {
-    if (!_navView) {
-        _navView = [AccompanyNavView shareInstance];
-        MJWeakSelf;
-        [_navView navCallback:^{
-            [weakSelf backAction];
-        }];
-    }
-    return _navView;
-}
 - (OnlineClassManager *)classManager {
     if (!_classManager) {
         _classManager = [[OnlineClassManager alloc] init];

+ 7 - 24
KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomCourseInfoCell.m

@@ -9,16 +9,13 @@
 
 @interface MusicRoomCourseInfoCell ()
 
-@property (weak, nonatomic) IBOutlet UILabel *courseDesc;
 
 @property (weak, nonatomic) IBOutlet UILabel *courseTimeLabel;
 @property (weak, nonatomic) IBOutlet UILabel *memberCount;
 @property (weak, nonatomic) IBOutlet UILabel *courseName;
 
 @property (weak, nonatomic) IBOutlet UILabel *subjectName;
-@property (weak, nonatomic) IBOutlet UIButton *statusButton;
-
-@property (weak, nonatomic) IBOutlet UIView *colorView;
+@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
 
 @property (nonatomic, strong) NSString *targetId;
 
@@ -32,13 +29,6 @@
     [super awakeFromNib];
     // Initialization code
     self.selectionStyle = UITableViewCellSelectionStyleNone;
-    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
-    gradientLayer.colors = @[(__bridge id)HexRGB(0xFFBC90).CGColor,(__bridge id)HexRGB(0xFF7021).CGColor];
-    gradientLayer.startPoint = CGPointMake(0, 0);
-    gradientLayer.endPoint = CGPointMake(0, 1);
-    gradientLayer.frame = CGRectMake(0, 0, 42, 42);
-    [self.colorView.layer addSublayer:gradientLayer];
-    [self.colorView bringSubviewToFront:self.courseDesc];
 }
 
 - (void)configWithSource:(MusicRoomDetailModel *)model chatAction:(MusicRoomGroupChatAction)callback {
@@ -53,23 +43,16 @@
     
     self.memberCount.text = [NSString stringWithFormat:@"%zd人",model.studentHomeworkList.records.count];
     if ([model.courseStatus isEqualToString:@"NOT_START"]) {
-        [self.statusButton setTitle:@"未开始" forState:UIControlStateNormal];
-        self.statusButton.backgroundColor = [UIColor whiteColor];
-        [self.statusButton setTitleColor:HexRGB(0xFF802C) forState:UIControlStateNormal];
-        self.statusButton.layer.borderColor = HexRGB(0xFF802C).CGColor;
+        self.statusLabel.text = @"未开始";
+        self.statusLabel.textColor = HexRGB(0xFF802C);
     }
     else if ([model.courseStatus isEqualToString:@"ING"]) {
-        [self.statusButton setTitle:@"进行中" forState:UIControlStateNormal];
-        self.statusButton.backgroundColor = THEMECOLOR;
-        [self.statusButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
-        self.statusButton.layer.borderColor = THEMECOLOR.CGColor;
-        
+        self.statusLabel.text = @"进行中";
+        self.statusLabel.textColor = THEMECOLOR;
     }
     else if ([model.courseStatus isEqualToString:@"COMPLETE"]) {
-        [self.statusButton setTitle:@"已结束" forState:UIControlStateNormal];
-        self.statusButton.backgroundColor = [UIColor whiteColor];
-        [self.statusButton setTitleColor:HexRGB(0x999999) forState:UIControlStateNormal];
-        self.statusButton.layer.borderColor = HexRGB(0xe5e5e5).CGColor;
+        self.statusLabel.text = @"已结束";
+        self.statusLabel.textColor = HexRGB(0x999999);
     }
 }
 

+ 70 - 105
KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomCourseInfoCell.xib

@@ -11,15 +11,15 @@
     <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="127" id="KGk-i7-Jjw" customClass="MusicRoomCourseInfoCell">
-            <rect key="frame" x="0.0" y="0.0" width="344" height="127"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="136" id="KGk-i7-Jjw" customClass="MusicRoomCourseInfoCell">
+            <rect key="frame" x="0.0" y="0.0" width="344" height="136"/>
             <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="344" height="127"/>
+                <rect key="frame" x="0.0" y="0.0" width="344" height="136"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bg9-Ww-DfJ">
-                        <rect key="frame" x="14" y="0.0" width="316" height="117"/>
+                        <rect key="frame" x="14" y="0.0" width="316" height="126"/>
                         <subviews>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_time" translatesAutoresizingMaskIntoConstraints="NO" id="CSZ-cc-B2S">
                                 <rect key="frame" x="12" y="12" width="16" height="16"/>
@@ -28,8 +28,8 @@
                                     <constraint firstAttribute="height" constant="16" id="OPR-bh-I32"/>
                                 </constraints>
                             </imageView>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2021/09/17 14:00~14:25" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xGN-fD-6g8">
-                                <rect key="frame" x="34" y="11" width="147" height="18"/>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xGN-fD-6g8">
+                                <rect key="frame" x="34" y="11" width="0.0" height="18"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="18" id="mzA-XH-SXS"/>
                                 </constraints>
@@ -37,66 +37,15 @@
                                 <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="6人" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="beA-D7-Fro">
-                                <rect key="frame" x="217" y="11.5" width="30" height="17"/>
-                                <constraints>
-                                    <constraint firstAttribute="width" constant="30" id="u7o-oZ-Kjt"/>
-                                </constraints>
-                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_member" translatesAutoresizingMaskIntoConstraints="NO" id="Nyk-iN-2CA">
-                                <rect key="frame" x="248" y="11" width="18" height="18"/>
-                                <constraints>
-                                    <constraint firstAttribute="width" constant="18" id="8mY-hb-vIn"/>
-                                    <constraint firstAttribute="height" constant="18" id="b4q-Ya-NEZ"/>
-                                </constraints>
-                            </imageView>
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="H2e-81-i3m">
-                                <rect key="frame" x="266" y="0.0" width="40" height="40"/>
-                                <constraints>
-                                    <constraint firstAttribute="width" constant="40" id="I1C-rp-Uj2"/>
-                                    <constraint firstAttribute="height" constant="40" id="Uho-dD-0NX"/>
-                                </constraints>
-                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
-                                <state key="normal" image="course_chat"/>
-                                <connections>
-                                    <action selector="chatAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="rgP-LQ-mk9"/>
-                                </connections>
-                            </button>
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="k2L-h9-9b3">
-                                <rect key="frame" x="10" y="40" width="296" height="1"/>
+                                <rect key="frame" x="10" y="38" width="296" height="1"/>
                                 <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="1" id="O3Q-xP-7fL"/>
                                 </constraints>
                             </view>
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uZy-Ne-tig">
-                                <rect key="frame" x="12" y="56" width="42" height="42"/>
-                                <subviews>
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="小课" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vK4-ep-gl3">
-                                        <rect key="frame" x="6.5" y="12.5" width="29" height="17"/>
-                                        <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
-                                        <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                        <nil key="highlightedColor"/>
-                                    </label>
-                                </subviews>
-                                <color key="backgroundColor" systemColor="systemRedColor"/>
-                                <constraints>
-                                    <constraint firstItem="vK4-ep-gl3" firstAttribute="centerY" secondItem="uZy-Ne-tig" secondAttribute="centerY" id="Jwg-cY-o8O"/>
-                                    <constraint firstAttribute="height" constant="42" id="PN0-3P-ABW"/>
-                                    <constraint firstAttribute="width" constant="42" id="el5-24-d0S"/>
-                                    <constraint firstItem="vK4-ep-gl3" firstAttribute="centerX" secondItem="uZy-Ne-tig" secondAttribute="centerX" id="w7n-r0-mK1"/>
-                                </constraints>
-                                <userDefinedRuntimeAttributes>
-                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                        <real key="value" value="21"/>
-                                    </userDefinedRuntimeAttribute>
-                                </userDefinedRuntimeAttributes>
-                            </view>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="单簧管第一期" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QUb-lq-pUv">
-                                <rect key="frame" x="66" y="56" width="98" height="28"/>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QUb-lq-pUv">
+                                <rect key="frame" x="68" y="51" width="0.0" height="28"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="28" id="4Be-UW-Fda"/>
                                 </constraints>
@@ -105,10 +54,10 @@
                                 <nil key="highlightedColor"/>
                             </label>
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ORG-gD-yMT">
-                                <rect key="frame" x="66" y="84" width="44" height="20"/>
+                                <rect key="frame" x="68" y="79" width="10" height="20"/>
                                 <subviews>
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="单簧管" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kCh-Pp-Mzx">
-                                        <rect key="frame" x="5" y="0.0" width="34" height="20"/>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kCh-Pp-Mzx">
+                                        <rect key="frame" x="5" y="0.0" width="0.0" height="20"/>
                                         <fontDescription key="fontDescription" type="system" pointSize="11"/>
                                         <color key="textColor" red="1" green="0.54901960780000003" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                         <nil key="highlightedColor"/>
@@ -128,55 +77,76 @@
                                     </userDefinedRuntimeAttribute>
                                 </userDefinedRuntimeAttributes>
                             </view>
-                            <button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ada-cD-ioh">
-                                <rect key="frame" x="234" y="63" width="70" height="28"/>
-                                <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_musicRoom" translatesAutoresizingMaskIntoConstraints="NO" id="MPJ-dm-TQx">
+                                <rect key="frame" x="11" y="53" width="47" height="51"/>
                                 <constraints>
-                                    <constraint firstAttribute="width" constant="70" id="1oo-CX-xda"/>
-                                    <constraint firstAttribute="height" constant="28" id="9sG-Kq-Fdh"/>
+                                    <constraint firstAttribute="width" constant="47" id="YIK-Oi-iUK"/>
+                                    <constraint firstAttribute="height" constant="51" id="yLf-ul-Qz1"/>
+                                </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="beA-D7-Fro">
+                                <rect key="frame" x="95" y="89" width="0.0" height="0.0"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1JB-RE-CPf">
+                                <rect key="frame" x="255" y="20" width="50" height="0.0"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="50" id="Xiy-dc-FXt"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6G2-hv-fsQ">
+                                <rect key="frame" x="86" y="83" width="1" height="12"/>
+                                <color key="backgroundColor" red="0.87058823529411766" green="0.87058823529411766" blue="0.87058823529411766" alpha="1" colorSpace="calibratedRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="12" id="eTX-wR-oTd"/>
+                                    <constraint firstAttribute="width" constant="1" id="vjN-Ij-zdo"/>
+                                </constraints>
+                            </view>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="H2e-81-i3m">
+                                <rect key="frame" x="68" y="45" width="40" height="40"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="40" id="Hz9-gz-ybY"/>
+                                    <constraint firstAttribute="height" constant="40" id="UIM-cc-gFb"/>
                                 </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="14"/>
-                                    </userDefinedRuntimeAttribute>
-                                    <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
-                                        <real key="value" value="1"/>
-                                    </userDefinedRuntimeAttribute>
-                                    <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
-                                        <color key="value" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
-                                    </userDefinedRuntimeAttribute>
-                                </userDefinedRuntimeAttributes>
+                                <state key="normal" image="course_chat"/>
+                                <connections>
+                                    <action selector="chatAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="rgP-LQ-mk9"/>
+                                </connections>
                             </button>
                         </subviews>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
-                            <constraint firstItem="k2L-h9-9b3" firstAttribute="top" secondItem="H2e-81-i3m" secondAttribute="bottom" id="C72-oV-z5W"/>
-                            <constraint firstItem="uZy-Ne-tig" firstAttribute="leading" secondItem="bg9-Ww-DfJ" secondAttribute="leading" constant="12" id="DZG-ON-fet"/>
+                            <constraint firstItem="6G2-hv-fsQ" firstAttribute="leading" secondItem="ORG-gD-yMT" secondAttribute="trailing" constant="8" id="0Uw-Pg-Fmd"/>
+                            <constraint firstItem="MPJ-dm-TQx" firstAttribute="top" secondItem="k2L-h9-9b3" secondAttribute="bottom" constant="14" id="4E8-rs-uzQ"/>
+                            <constraint firstItem="beA-D7-Fro" firstAttribute="centerY" secondItem="6G2-hv-fsQ" secondAttribute="centerY" id="9TM-nB-jfF"/>
+                            <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="beA-D7-Fro" secondAttribute="trailing" constant="10" id="C6A-UA-PaU"/>
                             <constraint firstItem="CSZ-cc-B2S" firstAttribute="leading" secondItem="bg9-Ww-DfJ" secondAttribute="leading" constant="12" id="E6P-sJ-IH9"/>
-                            <constraint firstItem="beA-D7-Fro" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="xGN-fD-6g8" secondAttribute="trailing" constant="10" id="Ece-OZ-FxO"/>
-                            <constraint firstAttribute="trailing" secondItem="ada-cD-ioh" secondAttribute="trailing" constant="12" id="HJh-IO-dEw"/>
                             <constraint firstAttribute="trailing" secondItem="k2L-h9-9b3" secondAttribute="trailing" constant="10" id="JLb-UI-mYN"/>
+                            <constraint firstItem="beA-D7-Fro" firstAttribute="leading" secondItem="6G2-hv-fsQ" secondAttribute="trailing" constant="8" id="NsI-u7-vvM"/>
                             <constraint firstItem="ORG-gD-yMT" firstAttribute="top" secondItem="QUb-lq-pUv" secondAttribute="bottom" id="TLD-7M-CeB"/>
                             <constraint firstItem="CSZ-cc-B2S" firstAttribute="top" secondItem="bg9-Ww-DfJ" secondAttribute="top" constant="12" id="Tje-AH-2gQ"/>
-                            <constraint firstItem="H2e-81-i3m" firstAttribute="centerY" secondItem="Nyk-iN-2CA" secondAttribute="centerY" id="Ttw-Vp-JJb"/>
-                            <constraint firstAttribute="trailing" secondItem="H2e-81-i3m" secondAttribute="trailing" constant="10" id="Uao-Io-AU9"/>
-                            <constraint firstItem="Nyk-iN-2CA" firstAttribute="leading" secondItem="beA-D7-Fro" secondAttribute="trailing" constant="1" id="V91-CH-Xvy"/>
-                            <constraint firstItem="ada-cD-ioh" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="QUb-lq-pUv" secondAttribute="trailing" constant="10" id="Xci-FU-blP"/>
-                            <constraint firstItem="H2e-81-i3m" firstAttribute="leading" secondItem="Nyk-iN-2CA" secondAttribute="trailing" id="ZL9-PQ-mk8"/>
+                            <constraint firstItem="H2e-81-i3m" firstAttribute="leading" secondItem="QUb-lq-pUv" secondAttribute="trailing" id="Ur2-gl-MQy"/>
+                            <constraint firstItem="H2e-81-i3m" firstAttribute="centerY" secondItem="QUb-lq-pUv" secondAttribute="centerY" id="XwZ-IK-zVu"/>
                             <constraint firstItem="ORG-gD-yMT" firstAttribute="leading" secondItem="QUb-lq-pUv" secondAttribute="leading" id="aJH-mK-uZA"/>
-                            <constraint firstAttribute="bottom" secondItem="uZy-Ne-tig" secondAttribute="bottom" constant="19" id="cKu-g0-xI4"/>
-                            <constraint firstItem="ada-cD-ioh" firstAttribute="centerY" secondItem="uZy-Ne-tig" secondAttribute="centerY" id="ca9-yP-aXh"/>
+                            <constraint firstItem="6G2-hv-fsQ" firstAttribute="centerY" secondItem="ORG-gD-yMT" secondAttribute="centerY" id="dNe-OJ-AZF"/>
+                            <constraint firstItem="QUb-lq-pUv" firstAttribute="leading" secondItem="MPJ-dm-TQx" secondAttribute="trailing" constant="10" id="dV2-FY-xt8"/>
                             <constraint firstItem="k2L-h9-9b3" firstAttribute="leading" secondItem="bg9-Ww-DfJ" secondAttribute="leading" constant="10" id="ftM-XR-ViC"/>
-                            <constraint firstItem="uZy-Ne-tig" firstAttribute="top" secondItem="k2L-h9-9b3" secondAttribute="bottom" constant="15" id="gPK-Uj-gnT"/>
+                            <constraint firstAttribute="trailing" secondItem="1JB-RE-CPf" secondAttribute="trailing" constant="11" id="g1o-YV-p9V"/>
+                            <constraint firstItem="QUb-lq-pUv" firstAttribute="top" secondItem="MPJ-dm-TQx" secondAttribute="top" constant="-2" id="hPh-Qi-MtD"/>
+                            <constraint firstItem="MPJ-dm-TQx" firstAttribute="leading" secondItem="bg9-Ww-DfJ" secondAttribute="leading" constant="11" id="hxC-0O-uti"/>
                             <constraint firstItem="xGN-fD-6g8" firstAttribute="centerY" secondItem="CSZ-cc-B2S" secondAttribute="centerY" id="iEe-aS-tcZ"/>
+                            <constraint firstItem="1JB-RE-CPf" firstAttribute="centerY" secondItem="xGN-fD-6g8" secondAttribute="centerY" id="jrf-db-QbH"/>
                             <constraint firstItem="xGN-fD-6g8" firstAttribute="leading" secondItem="CSZ-cc-B2S" secondAttribute="trailing" constant="6" id="lD3-wz-hkl"/>
-                            <constraint firstItem="H2e-81-i3m" firstAttribute="top" secondItem="bg9-Ww-DfJ" secondAttribute="top" id="o12-DE-Ebu"/>
-                            <constraint firstItem="QUb-lq-pUv" firstAttribute="leading" secondItem="uZy-Ne-tig" secondAttribute="trailing" constant="12" id="ou7-oD-l3J"/>
-                            <constraint firstItem="QUb-lq-pUv" firstAttribute="top" secondItem="uZy-Ne-tig" secondAttribute="top" id="qjM-Wb-1J2"/>
-                            <constraint firstItem="Nyk-iN-2CA" firstAttribute="centerY" secondItem="beA-D7-Fro" secondAttribute="centerY" id="was-pa-Dxw"/>
+                            <constraint firstAttribute="bottom" secondItem="MPJ-dm-TQx" secondAttribute="bottom" constant="22" id="myg-9t-fsJ"/>
+                            <constraint firstItem="k2L-h9-9b3" firstAttribute="top" secondItem="CSZ-cc-B2S" secondAttribute="bottom" constant="10" id="nrg-zV-2Wy"/>
+                            <constraint firstItem="1JB-RE-CPf" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="xGN-fD-6g8" secondAttribute="trailing" constant="10" id="vRh-MH-6qJ"/>
+                            <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="H2e-81-i3m" secondAttribute="trailing" constant="5" id="wXu-kG-UZC"/>
                         </constraints>
                         <userDefinedRuntimeAttributes>
                             <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
@@ -195,26 +165,21 @@
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <connections>
-                <outlet property="colorView" destination="uZy-Ne-tig" id="QT2-J1-Cco"/>
-                <outlet property="courseDesc" destination="vK4-ep-gl3" id="2ow-64-0PE"/>
                 <outlet property="courseName" destination="QUb-lq-pUv" id="jT1-d5-C3p"/>
                 <outlet property="courseTimeLabel" destination="xGN-fD-6g8" id="Sme-fy-pag"/>
                 <outlet property="memberCount" destination="beA-D7-Fro" id="ZII-Zj-fR2"/>
-                <outlet property="statusButton" destination="ada-cD-ioh" id="LIQ-GN-kV4"/>
+                <outlet property="statusLabel" destination="1JB-RE-CPf" id="Dx1-ae-yhb"/>
                 <outlet property="subjectName" destination="kCh-Pp-Mzx" id="G52-oL-Ssf"/>
             </connections>
-            <point key="canvasLocation" x="114.49275362318842" y="104.46428571428571"/>
+            <point key="canvasLocation" x="114.49275362318842" y="103.79464285714285"/>
         </tableViewCell>
     </objects>
     <resources>
         <image name="course_chat" width="19" height="18"/>
-        <image name="course_member" width="18" height="18"/>
+        <image name="course_musicRoom" width="47" height="51"/>
         <image name="course_time" width="16" height="16"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
-        <systemColor name="systemRedColor">
-            <color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-        </systemColor>
     </resources>
 </document>

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomStudentCell.m

@@ -19,6 +19,8 @@
 
 @property (weak, nonatomic) IBOutlet UIView *subjectView;
 
+@property (weak, nonatomic) IBOutlet UIImageView *arrowImage;
+
 @end
 
 @implementation MusicRoomStudentCell
@@ -55,9 +57,11 @@
         else {
             self.statusLabel.text = @"已提交";
         }
+        self.arrowImage.hidden = NO;
     }
     else {
         self.statusLabel.hidden = YES;
+        self.arrowImage.hidden = YES;
     }
 }
 

+ 13 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Course/MusicRoom/View/MusicRoomStudentCell.xib

@@ -66,24 +66,33 @@
                                 </userDefinedRuntimeAttributes>
                             </view>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="未提交" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="R0f-XO-tQM">
-                                <rect key="frame" x="242" y="29.5" width="43" height="17"/>
+                                <rect key="frame" x="214" y="29.5" width="43" height="17"/>
                                 <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>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="homework_next" translatesAutoresizingMaskIntoConstraints="NO" id="3Z5-jA-QVq">
+                                <rect key="frame" x="262" y="30" width="17" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="17" id="ScV-eQ-NnN"/>
+                                    <constraint firstAttribute="height" constant="16" id="gM1-uo-ITU"/>
+                                </constraints>
+                            </imageView>
                         </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <constraints>
                             <constraint firstItem="rmJ-FQ-1KP" firstAttribute="leading" secondItem="P8b-0z-8QJ" secondAttribute="leading" constant="12" id="2R0-lS-gDN"/>
+                            <constraint firstItem="3Z5-jA-QVq" firstAttribute="leading" secondItem="R0f-XO-tQM" secondAttribute="trailing" constant="5" id="7gZ-OU-4je"/>
                             <constraint firstItem="rmJ-FQ-1KP" firstAttribute="centerY" secondItem="P8b-0z-8QJ" secondAttribute="centerY" id="Djd-lt-PQo"/>
                             <constraint firstItem="R0f-XO-tQM" firstAttribute="centerY" secondItem="P8b-0z-8QJ" secondAttribute="centerY" id="FPv-yy-pHk"/>
+                            <constraint firstItem="3Z5-jA-QVq" firstAttribute="centerY" secondItem="P8b-0z-8QJ" secondAttribute="centerY" id="J7P-tk-hoN"/>
                             <constraint firstItem="6av-dX-iJM" firstAttribute="leading" secondItem="rmJ-FQ-1KP" secondAttribute="trailing" constant="9" id="MOZ-9b-DDB"/>
                             <constraint firstItem="92R-m4-gJp" firstAttribute="top" secondItem="6av-dX-iJM" secondAttribute="bottom" id="SJV-T1-azv"/>
                             <constraint firstItem="rmJ-FQ-1KP" firstAttribute="top" secondItem="P8b-0z-8QJ" secondAttribute="top" constant="14" id="T7J-S2-JPV"/>
                             <constraint firstItem="6av-dX-iJM" firstAttribute="top" secondItem="rmJ-FQ-1KP" secondAttribute="top" constant="1" id="Tzg-Qd-cQs"/>
                             <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6av-dX-iJM" secondAttribute="trailing" constant="70" id="c3m-uV-ZHk"/>
                             <constraint firstItem="92R-m4-gJp" firstAttribute="leading" secondItem="6av-dX-iJM" secondAttribute="leading" id="nTC-5a-Xwb"/>
-                            <constraint firstAttribute="trailing" secondItem="R0f-XO-tQM" secondAttribute="trailing" constant="12" id="nqS-S5-lqA"/>
+                            <constraint firstAttribute="trailing" secondItem="3Z5-jA-QVq" secondAttribute="trailing" constant="18" id="q1p-nM-0nB"/>
                             <constraint firstAttribute="bottom" secondItem="rmJ-FQ-1KP" secondAttribute="bottom" constant="14" id="usp-ip-tim"/>
                         </constraints>
                         <userDefinedRuntimeAttributes>
@@ -103,6 +112,7 @@
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <connections>
+                <outlet property="arrowImage" destination="3Z5-jA-QVq" id="Bxu-zU-1hE"/>
                 <outlet property="statusLabel" destination="R0f-XO-tQM" id="bWC-aV-hee"/>
                 <outlet property="studentAvatar" destination="rmJ-FQ-1KP" id="jFd-YZ-cAE"/>
                 <outlet property="studentName" destination="6av-dX-iJM" id="0Ca-oB-KtN"/>
@@ -113,6 +123,7 @@
         </tableViewCell>
     </objects>
     <resources>
+        <image name="homework_next" width="17" height="16"/>
         <image name="user_default_avatal" width="52" height="52"/>
     </resources>
 </document>

+ 55 - 9
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m

@@ -171,15 +171,53 @@
 
 - (void)configHeadSource:(NSDictionary *)parm {
     self.bodyView.hideCount = NO;
-    self.bodyView.courseCountLabel.text = [NSString stringWithFormat:@"%zd 课时",[parm integerValueForKey:@"courseSchedule"]];
-    self.bodyView.homeworkCount.text = [NSString stringWithFormat:@"本周共 %zd 节课",[parm integerValueForKey:@"courseHomework"]];
-    self.bodyView.evaluateCountLabel.text = [NSString stringWithFormat:@"剩余 %zd 节",[parm integerValueForKey:@"courseScheduleReplied"]];
-    self.bodyView.musicCountLabel.text = [NSString stringWithFormat:@"共 %zd 支",[parm integerValueForKey:@"musicSheet"]];
-    self.bodyView.receiveCountLabel.text = [NSString stringWithFormat:@"%zd 个评价",[parm integerValueForKey:@"studentReplied"]];
-    self.bodyView.amountLabel.text = [NSString stringWithFormat:@"%.2f 元",[parm doubleValueForKey:@"decimal"]];
-    self.bodyView.timeCountLabel.text = [NSString stringWithFormat:@"%zd 分钟",[parm integerValueForKey:@"pianoTime"]];
+    
+    NSInteger courseCount = [parm integerValueForKey:@"courseSchedule"];
+    NSString *courseCountContent = [NSString stringWithFormat:@"%zd 课时",courseCount];
+    BOOL needCourseTips = courseCount == 0 ? NO : YES;
+    self.bodyView.courseCountLabel.attributedText = [self createAttrStringWithDesc:courseCountContent valueString:[NSString stringWithFormat:@"%zd",courseCount] needTips:needCourseTips];
+    
+    NSInteger courseHomework = [parm integerValueForKey:@"courseHomework"];
+    NSString *courseHomeworkContent = [NSString stringWithFormat:@"本周共 %zd 节课",courseHomework];
+    BOOL needHomeworkTips = courseHomework == 0 ? NO : YES;
+    self.bodyView.homeworkCount.attributedText = [self createAttrStringWithDesc:courseHomeworkContent valueString:[NSString stringWithFormat:@"%zd",courseHomework] needTips:needHomeworkTips];
+    
+    NSInteger courseScheduleReplied = [parm integerValueForKey:@"courseScheduleReplied"];
+    NSString *courseScheduleRepliedContent = [NSString stringWithFormat:@"剩余 %zd 节",courseScheduleReplied];
+    BOOL needEvaluateTips = courseScheduleReplied == 0 ? NO : YES;
+    self.bodyView.evaluateCountLabel.attributedText = [self createAttrStringWithDesc:courseScheduleRepliedContent valueString:[NSString stringWithFormat:@"%zd",courseScheduleReplied] needTips:needEvaluateTips];
+    
+    NSInteger musicSheet = [parm integerValueForKey:@"musicSheet"];
+    NSString *musicSheetContent = [NSString stringWithFormat:@"共 %zd 支",musicSheet];
+    BOOL needMusicSheetTips = musicSheet == 0 ? NO : YES;
+    self.bodyView.musicCountLabel.attributedText = [self createAttrStringWithDesc:musicSheetContent valueString:[NSString stringWithFormat:@"%zd",musicSheet] needTips:needMusicSheetTips];
+    
+    NSInteger studentReplied = [parm integerValueForKey:@"studentReplied"];
+    NSString *studentRepliedContent = [NSString stringWithFormat:@"%zd 个评价",studentReplied];
+    BOOL needStudentRepliedTips = studentReplied == 0 ? NO : YES;
+    self.bodyView.receiveCountLabel.attributedText = [self createAttrStringWithDesc:studentRepliedContent valueString:[NSString stringWithFormat:@"%zd",studentReplied] needTips:needStudentRepliedTips];
+    
+    double decimal = [parm doubleValueForKey:@"decimal"];
+    NSString *decimalContent = [NSString stringWithFormat:@"%.2f 元",decimal];
+    BOOL needDecimalTips = decimal == 0 ? NO : YES;
+    self.bodyView.amountLabel.attributedText = [self createAttrStringWithDesc:decimalContent valueString:[NSString stringWithFormat:@"%.2f",decimal] needTips:needDecimalTips];
+    
+    NSInteger pianoTime = [parm integerValueForKey:@"pianoTime"];
+    NSString *pianoTimeContent = [NSString stringWithFormat:@"%zd 分钟",pianoTime];
+    BOOL needPianoTimeTips = pianoTime == 0 ? NO : YES;
+    self.bodyView.timeCountLabel.attributedText = [self createAttrStringWithDesc:pianoTimeContent valueString:[NSString stringWithFormat:@"%zd",pianoTime] needTips:needPianoTimeTips];
+    
 }
 
+- (NSMutableAttributedString *)createAttrStringWithDesc:(NSString *)desc valueString:(NSString *)valueString needTips:(BOOL)needTips {
+    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:desc attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12.0f], NSForegroundColorAttributeName:HexRGB(0x999999)}];
+    if (needTips) {
+        [attr addAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12.0f weight:UIFontWeightMedium], NSForegroundColorAttributeName:HexRGB(0xff5106)} range:[desc rangeOfString:valueString]];
+    }
+    return attr;
+}
+
+
 - (void)refreshView {
     [self.headView configMessage:self.mineInfo];
 }
@@ -364,7 +402,7 @@
         _noticeScrollView.scrollDirection = UICollectionViewScrollDirectionVertical;
         _noticeScrollView.titleLabelTextColor = HexRGB(0x1a1a1a);
         _noticeScrollView.titleLabelBackgroundColor = [UIColor whiteColor];
-        _noticeScrollView.titleLabelTextFont = [UIFont systemFontOfSize:11];
+        _noticeScrollView.titleLabelTextFont = [UIFont systemFontOfSize:14];
         _noticeScrollView.titlesGroup = self.titleArray;
     }
     return _noticeScrollView;
@@ -385,9 +423,17 @@
 }
 
 - (void)moreNotice {
+    if (self.bannerArray.count) {
+        NoticeSourceModel *bannerModel = self.bannerArray[0];
+        KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+        webCtrl.url = [NSString stringWithFormat:@"%@/#/helpCenterDetail?id=%@",WEBHOST, bannerModel.internalBaseClassIdentifier];
+        [self.navigationController pushViewController:webCtrl animated:YES];
+    }
+    /*
     KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
     webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/helpCenter?catalogType=2"];
-    [self.navigationController pushViewController:webCtrl animated:YES];
+    [self.navigationController pushViewController:webCtrl animated:YES];*/
+    
 }
 
 - (HomeRecentCourseView *)courseView {

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/Controller/EvaluateCourseListViewController.m

@@ -31,7 +31,7 @@
 }
 
 - (void)setupUI {
-    self.headHeight = 64.0f;
+    self.headHeight = 50.0f;
     [self.scrollView removeFromSuperview];
     self.view.backgroundColor = HexRGB(0xf6f8f9);
     
@@ -47,6 +47,7 @@
     JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
     lineView.indicatorColor = THEMECOLOR;
     lineView.indicatorWidth = 16;
+    lineView.indicatorHeight = 4.0f;
     self.categoryView.indicators = @[lineView];
     
     _pagerView = [self preferredPagingView];

+ 0 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/View/EvaluateCourseBodyView.m

@@ -51,11 +51,6 @@
         self.tableView.rowHeight = 86;
         [self addSubview:self.tableView];
         
-        
-        UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
-        headView.backgroundColor = HexRGB(0xf6f8f9);
-        self.tableView.tableHeaderView = headView;
-        
         UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
         bottomView.backgroundColor = HexRGB(0xf6f8f9);
         self.tableView.tableFooterView = bottomView;

+ 10 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/EvaluateCourse/View/EvaluateSortView.xib

@@ -85,19 +85,29 @@
                         </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                 </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="D3Q-k6-VgK">
+                    <rect key="frame" x="0.0" y="0.0" width="414" height="1"/>
+                    <color key="backgroundColor" red="0.92941176470588238" green="0.92941176470588238" blue="0.92941176470588238" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="1" id="kI5-PS-yBp"/>
+                    </constraints>
+                </view>
             </subviews>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
                 <constraint firstItem="YUB-ts-V2i" firstAttribute="centerY" secondItem="M5I-2d-z3B" secondAttribute="centerY" id="F0A-na-Ye3"/>
                 <constraint firstItem="M5I-2d-z3B" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="Nz7-Mo-tXg"/>
                 <constraint firstItem="BEq-Bt-1Ls" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="PpU-d4-ip4"/>
+                <constraint firstItem="D3Q-k6-VgK" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="SUI-8T-tUG"/>
                 <constraint firstAttribute="trailing" secondItem="BEq-Bt-1Ls" secondAttribute="trailing" constant="14" id="Vsa-T8-3FS"/>
                 <constraint firstItem="M5I-2d-z3B" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="Xln-Cr-iSF"/>
                 <constraint firstItem="YUB-ts-V2i" firstAttribute="trailing" secondItem="AsV-45-xOq" secondAttribute="trailing" id="e3c-OI-gI2"/>
+                <constraint firstItem="D3Q-k6-VgK" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="f0l-iw-KFN"/>
                 <constraint firstItem="BEq-Bt-1Ls" firstAttribute="leading" secondItem="YUB-ts-V2i" secondAttribute="trailing" constant="14" id="fss-ae-MLg"/>
                 <constraint firstItem="M5I-2d-z3B" firstAttribute="leading" secondItem="AsV-45-xOq" secondAttribute="leading" id="khy-8M-4pv"/>
                 <constraint firstItem="YUB-ts-V2i" firstAttribute="leading" secondItem="M5I-2d-z3B" secondAttribute="trailing" constant="3" id="sPd-hx-OO0"/>
                 <constraint firstItem="YUB-ts-V2i" firstAttribute="centerY" secondItem="AsV-45-xOq" secondAttribute="centerY" id="sZi-oM-MY2"/>
+                <constraint firstAttribute="trailing" secondItem="D3Q-k6-VgK" secondAttribute="trailing" id="zy6-hu-nDV"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>
             <nil key="simulatedBottomBarMetrics"/>

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/Controller/HomeworkListViewController.m

@@ -32,7 +32,7 @@
 }
 
 - (void)setupUI {
-    self.headHeight = 64.0f;
+    self.headHeight = 50.0f;
     [self.scrollView removeFromSuperview];
     self.view.backgroundColor = HexRGB(0xf6f8f9);
     
@@ -48,6 +48,7 @@
     JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
     lineView.indicatorColor = THEMECOLOR;
     lineView.indicatorWidth = 16;
+    lineView.indicatorHeight = 4.0f;
     self.categoryView.indicators = @[lineView];
     
     _pagerView = [self preferredPagingView];

+ 0 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkBodyView.m

@@ -52,11 +52,6 @@
         self.tableView.rowHeight = 132;
         [self addSubview:self.tableView];
         
-        
-        UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
-        headView.backgroundColor = HexRGB(0xf6f8f9);
-        self.tableView.tableHeaderView = headView;
-        
         UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 10)];
         bottomView.backgroundColor = HexRGB(0xf6f8f9);
         self.tableView.tableFooterView = bottomView;

+ 10 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/HomeworkSortView.xib

@@ -32,11 +32,21 @@
                         <action selector="sortButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="rWv-0j-Xxb"/>
                     </connections>
                 </button>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="idS-UU-njp">
+                    <rect key="frame" x="0.0" y="0.0" width="414" height="1"/>
+                    <color key="backgroundColor" red="0.92941176470588238" green="0.92941176470588238" blue="0.92941176470588238" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="1" id="O5D-lG-NRc"/>
+                    </constraints>
+                </view>
             </subviews>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
+                <constraint firstAttribute="trailing" secondItem="idS-UU-njp" secondAttribute="trailing" id="1ys-fa-lyv"/>
                 <constraint firstItem="0zE-tr-Z1O" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="3A4-LV-UX8"/>
+                <constraint firstItem="idS-UU-njp" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="HvB-xY-6Di"/>
                 <constraint firstItem="t4D-yi-OH7" firstAttribute="leading" secondItem="0zE-tr-Z1O" secondAttribute="leading" id="IEw-nx-7uA"/>
+                <constraint firstItem="idS-UU-njp" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="aX7-in-MSE"/>
                 <constraint firstItem="dxn-Em-1xD" firstAttribute="centerY" secondItem="0zE-tr-Z1O" secondAttribute="centerY" id="bQb-1X-2bN"/>
                 <constraint firstItem="dxn-Em-1xD" firstAttribute="centerY" secondItem="t4D-yi-OH7" secondAttribute="centerY" id="plf-sU-8TP"/>
                 <constraint firstAttribute="bottom" secondItem="0zE-tr-Z1O" secondAttribute="bottom" id="qyE-Vi-A46"/>

+ 0 - 11
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.m

@@ -9,10 +9,6 @@
 
 @interface MusicRoomHomeworkCell ()
 
-@property (weak, nonatomic) IBOutlet UILabel *courseDesc;
-
-@property (weak, nonatomic) IBOutlet UIView *colorView;
-
 @property (weak, nonatomic) IBOutlet UILabel *courseTimeLabel;
 
 @property (weak, nonatomic) IBOutlet UILabel *courseName;
@@ -29,13 +25,6 @@
     [super awakeFromNib];
     // Initialization code
     self.selectionStyle = UITableViewCellSelectionStyleNone;
-    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
-    gradientLayer.colors = @[(__bridge id)HexRGB(0xFFBC90).CGColor,(__bridge id)HexRGB(0xFF7021).CGColor];
-    gradientLayer.startPoint = CGPointMake(0, 0);
-    gradientLayer.endPoint = CGPointMake(0, 1);
-    gradientLayer.frame = CGRectMake(0, 0, 42, 42);
-    [self.colorView.layer addSublayer:gradientLayer];
-    [self.colorView bringSubviewToFront:self.courseDesc];
 }
 
 - (void)configWithSource:(HomeworkListModel *)sourceModel {

+ 5 - 40
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Homework/View/MusicRoomHomeworkCell.xib

@@ -50,17 +50,12 @@
                                 <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
-                            <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="user_default_avatal" translatesAutoresizingMaskIntoConstraints="NO" id="vbJ-lB-Z7m">
-                                <rect key="frame" x="11" y="56" width="47" height="47"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_musicRoom" translatesAutoresizingMaskIntoConstraints="NO" id="vbJ-lB-Z7m">
+                                <rect key="frame" x="11" y="56" width="47" height="51"/>
                                 <constraints>
                                     <constraint firstAttribute="width" constant="47" id="GJE-kv-Q75"/>
-                                    <constraint firstAttribute="height" constant="47" id="zsp-wi-eXy"/>
+                                    <constraint firstAttribute="height" constant="51" id="zsp-wi-eXy"/>
                                 </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="张豆豆" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="INl-R7-pRX">
                                 <rect key="frame" x="68" y="56" width="49" height="24"/>
@@ -72,7 +67,7 @@
                                 <nil key="highlightedColor"/>
                             </label>
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2XU-rf-TDq">
-                                <rect key="frame" x="68" y="83" width="44" height="20"/>
+                                <rect key="frame" x="68" y="87" width="44" height="20"/>
                                 <subviews>
                                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="单簧管" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sRr-14-Xr7">
                                         <rect key="frame" x="5" y="0.0" width="34" height="20"/>
@@ -104,39 +99,14 @@
                                 <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                 <state key="normal" image="course_chat"/>
                             </button>
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hEb-LU-Yhq">
-                                <rect key="frame" x="13.5" y="58.5" width="42" height="42"/>
-                                <subviews>
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="小课" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w4g-yi-Rgm">
-                                        <rect key="frame" x="6.5" y="12.5" width="29" height="17"/>
-                                        <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
-                                        <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                        <nil key="highlightedColor"/>
-                                    </label>
-                                </subviews>
-                                <color key="backgroundColor" systemColor="systemRedColor"/>
-                                <constraints>
-                                    <constraint firstItem="w4g-yi-Rgm" firstAttribute="centerX" secondItem="hEb-LU-Yhq" secondAttribute="centerX" id="7Ef-7w-7xf"/>
-                                    <constraint firstAttribute="width" constant="42" id="RF4-uX-Llf"/>
-                                    <constraint firstItem="w4g-yi-Rgm" firstAttribute="centerY" secondItem="hEb-LU-Yhq" secondAttribute="centerY" id="V92-9D-dCP"/>
-                                    <constraint firstAttribute="height" constant="42" id="nRB-hb-MeR"/>
-                                </constraints>
-                                <userDefinedRuntimeAttributes>
-                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                        <real key="value" value="21"/>
-                                    </userDefinedRuntimeAttribute>
-                                </userDefinedRuntimeAttributes>
-                            </view>
                         </subviews>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="trailing" secondItem="SWi-YI-jAG" secondAttribute="trailing" constant="10" id="1Li-Ou-Yjs"/>
-                            <constraint firstItem="hEb-LU-Yhq" firstAttribute="centerX" secondItem="vbJ-lB-Z7m" secondAttribute="centerX" id="4ma-pa-KEI"/>
                             <constraint firstItem="INl-R7-pRX" firstAttribute="leading" secondItem="vbJ-lB-Z7m" secondAttribute="trailing" constant="10" id="8Ab-GY-KQu"/>
                             <constraint firstItem="2XU-rf-TDq" firstAttribute="leading" secondItem="INl-R7-pRX" secondAttribute="leading" id="EZc-vw-yP4"/>
                             <constraint firstItem="C9U-yd-Bp1" firstAttribute="leading" secondItem="INl-R7-pRX" secondAttribute="trailing" id="Hzp-VS-u2x"/>
                             <constraint firstItem="C9U-yd-Bp1" firstAttribute="centerY" secondItem="INl-R7-pRX" secondAttribute="centerY" id="JW2-D5-JLA"/>
-                            <constraint firstItem="hEb-LU-Yhq" firstAttribute="centerY" secondItem="vbJ-lB-Z7m" secondAttribute="centerY" id="KWd-9i-iwF"/>
                             <constraint firstItem="2XU-rf-TDq" firstAttribute="bottom" secondItem="vbJ-lB-Z7m" secondAttribute="bottom" id="MMw-W4-Rrg"/>
                             <constraint firstItem="b6m-xf-3vf" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="gLO-02-Vhb" secondAttribute="trailing" constant="10" id="NmB-fs-yGE"/>
                             <constraint firstAttribute="trailing" secondItem="b6m-xf-3vf" secondAttribute="trailing" constant="11" id="Qf3-Bp-lGs"/>
@@ -169,8 +139,6 @@
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <connections>
-                <outlet property="colorView" destination="hEb-LU-Yhq" id="F3m-Ji-dhf"/>
-                <outlet property="courseDesc" destination="w4g-yi-Rgm" id="Y90-kI-6Pv"/>
                 <outlet property="courseName" destination="INl-R7-pRX" id="06n-hn-rxq"/>
                 <outlet property="courseTimeLabel" destination="gLO-02-Vhb" id="QXE-ZO-p5s"/>
                 <outlet property="statusLabel" destination="b6m-xf-3vf" id="2wd-As-SVx"/>
@@ -181,13 +149,10 @@
     </objects>
     <resources>
         <image name="course_chat" width="19" height="18"/>
+        <image name="course_musicRoom" width="47" height="51"/>
         <image name="course_time" width="16" height="16"/>
-        <image name="user_default_avatal" width="52" height="52"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
-        <systemColor name="systemRedColor">
-            <color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-        </systemColor>
     </resources>
 </document>

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m

@@ -322,6 +322,7 @@
                            @"trigger":@"item",
                            }
                   forKey:@"tooltip"];
+    
     NSMutableArray *bottomFillColorArray = [NSMutableArray array];
     NSMutableArray *dataArray = [NSMutableArray array];
     for (int i = 0; i < descArray.count && i < colorArray.count; i++) {

+ 3 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html

@@ -24,6 +24,9 @@
             
             function loadEcharts(echartJson){
                 var option = JSON.parse(echartJson);
+                option.tooltip.position = function (point, params, dom) {
+                        return [point[0], '10%'];
+                      }
                 myChart.setOption(option,true);
             }
         

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.xib

@@ -26,8 +26,8 @@
                             <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                             <nil key="highlightedColor"/>
                         </label>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Lz-0I-40s">
-                            <rect key="frame" x="12" y="48" width="0.0" height="34"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="124,111.00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Lz-0I-40s">
+                            <rect key="frame" x="12" y="48" width="130.5" height="34"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="34" id="Xey-xB-RFd"/>
                             </constraints>

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.m

@@ -68,6 +68,10 @@
     else if ([sourceModel.bizType isEqualToString:@"LIVE"]) {
         [self.courseTypeImage setImage:[UIImage imageNamed:@"income_live"]];
     }
+    // 琴房课收入
+    else if ([sourceModel.bizType isEqualToString:@""]) {
+        [self.courseTypeImage setImage:[UIImage imageNamed:@"income_live"]];
+    }
     else if ([sourceModel.bizType isEqualToString:@"VIDEO"]) {
         [self.courseTypeImage setImage:[UIImage imageNamed:@"income_video"]];
         [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm"];

+ 7 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.xib

@@ -27,6 +27,11 @@
                                     <constraint firstAttribute="height" constant="42" id="QGk-Dx-2B7"/>
                                     <constraint firstAttribute="width" constant="42" id="d9d-VE-yZr"/>
                                 </constraints>
+                                <userDefinedRuntimeAttributes>
+                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                        <real key="value" value="21"/>
+                                    </userDefinedRuntimeAttribute>
+                                </userDefinedRuntimeAttributes>
                             </imageView>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="李晓明" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kS8-LB-QVW">
                                 <rect key="frame" x="68" y="16" width="49" height="28"/>
@@ -47,8 +52,8 @@
                                 <nil key="highlightedColor"/>
                             </label>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="¥20" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uKk-JC-tKp">
-                                <rect key="frame" x="353" y="19" width="40" height="22"/>
-                                <fontDescription key="fontDescription" type="system" pointSize="18"/>
+                                <rect key="frame" x="352.5" y="19" width="40.5" height="22"/>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                                 <color key="textColor" red="1" green="0.30588235294117649" blue="0.098039215686274508" alpha="1" colorSpace="calibratedRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.m

@@ -113,6 +113,7 @@
     [KSNetworkingManager withdrawalPageRequest:KS_POST searchDate:self.searchDate status:self.statusType page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
         [self removehub];
         [self endRefresh];
+        NSLog(@"%@",[dic mj_JSONString]);
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
             NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
             

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

@@ -60,7 +60,7 @@
     self.bodyView.amount = self.drawModel.amountWithdrawal;
     NSString *descAmout = [NSString formatMoneyDoubleNum:self.drawModel.amountWithdrawal];
     self.bodyView.availableAmoutLabel.text = [NSString returnNoNullStringWithString:[NSString stringWithFormat:@"可结算余额 ¥%@",descAmout]];
-    if (self.drawModel.userBankCard) {
+    if (![NSString isEmptyString:self.drawModel.userBankCard.bankCard]) {
         NSString *cardNumber = self.drawModel.userBankCard.bankCard;
         if (cardNumber.length > 4) {
             self.bodyView.cardDesc.text = [NSString stringWithFormat:@"%@(****%@)",[NSString returnNoNullStringWithString:self.drawModel.userBankCard.bankName],[cardNumber substringFromIndex:cardNumber.length - 4]];
@@ -126,7 +126,6 @@
 
 - (void)showBandCardAlert {
     KSConfirmAlertView *alert = [KSConfirmAlertView shareInstance];
-    alert.frame = self.view.bounds;
     [alert configWithTitle:@"绑定银行卡" subTitle:@"您需要先绑定银行卡后才能结算"];
     MJWeakSelf;
     [alert opreationSure:^{
@@ -134,8 +133,7 @@
     } cancel:^{
         
     }];
-    [self.view addSubview:alert];
-    
+    [alert showAlert];
 }
 
 

+ 25 - 13
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.h

@@ -1,7 +1,7 @@
 //
 //  FeeRecordModel.h
 //
-//  Created by Steven  on 2022/4/27
+//  Created by Steven  on 2022/6/27
 //  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
 //
 
@@ -11,22 +11,34 @@
 
 @interface FeeRecordModel : NSObject <NSCoding, NSCopying>
 
-@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *tradeNo;
 @property (nonatomic, assign) double plantformFee;
-@property (nonatomic, strong) NSString *bankCard;
-@property (nonatomic, assign) double amount;
-@property (nonatomic, strong) NSString *bankName;
-@property (nonatomic, assign) double verifyUserId;
-@property (nonatomic, strong) NSString *bankFlowNo;
-@property (nonatomic, assign) double actualAmount;
+@property (nonatomic, strong) NSString *openType;
 @property (nonatomic, strong) NSString *verifyUser;
+@property (nonatomic, assign) double amount;
 @property (nonatomic, strong) NSString *withdrawaUser;
-@property (nonatomic, strong) NSString *verifyReason;
-@property (nonatomic, assign) double userId;
-@property (nonatomic, strong) NSString *transferTime;
-@property (nonatomic, strong) NSString *createTime;
-@property (nonatomic, strong) NSString *status;
+@property (nonatomic, strong) NSString *bankCard;
+@property (nonatomic, strong) NSString *callbackJson;
+@property (nonatomic, strong) NSString *withdrawStatus;
 @property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, strong) NSString *realName;
+@property (nonatomic, assign) double authUserId;
+@property (nonatomic, assign) double actualAmount;
+@property (nonatomic, assign) double bankCardId;
+@property (nonatomic, strong) NSString *authStatus;
+@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *errorMsg;
+@property (nonatomic, strong) NSString *errorCode;
+@property (nonatomic, strong) NSString *phone;
+@property (nonatomic, strong) NSString *authTime;
+@property (nonatomic, strong) NSString *transNo;
+@property (nonatomic, strong) NSString *bankName;
+@property (nonatomic, strong) NSString *tradeStatus;
+@property (nonatomic, strong) NSString *reason;
+@property (nonatomic, assign) double callbakAmount;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *transferTime;
+@property (nonatomic, assign) double userId;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 169 - 89
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Model/FeeRecordModel.m

@@ -1,29 +1,41 @@
 //
 //  FeeRecordModel.m
 //
-//  Created by Steven  on 2022/4/27
+//  Created by Steven  on 2022/6/27
 //  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
 //
 
 #import "FeeRecordModel.h"
 
 
-NSString *const kFeeRecordModelId = @"id";
+NSString *const kFeeRecordModelTradeNo = @"tradeNo";
 NSString *const kFeeRecordModelPlantformFee = @"plantformFee";
-NSString *const kFeeRecordModelBankCard = @"bankCard";
-NSString *const kFeeRecordModelAmount = @"amount";
-NSString *const kFeeRecordModelBankName = @"bankName";
-NSString *const kFeeRecordModelVerifyUserId = @"verifyUserId";
-NSString *const kFeeRecordModelBankFlowNo = @"bankFlowNo";
-NSString *const kFeeRecordModelActualAmount = @"actualAmount";
+NSString *const kFeeRecordModelOpenType = @"openType";
 NSString *const kFeeRecordModelVerifyUser = @"verifyUser";
+NSString *const kFeeRecordModelAmount = @"amount";
 NSString *const kFeeRecordModelWithdrawaUser = @"withdrawaUser";
-NSString *const kFeeRecordModelVerifyReason = @"verifyReason";
-NSString *const kFeeRecordModelUserId = @"userId";
-NSString *const kFeeRecordModelTransferTime = @"transferTime";
-NSString *const kFeeRecordModelCreateTime = @"createTime";
-NSString *const kFeeRecordModelStatus = @"status";
+NSString *const kFeeRecordModelBankCard = @"bankCard";
+NSString *const kFeeRecordModelCallbackJson = @"callbackJson";
+NSString *const kFeeRecordModelWithdrawStatus = @"withdrawStatus";
 NSString *const kFeeRecordModelUpdateTime = @"updateTime";
+NSString *const kFeeRecordModelRealName = @"realName";
+NSString *const kFeeRecordModelAuthUserId = @"authUserId";
+NSString *const kFeeRecordModelActualAmount = @"actualAmount";
+NSString *const kFeeRecordModelBankCardId = @"bankCardId";
+NSString *const kFeeRecordModelAuthStatus = @"authStatus";
+NSString *const kFeeRecordModelId = @"id";
+NSString *const kFeeRecordModelErrorMsg = @"errorMsg";
+NSString *const kFeeRecordModelErrorCode = @"errorCode";
+NSString *const kFeeRecordModelPhone = @"phone";
+NSString *const kFeeRecordModelAuthTime = @"authTime";
+NSString *const kFeeRecordModelTransNo = @"transNo";
+NSString *const kFeeRecordModelBankName = @"bankName";
+NSString *const kFeeRecordModelTradeStatus = @"tradeStatus";
+NSString *const kFeeRecordModelReason = @"reason";
+NSString *const kFeeRecordModelCallbakAmount = @"callbakAmount";
+NSString *const kFeeRecordModelCreateTime = @"createTime";
+NSString *const kFeeRecordModelTransferTime = @"transferTime";
+NSString *const kFeeRecordModelUserId = @"userId";
 
 
 @interface FeeRecordModel ()
@@ -34,22 +46,34 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
 
 @implementation FeeRecordModel
 
-@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize tradeNo = _tradeNo;
 @synthesize plantformFee = _plantformFee;
-@synthesize bankCard = _bankCard;
-@synthesize amount = _amount;
-@synthesize bankName = _bankName;
-@synthesize verifyUserId = _verifyUserId;
-@synthesize bankFlowNo = _bankFlowNo;
-@synthesize actualAmount = _actualAmount;
+@synthesize openType = _openType;
 @synthesize verifyUser = _verifyUser;
+@synthesize amount = _amount;
 @synthesize withdrawaUser = _withdrawaUser;
-@synthesize verifyReason = _verifyReason;
-@synthesize userId = _userId;
-@synthesize transferTime = _transferTime;
-@synthesize createTime = _createTime;
-@synthesize status = _status;
+@synthesize bankCard = _bankCard;
+@synthesize callbackJson = _callbackJson;
+@synthesize withdrawStatus = _withdrawStatus;
 @synthesize updateTime = _updateTime;
+@synthesize realName = _realName;
+@synthesize authUserId = _authUserId;
+@synthesize actualAmount = _actualAmount;
+@synthesize bankCardId = _bankCardId;
+@synthesize authStatus = _authStatus;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize errorMsg = _errorMsg;
+@synthesize errorCode = _errorCode;
+@synthesize phone = _phone;
+@synthesize authTime = _authTime;
+@synthesize transNo = _transNo;
+@synthesize bankName = _bankName;
+@synthesize tradeStatus = _tradeStatus;
+@synthesize reason = _reason;
+@synthesize callbakAmount = _callbakAmount;
+@synthesize createTime = _createTime;
+@synthesize transferTime = _transferTime;
+@synthesize userId = _userId;
 
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
@@ -64,22 +88,34 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
     // 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:kFeeRecordModelId fromDictionary:dict] doubleValue];
+            self.tradeNo = [self objectOrNilForKey:kFeeRecordModelTradeNo fromDictionary:dict];
             self.plantformFee = [[self objectOrNilForKey:kFeeRecordModelPlantformFee fromDictionary:dict] doubleValue];
-            self.bankCard = [self objectOrNilForKey:kFeeRecordModelBankCard fromDictionary:dict];
-            self.amount = [[self objectOrNilForKey:kFeeRecordModelAmount fromDictionary:dict] doubleValue];
-            self.bankName = [self objectOrNilForKey:kFeeRecordModelBankName fromDictionary:dict];
-            self.verifyUserId = [[self objectOrNilForKey:kFeeRecordModelVerifyUserId fromDictionary:dict] doubleValue];
-            self.bankFlowNo = [self objectOrNilForKey:kFeeRecordModelBankFlowNo fromDictionary:dict];
-            self.actualAmount = [[self objectOrNilForKey:kFeeRecordModelActualAmount fromDictionary:dict] doubleValue];
+            self.openType = [self objectOrNilForKey:kFeeRecordModelOpenType fromDictionary:dict];
             self.verifyUser = [self objectOrNilForKey:kFeeRecordModelVerifyUser fromDictionary:dict];
+            self.amount = [[self objectOrNilForKey:kFeeRecordModelAmount fromDictionary:dict] doubleValue];
             self.withdrawaUser = [self objectOrNilForKey:kFeeRecordModelWithdrawaUser fromDictionary:dict];
-            self.verifyReason = [self objectOrNilForKey:kFeeRecordModelVerifyReason fromDictionary:dict];
-            self.userId = [[self objectOrNilForKey:kFeeRecordModelUserId fromDictionary:dict] doubleValue];
-            self.transferTime = [self objectOrNilForKey:kFeeRecordModelTransferTime fromDictionary:dict];
-            self.createTime = [self objectOrNilForKey:kFeeRecordModelCreateTime fromDictionary:dict];
-            self.status = [self objectOrNilForKey:kFeeRecordModelStatus fromDictionary:dict];
+            self.bankCard = [self objectOrNilForKey:kFeeRecordModelBankCard fromDictionary:dict];
+            self.callbackJson = [self objectOrNilForKey:kFeeRecordModelCallbackJson fromDictionary:dict];
+            self.withdrawStatus = [self objectOrNilForKey:kFeeRecordModelWithdrawStatus fromDictionary:dict];
             self.updateTime = [self objectOrNilForKey:kFeeRecordModelUpdateTime fromDictionary:dict];
+            self.realName = [self objectOrNilForKey:kFeeRecordModelRealName fromDictionary:dict];
+            self.authUserId = [[self objectOrNilForKey:kFeeRecordModelAuthUserId fromDictionary:dict] doubleValue];
+            self.actualAmount = [[self objectOrNilForKey:kFeeRecordModelActualAmount fromDictionary:dict] doubleValue];
+            self.bankCardId = [[self objectOrNilForKey:kFeeRecordModelBankCardId fromDictionary:dict] doubleValue];
+            self.authStatus = [self objectOrNilForKey:kFeeRecordModelAuthStatus fromDictionary:dict];
+            self.internalBaseClassIdentifier = [[self objectOrNilForKey:kFeeRecordModelId fromDictionary:dict] doubleValue];
+            self.errorMsg = [self objectOrNilForKey:kFeeRecordModelErrorMsg fromDictionary:dict];
+            self.errorCode = [self objectOrNilForKey:kFeeRecordModelErrorCode fromDictionary:dict];
+            self.phone = [self objectOrNilForKey:kFeeRecordModelPhone fromDictionary:dict];
+            self.authTime = [self objectOrNilForKey:kFeeRecordModelAuthTime fromDictionary:dict];
+            self.transNo = [self objectOrNilForKey:kFeeRecordModelTransNo fromDictionary:dict];
+            self.bankName = [self objectOrNilForKey:kFeeRecordModelBankName fromDictionary:dict];
+            self.tradeStatus = [self objectOrNilForKey:kFeeRecordModelTradeStatus fromDictionary:dict];
+            self.reason = [self objectOrNilForKey:kFeeRecordModelReason fromDictionary:dict];
+            self.callbakAmount = [[self objectOrNilForKey:kFeeRecordModelCallbakAmount fromDictionary:dict] doubleValue];
+            self.createTime = [self objectOrNilForKey:kFeeRecordModelCreateTime fromDictionary:dict];
+            self.transferTime = [self objectOrNilForKey:kFeeRecordModelTransferTime fromDictionary:dict];
+            self.userId = [[self objectOrNilForKey:kFeeRecordModelUserId fromDictionary:dict] doubleValue];
 
     }
     
@@ -90,22 +126,34 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
 - (NSDictionary *)dictionaryRepresentation
 {
     NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
-    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kFeeRecordModelId];
+    [mutableDict setValue:self.tradeNo forKey:kFeeRecordModelTradeNo];
     [mutableDict setValue:[NSNumber numberWithDouble:self.plantformFee] forKey:kFeeRecordModelPlantformFee];
-    [mutableDict setValue:self.bankCard forKey:kFeeRecordModelBankCard];
-    [mutableDict setValue:[NSNumber numberWithDouble:self.amount] forKey:kFeeRecordModelAmount];
-    [mutableDict setValue:self.bankName forKey:kFeeRecordModelBankName];
-    [mutableDict setValue:[NSNumber numberWithDouble:self.verifyUserId] forKey:kFeeRecordModelVerifyUserId];
-    [mutableDict setValue:self.bankFlowNo forKey:kFeeRecordModelBankFlowNo];
-    [mutableDict setValue:[NSNumber numberWithDouble:self.actualAmount] forKey:kFeeRecordModelActualAmount];
+    [mutableDict setValue:self.openType forKey:kFeeRecordModelOpenType];
     [mutableDict setValue:self.verifyUser forKey:kFeeRecordModelVerifyUser];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.amount] forKey:kFeeRecordModelAmount];
     [mutableDict setValue:self.withdrawaUser forKey:kFeeRecordModelWithdrawaUser];
-    [mutableDict setValue:self.verifyReason forKey:kFeeRecordModelVerifyReason];
-    [mutableDict setValue:[NSNumber numberWithDouble:self.userId] forKey:kFeeRecordModelUserId];
-    [mutableDict setValue:self.transferTime forKey:kFeeRecordModelTransferTime];
-    [mutableDict setValue:self.createTime forKey:kFeeRecordModelCreateTime];
-    [mutableDict setValue:self.status forKey:kFeeRecordModelStatus];
+    [mutableDict setValue:self.bankCard forKey:kFeeRecordModelBankCard];
+    [mutableDict setValue:self.callbackJson forKey:kFeeRecordModelCallbackJson];
+    [mutableDict setValue:self.withdrawStatus forKey:kFeeRecordModelWithdrawStatus];
     [mutableDict setValue:self.updateTime forKey:kFeeRecordModelUpdateTime];
+    [mutableDict setValue:self.realName forKey:kFeeRecordModelRealName];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.authUserId] forKey:kFeeRecordModelAuthUserId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.actualAmount] forKey:kFeeRecordModelActualAmount];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.bankCardId] forKey:kFeeRecordModelBankCardId];
+    [mutableDict setValue:self.authStatus forKey:kFeeRecordModelAuthStatus];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kFeeRecordModelId];
+    [mutableDict setValue:self.errorMsg forKey:kFeeRecordModelErrorMsg];
+    [mutableDict setValue:self.errorCode forKey:kFeeRecordModelErrorCode];
+    [mutableDict setValue:self.phone forKey:kFeeRecordModelPhone];
+    [mutableDict setValue:self.authTime forKey:kFeeRecordModelAuthTime];
+    [mutableDict setValue:self.transNo forKey:kFeeRecordModelTransNo];
+    [mutableDict setValue:self.bankName forKey:kFeeRecordModelBankName];
+    [mutableDict setValue:self.tradeStatus forKey:kFeeRecordModelTradeStatus];
+    [mutableDict setValue:self.reason forKey:kFeeRecordModelReason];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.callbakAmount] forKey:kFeeRecordModelCallbakAmount];
+    [mutableDict setValue:self.createTime forKey:kFeeRecordModelCreateTime];
+    [mutableDict setValue:self.transferTime forKey:kFeeRecordModelTransferTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.userId] forKey:kFeeRecordModelUserId];
 
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
@@ -119,10 +167,6 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
 - (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;
 }
 
@@ -133,44 +177,68 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
 {
     self = [super init];
 
-    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kFeeRecordModelId];
+    self.tradeNo = [aDecoder decodeObjectForKey:kFeeRecordModelTradeNo];
     self.plantformFee = [aDecoder decodeDoubleForKey:kFeeRecordModelPlantformFee];
-    self.bankCard = [aDecoder decodeObjectForKey:kFeeRecordModelBankCard];
-    self.amount = [aDecoder decodeDoubleForKey:kFeeRecordModelAmount];
-    self.bankName = [aDecoder decodeObjectForKey:kFeeRecordModelBankName];
-    self.verifyUserId = [aDecoder decodeDoubleForKey:kFeeRecordModelVerifyUserId];
-    self.bankFlowNo = [aDecoder decodeObjectForKey:kFeeRecordModelBankFlowNo];
-    self.actualAmount = [aDecoder decodeDoubleForKey:kFeeRecordModelActualAmount];
+    self.openType = [aDecoder decodeObjectForKey:kFeeRecordModelOpenType];
     self.verifyUser = [aDecoder decodeObjectForKey:kFeeRecordModelVerifyUser];
+    self.amount = [aDecoder decodeDoubleForKey:kFeeRecordModelAmount];
     self.withdrawaUser = [aDecoder decodeObjectForKey:kFeeRecordModelWithdrawaUser];
-    self.verifyReason = [aDecoder decodeObjectForKey:kFeeRecordModelVerifyReason];
-    self.userId = [aDecoder decodeDoubleForKey:kFeeRecordModelUserId];
-    self.transferTime = [aDecoder decodeObjectForKey:kFeeRecordModelTransferTime];
-    self.createTime = [aDecoder decodeObjectForKey:kFeeRecordModelCreateTime];
-    self.status = [aDecoder decodeObjectForKey:kFeeRecordModelStatus];
+    self.bankCard = [aDecoder decodeObjectForKey:kFeeRecordModelBankCard];
+    self.callbackJson = [aDecoder decodeObjectForKey:kFeeRecordModelCallbackJson];
+    self.withdrawStatus = [aDecoder decodeObjectForKey:kFeeRecordModelWithdrawStatus];
     self.updateTime = [aDecoder decodeObjectForKey:kFeeRecordModelUpdateTime];
+    self.realName = [aDecoder decodeObjectForKey:kFeeRecordModelRealName];
+    self.authUserId = [aDecoder decodeDoubleForKey:kFeeRecordModelAuthUserId];
+    self.actualAmount = [aDecoder decodeDoubleForKey:kFeeRecordModelActualAmount];
+    self.bankCardId = [aDecoder decodeDoubleForKey:kFeeRecordModelBankCardId];
+    self.authStatus = [aDecoder decodeObjectForKey:kFeeRecordModelAuthStatus];
+    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kFeeRecordModelId];
+    self.errorMsg = [aDecoder decodeObjectForKey:kFeeRecordModelErrorMsg];
+    self.errorCode = [aDecoder decodeObjectForKey:kFeeRecordModelErrorCode];
+    self.phone = [aDecoder decodeObjectForKey:kFeeRecordModelPhone];
+    self.authTime = [aDecoder decodeObjectForKey:kFeeRecordModelAuthTime];
+    self.transNo = [aDecoder decodeObjectForKey:kFeeRecordModelTransNo];
+    self.bankName = [aDecoder decodeObjectForKey:kFeeRecordModelBankName];
+    self.tradeStatus = [aDecoder decodeObjectForKey:kFeeRecordModelTradeStatus];
+    self.reason = [aDecoder decodeObjectForKey:kFeeRecordModelReason];
+    self.callbakAmount = [aDecoder decodeDoubleForKey:kFeeRecordModelCallbakAmount];
+    self.createTime = [aDecoder decodeObjectForKey:kFeeRecordModelCreateTime];
+    self.transferTime = [aDecoder decodeObjectForKey:kFeeRecordModelTransferTime];
+    self.userId = [aDecoder decodeDoubleForKey:kFeeRecordModelUserId];
     return self;
 }
 
 - (void)encodeWithCoder:(NSCoder *)aCoder
 {
 
-    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kFeeRecordModelId];
+    [aCoder encodeObject:_tradeNo forKey:kFeeRecordModelTradeNo];
     [aCoder encodeDouble:_plantformFee forKey:kFeeRecordModelPlantformFee];
-    [aCoder encodeObject:_bankCard forKey:kFeeRecordModelBankCard];
-    [aCoder encodeDouble:_amount forKey:kFeeRecordModelAmount];
-    [aCoder encodeObject:_bankName forKey:kFeeRecordModelBankName];
-    [aCoder encodeDouble:_verifyUserId forKey:kFeeRecordModelVerifyUserId];
-    [aCoder encodeObject:_bankFlowNo forKey:kFeeRecordModelBankFlowNo];
-    [aCoder encodeDouble:_actualAmount forKey:kFeeRecordModelActualAmount];
+    [aCoder encodeObject:_openType forKey:kFeeRecordModelOpenType];
     [aCoder encodeObject:_verifyUser forKey:kFeeRecordModelVerifyUser];
+    [aCoder encodeDouble:_amount forKey:kFeeRecordModelAmount];
     [aCoder encodeObject:_withdrawaUser forKey:kFeeRecordModelWithdrawaUser];
-    [aCoder encodeObject:_verifyReason forKey:kFeeRecordModelVerifyReason];
-    [aCoder encodeDouble:_userId forKey:kFeeRecordModelUserId];
-    [aCoder encodeObject:_transferTime forKey:kFeeRecordModelTransferTime];
-    [aCoder encodeObject:_createTime forKey:kFeeRecordModelCreateTime];
-    [aCoder encodeObject:_status forKey:kFeeRecordModelStatus];
+    [aCoder encodeObject:_bankCard forKey:kFeeRecordModelBankCard];
+    [aCoder encodeObject:_callbackJson forKey:kFeeRecordModelCallbackJson];
+    [aCoder encodeObject:_withdrawStatus forKey:kFeeRecordModelWithdrawStatus];
     [aCoder encodeObject:_updateTime forKey:kFeeRecordModelUpdateTime];
+    [aCoder encodeObject:_realName forKey:kFeeRecordModelRealName];
+    [aCoder encodeDouble:_authUserId forKey:kFeeRecordModelAuthUserId];
+    [aCoder encodeDouble:_actualAmount forKey:kFeeRecordModelActualAmount];
+    [aCoder encodeDouble:_bankCardId forKey:kFeeRecordModelBankCardId];
+    [aCoder encodeObject:_authStatus forKey:kFeeRecordModelAuthStatus];
+    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kFeeRecordModelId];
+    [aCoder encodeObject:_errorMsg forKey:kFeeRecordModelErrorMsg];
+    [aCoder encodeObject:_errorCode forKey:kFeeRecordModelErrorCode];
+    [aCoder encodeObject:_phone forKey:kFeeRecordModelPhone];
+    [aCoder encodeObject:_authTime forKey:kFeeRecordModelAuthTime];
+    [aCoder encodeObject:_transNo forKey:kFeeRecordModelTransNo];
+    [aCoder encodeObject:_bankName forKey:kFeeRecordModelBankName];
+    [aCoder encodeObject:_tradeStatus forKey:kFeeRecordModelTradeStatus];
+    [aCoder encodeObject:_reason forKey:kFeeRecordModelReason];
+    [aCoder encodeDouble:_callbakAmount forKey:kFeeRecordModelCallbakAmount];
+    [aCoder encodeObject:_createTime forKey:kFeeRecordModelCreateTime];
+    [aCoder encodeObject:_transferTime forKey:kFeeRecordModelTransferTime];
+    [aCoder encodeDouble:_userId forKey:kFeeRecordModelUserId];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -179,22 +247,34 @@ NSString *const kFeeRecordModelUpdateTime = @"updateTime";
     
     if (copy) {
 
-        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.tradeNo = [self.tradeNo copyWithZone:zone];
         copy.plantformFee = self.plantformFee;
-        copy.bankCard = [self.bankCard copyWithZone:zone];
-        copy.amount = self.amount;
-        copy.bankName = [self.bankName copyWithZone:zone];
-        copy.verifyUserId = self.verifyUserId;
-        copy.bankFlowNo = [self.bankFlowNo copyWithZone:zone];
-        copy.actualAmount = self.actualAmount;
+        copy.openType = [self.openType copyWithZone:zone];
         copy.verifyUser = [self.verifyUser copyWithZone:zone];
+        copy.amount = self.amount;
         copy.withdrawaUser = [self.withdrawaUser copyWithZone:zone];
-        copy.verifyReason = [self.verifyReason copyWithZone:zone];
-        copy.userId = self.userId;
-        copy.transferTime = [self.transferTime copyWithZone:zone];
-        copy.createTime = [self.createTime copyWithZone:zone];
-        copy.status = [self.status copyWithZone:zone];
+        copy.bankCard = [self.bankCard copyWithZone:zone];
+        copy.callbackJson = [self.callbackJson copyWithZone:zone];
+        copy.withdrawStatus = [self.withdrawStatus copyWithZone:zone];
         copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.realName = [self.realName copyWithZone:zone];
+        copy.authUserId = self.authUserId;
+        copy.actualAmount = self.actualAmount;
+        copy.bankCardId = self.bankCardId;
+        copy.authStatus = [self.authStatus copyWithZone:zone];
+        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.errorMsg = [self.errorMsg copyWithZone:zone];
+        copy.errorCode = [self.errorCode copyWithZone:zone];
+        copy.phone = [self.phone copyWithZone:zone];
+        copy.authTime = [self.authTime copyWithZone:zone];
+        copy.transNo = [self.transNo copyWithZone:zone];
+        copy.bankName = [self.bankName copyWithZone:zone];
+        copy.tradeStatus = [self.tradeStatus copyWithZone:zone];
+        copy.reason = [self.reason copyWithZone:zone];
+        copy.callbakAmount = self.callbakAmount;
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.transferTime = [self.transferTime copyWithZone:zone];
+        copy.userId = self.userId;
     }
     
     return copy;

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.m

@@ -39,11 +39,11 @@
     [formatter setDateFormat:@"yyyy/MM/dd HH:mm"];
     NSString *applyTime = [formatter stringFromDate:applyDate];
     self.timeLabel.text = [NSString returnNoNullStringWithString:applyTime];
-    if ([sourceModel.status isEqualToString:@"DOING"]) {
+    if ([sourceModel.withdrawStatus isEqualToString:@"DOING"]) {
         self.statusLabel.text = @"审核中";
         self.statusLabel.textColor = HexRGB(0x666666);
     }
-    else if ([sourceModel.status isEqualToString:@"PASS"]) {
+    else if ([sourceModel.withdrawStatus isEqualToString:@"SUCCESS"]) {
         self.statusLabel.text = @"结算成功";
         self.statusLabel.textColor = THEMECOLOR;
     }

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/WithdrawApplyBodyView.xib

@@ -30,7 +30,7 @@
                     <nil key="highlightedColor"/>
                 </label>
                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8ob-Ni-H4W">
-                    <rect key="frame" x="109" y="359.5" width="196" height="44"/>
+                    <rect key="frame" x="109" y="362" width="196" height="44"/>
                     <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="196" id="HFu-y6-qnF"/>
@@ -48,12 +48,12 @@
                     </connections>
                 </button>
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vhp-hV-vrO">
-                    <rect key="frame" x="46" y="300" width="322" height="37.5"/>
+                    <rect key="frame" x="46" y="300" width="322" height="40"/>
                     <attributedString key="attributedText">
                         <fragment content="平台将在2个工作日内将结算金额转账至你所绑定的银行卡,请留意银行卡收入信息">
                             <attributes>
                                 <color key="NSColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
-                                <font key="NSFont" size="15" name=".PingFangSC-Regular"/>
+                                <font key="NSFont" metaFont="system" size="15"/>
                                 <paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4" tighteningFactorForTruncation="0.0"/>
                             </attributes>
                         </fragment>

+ 3 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/Controller/MyMusicViewController.m

@@ -20,7 +20,7 @@
 #import "KSPremissionAlert.h"
 #import "KSUMShareManager.h"
 
-#define HEADER_HEIGHT (64)
+#define HEADER_HEIGHT (50)
 
 @interface MyMusicViewController ()<JXPagerViewDelegate, JXPagerMainTableViewGestureDelegate,JXCategoryViewDelegate>
 
@@ -61,6 +61,7 @@
     JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
     lineView.indicatorColor = THEMECOLOR;
     lineView.indicatorWidth = 16;
+    lineView.indicatorHeight = 4.0f;
     self.categoryView.indicators = @[lineView];
     
     _pagerView = [self preferredPagingView];
@@ -115,7 +116,7 @@
 }
 
 - (void)showShareUI:(UIImage *)image {
-    KSUMShareManager *manager = [KSUMShareManager shareInstanceWithImage:image url:nil shareTitle:nil descMessage:nil shareType:KSSHARETYPE_IMAGE callback:^(BOOL isSuccess, NSString * _Nonnull descMessage) {
+    KSUMShareManager *manager = [KSUMShareManager shareInstanceWithImage:image url:@"" shareTitle:@"" descMessage:nil shareType:KSSHARETYPE_IMAGE showInView:self callback:^(BOOL isSuccess, NSString * _Nonnull descMessage) {
         if (isSuccess) {
             [self .shareView hideView];
         }

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Music/View/MusicShareDisplayView.xib

@@ -113,7 +113,7 @@
                             <constraints>
                                 <constraint firstAttribute="width" constant="100" id="kzC-xI-fMK"/>
                             </constraints>
-                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                             <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                             <nil key="highlightedColor"/>
                         </label>

Some files were not shown because too many files changed in this diff