Jelajahi Sumber

Merge branch 'HomeStatistics' into NewDev

# Conflicts:
#	KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
Steven 2 bulan lalu
induk
melakukan
2bfd4ee0ac
46 mengubah file dengan 1829 tambahan dan 434 penghapusan
  1. 69 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/group_introduce.imageset/Contents.json
  3. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/group_introduce.imageset/group_introduce@2x.png
  4. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/group_introduce.imageset/group_introduce@3x.png
  5. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/Contents.json
  6. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_hot_music.imageset/Contents.json
  7. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_hot_music.imageset/home_hot_music@2x.png
  8. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_hot_music.imageset/home_hot_music@3x.png
  9. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_newest_music.imageset/Contents.json
  10. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_newest_music.imageset/home_newest_music@2x.png
  11. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_newest_music.imageset/home_newest_music@3x.png
  12. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_recommend_music.imageset/Contents.json
  13. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_recommend_music.imageset/home_recommend_music@2x.png
  14. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/home_recommend_music.imageset/home_recommend_music@3x.png
  15. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_album_icon.imageset/Contents.json
  16. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_album_icon.imageset/home_album_icon@2x.png
  17. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_album_icon.imageset/home_album_icon@3x.png
  18. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_music_icon.imageset/Contents.json
  19. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_music_icon.imageset/home_music_icon@2x.png
  20. TEMPAT SAMPAH
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_music_icon.imageset/home_music_icon@3x.png
  21. 9 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  22. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  23. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupIntroduceViewController.h
  24. 73 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupIntroduceViewController.m
  25. 10 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupSettingViewController.m
  26. 6 6
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/ChatComplainBodyView.xib
  27. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.h
  28. 180 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.m
  29. 127 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.xib
  30. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.h
  31. 12 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.m
  32. 128 58
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.xib
  33. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.xib
  34. 110 362
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m
  35. 26 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/HomeStatistics/HomeStatisticsView.h
  36. 321 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/HomeStatistics/HomeStatisticsView.m
  37. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHotAlbumCell.xib
  38. 31 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.h
  39. 71 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.m
  40. 204 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.xib
  41. 27 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.h
  42. 48 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.m
  43. 128 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.xib
  44. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/Controller/CoursewareViewController.m
  45. 2 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/ViewModel/CoursewareViewModel.h
  46. 36 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/ViewModel/CoursewareViewModel.m

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

@@ -247,6 +247,9 @@
 		BC02BCEC28B324FE005CB483 /* LiveMemberSeatCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC02BCEA28B324FD005CB483 /* LiveMemberSeatCell.xib */; };
 		BC02F32A2D1E913F0004233D /* MusicRoomStudentListHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC02F3292D1E913F0004233D /* MusicRoomStudentListHeadView.m */; };
 		BC02F32C2D1E91470004233D /* MusicRoomStudentListHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC02F32B2D1E91470004233D /* MusicRoomStudentListHeadView.xib */; };
+		BC02F32F2D2273740004233D /* GroupIntroduceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC02F32E2D2273740004233D /* GroupIntroduceViewController.m */; };
+		BC02F3322D2274070004233D /* GroupIntroduceBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC02F3312D2274070004233D /* GroupIntroduceBodyView.m */; };
+		BC02F3342D2274140004233D /* GroupIntroduceBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC02F3332D2274140004233D /* GroupIntroduceBodyView.xib */; };
 		BC063D842823CEFE000EB350 /* AddressListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC063D822823CEFD000EB350 /* AddressListModel.m */; };
 		BC0A22A3284751F80065C1AB /* AccompanyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0A228F284751F80065C1AB /* AccompanyView.m */; };
 		BC0A22A4284751F80065C1AB /* AccompanySongCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0A2292284751F80065C1AB /* AccompanySongCell.m */; };
@@ -883,6 +886,12 @@
 		BCA353E52859797500377661 /* MusicRoomStudentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA353E32859797400377661 /* MusicRoomStudentCell.xib */; };
 		BCA353E92859A6FB00377661 /* MusicRoomHomeworkCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA353E72859A6FA00377661 /* MusicRoomHomeworkCell.m */; };
 		BCA353EA2859A6FB00377661 /* MusicRoomHomeworkCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA353E82859A6FA00377661 /* MusicRoomHomeworkCell.xib */; };
+		BCA353ED2859B4EC00377661 /* MusicRoomHomeworkStudentController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA353EC2859B4EC00377661 /* MusicRoomHomeworkStudentController.m */; };
+		BCA409F52D1D269700A387F1 /* HomeStatisticsView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA409F42D1D269700A387F1 /* HomeStatisticsView.m */; };
+		BCA409F92D1D2A5D00A387F1 /* HomeNewAlbumView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA409F82D1D2A5D00A387F1 /* HomeNewAlbumView.m */; };
+		BCA409FB2D1D2A6600A387F1 /* HomeNewAlbumView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA409FA2D1D2A6600A387F1 /* HomeNewAlbumView.xib */; };
+		BCA409FF2D1D2EC800A387F1 /* HomeMusicPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA409FE2D1D2EC800A387F1 /* HomeMusicPageView.m */; };
+		BCA40A012D1D2ECF00A387F1 /* HomeMusicPageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA40A002D1D2ECF00A387F1 /* HomeMusicPageView.xib */; };
 		BCA723FB2806A96000DA0D0D /* HomeworkDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA723FA2806A96000DA0D0D /* HomeworkDetailViewController.m */; };
 		BCA723FF2806AEA000DA0D0D /* AccompanyHomeworkCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA723FD2806AEA000DA0D0D /* AccompanyHomeworkCell.m */; };
 		BCA724002806AEA000DA0D0D /* AccompanyHomeworkCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA723FE2806AEA000DA0D0D /* AccompanyHomeworkCell.xib */; };
@@ -1646,6 +1655,11 @@
 		BC02F3282D1E913F0004233D /* MusicRoomStudentListHeadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicRoomStudentListHeadView.h; sourceTree = "<group>"; };
 		BC02F3292D1E913F0004233D /* MusicRoomStudentListHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MusicRoomStudentListHeadView.m; sourceTree = "<group>"; };
 		BC02F32B2D1E91470004233D /* MusicRoomStudentListHeadView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MusicRoomStudentListHeadView.xib; sourceTree = "<group>"; };
+		BC02F32D2D2273740004233D /* GroupIntroduceViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroupIntroduceViewController.h; sourceTree = "<group>"; };
+		BC02F32E2D2273740004233D /* GroupIntroduceViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroupIntroduceViewController.m; sourceTree = "<group>"; };
+		BC02F3302D2274070004233D /* GroupIntroduceBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroupIntroduceBodyView.h; sourceTree = "<group>"; };
+		BC02F3312D2274070004233D /* GroupIntroduceBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroupIntroduceBodyView.m; sourceTree = "<group>"; };
+		BC02F3332D2274140004233D /* GroupIntroduceBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GroupIntroduceBodyView.xib; sourceTree = "<group>"; };
 		BC063D822823CEFD000EB350 /* AddressListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddressListModel.m; sourceTree = "<group>"; };
 		BC063D832823CEFE000EB350 /* AddressListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddressListModel.h; sourceTree = "<group>"; };
 		BC0A228F284751F80065C1AB /* AccompanyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AccompanyView.m; sourceTree = "<group>"; };
@@ -2679,6 +2693,16 @@
 		BCA353E62859A6FA00377661 /* MusicRoomHomeworkCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicRoomHomeworkCell.h; sourceTree = "<group>"; };
 		BCA353E72859A6FA00377661 /* MusicRoomHomeworkCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MusicRoomHomeworkCell.m; sourceTree = "<group>"; };
 		BCA353E82859A6FA00377661 /* MusicRoomHomeworkCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MusicRoomHomeworkCell.xib; sourceTree = "<group>"; };
+		BCA353EB2859B4EC00377661 /* MusicRoomHomeworkStudentController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicRoomHomeworkStudentController.h; sourceTree = "<group>"; };
+		BCA353EC2859B4EC00377661 /* MusicRoomHomeworkStudentController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MusicRoomHomeworkStudentController.m; sourceTree = "<group>"; };
+		BCA409F32D1D269700A387F1 /* HomeStatisticsView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeStatisticsView.h; sourceTree = "<group>"; };
+		BCA409F42D1D269700A387F1 /* HomeStatisticsView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeStatisticsView.m; sourceTree = "<group>"; };
+		BCA409F72D1D2A5D00A387F1 /* HomeNewAlbumView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeNewAlbumView.h; sourceTree = "<group>"; };
+		BCA409F82D1D2A5D00A387F1 /* HomeNewAlbumView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeNewAlbumView.m; sourceTree = "<group>"; };
+		BCA409FA2D1D2A6600A387F1 /* HomeNewAlbumView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeNewAlbumView.xib; sourceTree = "<group>"; };
+		BCA409FD2D1D2EC800A387F1 /* HomeMusicPageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeMusicPageView.h; sourceTree = "<group>"; };
+		BCA409FE2D1D2EC800A387F1 /* HomeMusicPageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeMusicPageView.m; sourceTree = "<group>"; };
+		BCA40A002D1D2ECF00A387F1 /* HomeMusicPageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeMusicPageView.xib; sourceTree = "<group>"; };
 		BCA723F92806A96000DA0D0D /* HomeworkDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeworkDetailViewController.h; sourceTree = "<group>"; };
 		BCA723FA2806A96000DA0D0D /* HomeworkDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeworkDetailViewController.m; sourceTree = "<group>"; };
 		BCA723FC2806AEA000DA0D0D /* AccompanyHomeworkCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccompanyHomeworkCell.h; sourceTree = "<group>"; };
@@ -3829,6 +3853,7 @@
 		277935FA27E32BBF0010E277 /* Home */ = {
 			isa = PBXGroup;
 			children = (
+				BCA409F22D1D267400A387F1 /* HomeStatistics */,
 				BCB9FA17286D52CF005D766B /* ScanView */,
 				BCFE540A28178BD100AD6786 /* Income */,
 				BC1365BE280D44D500EB03E2 /* NotiferMessage */,
@@ -3874,6 +3899,8 @@
 		277935FD27E32BBF0010E277 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BCA409FC2D1D2EBA00A387F1 /* HomeMusicPageView */,
+				BCA409F62D1D2A4F00A387F1 /* HomeNewAlbum */,
 				BC7E77092900DD8E00EB37AF /* HomeDragButton */,
 				BC1263A628FF98C300509E90 /* HomeRecommendMusic */,
 				BC1263A028FF98BB00509E90 /* HomeNewMusic */,
@@ -4366,6 +4393,8 @@
 				2755C08027ED54EF007D9070 /* GroupApplyViewController.m */,
 				2755C06A27EC7F0D007D9070 /* KSChatComplainController.h */,
 				2755C06B27EC7F0E007D9070 /* KSChatComplainController.m */,
+				BC02F32D2D2273740004233D /* GroupIntroduceViewController.h */,
+				BC02F32E2D2273740004233D /* GroupIntroduceViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -4412,6 +4441,9 @@
 				BC9AA0C72ABC3C7B00CD954D /* KSPhotoChooseView.h */,
 				BC9AA0C32ABC3C7A00CD954D /* KSPhotoChooseView.m */,
 				BC9AA0C52ABC3C7A00CD954D /* KSPhotoChooseView.xib */,
+				BC02F3302D2274070004233D /* GroupIntroduceBodyView.h */,
+				BC02F3312D2274070004233D /* GroupIntroduceBodyView.m */,
+				BC02F3332D2274140004233D /* GroupIntroduceBodyView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -6861,6 +6893,35 @@
 			path = BanList;
 			sourceTree = "<group>";
 		};
+		BCA409F22D1D267400A387F1 /* HomeStatistics */ = {
+			isa = PBXGroup;
+			children = (
+				BCA409F32D1D269700A387F1 /* HomeStatisticsView.h */,
+				BCA409F42D1D269700A387F1 /* HomeStatisticsView.m */,
+			);
+			path = HomeStatistics;
+			sourceTree = "<group>";
+		};
+		BCA409F62D1D2A4F00A387F1 /* HomeNewAlbum */ = {
+			isa = PBXGroup;
+			children = (
+				BCA409F72D1D2A5D00A387F1 /* HomeNewAlbumView.h */,
+				BCA409F82D1D2A5D00A387F1 /* HomeNewAlbumView.m */,
+				BCA409FA2D1D2A6600A387F1 /* HomeNewAlbumView.xib */,
+			);
+			path = HomeNewAlbum;
+			sourceTree = "<group>";
+		};
+		BCA409FC2D1D2EBA00A387F1 /* HomeMusicPageView */ = {
+			isa = PBXGroup;
+			children = (
+				BCA409FD2D1D2EC800A387F1 /* HomeMusicPageView.h */,
+				BCA409FE2D1D2EC800A387F1 /* HomeMusicPageView.m */,
+				BCA40A002D1D2ECF00A387F1 /* HomeMusicPageView.xib */,
+			);
+			path = HomeMusicPageView;
+			sourceTree = "<group>";
+		};
 		BCA9A5B22D18F67500C7CC9D /* GroupCourse */ = {
 			isa = PBXGroup;
 			children = (
@@ -8073,6 +8134,7 @@
 				BCECE2242B3D648700C0D555 /* CourseFileDisplayView.xib in Resources */,
 				2755C06927EC71C8007D9070 /* GroupSettingBodyView.xib in Resources */,
 				BC2820E52C9182D9008BD2CC /* GroupNoticeDetailBodyView.xib in Resources */,
+				BCA40A012D1D2ECF00A387F1 /* HomeMusicPageView.xib in Resources */,
 				BC71D1EF2887FDD40010F14B /* img_2.png in Resources */,
 				BC8B641D28F3E8D800A08D16 /* KSAwardAlertView.xib in Resources */,
 				BCD1606B2CED870700A78B43 /* MyCourseGroupNavView.xib in Resources */,
@@ -8166,6 +8228,7 @@
 				BCECE2162B3D5F0800C0D555 /* FeedbackNavView.xib in Resources */,
 				BC206EDF2CEF2623001F2B85 /* MusicRoomCourseCell.xib in Resources */,
 				BCECE21B2B3D5F0800C0D555 /* FeedbackListCell.xib in Resources */,
+				BC02F3342D2274140004233D /* GroupIntroduceBodyView.xib in Resources */,
 				BC31BF952B219C5700F7D538 /* ToneTuningBodyView.xib in Resources */,
 				BC58E7DF281B96A4004B0893 /* MinePageTopView.xib in Resources */,
 				BCEA75322819336A00886A86 /* WithdrawBodyView.xib in Resources */,
@@ -8331,6 +8394,7 @@
 				BC245710286C437D00D1F7C0 /* synthgms.sf2 in Resources */,
 				BC71D1EE2887FDD40010F14B /* img_13.png in Resources */,
 				BCF1BA5B27F5CF3C00FA36C4 /* LiveSeatApplyCell.xib in Resources */,
+				BCA409FB2D1D2A6600A387F1 /* HomeNewAlbumView.xib in Resources */,
 				2780C92427E4903500A95A4F /* PasswordBodyView.xib in Resources */,
 				BC81F0EF29233228004106AF /* CoursewareSearchView.xib in Resources */,
 				27F902FF27E864AE00C08A19 /* KSNetworkAlert.xib in Resources */,
@@ -8767,6 +8831,7 @@
 				BC106BA42A8F45AA000759A9 /* TXLiveChatListCell.m in Sources */,
 				BC86A2C92CD36B6400A15A53 /* MineWorkSortView.m in Sources */,
 				BC31BF9C2B219C5700F7D538 /* WidgetBottomButtonView.m in Sources */,
+				BCA409F92D1D2A5D00A387F1 /* HomeNewAlbumView.m in Sources */,
 				BC1263A428FF98BB00509E90 /* HomeNewMusicView.m in Sources */,
 				BCDE359E289BC03E00A9A560 /* HomeAlbumModel.m in Sources */,
 				BC3BF6362B9ED1F600831494 /* StateView.m in Sources */,
@@ -8856,6 +8921,7 @@
 				BC4BCE7D2823B66000522C8B /* AddressDetailBodyView.m in Sources */,
 				BC38C4222AF900E100ABFCC2 /* KSPlayerView.m in Sources */,
 				BCA9AC442CED91F200047BFA /* MyLiveCourseGroupListCell.m in Sources */,
+				BC02F3322D2274070004233D /* GroupIntroduceBodyView.m in Sources */,
 				BC42CAAE2BEC9CDA001F076E /* RhythmChooseView.m in Sources */,
 				BCF425ED2AB975D200BCD942 /* TenantMineHeadView.m in Sources */,
 				27FC2F6D27F1BE4800FCC239 /* VideoCourseViewController.m in Sources */,
@@ -8956,6 +9022,7 @@
 				BCA193BE282B9866004A585D /* MinePageGroupModel.m in Sources */,
 				BCB633F827F6A18200ACFDCF /* KSTipsView.m in Sources */,
 				BCF748602D156F4900CD7EB4 /* EvaluateReceiveBodyView.m in Sources */,
+				BCA409FF2D1D2EC800A387F1 /* HomeMusicPageView.m in Sources */,
 				BC0A22B72847523E0065C1AB /* MemberBottomView.m in Sources */,
 				BC02BCDA28B3243F005CB483 /* LiveSeatActionView.m in Sources */,
 				BCECE21A2B3D5F0800C0D555 /* KSSortButtonView.m in Sources */,
@@ -9045,6 +9112,7 @@
 				275B172927EB26920081FDEF /* ChatAddressHeaderView.m in Sources */,
 				BC7CFFA22817D72200CAEB21 /* IncomeListModel.m in Sources */,
 				BCB6F45E2CF57F13000D8805 /* TeacherStyleFlowLayout.m in Sources */,
+				BCA409F52D1D269700A387F1 /* HomeStatisticsView.m in Sources */,
 				2755C06C27EC7F0E007D9070 /* KSChatComplainController.m in Sources */,
 				BC12638528FEB5B900509E90 /* UserDetailBodyView.m in Sources */,
 				BC14A61728A0B0440086395C /* MineBottomView.m in Sources */,
@@ -9162,6 +9230,7 @@
 				BCFB9B892CE4883100B66BC0 /* VipCouseDetailViewController.m in Sources */,
 				BCB399AC27F946A200AFF376 /* CourseNavView.m in Sources */,
 				BCA9A5B52D18F73800C7CC9D /* MineGroupCourseBodyView.m in Sources */,
+				BC02F32F2D2273740004233D /* GroupIntroduceViewController.m in Sources */,
 				BCE06F2B2818146700234817 /* KSConfirmAlertView.m in Sources */,
 				275B16FA27EB08230081FDEF /* CreateFansGroupViewController.m in Sources */,
 				27F9030227E864AE00C08A19 /* KSNetworkAlert.m in Sources */,

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

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

TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/group_introduce.imageset/group_introduce@2x.png


TEMPAT SAMPAH
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/group_introduce.imageset/group_introduce@3x.png


+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/HomeMusic/Contents.json

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

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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

@@ -534,6 +534,15 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)groupMuteRequest:(NSString *)post groupId:(NSString *)groupId userIdArray:(NSMutableArray *)userIds groupMute:(BOOL)groupMute success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+// /imGroup/updateIntroduce
+// 群简介修改
+/// @param post post json
+/// @param groupId 群ID
+/// @param introduce 简介
+/// @param success 成功
+/// @param faliure 失败
++ (void)imGroupIntroduceModifyRequest:(NSString *)post groupId:(NSString *)groupId introduce:(NSString *)introduce success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 #pragma mark ---- 群公告
 // /api-teacher/imGroupNotice/queryPage
 

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

@@ -1140,6 +1140,22 @@
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
+// /imGroup/updateIntroduce
+// 群简介修改
+/// @param post post json
+/// @param groupId 群ID
+/// @param introduce 简介
+/// @param success 成功
+/// @param faliure 失败
++ (void)imGroupIntroduceModifyRequest:(NSString *)post groupId:(NSString *)groupId introduce:(NSString *)introduce success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", hostURL, @"/api-teacher",@"/imGroup/updateIntroduce"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:groupId forKey:@"id"];
+    [parm setValue:introduce forKey:@"introduce"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 #pragma mark ---- 群公告
 // /api-teacher/imGroupNotice/queryPage
 

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupIntroduceViewController.h

@@ -0,0 +1,22 @@
+//
+//  GroupIntroduceViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/30.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GroupIntroduceViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *groupId;
+
+@property (nonatomic, strong) NSString *groupIntroduce;
+
+@property (nonatomic, assign) BOOL canModify;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 73 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupIntroduceViewController.m

@@ -0,0 +1,73 @@
+//
+//  GroupIntroduceViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/30.
+//
+
+#import "GroupIntroduceViewController.h"
+#import "GroupIntroduceBodyView.h"
+
+@interface GroupIntroduceViewController ()
+
+@property (nonatomic, strong) GroupIntroduceBodyView *bodyView;
+
+@end
+
+@implementation GroupIntroduceViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"群简介"];
+    [self configUI];
+}
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    [self.view addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    MJWeakSelf;
+    [self.bodyView configWithDesc:self.groupIntroduce callback:^(NSString * _Nonnull introduceString) {
+        [weakSelf updateIntroduce:introduceString];
+    }];
+}
+
+- (void)updateIntroduce:(NSString *)introduce {
+    [LOADING_MANAGER showCustomLoading:@"加载中..."];
+    [KSNetworkingManager imGroupIntroduceModifyRequest:KS_POST groupId:self.groupId introduce:introduce success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeCustomLoading];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER KSShowMsg:@"保存成功" promptCompletion:^{
+                [self backAction];
+            }];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeCustomLoading];
+    }];
+}
+
+- (GroupIntroduceBodyView *)bodyView {
+    if (!_bodyView) {
+        _bodyView = [GroupIntroduceBodyView sharedInstance];
+        _bodyView.canModify = self.canModify;
+    }
+    return _bodyView;
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 10 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupSettingViewController.m

@@ -21,6 +21,7 @@
 #import "TenantChooseMemberViewController.h"
 #import "TenantStuModel.h"
 #import "GroupBanListViewController.h"
+#import "GroupIntroduceViewController.h"
 
 @interface GroupSettingViewController ()
 
@@ -286,6 +287,15 @@
             [self.navigationController pushViewController:ctrl animated:YES];
         }
             break;
+        case GROUPSETTING_GROUPINTRODUCE: // 群简介
+        {
+            GroupIntroduceViewController *ctrl = [[GroupIntroduceViewController alloc] init];
+            ctrl.groupId = self.groupId;
+            ctrl.groupIntroduce = self.sourceModel.introduce;
+            ctrl.canModify = YES;
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
         default:
             break;
     }

+ 6 - 6
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/ChatComplainBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -38,10 +38,10 @@
                                     <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
                                     <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
-                                    <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+                                    <textInputTraits key="textInputTraits" autocapitalizationType="sentences" smartInsertDeleteType="no"/>
                                 </textView>
                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入投诉理由" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="srl-cR-tfi">
-                                    <rect key="frame" x="10" y="9" width="107.5" height="18"/>
+                                    <rect key="frame" x="10" y="9" width="104.5" height="18"/>
                                     <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                     <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="calibratedRGB"/>
                                     <nil key="highlightedColor"/>
@@ -58,7 +58,7 @@
                             </constraints>
                         </view>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="投诉理由" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tN1-Iy-7ZO">
-                            <rect key="frame" x="40" y="16" width="65.5" height="22"/>
+                            <rect key="frame" x="40" y="16" width="64" height="22"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="22" id="brX-IC-SC3"/>
                             </constraints>
@@ -105,7 +105,7 @@
                             </constraints>
                         </view>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="上传聊天截图" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oi4-ac-uGd">
-                            <rect key="frame" x="40" y="16" width="98" height="22"/>
+                            <rect key="frame" x="40" y="16" width="95.5" height="22"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="22" id="4KB-xi-B4I"/>
                             </constraints>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.h

@@ -0,0 +1,24 @@
+//
+//  GroupIntroduceBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/30.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^GroupIntroduceModifyCallback)(NSString * _Nonnull introduceString);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GroupIntroduceBodyView : UIView
+
+@property (nonatomic, assign) BOOL canModify;
+
++ (instancetype)sharedInstance;
+
+- (void)configWithDesc:(NSString *)introduceString callback:(GroupIntroduceModifyCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 180 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.m

@@ -0,0 +1,180 @@
+//
+//  GroupIntroduceBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/30.
+//
+
+#import "GroupIntroduceBodyView.h"
+
+@interface GroupIntroduceBodyView ()<UITextViewDelegate>
+
+@property (weak, nonatomic) IBOutlet UILabel *tipsLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *countLabel;
+
+@property (weak, nonatomic) IBOutlet UITextView *inputView;
+
+@property (nonatomic, copy) GroupIntroduceModifyCallback callback;
+
+@property (nonatomic, assign) NSInteger maxInputCount;
+
+@property (weak, nonatomic) IBOutlet UIButton *bottomButton;
+
+@end
+
+@implementation GroupIntroduceBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.inputView.delegate = self;
+    self.inputView.textContainer.lineFragmentPadding = 0;
+    self.inputView.textContainerInset = UIEdgeInsetsZero;
+    [self configDefault];
+}
+
+- (void)configDefault {
+    self.maxInputCount = 200;
+}
+
++ (instancetype)sharedInstance {
+    GroupIntroduceBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"GroupIntroduceBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configWithDesc:(NSString *)introduceString callback:(GroupIntroduceModifyCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.countLabel.text = [NSString stringWithFormat:@"%zd/200", introduceString.length];
+    self.tipsLabel.hidden = [NSString isEmptyString:introduceString] ? NO : YES;
+    
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
+    paragraphStyle.lineSpacing = 4.0f;
+    UIFont *font = [UIFont systemFontOfSize:16 weight:UIFontWeightRegular];
+    if (![NSString isEmptyString:introduceString]) {
+        NSDictionary *attributes = @{NSFontAttributeName:font,NSParagraphStyleAttributeName:paragraphStyle,NSForegroundColorAttributeName:HexRGB(0x333333)};
+        self.inputView.attributedText = [[NSAttributedString alloc] initWithString:introduceString attributes:attributes];
+    }
+}
+
+- (IBAction)saveAction:(id)sender {
+    [self endEditing:YES];
+    if (self.callback) {
+        if ([NSString isEmptyString:self.inputView.text]) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:self.tipsLabel.text];
+            return;
+        }
+        self.callback(self.inputView.text);
+    }
+}
+
+#pragma mark   ---- delegate
+
+- (void)textViewDidBeginEditing:(UITextView *)textView {
+    self.tipsLabel.hidden = YES;
+}
+
+
+- (void)textViewDidEndEditing:(UITextView *)textView {
+    if ([NSString isEmptyString:textView.text]) {
+        self.tipsLabel.hidden = NO;
+    }
+}
+
+- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
+    UITextRange *markedTextRange = textView.markedTextRange;
+    if (markedTextRange) {
+        // 当前处于拼音输入状态,暂不更新 attributedText
+        return YES;
+    }
+    NSInteger limitCount = self.maxInputCount;
+
+    NSString *newText = [[textView text] stringByReplacingCharactersInRange:range withString:text];
+    if (newText.length > limitCount) {
+        newText = [newText substringWithRange:NSMakeRange(0, limitCount)];
+        textView.text = newText;
+    }
+    return YES;
+}
+
+- (void)updateTextViewLineHeight:(UITextView *)textView {
+    UITextRange *markedTextRange = textView.markedTextRange;
+    if (markedTextRange) {
+        // 当前处于拼音输入状态,暂不更新 attributedText
+        return;
+    }
+    [UIView setAnimationsEnabled:NO];
+    NSRange selectedRange = textView.selectedRange;
+    NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:textView.text attributes:[self getTypeAttributes]];
+    textView.attributedText = attrs;
+    textView.selectedRange = selectedRange;
+    [UIView setAnimationsEnabled:YES];
+}
+
+- (void)textViewDidChange:(UITextView *)textView {
+    // 获取当前高亮的部分(如果正在拼音输入状态)
+    UITextRange *selectedRange = [textView markedTextRange];
+    UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
+    
+    // 如果没有高亮选择的文本,说明不是拼音输入状态
+    if (!position) {
+        // 获取当前textView的内容
+        NSInteger limitCount = self.maxInputCount;
+        NSString *currentText = textView.text;
+        
+        // 如果文本超出最大长度,进行截取
+        if (currentText.length > limitCount) {
+            NSString *limitedText = [currentText substringToIndex:limitCount];
+            textView.text = limitedText;
+        }
+        
+        self.countLabel.text = [NSString stringWithFormat:@"%zd/%zd",textView.text.length,self.maxInputCount];
+    }
+    [self updateTextViewLineHeight:textView];
+}
+
+- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
+    [self endEditing:YES];
+    return YES;
+}
+
+- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
+    [self endEditing:YES];
+}
+
+- (NSDictionary *)getTypeAttributes {
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
+    paragraphStyle.lineSpacing = 4.0f;
+    UIFont *font = [UIFont systemFontOfSize:16 weight:UIFontWeightRegular];
+    
+    NSDictionary *attributes = @{NSFontAttributeName:font,NSParagraphStyleAttributeName:paragraphStyle,NSForegroundColorAttributeName:HexRGB(0x333333)};
+    return attributes;
+}
+
+- (void)setCanModify:(BOOL)canModify {
+    _canModify = canModify;
+    if (canModify) {
+        self.inputView.editable = YES;
+        self.inputView.selectable = YES;
+        self.countLabel.hidden = NO;
+        self.bottomButton.hidden = NO;
+        self.bottomButton.userInteractionEnabled = YES;
+    }
+    else {
+        self.inputView.editable = NO;
+        self.inputView.selectable = NO;
+        self.countLabel.hidden = YES;
+        self.bottomButton.hidden = YES;
+        self.bottomButton.userInteractionEnabled = NO;
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 127 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupIntroduceBodyView.xib

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GroupIntroduceBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6Wf-NZ-RlI">
+                    <rect key="frame" x="14" y="12" width="365" height="296"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="group_introduce" translatesAutoresizingMaskIntoConstraints="NO" id="l4Y-wY-IEl">
+                            <rect key="frame" x="11" y="12" width="24" height="24"/>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="群简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="00i-pd-fVW">
+                            <rect key="frame" x="38" y="12" width="50.666666666666657" height="24"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="24" id="3pX-8E-oJi"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsVerticalScrollIndicator="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="ojd-Ye-Vwu">
+                            <rect key="frame" x="12" y="45" width="341" height="239"/>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <color key="textColor" systemColor="labelColor"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences" smartInsertDeleteType="no"/>
+                        </textView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入群简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eX5-gT-ext">
+                            <rect key="frame" x="12" y="44" width="95.333333333333329" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="BLH-Gt-f9F"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.75686274509803919" green="0.75686274509803919" blue="0.75686274509803919" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0/200" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rjf-ib-50h">
+                            <rect key="frame" x="314.33333333333331" y="12" width="38.666666666666686" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="Noz-AX-6hw"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.29999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="00i-pd-fVW" firstAttribute="leading" secondItem="l4Y-wY-IEl" secondAttribute="trailing" constant="3" id="3ph-YE-NzZ"/>
+                        <constraint firstItem="ojd-Ye-Vwu" firstAttribute="top" secondItem="l4Y-wY-IEl" secondAttribute="bottom" constant="9" id="4vj-gA-Ure"/>
+                        <constraint firstItem="l4Y-wY-IEl" firstAttribute="leading" secondItem="6Wf-NZ-RlI" secondAttribute="leading" constant="11" id="7V7-IT-uqm"/>
+                        <constraint firstAttribute="height" constant="296" id="82l-ei-nCJ"/>
+                        <constraint firstAttribute="trailing" secondItem="ojd-Ye-Vwu" secondAttribute="trailing" constant="12" id="BLP-4W-nDO"/>
+                        <constraint firstAttribute="trailing" secondItem="Rjf-ib-50h" secondAttribute="trailing" constant="12" id="BcM-MP-oJu"/>
+                        <constraint firstItem="eX5-gT-ext" firstAttribute="leading" secondItem="6Wf-NZ-RlI" secondAttribute="leading" constant="12" id="IhJ-pg-fSz"/>
+                        <constraint firstItem="eX5-gT-ext" firstAttribute="top" secondItem="l4Y-wY-IEl" secondAttribute="bottom" constant="8" id="QiB-Pr-4I5"/>
+                        <constraint firstItem="00i-pd-fVW" firstAttribute="top" secondItem="6Wf-NZ-RlI" secondAttribute="top" constant="12" id="Rsc-jc-KdL"/>
+                        <constraint firstItem="ojd-Ye-Vwu" firstAttribute="leading" secondItem="6Wf-NZ-RlI" secondAttribute="leading" constant="12" id="UME-c2-72N"/>
+                        <constraint firstAttribute="bottom" secondItem="ojd-Ye-Vwu" secondAttribute="bottom" constant="12" id="cdd-Zt-61K"/>
+                        <constraint firstItem="Rjf-ib-50h" firstAttribute="top" secondItem="6Wf-NZ-RlI" secondAttribute="top" constant="12" id="eFF-Or-OsZ"/>
+                        <constraint firstItem="00i-pd-fVW" firstAttribute="centerY" secondItem="l4Y-wY-IEl" secondAttribute="centerY" id="yi3-dX-Lwd"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="C0w-dR-pBm">
+                    <rect key="frame" x="28" y="778" width="337" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="5jv-sv-lKD"/>
+                    </constraints>
+                    <state key="normal" title="保存"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="saveAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="SfW-vq-1Bz"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="C0w-dR-pBm" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="1oa-4g-zqK"/>
+                <constraint firstAttribute="trailing" secondItem="6Wf-NZ-RlI" secondAttribute="trailing" constant="14" id="XuS-lA-1RW"/>
+                <constraint firstAttribute="bottom" secondItem="C0w-dR-pBm" secondAttribute="bottom" constant="30" id="Z9k-V6-6qZ"/>
+                <constraint firstAttribute="trailing" secondItem="C0w-dR-pBm" secondAttribute="trailing" constant="28" id="Zci-Tb-W7R"/>
+                <constraint firstItem="6Wf-NZ-RlI" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="a4L-PN-NXM"/>
+                <constraint firstItem="6Wf-NZ-RlI" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="qEn-Se-ObV"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bottomButton" destination="C0w-dR-pBm" id="cjE-AE-nOE"/>
+                <outlet property="countLabel" destination="Rjf-ib-50h" id="ZsS-CC-wDP"/>
+                <outlet property="inputView" destination="ojd-Ye-Vwu" id="9KT-FR-eXz"/>
+                <outlet property="tipsLabel" destination="eX5-gT-ext" id="IAg-Sd-72T"/>
+            </connections>
+            <point key="canvasLocation" x="34" y="20"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="group_introduce" width="24" height="24"/>
+        <systemColor name="labelColor">
+            <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.h

@@ -19,6 +19,7 @@ typedef NS_ENUM(NSInteger, GROUPSETTING) {
     GROUPSETTING_ADDMENBER, // 添加成员
     GROUPSETTING_MUTE,  // 静言
     GROUPSETTING_BANLIST, // 禁言列表
+    GROUPSETTING_GROUPINTRODUCE, // 群介绍
 };
 
 

+ 12 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.m

@@ -140,6 +140,8 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
 @property (weak, nonatomic) IBOutlet UIView *banListView;
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *banListHeight;
 
+@property (weak, nonatomic) IBOutlet UILabel *groupDesc;
+
 @end
 
 @implementation GroupSettingBodyView
@@ -206,6 +208,8 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
             groupLimit = 2000;
         }
         self.groupMemberDesc.text = [NSString stringWithFormat:@"%.0f/%zd",model.memberNum,groupLimit];
+        
+        self.groupDesc.text = [NSString returnNoNullStringWithString:model.introduce];
     }
 }
 
@@ -326,6 +330,12 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
         self.callback(GROUPSETTING_SETTING);
     }
 }
+// 群简介
+- (IBAction)groupIntroduce:(id)sender {
+    if (self.callback) {
+        self.callback(GROUPSETTING_GROUPINTRODUCE);
+    }
+}
 
 // 群公告
 - (IBAction)groupNotice:(id)sender {
@@ -418,10 +428,10 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
 - (CGFloat)getViewHeight:(NSString *)roleType {
     CGFloat bottomSpace = IS_iPhoneX ? iPhoneXSafeBottomMargin : 20;
     if ([self.groupRoleType isEqualToString:@"Owner"] || [self.groupRoleType isEqualToString:@"Admin"]) {
-        return 802 + bottomSpace;
+        return 857 + bottomSpace;
     }
     else {
-        return 692 + bottomSpace;
+        return 747 + bottomSpace;
     }
 }
 /*

+ 128 - 58
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupSettingBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -64,7 +64,7 @@
                     <rect key="frame" x="0.0" y="112" width="414" height="140"/>
                     <subviews>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="查看联系人" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ko0-ic-QhE">
-                            <rect key="frame" x="13" y="14" width="90" height="19.5"/>
+                            <rect key="frame" x="16" y="14" width="90" height="19.5"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="90" id="KWN-ah-XX8"/>
                             </constraints>
@@ -73,7 +73,7 @@
                             <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="v6l-tz-OXe">
-                            <rect key="frame" x="289.5" y="14" width="97.5" height="20"/>
+                            <rect key="frame" x="285.5" y="14" width="97.5" height="20"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="20" id="0re-nB-uf4"/>
                             </constraints>
@@ -82,7 +82,7 @@
                             <nil key="highlightedColor"/>
                         </label>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="Ef1-4F-E7a">
-                            <rect key="frame" x="397" y="17" width="7" height="14"/>
+                            <rect key="frame" x="395" y="17" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="LPs-ha-Fjo"/>
                                 <constraint firstAttribute="height" constant="14" id="dR4-cU-LG1"/>
@@ -102,25 +102,25 @@
                     <constraints>
                         <constraint firstItem="v6l-tz-OXe" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Ko0-ic-QhE" secondAttribute="trailing" constant="15" id="0ov-cL-SgD"/>
                         <constraint firstItem="Ef1-4F-E7a" firstAttribute="centerY" secondItem="Ko0-ic-QhE" secondAttribute="centerY" id="6L2-1v-ewt"/>
-                        <constraint firstItem="Ko0-ic-QhE" firstAttribute="leading" secondItem="fRV-DB-sBs" secondAttribute="leading" constant="13" id="CJV-Ne-PQB"/>
+                        <constraint firstItem="Ko0-ic-QhE" firstAttribute="leading" secondItem="fRV-DB-sBs" secondAttribute="leading" constant="16" id="CJV-Ne-PQB"/>
                         <constraint firstAttribute="trailing" secondItem="HI1-5o-vEr" secondAttribute="trailing" id="GKt-iB-nKb"/>
-                        <constraint firstAttribute="trailing" secondItem="Ef1-4F-E7a" secondAttribute="trailing" constant="10" id="JQU-jz-a7d"/>
+                        <constraint firstAttribute="trailing" secondItem="Ef1-4F-E7a" secondAttribute="trailing" constant="12" id="JQU-jz-a7d"/>
                         <constraint firstAttribute="height" constant="140" id="TIV-BF-Okg"/>
                         <constraint firstItem="HI1-5o-vEr" firstAttribute="leading" secondItem="fRV-DB-sBs" secondAttribute="leading" id="WAH-j7-00w"/>
                         <constraint firstItem="Ef1-4F-E7a" firstAttribute="centerY" secondItem="v6l-tz-OXe" secondAttribute="centerY" id="oj4-oI-oLh"/>
                         <constraint firstAttribute="bottom" secondItem="HI1-5o-vEr" secondAttribute="bottom" id="s4z-Vn-yuR"/>
                         <constraint firstItem="Ko0-ic-QhE" firstAttribute="top" secondItem="fRV-DB-sBs" secondAttribute="top" constant="14" id="xog-98-TJN"/>
-                        <constraint firstItem="Ef1-4F-E7a" firstAttribute="leading" secondItem="v6l-tz-OXe" secondAttribute="trailing" constant="10" id="zdw-Q7-SoW"/>
+                        <constraint firstItem="Ef1-4F-E7a" firstAttribute="leading" secondItem="v6l-tz-OXe" secondAttribute="trailing" constant="12" id="zdw-Q7-SoW"/>
                     </constraints>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="hZ3-TO-Qmd" appends="YES" id="e9a-aC-88k"/>
                     </connections>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UZO-j7-eJs">
-                    <rect key="frame" x="0.0" y="429" width="414" height="50"/>
+                    <rect key="frame" x="0.0" y="484" width="414" height="50"/>
                     <subviews>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="查找聊天内容" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bcd-XL-l1B">
-                            <rect key="frame" x="13" y="15.5" width="145" height="19.5"/>
+                            <rect key="frame" x="16" y="15.5" width="145" height="19.5"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="145" id="ZNy-Jc-fkX"/>
                             </constraints>
@@ -129,14 +129,14 @@
                             <nil key="highlightedColor"/>
                         </label>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="09i-zq-wwF">
-                            <rect key="frame" x="397" y="18" width="7" height="14"/>
+                            <rect key="frame" x="395" y="18" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="JUy-qJ-BB2"/>
                                 <constraint firstAttribute="height" constant="14" id="bLX-Xe-UN1"/>
                             </constraints>
                         </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ntG-Sr-YZn">
-                            <rect key="frame" x="387" y="25" width="0.0" height="0.0"/>
+                            <rect key="frame" x="385" y="25" width="0.0" height="0.0"/>
                             <fontDescription key="fontDescription" type="system" pointSize="17"/>
                             <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
@@ -156,11 +156,11 @@
                         <constraint firstItem="7Fh-bv-cgE" firstAttribute="leading" secondItem="UZO-j7-eJs" secondAttribute="leading" constant="16" id="IKr-hz-1ro"/>
                         <constraint firstItem="7Fh-bv-cgE" firstAttribute="top" secondItem="UZO-j7-eJs" secondAttribute="top" id="MOh-cf-etV"/>
                         <constraint firstItem="09i-zq-wwF" firstAttribute="centerY" secondItem="UZO-j7-eJs" secondAttribute="centerY" id="OeQ-fN-6cK"/>
-                        <constraint firstItem="bcd-XL-l1B" firstAttribute="leading" secondItem="UZO-j7-eJs" secondAttribute="leading" constant="13" id="Rws-Er-90w"/>
+                        <constraint firstItem="bcd-XL-l1B" firstAttribute="leading" secondItem="UZO-j7-eJs" secondAttribute="leading" constant="16" id="Rws-Er-90w"/>
                         <constraint firstItem="09i-zq-wwF" firstAttribute="centerY" secondItem="ntG-Sr-YZn" secondAttribute="centerY" id="TxF-a3-Wxc"/>
                         <constraint firstAttribute="trailing" secondItem="7Fh-bv-cgE" secondAttribute="trailing" id="qym-aL-ovv"/>
                         <constraint firstAttribute="height" constant="50" id="s7y-Cv-X16"/>
-                        <constraint firstAttribute="trailing" secondItem="09i-zq-wwF" secondAttribute="trailing" constant="10" id="tRK-q4-3Nx"/>
+                        <constraint firstAttribute="trailing" secondItem="09i-zq-wwF" secondAttribute="trailing" constant="12" id="tRK-q4-3Nx"/>
                         <constraint firstItem="ntG-Sr-YZn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="bcd-XL-l1B" secondAttribute="trailing" constant="10" id="wek-mK-cMq"/>
                         <constraint firstItem="09i-zq-wwF" firstAttribute="leading" secondItem="ntG-Sr-YZn" secondAttribute="trailing" constant="10" id="xCS-nl-Zyy"/>
                     </constraints>
@@ -172,7 +172,7 @@
                     <rect key="frame" x="0.0" y="319" width="414" height="55"/>
                     <subviews>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="群名称" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w4w-2R-YqH">
-                            <rect key="frame" x="13" y="18" width="60" height="19.5"/>
+                            <rect key="frame" x="16" y="18" width="60" height="19.5"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="60" id="kIg-GL-3Tq"/>
                             </constraints>
@@ -181,13 +181,16 @@
                             <nil key="highlightedColor"/>
                         </label>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Sg5-z3-lFr">
-                            <rect key="frame" x="387" y="27.5" width="0.0" height="0.0"/>
+                            <rect key="frame" x="383" y="16.5" width="0.0" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="dSh-qw-gvh"/>
+                            </constraints>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                            <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="dH8-35-u9Y">
-                            <rect key="frame" x="397" y="20.5" width="7" height="14"/>
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="kGp-Em-Btf"/>
                                 <constraint firstAttribute="height" constant="14" id="vvc-DA-Efa"/>
@@ -199,22 +202,22 @@
                     <constraints>
                         <constraint firstItem="dH8-35-u9Y" firstAttribute="centerY" secondItem="hNX-kx-Qhp" secondAttribute="centerY" id="0dJ-eE-6L0"/>
                         <constraint firstItem="Sg5-z3-lFr" firstAttribute="centerY" secondItem="w4w-2R-YqH" secondAttribute="centerY" id="1ta-aB-eQs"/>
-                        <constraint firstItem="w4w-2R-YqH" firstAttribute="leading" secondItem="hNX-kx-Qhp" secondAttribute="leading" constant="13" id="A3g-5U-3fj"/>
+                        <constraint firstItem="w4w-2R-YqH" firstAttribute="leading" secondItem="hNX-kx-Qhp" secondAttribute="leading" constant="16" id="A3g-5U-3fj"/>
                         <constraint firstAttribute="height" constant="55" id="Emh-Yn-dgo"/>
-                        <constraint firstItem="Sg5-z3-lFr" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="w4w-2R-YqH" secondAttribute="trailing" constant="10" id="RYT-Id-TVH"/>
-                        <constraint firstAttribute="trailing" secondItem="dH8-35-u9Y" secondAttribute="trailing" constant="10" id="Xqe-hq-Kxm"/>
+                        <constraint firstItem="Sg5-z3-lFr" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="w4w-2R-YqH" secondAttribute="trailing" constant="12" id="RYT-Id-TVH"/>
+                        <constraint firstAttribute="trailing" secondItem="dH8-35-u9Y" secondAttribute="trailing" constant="12" id="Xqe-hq-Kxm"/>
                         <constraint firstItem="dH8-35-u9Y" firstAttribute="centerY" secondItem="w4w-2R-YqH" secondAttribute="centerY" id="Z1C-5o-HBo"/>
-                        <constraint firstItem="dH8-35-u9Y" firstAttribute="leading" secondItem="Sg5-z3-lFr" secondAttribute="trailing" constant="10" id="nEX-xd-gIi"/>
+                        <constraint firstItem="dH8-35-u9Y" firstAttribute="leading" secondItem="Sg5-z3-lFr" secondAttribute="trailing" constant="12" id="nEX-xd-gIi"/>
                     </constraints>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="7kx-cV-Azd" appends="YES" id="biv-0X-K3l"/>
                     </connections>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aOO-cS-gdV">
-                    <rect key="frame" x="0.0" y="601" width="414" height="55"/>
+                    <rect key="frame" x="0.0" y="656" width="414" height="55"/>
                     <subviews>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fl2-Rm-1E9">
-                            <rect key="frame" x="354" y="7.5" width="47" height="40"/>
+                            <rect key="frame" x="352" y="7.5" width="47" height="40"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="47" id="30N-IR-OuO"/>
                                 <constraint firstAttribute="height" constant="40" id="ZIc-CE-ru7"/>
@@ -225,7 +228,7 @@
                             </connections>
                         </button>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" text="群消息接收但不提醒" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="k5R-Vy-hE4">
-                            <rect key="frame" x="13" y="18" width="143" height="19.5"/>
+                            <rect key="frame" x="16" y="18" width="143" height="19.5"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
@@ -234,17 +237,17 @@
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
                         <constraint firstItem="fl2-Rm-1E9" firstAttribute="centerY" secondItem="aOO-cS-gdV" secondAttribute="centerY" id="7FZ-Tr-MBK"/>
-                        <constraint firstItem="k5R-Vy-hE4" firstAttribute="leading" secondItem="aOO-cS-gdV" secondAttribute="leading" constant="13" id="dyA-fF-EdC"/>
+                        <constraint firstItem="k5R-Vy-hE4" firstAttribute="leading" secondItem="aOO-cS-gdV" secondAttribute="leading" constant="16" id="dyA-fF-EdC"/>
                         <constraint firstAttribute="height" constant="55" id="f3H-FW-bKQ"/>
                         <constraint firstItem="k5R-Vy-hE4" firstAttribute="centerY" secondItem="aOO-cS-gdV" secondAttribute="centerY" id="mXM-Wu-xYx"/>
-                        <constraint firstAttribute="trailing" secondItem="fl2-Rm-1E9" secondAttribute="trailing" constant="13" id="p2H-Bc-RbE"/>
+                        <constraint firstAttribute="trailing" secondItem="fl2-Rm-1E9" secondAttribute="trailing" constant="15" id="p2H-Bc-RbE"/>
                     </constraints>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DCz-5K-rHE">
                     <rect key="frame" x="0.0" y="264" width="414" height="55"/>
                     <subviews>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="入群申请" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aJm-I4-iZk">
-                            <rect key="frame" x="13" y="18" width="80" height="19.5"/>
+                            <rect key="frame" x="16" y="18" width="80" height="19.5"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="80" id="sSE-b8-P4K"/>
                             </constraints>
@@ -253,9 +256,12 @@
                             <nil key="highlightedColor"/>
                         </label>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hPH-bg-uLo">
-                            <rect key="frame" x="387" y="27.5" width="0.0" height="0.0"/>
+                            <rect key="frame" x="383" y="16.5" width="0.0" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="z9z-9C-bbB"/>
+                            </constraints>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                            <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UZI-A8-kiW">
@@ -266,7 +272,7 @@
                             </constraints>
                         </view>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="az0-z3-fYG">
-                            <rect key="frame" x="397" y="20.5" width="7" height="14"/>
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="14" id="bUQ-SX-QzV"/>
                                 <constraint firstAttribute="width" constant="7" id="gtn-Y6-fb1"/>
@@ -281,11 +287,11 @@
                         <constraint firstItem="UZI-A8-kiW" firstAttribute="leading" secondItem="DCz-5K-rHE" secondAttribute="leading" constant="16" id="FnD-Cw-SZp"/>
                         <constraint firstItem="az0-z3-fYG" firstAttribute="centerY" secondItem="DCz-5K-rHE" secondAttribute="centerY" id="LP1-I4-gLg"/>
                         <constraint firstAttribute="bottom" secondItem="UZI-A8-kiW" secondAttribute="bottom" id="R5e-r0-saN"/>
-                        <constraint firstAttribute="trailing" secondItem="az0-z3-fYG" secondAttribute="trailing" constant="10" id="j1Y-dC-Dh3"/>
-                        <constraint firstItem="aJm-I4-iZk" firstAttribute="leading" secondItem="DCz-5K-rHE" secondAttribute="leading" constant="13" id="lv2-ev-QEz"/>
-                        <constraint firstItem="hPH-bg-uLo" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="aJm-I4-iZk" secondAttribute="trailing" constant="10" id="qOe-ua-nh2"/>
+                        <constraint firstAttribute="trailing" secondItem="az0-z3-fYG" secondAttribute="trailing" constant="12" id="j1Y-dC-Dh3"/>
+                        <constraint firstItem="aJm-I4-iZk" firstAttribute="leading" secondItem="DCz-5K-rHE" secondAttribute="leading" constant="16" id="lv2-ev-QEz"/>
+                        <constraint firstItem="hPH-bg-uLo" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="aJm-I4-iZk" secondAttribute="trailing" constant="12" id="qOe-ua-nh2"/>
                         <constraint firstItem="az0-z3-fYG" firstAttribute="centerY" secondItem="aJm-I4-iZk" secondAttribute="centerY" id="xGf-HS-Y3C"/>
-                        <constraint firstItem="az0-z3-fYG" firstAttribute="leading" secondItem="hPH-bg-uLo" secondAttribute="trailing" constant="10" id="yzh-zb-ebW"/>
+                        <constraint firstItem="az0-z3-fYG" firstAttribute="leading" secondItem="hPH-bg-uLo" secondAttribute="trailing" constant="12" id="yzh-zb-ebW"/>
                         <constraint firstAttribute="trailing" secondItem="UZI-A8-kiW" secondAttribute="trailing" id="zKt-el-uj7"/>
                     </constraints>
                     <connections>
@@ -293,17 +299,17 @@
                     </connections>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="H5y-Vp-Aux">
-                    <rect key="frame" x="0.0" y="668" width="414" height="55"/>
+                    <rect key="frame" x="0.0" y="723" width="414" height="55"/>
                     <subviews>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="dhO-9D-vfB">
-                            <rect key="frame" x="397" y="20.5" width="7" height="14"/>
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="Mwr-7x-08y"/>
                                 <constraint firstAttribute="height" constant="14" id="j9v-xx-Z25"/>
                             </constraints>
                         </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" text="投诉" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RaV-yo-qZk">
-                            <rect key="frame" x="13" y="18" width="32" height="19.5"/>
+                            <rect key="frame" x="16" y="18" width="32" height="19.5"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
@@ -312,19 +318,19 @@
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <gestureRecognizers/>
                     <constraints>
-                        <constraint firstItem="RaV-yo-qZk" firstAttribute="leading" secondItem="H5y-Vp-Aux" secondAttribute="leading" constant="13" id="4yM-zG-FmJ"/>
+                        <constraint firstItem="RaV-yo-qZk" firstAttribute="leading" secondItem="H5y-Vp-Aux" secondAttribute="leading" constant="16" id="4yM-zG-FmJ"/>
                         <constraint firstItem="dhO-9D-vfB" firstAttribute="centerY" secondItem="H5y-Vp-Aux" secondAttribute="centerY" id="FL2-eR-Ut8"/>
                         <constraint firstItem="RaV-yo-qZk" firstAttribute="centerY" secondItem="H5y-Vp-Aux" secondAttribute="centerY" id="GqM-P7-Cp7"/>
                         <constraint firstAttribute="height" constant="55" id="gHm-0O-tco"/>
-                        <constraint firstAttribute="trailing" secondItem="dhO-9D-vfB" secondAttribute="trailing" constant="10" id="xXB-Pd-yCs"/>
+                        <constraint firstAttribute="trailing" secondItem="dhO-9D-vfB" secondAttribute="trailing" constant="12" id="xXB-Pd-yCs"/>
                     </constraints>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="RP4-Dp-PNk" appends="YES" id="xWt-UT-yhY"/>
                     </connections>
                 </view>
                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9Zk-Ss-xf8">
-                    <rect key="frame" x="28" y="753" width="358" height="44"/>
-                    <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="calibratedRGB"/>
+                    <rect key="frame" x="28" y="808" width="358" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="44" id="zlf-6G-YkC"/>
                     </constraints>
@@ -339,7 +345,7 @@
                     </connections>
                 </button>
                 <view autoresizesSubviews="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fy6-IY-oQY">
-                    <rect key="frame" x="0.0" y="479" width="414" height="55"/>
+                    <rect key="frame" x="0.0" y="534" width="414" height="55"/>
                     <subviews>
                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O4h-2N-H8x">
                             <rect key="frame" x="13" y="0.0" width="388" height="1"/>
@@ -349,13 +355,13 @@
                             </constraints>
                         </view>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" text="学生禁言" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QbV-a9-wg4">
-                            <rect key="frame" x="13" y="17.5" width="64" height="20"/>
+                            <rect key="frame" x="16" y="17.5" width="64" height="20"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3mj-vH-cZt">
-                            <rect key="frame" x="354" y="7.5" width="47" height="40"/>
+                            <rect key="frame" x="352" y="7.5" width="47" height="40"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="40" id="XOU-8Q-QP6"/>
                                 <constraint firstAttribute="width" constant="47" id="bvx-hY-Qyf"/>
@@ -373,24 +379,24 @@
                         <constraint firstAttribute="trailing" secondItem="O4h-2N-H8x" secondAttribute="trailing" constant="13" id="AQ8-az-aKE"/>
                         <constraint firstItem="O4h-2N-H8x" firstAttribute="leading" secondItem="fy6-IY-oQY" secondAttribute="leading" constant="13" id="He8-tc-JXN"/>
                         <constraint firstItem="3mj-vH-cZt" firstAttribute="centerY" secondItem="fy6-IY-oQY" secondAttribute="centerY" id="WCh-oQ-eED"/>
-                        <constraint firstAttribute="trailing" secondItem="3mj-vH-cZt" secondAttribute="trailing" constant="13" id="ZAI-2d-uCC"/>
+                        <constraint firstAttribute="trailing" secondItem="3mj-vH-cZt" secondAttribute="trailing" constant="15" id="ZAI-2d-uCC"/>
                         <constraint firstItem="O4h-2N-H8x" firstAttribute="top" secondItem="fy6-IY-oQY" secondAttribute="top" id="nob-ZP-O4G"/>
-                        <constraint firstItem="QbV-a9-wg4" firstAttribute="leading" secondItem="fy6-IY-oQY" secondAttribute="leading" constant="13" id="vE7-HQ-HbE"/>
+                        <constraint firstItem="QbV-a9-wg4" firstAttribute="leading" secondItem="fy6-IY-oQY" secondAttribute="leading" constant="16" id="vE7-HQ-HbE"/>
                         <constraint firstAttribute="height" constant="55" id="wSL-OO-F62"/>
                     </constraints>
                 </view>
                 <view tag="1012" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="351-sB-JCZ">
-                    <rect key="frame" x="0.0" y="534" width="414" height="55"/>
+                    <rect key="frame" x="0.0" y="589" width="414" height="55"/>
                     <subviews>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="sGO-wF-f08">
-                            <rect key="frame" x="397" y="20.5" width="7" height="14"/>
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="vQf-54-whb"/>
                                 <constraint firstAttribute="height" constant="14" id="zZ8-YS-Y8C"/>
                             </constraints>
                         </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" text="禁言名单" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VVt-xF-zQW">
-                            <rect key="frame" x="13" y="17.5" width="64" height="20"/>
+                            <rect key="frame" x="16" y="17.5" width="64" height="20"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
@@ -406,10 +412,10 @@
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <gestureRecognizers/>
                     <constraints>
-                        <constraint firstItem="VVt-xF-zQW" firstAttribute="leading" secondItem="351-sB-JCZ" secondAttribute="leading" constant="13" id="6Xq-cf-W5j"/>
+                        <constraint firstItem="VVt-xF-zQW" firstAttribute="leading" secondItem="351-sB-JCZ" secondAttribute="leading" constant="16" id="6Xq-cf-W5j"/>
                         <constraint firstItem="B4z-Xs-JGO" firstAttribute="top" secondItem="351-sB-JCZ" secondAttribute="top" id="DlR-ov-c7z"/>
                         <constraint firstItem="sGO-wF-f08" firstAttribute="centerY" secondItem="351-sB-JCZ" secondAttribute="centerY" id="EIJ-UV-KdK"/>
-                        <constraint firstAttribute="trailing" secondItem="sGO-wF-f08" secondAttribute="trailing" constant="10" id="En0-ln-AE1"/>
+                        <constraint firstAttribute="trailing" secondItem="sGO-wF-f08" secondAttribute="trailing" constant="12" id="En0-ln-AE1"/>
                         <constraint firstAttribute="height" constant="55" id="e2x-ks-Y8i"/>
                         <constraint firstItem="B4z-Xs-JGO" firstAttribute="leading" secondItem="351-sB-JCZ" secondAttribute="leading" constant="13" id="fUR-Nq-f5e"/>
                         <constraint firstItem="VVt-xF-zQW" firstAttribute="centerY" secondItem="351-sB-JCZ" secondAttribute="centerY" id="si4-4D-x0f"/>
@@ -420,17 +426,17 @@
                     </connections>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0hZ-Dj-wqy">
-                    <rect key="frame" x="0.0" y="374" width="414" height="55"/>
+                    <rect key="frame" x="0.0" y="429" width="414" height="55"/>
                     <subviews>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="jgL-fA-2h0">
-                            <rect key="frame" x="397" y="20.5" width="7" height="14"/>
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
                             <constraints>
                                 <constraint firstAttribute="width" constant="7" id="Vsh-oH-cIl"/>
                                 <constraint firstAttribute="height" constant="14" id="pBM-IT-X3h"/>
                             </constraints>
                         </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" text="群公告" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wGu-Ji-Izg">
-                            <rect key="frame" x="13" y="18" width="48" height="19.5"/>
+                            <rect key="frame" x="16" y="18" width="48" height="19.5"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
@@ -448,17 +454,72 @@
                     <constraints>
                         <constraint firstAttribute="trailing" secondItem="K7k-ff-Bs3" secondAttribute="trailing" id="7K2-hG-pph"/>
                         <constraint firstItem="K7k-ff-Bs3" firstAttribute="top" secondItem="0hZ-Dj-wqy" secondAttribute="top" id="DLW-W9-0r5"/>
-                        <constraint firstItem="wGu-Ji-Izg" firstAttribute="leading" secondItem="0hZ-Dj-wqy" secondAttribute="leading" constant="13" id="FXk-Ra-yOH"/>
+                        <constraint firstItem="wGu-Ji-Izg" firstAttribute="leading" secondItem="0hZ-Dj-wqy" secondAttribute="leading" constant="16" id="FXk-Ra-yOH"/>
                         <constraint firstItem="wGu-Ji-Izg" firstAttribute="centerY" secondItem="0hZ-Dj-wqy" secondAttribute="centerY" id="Ncj-TG-giW"/>
                         <constraint firstAttribute="height" constant="55" id="OJA-EE-coh"/>
                         <constraint firstItem="jgL-fA-2h0" firstAttribute="centerY" secondItem="0hZ-Dj-wqy" secondAttribute="centerY" id="QO5-DD-RdR"/>
-                        <constraint firstAttribute="trailing" secondItem="jgL-fA-2h0" secondAttribute="trailing" constant="10" id="b39-Pk-DXM"/>
+                        <constraint firstAttribute="trailing" secondItem="jgL-fA-2h0" secondAttribute="trailing" constant="12" id="b39-Pk-DXM"/>
                         <constraint firstItem="K7k-ff-Bs3" firstAttribute="leading" secondItem="0hZ-Dj-wqy" secondAttribute="leading" constant="16" id="bXz-DV-Cag"/>
                     </constraints>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="bpJ-RX-zB4" appends="YES" id="dVS-cS-Bxl"/>
                     </connections>
                 </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tp6-8D-B5D">
+                    <rect key="frame" x="0.0" y="374" width="414" height="55"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="群简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RYL-hu-GQa">
+                            <rect key="frame" x="16" y="18" width="60" height="19.5"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="60" id="YfG-bx-WbS"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rxL-8Y-p5y">
+                            <rect key="frame" x="130" y="16.5" width="253" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="DM5-dz-fyS"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.66666666669999997" green="0.66666666669999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="3g6-HZ-O7l">
+                            <rect key="frame" x="395" y="20.5" width="7" height="14"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="14" id="7We-lM-qbE"/>
+                                <constraint firstAttribute="width" constant="7" id="uVm-xW-oEd"/>
+                            </constraints>
+                        </imageView>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DGg-Ff-sHI">
+                            <rect key="frame" x="16" y="0.0" width="398" height="1"/>
+                            <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="1" id="2Si-eq-bYf"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <gestureRecognizers/>
+                    <constraints>
+                        <constraint firstItem="3g6-HZ-O7l" firstAttribute="centerY" secondItem="RYL-hu-GQa" secondAttribute="centerY" id="Ecl-HX-DUf"/>
+                        <constraint firstAttribute="height" constant="55" id="FBf-Qp-5N8"/>
+                        <constraint firstAttribute="trailing" secondItem="DGg-Ff-sHI" secondAttribute="trailing" id="GvD-Qk-Eps"/>
+                        <constraint firstItem="3g6-HZ-O7l" firstAttribute="leading" secondItem="rxL-8Y-p5y" secondAttribute="trailing" constant="12" id="M5d-UE-udM"/>
+                        <constraint firstItem="DGg-Ff-sHI" firstAttribute="leading" secondItem="tp6-8D-B5D" secondAttribute="leading" constant="16" id="Vgr-Bo-eiz"/>
+                        <constraint firstItem="RYL-hu-GQa" firstAttribute="leading" secondItem="tp6-8D-B5D" secondAttribute="leading" constant="16" id="h05-Lh-qGj"/>
+                        <constraint firstItem="rxL-8Y-p5y" firstAttribute="leading" secondItem="tp6-8D-B5D" secondAttribute="leading" constant="130" id="ieR-js-deU"/>
+                        <constraint firstItem="3g6-HZ-O7l" firstAttribute="centerY" secondItem="tp6-8D-B5D" secondAttribute="centerY" id="jqB-5h-Ejb"/>
+                        <constraint firstItem="DGg-Ff-sHI" firstAttribute="top" secondItem="tp6-8D-B5D" secondAttribute="top" id="krE-xe-v0B"/>
+                        <constraint firstAttribute="trailing" secondItem="3g6-HZ-O7l" secondAttribute="trailing" constant="12" id="miG-LK-e33"/>
+                        <constraint firstItem="rxL-8Y-p5y" firstAttribute="centerY" secondItem="RYL-hu-GQa" secondAttribute="centerY" id="wU6-BV-fmR"/>
+                    </constraints>
+                    <connections>
+                        <outletCollection property="gestureRecognizers" destination="qcN-so-hbi" appends="YES" id="M2T-Ma-wbb"/>
+                    </connections>
+                </view>
             </subviews>
             <color key="backgroundColor" red="0.96470588235294119" green="0.97254901960784312" blue="0.97647058823529409" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
             <constraints>
@@ -473,11 +534,14 @@
                 <constraint firstItem="0hZ-Dj-wqy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="AoA-pe-YVq"/>
                 <constraint firstAttribute="trailing" secondItem="H5y-Vp-Aux" secondAttribute="trailing" id="DZc-LC-mJn"/>
                 <constraint firstItem="fRV-DB-sBs" firstAttribute="top" secondItem="AOx-4a-71e" secondAttribute="bottom" constant="12" id="E1k-Ju-fB8"/>
+                <constraint firstItem="tp6-8D-B5D" firstAttribute="top" secondItem="hNX-kx-Qhp" secondAttribute="bottom" id="Fso-tE-6re"/>
                 <constraint firstAttribute="trailing" secondItem="aOO-cS-gdV" secondAttribute="trailing" id="Ggg-Dr-4dw"/>
                 <constraint firstItem="AOx-4a-71e" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="JaT-tL-Lg5"/>
                 <constraint firstItem="fRV-DB-sBs" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="KfE-Ms-nB3"/>
                 <constraint firstItem="hNX-kx-Qhp" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Ki4-NK-uXf"/>
                 <constraint firstItem="9Zk-Ss-xf8" firstAttribute="top" secondItem="H5y-Vp-Aux" secondAttribute="bottom" constant="30" id="N1t-gx-92V"/>
+                <constraint firstAttribute="trailing" secondItem="tp6-8D-B5D" secondAttribute="trailing" id="OxD-TF-5Rg"/>
+                <constraint firstItem="tp6-8D-B5D" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="QgK-Kv-2Jt"/>
                 <constraint firstAttribute="trailing" secondItem="351-sB-JCZ" secondAttribute="trailing" id="RVK-hp-Anr"/>
                 <constraint firstItem="DCz-5K-rHE" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Utq-mZ-4EV"/>
                 <constraint firstAttribute="trailing" secondItem="AOx-4a-71e" secondAttribute="trailing" id="VHK-38-OtQ"/>
@@ -491,7 +555,7 @@
                 <constraint firstAttribute="trailing" secondItem="DCz-5K-rHE" secondAttribute="trailing" id="ksy-CG-efB"/>
                 <constraint firstItem="351-sB-JCZ" firstAttribute="top" secondItem="fy6-IY-oQY" secondAttribute="bottom" id="lwb-rj-bpN"/>
                 <constraint firstItem="UZO-j7-eJs" firstAttribute="top" secondItem="0hZ-Dj-wqy" secondAttribute="bottom" id="qQh-1L-7mE"/>
-                <constraint firstItem="0hZ-Dj-wqy" firstAttribute="top" secondItem="hNX-kx-Qhp" secondAttribute="bottom" id="vWc-li-LcJ"/>
+                <constraint firstItem="0hZ-Dj-wqy" firstAttribute="top" secondItem="tp6-8D-B5D" secondAttribute="bottom" id="raH-oV-Idn"/>
                 <constraint firstItem="351-sB-JCZ" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="vhT-9a-u5w"/>
                 <constraint firstItem="aOO-cS-gdV" firstAttribute="top" secondItem="351-sB-JCZ" secondAttribute="bottom" constant="12" id="x1A-la-Wpa"/>
                 <constraint firstAttribute="trailing" secondItem="UZO-j7-eJs" secondAttribute="trailing" id="xBL-hk-DiD"/>
@@ -507,6 +571,7 @@
                 <outlet property="banListView" destination="351-sB-JCZ" id="JY9-Rm-pkz"/>
                 <outlet property="fullBanHeight" destination="wSL-OO-F62" id="vV3-qG-A2f"/>
                 <outlet property="fullbannedView" destination="fy6-IY-oQY" id="pl8-jV-jOy"/>
+                <outlet property="groupDesc" destination="rxL-8Y-p5y" id="67c-fC-Nbd"/>
                 <outlet property="groupImage" destination="Pgc-8e-F0o" id="cD2-2v-pf4"/>
                 <outlet property="groupMemberDesc" destination="mGj-Ko-LcU" id="oD7-d5-0hD"/>
                 <outlet property="groupName" destination="hDS-dB-bma" id="Rpk-gW-4hb"/>
@@ -553,6 +618,11 @@
                 <action selector="displayBanList:" destination="iN0-l3-epB" id="I8w-Ka-XSN"/>
             </connections>
         </tapGestureRecognizer>
+        <tapGestureRecognizer id="qcN-so-hbi">
+            <connections>
+                <action selector="groupIntroduce:" destination="iN0-l3-epB" id="Sp7-wr-HlA"/>
+            </connections>
+        </tapGestureRecognizer>
     </objects>
     <resources>
         <image name="chat_group_Logo" width="300" height="300"/>

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -83,7 +83,7 @@
                             <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences" smartInsertDeleteType="no"/>
                         </textView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入标题" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fi-W7-TxF">
                             <rect key="frame" x="12" y="47" width="74.5" height="18"/>
@@ -143,7 +143,7 @@
                             <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+                            <textInputTraits key="textInputTraits" autocapitalizationType="sentences" smartInsertDeleteType="no"/>
                         </textView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入公告内容" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mUd-aN-ASn">
                             <rect key="frame" x="12" y="47" width="104.5" height="18"/>

+ 110 - 362
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m

@@ -34,12 +34,10 @@
 #import "KSHomeButton.h"
 #import "HomeNewHeadView.h"
 
-#import "HomeAlbumView.h"
+#import "HomeNewAlbumView.h"
 #import "HomeAlbumModel.h"
 #import "HomeHotAlbumCell.h"
 
-#import "HomeHotMusicView.h"
-#import "HomeHotMusicCollectionCell.h"
 
 #import "HomeBannerView.h"
 #import <UIButton+WebCache.h>
@@ -49,9 +47,6 @@
 #import "HomeAuthAlertView.h"
 #import "KSAwardAlertView.h"
 
-#import "HomeNewMusicView.h"
-#import "HomeRecommendMusicView.h"
-#import "HomeMusicModel.h"
 
 #import "HomeDragButton.h"
 #import "ToneTuningViewController.h"
@@ -63,6 +58,9 @@
 #import "HomeMusicSheetLayout.h"
 #import "MinePageViewController.h"
 
+#import "HomeMusicPageView.h"
+#import "HomeStatisticsView.h"
+
 #define COLLECTION_WIDTH ((NSInteger)(IS_IPAD ? KPortraitWidth * 0.7 : KPortraitWidth * 0.83))
 #define COLLECTION_HEIGHT (320)
 
@@ -97,7 +95,7 @@
 
 @property (nonatomic, assign) BOOL isFirstLoad;
 
-@property (nonatomic, strong) HomeAlbumView *albumView;
+@property (nonatomic, strong) HomeNewAlbumView *albumView;
 @property (nonatomic, strong) NSMutableArray *albumArray;  // 热门专辑
 @property (nonatomic, strong) UICollectionView *albumCollectionView; // 专辑容器
 @property (nonatomic, assign) CGFloat albumViewHeight; // album 高度
@@ -106,22 +104,6 @@
 
 @property (nonatomic, strong) RecentCourseModel *recentCourseModel;
 
-// 热门曲目
-@property (nonatomic, strong) HomeHotMusicView *hotMusicView;
-@property (nonatomic, strong) UICollectionView *musicCollectionView; // 曲谱容器
-@property (nonatomic, assign) CGFloat hotMusicHeight; // music 高度
-
-// 推荐曲目
-@property (nonatomic, strong) HomeRecommendMusicView *recommendMusicView;
-@property (nonatomic, strong) UICollectionView *recommendMusicCollectionView; // 曲谱容器
-@property (nonatomic, strong) NSMutableArray *recommendMusicArray; // 曲谱数据
-@property (nonatomic, assign) CGFloat recommendMusicViewHeight; // music 高度
-
-// 最新曲目
-@property (nonatomic, strong) HomeNewMusicView *newestMusicView;
-@property (nonatomic, strong) UICollectionView *newestMusicCollectionView; // 曲谱容器
-@property (nonatomic, strong) NSMutableArray *newestMusicArray; // 曲谱数据
-@property (nonatomic, assign) CGFloat newestMusicViewHeight; // music 高度
 
 @property (nonatomic, strong) HomeAuthAlertView *authAlertView;
 
@@ -136,6 +118,14 @@
 // 机构名称
 @property (nonatomic, strong) HomeTenantView *tenantNameView;
 
+@property (nonatomic, strong) HomeMusicPageView *musicPageView;
+
+@property (nonatomic, assign) CGFloat musicPageViewHeight;
+
+@property (nonatomic, strong) HomeStatisticsView *statisticsView;
+
+@property (nonatomic, assign) CGFloat statisticsViewHeight;
+
 @end
 
 @implementation HomeViewController
@@ -259,8 +249,8 @@
     [self refreshButtonView];
     [self refreshCourseView:self.recentCourseModel];
     [self refreshAlbumView];
-    [self refreshMusicView];
-
+    [self refreshStatistic]; // 刷新统计
+    
     // 刷新排序
     if (self.isCheck) {
         [self checkShowAwardAlert];
@@ -275,6 +265,11 @@
     }
 }
 
+- (void)refreshStatistic {
+    if (self.statisticsView.isHidden == NO) {
+        [self.statisticsView refreshStatistic];
+    }
+}
 
 - (void)refreshTenantNameView {
     CGFloat tenantNameHeight = CGFLOAT_MIN;
@@ -532,7 +527,7 @@
 
 - (void)refreshAlbumView {
     if (self.albumArray.count) {
-        self.albumViewHeight = [HomeAlbumView getViewHeight];
+        self.albumViewHeight = [HomeNewAlbumView getViewHeight];
         self.albumView.hidden = NO;
     }
     else {
@@ -545,91 +540,6 @@
     [self.albumCollectionView reloadData];
 }
 
-- (void)requestHomeMusicMessage {
-    dispatch_group_enter(self.requestGroup);
-    [KSNetworkingManager homeAppMusicSheetRequest:KS_POST version:[USER_MANAGER getCurrentVersion] subjectIds:[NSString stringWithFormat:@"%.0f",self.mineInfo.defaultSubject] success:^(NSDictionary * _Nonnull dic) {
-        dispatch_group_leave(self.requestGroup);
-        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
-            NSDictionary *result = [dic ks_dictionaryValueForKey:@"data"];
-            NSArray *hotMusicSheet = [result ks_arrayValueForKey:@"hotMusicSheet"]; // 热门曲目
-            NSMutableArray *hotArray = [NSMutableArray array];
-            for (NSDictionary *parm in hotMusicSheet) {
-                HomeMusicModel *model = [[HomeMusicModel alloc] initWithDictionary:parm];
-                [hotArray addObject:model];
-            }
-            self.dataArray = [NSMutableArray arrayWithArray:hotArray];
-            
-            NSArray *newMusicSheet = [result ks_arrayValueForKey:@"newMusicSheet"]; // 最新曲目
-            NSMutableArray *newMusicArray = [NSMutableArray array];
-            for (NSDictionary *parm in newMusicSheet) {
-                HomeMusicModel *model = [[HomeMusicModel alloc] initWithDictionary:parm];
-                [newMusicArray addObject:model];
-            }
-            self.newestMusicArray = [NSMutableArray arrayWithArray:newMusicArray];
-            
-            NSArray *topMusicSheet = [result ks_arrayValueForKey:@"topMusicSheet"]; // 推荐曲目
-            NSMutableArray *topMusicArray = [NSMutableArray array];
-            for (NSDictionary *parm in topMusicSheet) {
-                HomeMusicModel *model = [[HomeMusicModel alloc] initWithDictionary:parm];
-                [topMusicArray addObject:model];
-            }
-            self.recommendMusicArray = [NSMutableArray arrayWithArray:topMusicArray];
-        }
-        else {
-            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
-        }
-    } faliure:^(NSError * _Nonnull error) {
-        dispatch_group_leave(self.requestGroup);
-    }];
-}
-
-
-
-
-- (void)refreshMusicView {
-    
-    if (self.recommendMusicArray.count) {
-        self.recommendMusicViewHeight = [HomeHotMusicView getViewHeight];
-        self.recommendMusicView.hidden = NO;
-    }
-    else {
-        self.recommendMusicViewHeight = CGFLOAT_MIN;
-        self.recommendMusicView.hidden = YES;
-    }
-    
-    [self.recommendMusicView mas_updateConstraints:^(MASConstraintMaker *make) {
-        make.height.mas_equalTo(self.recommendMusicViewHeight);
-    }];
-    [self.recommendMusicCollectionView reloadData];
-    
-    if (self.newestMusicArray.count) {
-        self.newestMusicViewHeight = [HomeHotMusicView getViewHeight];
-        self.newestMusicView.hidden = NO;
-    }
-    else {
-        self.newestMusicViewHeight = CGFLOAT_MIN;
-        self.newestMusicView.hidden = YES;
-    }
-    
-    [self.newestMusicView mas_updateConstraints:^(MASConstraintMaker *make) {
-        make.height.mas_equalTo(self.newestMusicViewHeight);
-    }];
-    [self.newestMusicCollectionView reloadData];
-    
-    if (self.dataArray.count) {
-        self.hotMusicHeight = [HomeHotMusicView getViewHeight];
-        self.hotMusicView.hidden = NO;
-    }
-    else {
-        self.hotMusicHeight = CGFLOAT_MIN;
-        self.hotMusicView.hidden = YES;
-    }
-    [self.hotMusicView mas_updateConstraints:^(MASConstraintMaker *make) {
-        make.height.mas_equalTo(self.hotMusicHeight);
-    }];
-    [self.musicCollectionView reloadData];
-}
-
 - (void)configUI {
     CGFloat navHeight = [HomeNavView getViewHeight];
     [self.view addSubview:self.navView];
@@ -722,38 +632,33 @@
     self.headBgView.layer.cornerRadius = 18.0f;
     self.headBgView.layer.maskedCorners = kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
     
-    [self.scrollView addSubview:self.albumView];
-    self.albumViewHeight = [HomeAlbumView getViewHeight];
-    [self.albumView mas_makeConstraints:^(MASConstraintMaker *make) {
+    // 统计
+    [self.scrollView addSubview:self.statisticsView];
+    self.statisticsViewHeight = CGFLOAT_MIN;
+    [self.statisticsView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.mas_equalTo(self.view);
         make.top.mas_equalTo(self.headBgView.mas_bottom);
-        make.height.mas_equalTo(self.albumViewHeight);
+        make.height.mas_equalTo(self.statisticsViewHeight);
     }];
+    self.statisticsView.hidden = YES;
     
-    [self.scrollView addSubview:self.recommendMusicView];
-    CGFloat recommendMusicHeadHeight = [HomeRecommendMusicView getViewHeight];
-    [self.recommendMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
+    [self.scrollView addSubview:self.albumView];
+    self.albumViewHeight = [HomeNewAlbumView getViewHeight];
+    [self.albumView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.mas_equalTo(self.view);
-        make.top.mas_equalTo(self.albumView.mas_bottom);
-        make.height.mas_equalTo(recommendMusicHeadHeight);
+        make.top.mas_equalTo(self.statisticsView.mas_bottom);
+        make.height.mas_equalTo(self.albumViewHeight);
     }];
     
-    [self.scrollView addSubview:self.newestMusicView];
-    CGFloat newMusicHeight = [HomeNewMusicView getViewHeight];
-    [self.newestMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
+    [self.scrollView addSubview:self.musicPageView];
+    self.musicPageViewHeight = [HomeMusicPageView getViewHeight];
+    [self.musicPageView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.mas_equalTo(self.view);
-        make.top.mas_equalTo(self.recommendMusicView.mas_bottom);
-        make.height.mas_equalTo(newMusicHeight);
+        make.top.mas_equalTo(self.albumView.mas_bottom);
+        make.height.mas_equalTo(self.musicPageViewHeight);
+        make.bottom.mas_equalTo(self.scrollView.mas_bottom);
     }];
     
-    [self.scrollView addSubview:self.hotMusicView];
-    CGFloat musicHeadHeight = [HomeHotMusicView getViewHeight];
-    [self.hotMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.right.mas_equalTo(self.view);
-        make.top.mas_equalTo(self.newestMusicView.mas_bottom);
-        make.height.mas_equalTo(musicHeadHeight);
-        make.bottom.mas_equalTo(self.scrollView.mas_bottom).offset(-10);
-    }];
 }
 
 
@@ -769,7 +674,6 @@
     [self requestRecentCourse];
     [self requestNotice];
     [self requestAlbumSource];
-    [self requestHomeMusicMessage];
     [self requestAwardMessage];
     
     dispatch_group_notify(self.requestGroup, dispatch_get_main_queue(), ^{
@@ -1161,72 +1065,14 @@
 }
 
 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
-    if (collectionView == self.albumCollectionView) {
-        return self.albumArray.count;
-    }
-    else if (collectionView == self.recommendMusicCollectionView) {
-        NSInteger lastRowCount = (self.recommendMusicArray.count % 4) > 0 ? 1 : 0;
-        NSInteger count = self.recommendMusicArray.count / 4 + lastRowCount;
-        return count;
-    }
-    else if (collectionView == self.newestMusicCollectionView) {
-        NSInteger lastRowCount = (self.newestMusicArray.count % 4) > 0 ? 1 : 0;
-        NSInteger count = self.newestMusicArray.count / 4 + lastRowCount;
-        return count;
-    }
-    else {
-        NSInteger lastRowCount = (self.dataArray.count % 4) > 0 ? 1 : 0;
-        NSInteger count = self.dataArray.count / 4 + lastRowCount;
-        return count;
-    }
+    return self.albumArray.count;
 }
 
 - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
-    if (collectionView == self.albumCollectionView) {
-        HomeAlbumModel *model = self.albumArray[indexPath.item];
-        HomeHotAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeHotAlbumCell" forIndexPath:indexPath];
-        [cell configWithAlbumModel:model];
-        return cell;
-    }
-    else if (collectionView == self.recommendMusicCollectionView) {
-        NSMutableArray *songArray = [NSMutableArray array];
-        NSInteger length = indexPath.item * 4 + 4 > self.recommendMusicArray.count ? self.recommendMusicArray.count - indexPath.item * 4: 4;
-        NSRange range = NSMakeRange(indexPath.item * 4, length);
-        
-        songArray = [NSMutableArray arrayWithArray:[self.recommendMusicArray subarrayWithRange:range]];
-        HomeHotMusicCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeHotMusicCollectionCell" forIndexPath:indexPath];
-        MJWeakSelf;
-        [cell configWithSourceArray:songArray callback:^(NSString * _Nonnull songId) {
-            [weakSelf displaySongDetail:songId];
-        }];
-        return cell;
-    }
-    else if (collectionView == self.newestMusicCollectionView) {
-        NSMutableArray *songArray = [NSMutableArray array];
-        NSInteger length = indexPath.item * 4 + 4 > self.newestMusicArray.count ? self.newestMusicArray.count - indexPath.item * 4: 4;
-        NSRange range = NSMakeRange(indexPath.item * 4, length);
-        
-        songArray = [NSMutableArray arrayWithArray:[self.newestMusicArray subarrayWithRange:range]];
-        HomeHotMusicCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeHotMusicCollectionCell" forIndexPath:indexPath];
-        MJWeakSelf;
-        [cell configWithSourceArray:songArray callback:^(NSString * _Nonnull songId) {
-            [weakSelf displaySongDetail:songId];
-        }];
-        return cell;
-    }
-    else {
-        NSMutableArray *songArray = [NSMutableArray array];
-        NSInteger length = indexPath.item * 4 + 4 > self.dataArray.count ? self.dataArray.count - indexPath.item * 4: 4;
-        NSRange range = NSMakeRange(indexPath.item * 4, length);
-        
-        songArray = [NSMutableArray arrayWithArray:[self.dataArray subarrayWithRange:range]];
-        HomeHotMusicCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeHotMusicCollectionCell" forIndexPath:indexPath];
-        MJWeakSelf;
-        [cell configWithSourceArray:songArray callback:^(NSString * _Nonnull songId) {
-            [weakSelf displaySongDetail:songId];
-        }];
-        return cell;
-    }
+    HomeAlbumModel *model = self.albumArray[indexPath.item];
+    HomeHotAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeHotAlbumCell" forIndexPath:indexPath];
+    [cell configWithAlbumModel:model];
+    return cell;
 }
 
 
@@ -1251,9 +1097,9 @@
 }
 
 #pragma mark ----- 专辑
-- (HomeAlbumView *)albumView {
+- (HomeNewAlbumView *)albumView {
     if (!_albumView) {
-        _albumView = [HomeAlbumView shareInstance];
+        _albumView = [HomeNewAlbumView sharedInstance];
         MJWeakSelf;
         [_albumView homeAlbumMore:^{
             [weakSelf moreAlbumDetail];
@@ -1305,169 +1151,6 @@
     [self.navigationController pushViewController:ctrl animated:YES];
 }
 
-#pragma mark --- 推荐曲目
-- (HomeRecommendMusicView *)recommendMusicView {
-    if (!_recommendMusicView) {
-        _recommendMusicView = [HomeRecommendMusicView shareInstance];
-        MJWeakSelf;
-        [_recommendMusicView homeMusicMore:^{
-            [weakSelf moreRecommendMusic];
-        }];
-        [_recommendMusicView.musicContentView addSubview:self.recommendMusicCollectionView];
-        [self.recommendMusicCollectionView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.right.bottom.top.mas_equalTo(_recommendMusicView.musicContentView);
-        }];
-    }
-    return _recommendMusicView;
-}
-
-- (UICollectionView *)recommendMusicCollectionView {
-    if (!_recommendMusicCollectionView) {
-        HomeMusicSheetLayout *layout = [[HomeMusicSheetLayout alloc] initWithSectionInset:UIEdgeInsetsMake(0, 14, 0, 14) andMiniLineSapce:10 andMiniInterItemSpace:10 andItemSize:CGSizeMake(COLLECTION_WIDTH, COLLECTION_HEIGHT)];
-
-        _recommendMusicCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
-        _recommendMusicCollectionView.backgroundColor = [UIColor clearColor];
-        _recommendMusicCollectionView.delegate = self;
-        _recommendMusicCollectionView.dataSource = self;
-        _recommendMusicCollectionView.showsVerticalScrollIndicator = NO;
-        _recommendMusicCollectionView.showsHorizontalScrollIndicator = NO;
-        _recommendMusicCollectionView.bounces = NO;
-        if (@available(iOS 11.0, *)) {
-            _recommendMusicCollectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
-        } else {
-            // Fallback on earlier versions
-            if (@available(iOS 13.0, *)) {
-                _recommendMusicCollectionView.automaticallyAdjustsScrollIndicatorInsets = NO;
-            } else {
-                // Fallback on earlier versions
-            }
-        }
-        [_recommendMusicCollectionView registerNib:[UINib nibWithNibName:@"HomeHotMusicCollectionCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"HomeHotMusicCollectionCell"];
-    }
-    return _recommendMusicCollectionView;
-}
-
-- (NSMutableArray *)recommendMusicArray {
-    if (!_recommendMusicArray) {
-        _recommendMusicArray  = [NSMutableArray array];
-    }
-    return _recommendMusicArray;
-}
-
-- (void)moreRecommendMusic {
-    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-list"];
-    [self.navigationController pushViewController:ctrl animated:YES];
-}
-
-#pragma mark ---- 最新曲目
-- (HomeNewMusicView *)newestMusicView {
-    if (!_newestMusicView) {
-        if (!_newestMusicView) {
-            _newestMusicView = [HomeNewMusicView shareInstance];
-            MJWeakSelf;
-            [_newestMusicView homeMusicMore:^{
-                [weakSelf moreNewMusic];
-            }];
-            [_newestMusicView.musicContentView addSubview:self.newestMusicCollectionView];
-            [self.newestMusicCollectionView mas_makeConstraints:^(MASConstraintMaker *make) {
-                make.left.right.bottom.top.mas_equalTo(_newestMusicView.musicContentView);
-            }];
-        }
-        return _newestMusicView;
-    }
-    return _newestMusicView;
-}
-
-- (UICollectionView *)newestMusicCollectionView {
-    if (!_newestMusicCollectionView) {
-        HomeMusicSheetLayout *layout = [[HomeMusicSheetLayout alloc] initWithSectionInset:UIEdgeInsetsMake(0, 14, 0, 14) andMiniLineSapce:10 andMiniInterItemSpace:10 andItemSize:CGSizeMake(COLLECTION_WIDTH, COLLECTION_HEIGHT)];
-
-        _newestMusicCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
-        _newestMusicCollectionView.backgroundColor = [UIColor clearColor];
-        _newestMusicCollectionView.delegate = self;
-        _newestMusicCollectionView.dataSource = self;
-        _newestMusicCollectionView.showsVerticalScrollIndicator = NO;
-        _newestMusicCollectionView.showsHorizontalScrollIndicator = NO;
-        _newestMusicCollectionView.bounces = NO;
-        if (@available(iOS 11.0, *)) {
-            _newestMusicCollectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
-        } else {
-            // Fallback on earlier versions
-            if (@available(iOS 13.0, *)) {
-                _newestMusicCollectionView.automaticallyAdjustsScrollIndicatorInsets = NO;
-            } else {
-                // Fallback on earlier versions
-            }
-        }
-        [_newestMusicCollectionView registerNib:[UINib nibWithNibName:@"HomeHotMusicCollectionCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"HomeHotMusicCollectionCell"];
-    }
-    return _newestMusicCollectionView;
-}
-
-- (NSMutableArray *)newestMusicArray {
-    if (!_newestMusicArray) {
-        _newestMusicArray = [NSMutableArray array];
-    }
-    return _newestMusicArray;
-}
-
-- (void)moreNewMusic {
-    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-list"];
-    [self.navigationController pushViewController:ctrl animated:YES];
-}
-
-
-#pragma mark ---- 更多曲目
-- (HomeHotMusicView *)hotMusicView {
-    if (!_hotMusicView) {
-        _hotMusicView = [HomeHotMusicView shareInstance];
-        MJWeakSelf;
-        [_hotMusicView homeMusicMore:^{
-            [weakSelf moreHotMusic];
-        }];
-        [_hotMusicView.musicContentView addSubview:self.musicCollectionView];
-        [self.musicCollectionView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.right.bottom.top.mas_equalTo(_hotMusicView.musicContentView);
-        }];
-    }
-    return _hotMusicView;
-}
-
-
-- (void)moreHotMusic {
-    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-list"];
-    [self.navigationController pushViewController:ctrl animated:YES];
-}
-
-- (UICollectionView *)musicCollectionView {
-    if (!_musicCollectionView) {
-        HomeMusicSheetLayout *layout = [[HomeMusicSheetLayout alloc] initWithSectionInset:UIEdgeInsetsMake(0, 14, 0, 14) andMiniLineSapce:10 andMiniInterItemSpace:10 andItemSize:CGSizeMake(COLLECTION_WIDTH, COLLECTION_HEIGHT)];
-
-        _musicCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
-        _musicCollectionView.backgroundColor = [UIColor clearColor];
-        _musicCollectionView.delegate = self;
-        _musicCollectionView.dataSource = self;
-        _musicCollectionView.showsVerticalScrollIndicator = NO;
-        _musicCollectionView.showsHorizontalScrollIndicator = NO;
-        _musicCollectionView.bounces = NO;
-        if (@available(iOS 11.0, *)) {
-            _musicCollectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
-        } else {
-            // Fallback on earlier versions
-            if (@available(iOS 13.0, *)) {
-                _musicCollectionView.automaticallyAdjustsScrollIndicatorInsets = NO;
-            } else {
-                // Fallback on earlier versions
-            }
-        }
-        [_musicCollectionView registerNib:[UINib nibWithNibName:@"HomeHotMusicCollectionCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"HomeHotMusicCollectionCell"];
-    }
-    return _musicCollectionView;
-}
-
 
 - (HomeBannerView *)bannerView {
     if (!_bannerView) {
@@ -1599,6 +1282,71 @@
     }
     return _tenantNameView;
 }
+
+- (HomeMusicPageView *)musicPageView {
+    if (!_musicPageView) {
+        _musicPageView = [HomeMusicPageView sharedInstance];
+        MJWeakSelf;
+        [_musicPageView pageActionCallback:^(HOME_MUSIC_TAG action) {
+            [weakSelf musicPageAction:action];
+        }];
+    }
+    return _musicPageView;
+}
+
+- (void)musicPageAction:(HOME_MUSIC_TAG)action {
+    NSString *pageType = @"";
+    switch (action) {
+        case HOME_MUSIC_TAG_RECOMMEND:
+        {
+            pageType = @"?type=TOP";
+        }
+            break;
+        case HOME_MUSIC_TAG_HOT:
+        {
+            pageType = @"?type=HOT";
+        }
+            break;
+        case HOME_MUSIC_TAG_NEW:
+        {
+            pageType = @"?type=NEW";
+        }
+            break;
+        case HOME_MUSIC_TAG_MORE:
+        {
+            pageType = @""; // 全部
+        }
+            break;
+        default:
+            pageType = @"";
+            break;
+    }
+    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+    ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/music-list", pageType];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+- (HomeStatisticsView *)statisticsView {
+    if (!_statisticsView) {
+        _statisticsView = [HomeStatisticsView sharedInstance];
+        _statisticsView.naviController = self.navigationController;
+        MJWeakSelf;
+        [_statisticsView configWebViewRefreshCallback:^(CGFloat viewHeight) {
+            [weakSelf refreshStatisticView:viewHeight];
+        }];
+    }
+    return _statisticsView;
+}
+
+- (void)refreshStatisticView:(CGFloat)viewHeight {
+    self.statisticsView.hidden = NO;
+    self.statisticsViewHeight = viewHeight;
+    [self.statisticsView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.headBgView.mas_bottom).offset(12);
+        make.height.mas_equalTo(self.statisticsViewHeight);
+    }];
+}
 /*
 #pragma mark - Navigation
 

+ 26 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/HomeStatistics/HomeStatisticsView.h

@@ -0,0 +1,26 @@
+//
+//  HomeStatisticsView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^RefreshViewHeightCallback)(CGFloat viewHeight);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeStatisticsView : UIView
+
+@property (nonatomic, weak) UINavigationController *naviController;
+
++ (instancetype)sharedInstance;
+
+- (void)configWebViewRefreshCallback:(RefreshViewHeightCallback)callback;
+
+- (void)refreshStatistic;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 321 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/HomeStatistics/HomeStatisticsView.m

@@ -0,0 +1,321 @@
+//
+//  HomeStatisticsView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import "HomeStatisticsView.h"
+#import <WebKit/WebKit.h>
+#import <WeakWebViewScriptMessageDelegate.h>
+#import "KSBaseWKWebViewController.h"
+#import "KSWebLoadRefreshView.h"
+#import <AuthChallengeManager.h>
+#import "UserInfoManager.h"
+
+@interface HomeStatisticsView ()<WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler,UIScrollViewDelegate>
+
+@property (nonatomic, strong) WKWebView *myWebView;
+
+@property (nonatomic, strong) NSString *url;
+
+@property (nonatomic, strong) KSWebLoadRefreshView *errorView;
+
+@property (nonatomic, copy) RefreshViewHeightCallback callback;
+@end
+
+@implementation HomeStatisticsView
+
++ (instancetype)sharedInstance {
+    HomeStatisticsView *view = [[HomeStatisticsView alloc] initWithFrame:CGRectZero];
+    view.backgroundColor = [UIColor clearColor];
+    return view;
+}
+
+
+- (void)configWebViewRefreshCallback:(RefreshViewHeightCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    _url = [NSString stringWithFormat:@"%@%@",WEBHOST,@"/#/home-statistics"];
+    [self addSubview:self.myWebView];
+    [self.myWebView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left).offset(14.0f);
+        make.right.mas_equalTo(self.mas_right).offset(-14.0f);
+        make.top.mas_equalTo(self.mas_top);
+        make.bottom.mas_equalTo(self.mas_bottom);
+    }];
+    [self loadRequest];
+}
+
+
+//  页面重现时刷新统计数据
+- (void)refreshStatistic {
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@"webViewOnResume" forKey:@"api"];
+    [self postMessage:parm];
+}
+
+- (void)configUserAgent:(WKWebViewConfiguration *)config {
+    NSString *oldUserAgent = config.applicationNameForUserAgent;
+    NSString *newAgent = [NSString stringWithFormat:@"%@ %@ %@",oldUserAgent,AGENT_NAME,AGENT_DOMAIN];
+    config.applicationNameForUserAgent = newAgent;
+}
+
+
++ (WKProcessPool*)singleWkProcessPool {
+    static WKProcessPool *sharedPool;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedPool = [[WKProcessPool alloc] init];
+    });
+    return sharedPool;
+}
+
+- (void)loadRequest {
+    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0f];
+    [self.myWebView loadRequest:request];
+}
+
+- (NSString *)url {
+    if (_url) {
+        if ([_url containsString:@"Authorization="]) {
+            NSRange range = [_url rangeOfString:@"Authorization="];
+            if (range.location != NSNotFound) {
+                _url = [_url substringToIndex:range.location-1];
+            }
+        }
+        NSString *sepectString = [_url containsString:@"?"] ? @"&" : @"?";
+        NSString *tokenStr = UserDefault(TokenKey);
+        if (![NSString isEmptyString:tokenStr]) {
+            NSString *token = [[NSString stringWithFormat:@"Authorization=%@ %@", UserDefault(Token_type), tokenStr] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
+            _url = [NSString stringWithFormat:@"%@%@%@",_url, sepectString, token];
+        }
+    }
+    return _url;
+}
+
+- (NSDictionary *)convertJsonStringToNSDictionary:(NSString *)jsonString {
+    if (jsonString == nil) {
+        return nil;
+    }
+    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
+    NSError *error;
+    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
+    if (error) {
+        NSLog(@"jsonString解析失败:%@", error);
+        return nil;
+    }
+    return json;
+}
+
+#pragma mark - WKScriptMessageHandler
+- (void)userContentController:(WKUserContentController *)userContentController
+      didReceiveScriptMessage:(WKScriptMessage *)message {
+    
+    if ([message.name isEqualToString:SCRIPT_NAME]) {
+        NSDictionary *parm = [self convertJsonStringToNSDictionary:message.body];
+        // 回到主线程
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [self handleScriptMessageSource:parm];
+        });
+    }
+}
+
+- (void)handleScriptMessageSource:(NSDictionary *)parm {
+    if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openWebView"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        
+        KSBaseWKWebViewController *detailCtrl = [[KSBaseWKWebViewController alloc] init];
+        detailCtrl.url = [valueDic ks_stringValueForKey:@"url"];
+        detailCtrl.parmDic = valueDic;
+        NSInteger orientation = [valueDic ks_integerValueForKey:@"orientation"];
+        BOOL isLandScape = orientation == 0 ? YES : NO;
+        detailCtrl.ks_landScape = isLandScape;
+        [self postMessage:parm];
+
+        [self.naviController pushViewController:detailCtrl animated:YES];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getVersion"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+        [parm setValue:@"getVersion" forKey:@"api"];
+        NSMutableDictionary *content = [NSMutableDictionary dictionary];
+        [content setValue:[USER_MANAGER getCurrentVersion] forKey:@"version"];
+        [content setValue:[valueDic ks_stringValueForKey:@"uuid"] forKey:@"uuid"];
+        [sendParm setValue:content forKey:@"content"];
+        [self postMessage:sendParm];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getToken"]) {
+        NSMutableDictionary *valueDic = [NSMutableDictionary dictionaryWithDictionary:[parm ks_dictionaryValueForKey:@"content"]];
+        [valueDic setValue:UserDefault(Token_type) forKey:@"tokenType"];
+        [valueDic setValue:UserDefault(TokenKey) forKey:@"accessToken"];
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
+        [sendParm setValue:valueDic forKey:@"content"];
+        [self postMessage:sendParm];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"homeStatisticsHeight"]) { // 高度
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        CGFloat height = [valueDic ks_intValueForKey:@"height"];
+        if (self.callback) {
+            self.callback(height);
+        }
+    }
+}
+
+
+#pragma mark ----- lazying
+- (WKWebView *)myWebView {
+    if (!_myWebView) {
+        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
+        config.selectionGranularity = WKSelectionGranularityDynamic;
+        config.allowsInlineMediaPlayback = YES;
+        config.mediaTypesRequiringUserActionForPlayback = NO;
+        config.processPool = [HomeStatisticsView singleWkProcessPool];
+        config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
+        [self configUserAgent:config];
+        
+        //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
+        WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
+        //这个类主要用来做native与JavaScript的交互管理
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:SCRIPT_NAME];
+        config.userContentController = wkUController;
+        
+        WKPreferences *preferences = [WKPreferences new];
+        // 是否支出javaScript
+        preferences.javaScriptEnabled = YES;
+        //不通过用户交互,是否可以打开窗口
+        preferences.javaScriptCanOpenWindowsAutomatically = YES;
+        config.preferences = preferences;
+        _myWebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
+        _myWebView.backgroundColor = [UIColor clearColor];
+        _myWebView.UIDelegate = self;
+        _myWebView.navigationDelegate = self;
+        _myWebView.scrollView.bounces = NO;
+        _myWebView.scrollView.opaque = NO;
+        _myWebView.scrollView.alwaysBounceVertical = NO;
+        _myWebView.scrollView.alwaysBounceHorizontal = NO;
+        _myWebView.scrollView.showsVerticalScrollIndicator = NO;
+        _myWebView.scrollView.showsHorizontalScrollIndicator = NO;
+        _myWebView.scrollView.delegate = self;
+        _myWebView.scrollView.scrollEnabled = NO;
+    }
+    return _myWebView;
+}
+
+- (void)postMessage:(NSDictionary *)parm {
+    if (_myWebView) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            NSString *jsString = [parm mj_JSONString];
+            [self.myWebView evaluateJavaScript:[NSString stringWithFormat:@"postMessage(%@,'*')", jsString] completionHandler:nil];
+        });
+    }
+}
+
+
+
+- (void)dealloc {
+    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:SCRIPT_NAME];
+    [_myWebView loadHTMLString:@"" baseURL:nil];
+    [_myWebView removeFromSuperview];
+    _myWebView = nil;
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
+    [self showErrorView];
+}
+
+- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *_Nullable))completionHandler
+{
+    dispatch_queue_t queue =  dispatch_queue_create("webViewChallengeQueue", NULL);
+    dispatch_async(queue, ^{
+        if (SSL_AUTH) {
+
+            NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
+            NSURLCredential *customCredential = nil;
+            
+            if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
+                // 默认信任
+                customCredential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
+                disposition = NSURLSessionAuthChallengeUseCredential;
+            }
+            else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate]) {
+                // client authentication
+                SecIdentityRef identity = NULL;
+                SecTrustRef trust = NULL;
+                if ([AuthChallengeManager extractIdentity:&identity andTrust:&trust filePath:CERT_PATH]) {
+                    SecCertificateRef certificate = NULL;
+                    SecIdentityCopyCertificate(identity, &certificate);
+                    const void*certs[] = {certificate};
+                    CFArrayRef certArray =CFArrayCreate(kCFAllocatorDefault, certs,1,NULL);
+                    customCredential =[NSURLCredential credentialWithIdentity:identity certificates:(__bridge  NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];
+                    disposition = NSURLSessionAuthChallengeUseCredential;
+                    // 释放 CFArrayRef 和 SecCertificateRef
+                    CFRelease(certArray);
+                    CFRelease(certificate);
+                }
+            }
+            
+            if (completionHandler) {
+                completionHandler(disposition, customCredential);
+            }
+        }
+        else {
+            if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
+                if (challenge.previousFailureCount == 0) {
+                    NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
+                    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
+                } else {
+                    completionHandler(NSURLSessionAuthChallengeUseCredential, nil);
+                }
+            } else {
+                completionHandler(NSURLSessionAuthChallengeUseCredential, nil);
+            }
+        }
+    });
+}
+
+- (KSWebLoadRefreshView *)errorView {
+    if (!_errorView) {
+        _errorView = [KSWebLoadRefreshView shareInstance];
+        _errorView.hideBackButton = YES;
+        MJWeakSelf;
+        [_errorView failViewActionCallback:^(BOOL isBack) {
+            [weakSelf hideErrorView];
+            if (isBack) {
+                
+            }
+            else {
+                [weakSelf loadRequest];
+            }
+        }];
+    }
+    return _errorView;
+}
+
+- (void)showErrorView {
+    if (![self.subviews containsObject:self.errorView]) {
+        [self addSubview:self.errorView];
+        [self.errorView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.top.bottom.mas_equalTo(self);
+        }];
+        [self bringSubviewToFront:self.errorView];
+    }
+}
+
+- (void)hideErrorView {
+    if ([self.subviews containsObject:self.errorView]) {
+        [self.errorView removeFromSuperview];
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHotAlbumCell.xib

@@ -30,7 +30,7 @@
                         </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="1bh-Zm-ov0">
-                        <rect key="frame" x="3" y="114" width="94" height="20"/>
+                        <rect key="frame" x="3" y="112" width="94" height="20"/>
                         <constraints>
                             <constraint firstAttribute="height" constant="20" id="s4H-Kv-zgp"/>
                         </constraints>
@@ -93,7 +93,7 @@
             </view>
             <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
             <constraints>
-                <constraint firstItem="1bh-Zm-ov0" firstAttribute="top" secondItem="mkp-8k-Rld" secondAttribute="bottom" constant="10" id="8Ah-sJ-mEm"/>
+                <constraint firstItem="1bh-Zm-ov0" firstAttribute="top" secondItem="mkp-8k-Rld" secondAttribute="bottom" constant="8" id="8Ah-sJ-mEm"/>
                 <constraint firstItem="mkp-8k-Rld" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="Oca-f5-sam"/>
                 <constraint firstItem="mkp-8k-Rld" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="10" id="XeE-bJ-DC9"/>
                 <constraint firstItem="E1s-oA-ark" firstAttribute="top" secondItem="mkp-8k-Rld" secondAttribute="top" id="fSg-j4-d7O"/>

+ 31 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.h

@@ -0,0 +1,31 @@
+//
+//  HomeMusicPageView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, HOME_MUSIC_TAG) {
+    HOME_MUSIC_TAG_RECOMMEND, // 推介
+    HOME_MUSIC_TAG_HOT,       // 热门
+    HOME_MUSIC_TAG_NEW,       // 最新
+    HOME_MUSIC_TAG_MORE,      // 更多
+};
+
+typedef void(^HomeMusicPageViewCallback)(HOME_MUSIC_TAG action);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeMusicPageView : UIView
+
++ (instancetype)sharedInstance;
+
+- (void)pageActionCallback:(HomeMusicPageViewCallback)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 71 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.m

@@ -0,0 +1,71 @@
+//
+//  HomeMusicPageView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import "HomeMusicPageView.h"
+
+@interface HomeMusicPageView ()
+
+@property (nonatomic, copy) HomeMusicPageViewCallback callback;
+
+@end
+
+@implementation HomeMusicPageView
+
+
++ (instancetype)sharedInstance {
+    HomeMusicPageView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeMusicPageView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)pageActionCallback:(HomeMusicPageViewCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+// 更多
+- (IBAction)moreMusic:(id)sender {
+    if (self.callback) {
+        self.callback(HOME_MUSIC_TAG_MORE);
+    }
+}
+// 推荐
+- (IBAction)recommendMusic:(id)sender {
+    if (self.callback) {
+        self.callback(HOME_MUSIC_TAG_RECOMMEND);
+    }
+}
+
+// 热门
+- (IBAction)hotMusic:(id)sender {
+    if (self.callback) {
+        self.callback(HOME_MUSIC_TAG_HOT);
+    }
+}
+
+- (IBAction)newMusic:(id)sender {
+    if (self.callback) {
+        self.callback(HOME_MUSIC_TAG_NEW);
+    }
+}
+
+
++ (CGFloat)getViewHeight {
+    CGFloat imageWidth = (KPortraitWidth - 14 * 2 - 12 * 2 - 10 * 2) / 3.0f;
+    CGFloat imageHeight = imageWidth / 101.0f * 92.0f;
+    return 80 + imageHeight;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 204 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeMusicPageView/HomeMusicPageView.xib

@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeMusicPageView">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="172"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZPo-SV-HeG">
+                    <rect key="frame" x="14" y="12" width="347" height="148"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Y5r-ts-DoX">
+                            <rect key="frame" x="290" y="13" width="45" height="18"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="更多" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1hk-0n-5Y5">
+                                    <rect key="frame" x="6" y="1.6666666666666679" width="24" height="15"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                    <color key="textColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_more_green" translatesAutoresizingMaskIntoConstraints="NO" id="DEv-sd-PP4">
+                                    <rect key="frame" x="34" y="5" width="6" height="8"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="8" id="0hE-Zk-eeX"/>
+                                        <constraint firstAttribute="width" constant="6" id="vuN-XZ-xWe"/>
+                                    </constraints>
+                                </imageView>
+                            </subviews>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="1hk-0n-5Y5" firstAttribute="centerY" secondItem="Y5r-ts-DoX" secondAttribute="centerY" id="3QF-n3-l3i"/>
+                                <constraint firstAttribute="width" constant="45" id="BdX-wa-BdI"/>
+                                <constraint firstAttribute="trailing" secondItem="DEv-sd-PP4" secondAttribute="trailing" constant="5" id="FON-d3-YTL"/>
+                                <constraint firstAttribute="height" constant="18" id="awh-4r-ml1"/>
+                                <constraint firstItem="DEv-sd-PP4" firstAttribute="centerY" secondItem="Y5r-ts-DoX" secondAttribute="centerY" id="sYt-Ge-Iz6"/>
+                                <constraint firstItem="1hk-0n-5Y5" firstAttribute="leading" secondItem="Y5r-ts-DoX" secondAttribute="leading" constant="6" id="zdO-W7-Cyz"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="9"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0QL-gB-Zjx">
+                            <rect key="frame" x="290" y="7" width="45" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="30" id="Wfu-nR-rKi"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="moreMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="fki-pb-0Q9"/>
+                            </connections>
+                        </button>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_music_icon" translatesAutoresizingMaskIntoConstraints="NO" id="nbK-4M-Pq7">
+                            <rect key="frame" x="12" y="13" width="18" height="18"/>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ATh-Pl-TWm">
+                            <rect key="frame" x="36" y="12" width="30" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="rrL-Mh-nw9"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="biR-35-QOg">
+                            <rect key="frame" x="12" y="44" width="101" height="92"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_recommend_music" translatesAutoresizingMaskIntoConstraints="NO" id="FxH-IH-4qd">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                </imageView>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cJb-QJ-rt1">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="recommendMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="S0C-lF-paP"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="bottom" secondItem="cJb-QJ-rt1" secondAttribute="bottom" id="4FF-3l-H3w"/>
+                                <constraint firstItem="cJb-QJ-rt1" firstAttribute="leading" secondItem="biR-35-QOg" secondAttribute="leading" id="LH3-SF-Prv"/>
+                                <constraint firstItem="FxH-IH-4qd" firstAttribute="top" secondItem="biR-35-QOg" secondAttribute="top" id="Pr2-fS-9rf"/>
+                                <constraint firstAttribute="trailing" secondItem="FxH-IH-4qd" secondAttribute="trailing" id="STk-1K-UE5"/>
+                                <constraint firstItem="FxH-IH-4qd" firstAttribute="leading" secondItem="biR-35-QOg" secondAttribute="leading" id="bf0-qJ-cau"/>
+                                <constraint firstItem="cJb-QJ-rt1" firstAttribute="top" secondItem="biR-35-QOg" secondAttribute="top" id="fvR-14-e7s"/>
+                                <constraint firstAttribute="width" secondItem="biR-35-QOg" secondAttribute="height" multiplier="101:92" id="m1C-qf-M5D"/>
+                                <constraint firstAttribute="trailing" secondItem="cJb-QJ-rt1" secondAttribute="trailing" id="xbn-F3-cuQ"/>
+                                <constraint firstAttribute="bottom" secondItem="FxH-IH-4qd" secondAttribute="bottom" id="zlb-UD-Kps"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aKe-lV-Gxm">
+                            <rect key="frame" x="123" y="44" width="101" height="92"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_hot_music" translatesAutoresizingMaskIntoConstraints="NO" id="fhQ-N6-QVv">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                </imageView>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NgJ-z9-vXs">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="hotMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="Dui-Mo-Ous"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="NgJ-z9-vXs" secondAttribute="trailing" id="EeK-X5-crA"/>
+                                <constraint firstAttribute="width" secondItem="aKe-lV-Gxm" secondAttribute="height" multiplier="101:92" id="Hxn-yJ-JUp"/>
+                                <constraint firstAttribute="trailing" secondItem="fhQ-N6-QVv" secondAttribute="trailing" id="I67-HH-Wmm"/>
+                                <constraint firstItem="NgJ-z9-vXs" firstAttribute="top" secondItem="aKe-lV-Gxm" secondAttribute="top" id="KVB-mA-y1d"/>
+                                <constraint firstAttribute="bottom" secondItem="NgJ-z9-vXs" secondAttribute="bottom" id="LKX-0b-Ar8"/>
+                                <constraint firstItem="fhQ-N6-QVv" firstAttribute="leading" secondItem="aKe-lV-Gxm" secondAttribute="leading" id="Rzb-J3-heH"/>
+                                <constraint firstItem="NgJ-z9-vXs" firstAttribute="leading" secondItem="aKe-lV-Gxm" secondAttribute="leading" id="U2N-hL-mEK"/>
+                                <constraint firstItem="fhQ-N6-QVv" firstAttribute="top" secondItem="aKe-lV-Gxm" secondAttribute="top" id="qWD-Jk-e8m"/>
+                                <constraint firstAttribute="bottom" secondItem="fhQ-N6-QVv" secondAttribute="bottom" id="rtI-Tb-8oY"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jKd-mQ-8sh">
+                            <rect key="frame" x="234" y="44" width="101" height="92"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_newest_music" translatesAutoresizingMaskIntoConstraints="NO" id="Hom-x6-dld">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                </imageView>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4o4-S4-qi3">
+                                    <rect key="frame" x="0.0" y="0.0" width="101" height="92"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="newMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="EAb-R8-uUQ"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="width" secondItem="jKd-mQ-8sh" secondAttribute="height" multiplier="101:92" id="AJD-jL-7xh"/>
+                                <constraint firstItem="4o4-S4-qi3" firstAttribute="leading" secondItem="jKd-mQ-8sh" secondAttribute="leading" id="H5T-FT-U3H"/>
+                                <constraint firstItem="4o4-S4-qi3" firstAttribute="top" secondItem="jKd-mQ-8sh" secondAttribute="top" id="JuA-bg-vsj"/>
+                                <constraint firstAttribute="bottom" secondItem="Hom-x6-dld" secondAttribute="bottom" id="U1H-IQ-zDz"/>
+                                <constraint firstAttribute="bottom" secondItem="4o4-S4-qi3" secondAttribute="bottom" id="cNj-N8-oxw"/>
+                                <constraint firstAttribute="trailing" secondItem="Hom-x6-dld" secondAttribute="trailing" id="dAA-yu-6j1"/>
+                                <constraint firstItem="Hom-x6-dld" firstAttribute="leading" secondItem="jKd-mQ-8sh" secondAttribute="leading" id="qak-qJ-lBb"/>
+                                <constraint firstAttribute="trailing" secondItem="4o4-S4-qi3" secondAttribute="trailing" id="weW-h1-7QW"/>
+                                <constraint firstItem="Hom-x6-dld" firstAttribute="top" secondItem="jKd-mQ-8sh" secondAttribute="top" id="y5i-Xk-YeN"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="aKe-lV-Gxm" firstAttribute="width" secondItem="biR-35-QOg" secondAttribute="width" id="0Ml-AM-z03"/>
+                        <constraint firstItem="Y5r-ts-DoX" firstAttribute="centerY" secondItem="ATh-Pl-TWm" secondAttribute="centerY" id="KJS-B9-0GQ"/>
+                        <constraint firstItem="ATh-Pl-TWm" firstAttribute="top" secondItem="ZPo-SV-HeG" secondAttribute="top" constant="12" id="Kqq-9T-bjt"/>
+                        <constraint firstItem="jKd-mQ-8sh" firstAttribute="leading" secondItem="aKe-lV-Gxm" secondAttribute="trailing" constant="10" id="Q57-J8-VgU"/>
+                        <constraint firstItem="nbK-4M-Pq7" firstAttribute="leading" secondItem="ZPo-SV-HeG" secondAttribute="leading" constant="12" id="QxC-xY-L3y"/>
+                        <constraint firstItem="Y5r-ts-DoX" firstAttribute="centerY" secondItem="0QL-gB-Zjx" secondAttribute="centerY" id="REZ-6g-O9B"/>
+                        <constraint firstItem="biR-35-QOg" firstAttribute="leading" secondItem="ZPo-SV-HeG" secondAttribute="leading" constant="12" id="Run-1w-eLP"/>
+                        <constraint firstItem="jKd-mQ-8sh" firstAttribute="width" secondItem="biR-35-QOg" secondAttribute="width" id="SU7-HB-i1r"/>
+                        <constraint firstAttribute="trailing" secondItem="jKd-mQ-8sh" secondAttribute="trailing" constant="12" id="Tj6-yw-gDL"/>
+                        <constraint firstItem="Y5r-ts-DoX" firstAttribute="leading" secondItem="0QL-gB-Zjx" secondAttribute="leading" id="U3D-lf-SD3"/>
+                        <constraint firstItem="jKd-mQ-8sh" firstAttribute="bottom" secondItem="biR-35-QOg" secondAttribute="bottom" id="XlD-Wn-pzh"/>
+                        <constraint firstAttribute="bottom" secondItem="biR-35-QOg" secondAttribute="bottom" constant="12" id="YwG-AL-nz4"/>
+                        <constraint firstAttribute="trailing" secondItem="Y5r-ts-DoX" secondAttribute="trailing" constant="12" id="cIT-RS-MW0"/>
+                        <constraint firstItem="ATh-Pl-TWm" firstAttribute="centerY" secondItem="nbK-4M-Pq7" secondAttribute="centerY" id="cdu-MC-mKR"/>
+                        <constraint firstItem="ATh-Pl-TWm" firstAttribute="leading" secondItem="nbK-4M-Pq7" secondAttribute="trailing" constant="6" id="fmK-sM-Gol"/>
+                        <constraint firstItem="biR-35-QOg" firstAttribute="top" secondItem="ATh-Pl-TWm" secondAttribute="bottom" constant="12" id="gCX-NM-Sc2"/>
+                        <constraint firstItem="aKe-lV-Gxm" firstAttribute="leading" secondItem="biR-35-QOg" secondAttribute="trailing" constant="10" id="njC-Tu-gZ8"/>
+                        <constraint firstItem="aKe-lV-Gxm" firstAttribute="bottom" secondItem="biR-35-QOg" secondAttribute="bottom" id="pf3-Jv-WnY"/>
+                        <constraint firstItem="Y5r-ts-DoX" firstAttribute="trailing" secondItem="0QL-gB-Zjx" secondAttribute="trailing" id="uiw-yb-xaM"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="ZPo-SV-HeG" secondAttribute="bottom" constant="12" id="9uM-4W-RwS"/>
+                <constraint firstAttribute="trailing" secondItem="ZPo-SV-HeG" secondAttribute="trailing" constant="14" id="A3w-We-WgU"/>
+                <constraint firstItem="ZPo-SV-HeG" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="Xxa-ww-q2o"/>
+                <constraint firstItem="ZPo-SV-HeG" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="e9s-OZ-GpR"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="132.06106870229007" y="73.239436619718319"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="home_hot_music" width="101" height="92"/>
+        <image name="home_more_green" width="5" height="8"/>
+        <image name="home_music_icon" width="18" height="18"/>
+        <image name="home_newest_music" width="101" height="92"/>
+        <image name="home_recommend_music" width="101" height="92"/>
+    </resources>
+</document>

+ 27 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.h

@@ -0,0 +1,27 @@
+//
+//  HomeNewAlbumView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^HomeNewAlbumMoreBlock)(void);
+
+
+@interface HomeNewAlbumView : UIView
+
+@property (weak, nonatomic) IBOutlet UIView *albumContentView;
+
++ (instancetype)sharedInstance;
+
+- (void)homeAlbumMore:(HomeNewAlbumMoreBlock)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 48 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.m

@@ -0,0 +1,48 @@
+//
+//  HomeNewAlbumView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/12/26.
+//
+
+#import "HomeNewAlbumView.h"
+
+@interface HomeNewAlbumView ()
+
+@property (nonatomic, copy) HomeNewAlbumMoreBlock callback;
+
+
+@end
+
+@implementation HomeNewAlbumView
+
++ (instancetype)sharedInstance {
+    HomeNewAlbumView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeNewAlbumView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)homeAlbumMore:(HomeNewAlbumMoreBlock)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    
+}
+
+- (IBAction)moreAlbum:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
++ (CGFloat)getViewHeight {
+    return 198.0f;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 128 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNewAlbum/HomeNewAlbumView.xib

@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeNewAlbumView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="198"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="z5G-Gl-4c5">
+                    <rect key="frame" x="14" y="12" width="365" height="186"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_album_icon" translatesAutoresizingMaskIntoConstraints="NO" id="OU7-PR-K5u">
+                            <rect key="frame" x="12" y="13" width="18" height="18"/>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="热门专辑" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2LP-nl-mK2">
+                            <rect key="frame" x="36" y="12" width="60" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="igJ-uR-lBF"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jNd-L1-cJI">
+                            <rect key="frame" x="308" y="13" width="45" height="18"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="更多" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lYe-vQ-tRQ">
+                                    <rect key="frame" x="6" y="1.6666666666666679" width="24" height="15"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                    <color key="textColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_more_green" translatesAutoresizingMaskIntoConstraints="NO" id="V1h-0u-u1u">
+                                    <rect key="frame" x="34" y="5" width="6" height="8"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="6" id="hd7-zQ-I3v"/>
+                                        <constraint firstAttribute="height" constant="8" id="tFH-i4-F7h"/>
+                                    </constraints>
+                                </imageView>
+                            </subviews>
+                            <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="V1h-0u-u1u" firstAttribute="centerY" secondItem="jNd-L1-cJI" secondAttribute="centerY" id="1aT-B8-SAQ"/>
+                                <constraint firstAttribute="width" constant="45" id="BWo-A6-9D0"/>
+                                <constraint firstAttribute="height" constant="18" id="HrV-YU-dNj"/>
+                                <constraint firstItem="lYe-vQ-tRQ" firstAttribute="leading" secondItem="jNd-L1-cJI" secondAttribute="leading" constant="6" id="beg-VB-59T"/>
+                                <constraint firstAttribute="trailing" secondItem="V1h-0u-u1u" secondAttribute="trailing" constant="5" id="eYr-eG-HKw"/>
+                                <constraint firstItem="lYe-vQ-tRQ" firstAttribute="centerY" secondItem="jNd-L1-cJI" secondAttribute="centerY" id="svd-PQ-RQg"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="9"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yQq-3q-xwT">
+                            <rect key="frame" x="308" y="7" width="45" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="30" id="NRc-5s-nbC"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="moreAlbum:" destination="iN0-l3-epB" eventType="touchUpInside" id="G6u-op-kRJ"/>
+                            </connections>
+                        </button>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="x64-uM-YiP">
+                            <rect key="frame" x="0.0" y="42" width="365" height="134"/>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="134" id="6hD-4P-ZyT"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="OU7-PR-K5u" firstAttribute="leading" secondItem="z5G-Gl-4c5" secondAttribute="leading" constant="12" id="7hP-Ha-cpZ"/>
+                        <constraint firstItem="x64-uM-YiP" firstAttribute="top" secondItem="2LP-nl-mK2" secondAttribute="bottom" constant="10" id="MY1-e5-Wml"/>
+                        <constraint firstItem="jNd-L1-cJI" firstAttribute="centerY" secondItem="2LP-nl-mK2" secondAttribute="centerY" id="QoY-hu-4wO"/>
+                        <constraint firstItem="jNd-L1-cJI" firstAttribute="leading" secondItem="yQq-3q-xwT" secondAttribute="leading" id="QqA-Oe-ZCE"/>
+                        <constraint firstAttribute="trailing" secondItem="jNd-L1-cJI" secondAttribute="trailing" constant="12" id="QtC-HC-YdS"/>
+                        <constraint firstItem="2LP-nl-mK2" firstAttribute="centerY" secondItem="OU7-PR-K5u" secondAttribute="centerY" id="Vda-0C-ufH"/>
+                        <constraint firstItem="x64-uM-YiP" firstAttribute="leading" secondItem="z5G-Gl-4c5" secondAttribute="leading" id="dHL-1w-jES"/>
+                        <constraint firstAttribute="bottom" secondItem="x64-uM-YiP" secondAttribute="bottom" constant="10" id="iK3-eA-Taw"/>
+                        <constraint firstAttribute="trailing" secondItem="x64-uM-YiP" secondAttribute="trailing" id="jKv-Bk-Y0H"/>
+                        <constraint firstItem="2LP-nl-mK2" firstAttribute="top" secondItem="z5G-Gl-4c5" secondAttribute="top" constant="12" id="jVi-PP-qqs"/>
+                        <constraint firstItem="jNd-L1-cJI" firstAttribute="centerY" secondItem="yQq-3q-xwT" secondAttribute="centerY" id="t9h-5i-ns0"/>
+                        <constraint firstItem="2LP-nl-mK2" firstAttribute="leading" secondItem="OU7-PR-K5u" secondAttribute="trailing" constant="6" id="wJO-mp-RZt"/>
+                        <constraint firstItem="jNd-L1-cJI" firstAttribute="trailing" secondItem="yQq-3q-xwT" secondAttribute="trailing" id="x15-7n-gya"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="z5G-Gl-4c5" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="QXO-be-HV3"/>
+                <constraint firstItem="z5G-Gl-4c5" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="Tql-7c-rWP"/>
+                <constraint firstAttribute="bottom" secondItem="z5G-Gl-4c5" secondAttribute="bottom" id="u5u-XB-985"/>
+                <constraint firstAttribute="trailing" secondItem="z5G-Gl-4c5" secondAttribute="trailing" constant="14" id="zl9-3V-2BP"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="albumContentView" destination="x64-uM-YiP" id="LPB-oc-laG"/>
+            </connections>
+            <point key="canvasLocation" x="41.984732824427482" y="100"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="home_album_icon" width="18" height="18"/>
+        <image name="home_more_green" width="5" height="8"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

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

@@ -126,8 +126,12 @@
 - (void)loadSourceSuccess:(NSArray *)sourceArray {
     self.tableDelegate.dataArray = sourceArray;
     [self.tableView reloadData];
+    [self changePromptLabelState];
 }
 
+- (void)refreshEmptyString:(NSString *)emptyString emptyImageName:(NSString *)emptyImageName {
+    [self setPromptString:emptyString imageName:emptyImageName inView:self.tableView];
+}
 
 #pragma mark -- setter
 

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/ViewModel/CoursewareViewModel.h

@@ -13,6 +13,8 @@
 
 - (void)loadSourceSuccess:(NSArray *_Nonnull)sourceArray;
 
+- (void)refreshEmptyString:(NSString *_Nonnull)emptyString emptyImageName:(NSString *_Nonnull)emptyImageName;
+
 @end
 
 NS_ASSUME_NONNULL_BEGIN

+ 36 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Courseware/ViewModel/CoursewareViewModel.m

@@ -7,6 +7,7 @@
 
 #import "CoursewareViewModel.h"
 #import "CoursewareListModel.h"
+#import "Reachability.h"
 
 @interface CoursewareViewModel ()
 
@@ -24,6 +25,9 @@
     self.rows = 10;
     self.isLoadMore = YES;
     self.sourceArray = [NSMutableArray array];
+    if (self.delegate && [self.delegate respondsToSelector:@selector(refreshEmptyString:emptyImageName:)]) {
+        [self.delegate refreshEmptyString:@"暂无内容" emptyImageName:@"wd_img_zwsj"];
+    }
 }
 
 - (void)refreshAndRequest {
@@ -59,6 +63,14 @@
     } faliure:^(NSError * _Nonnull error) {
         [LOADING_MANAGER removeCustomLoading];
         [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            self.sourceArray = [NSMutableArray array];
+            NSArray *array = [self.sourceArray copy];
+            if (self.delegate && [self.delegate respondsToSelector:@selector(refreshEmptyString:emptyImageName:)]) {
+                [self.delegate refreshEmptyString:@"暂无网络" emptyImageName:@"no_networking"];
+            }
+            [self.delegate loadSourceSuccess:array];
+        }
     }];
     
     
@@ -142,4 +154,28 @@
     }
     return _sourceArray;
 }
+
+- (BOOL)networkAvaiable {
+    return [self checkNetworkAvaiable];
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
 @end