Steven 2 роки тому
батько
коміт
6fd1c29c85
27 змінених файлів з 1092 додано та 622 видалено
  1. 42 38
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. BIN
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate
  3. 2 2
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  4. 4 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Controller/KSChatUserDetailViewController.m
  5. 4 0
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Model/ChatUserInfo/ChatUserInfo.m
  6. 4 0
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Model/ChatUserInfo/RecentPracticeModel.m
  7. 243 12
      KulexiuForStudent/KulexiuForStudent/Module/Home/Controller/HomeViewController.m
  8. 70 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeMusicModel.h
  9. 449 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeMusicModel.m
  10. 4 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeTeacherLiveModel.m
  11. 5 6
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.h
  12. 9 9
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.m
  13. 49 49
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.xib
  14. 26 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.h
  15. 48 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.m
  16. 111 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.xib
  17. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicCellView.h
  18. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicCellView.m
  19. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicView.m
  20. 5 7
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicView.xib
  21. 0 23
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.h
  22. 0 166
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.m
  23. 0 154
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.xib
  24. 0 19
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.h
  25. 0 62
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.m
  26. 0 57
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.xib
  27. 12 12
      KulexiuForStudent/KulexiuForStudent/Module/Live/Controller/LiveVideoRoomViewController.m

+ 42 - 38
KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj

@@ -425,6 +425,11 @@
 		BC12636728FEA01F00509E90 /* RecentPracticeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC12636628FEA01F00509E90 /* RecentPracticeModel.m */; };
 		BC12636D28FEA20100509E90 /* RecentMusicView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC12636C28FEA20100509E90 /* RecentMusicView.m */; };
 		BC12636F28FEA20800509E90 /* RecentMusicView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC12636E28FEA20800509E90 /* RecentMusicView.xib */; };
+		BC12639528FF8D2300509E90 /* HomeMusicModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC12639428FF8D2300509E90 /* HomeMusicModel.m */; };
+		BC12639828FF8E0F00509E90 /* HomeNewMusicView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC12639728FF8E0F00509E90 /* HomeNewMusicView.m */; };
+		BC12639A28FF8E1700509E90 /* HomeNewMusicView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC12639928FF8E1700509E90 /* HomeNewMusicView.xib */; };
+		BC12639D28FF8E6D00509E90 /* HomeRecommendMusicView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC12639C28FF8E6D00509E90 /* HomeRecommendMusicView.m */; };
+		BC12639F28FF8E7400509E90 /* HomeRecommendMusicView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC12639E28FF8E7400509E90 /* HomeRecommendMusicView.xib */; };
 		BC27A06E280FF56C00F91E27 /* AccompanyEvaluateCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC27A06A280FF56B00F91E27 /* AccompanyEvaluateCell.xib */; };
 		BC27A06F280FF56C00F91E27 /* AccompanyStudentEvaCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27A06B280FF56C00F91E27 /* AccompanyStudentEvaCell.m */; };
 		BC27A070280FF56C00F91E27 /* AccompanyStudentEvaCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC27A06C280FF56C00F91E27 /* AccompanyStudentEvaCell.xib */; };
@@ -460,12 +465,6 @@
 		BC494A8028696BC300CCD343 /* MusicRoomListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC494A7F28696BC300CCD343 /* MusicRoomListModel.m */; };
 		BC49BAEC28D98C500031FF06 /* KSMetronomePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BC49BAEB28D98C500031FF06 /* KSMetronomePlayer.m */; };
 		BC4CC417288FD689004AD8EC /* LaunchAnimationView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CC416288FD689004AD8EC /* LaunchAnimationView.m */; };
-		BC4CF26A28D025E200961C61 /* HomeQualityMusic.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CF26928D025E200961C61 /* HomeQualityMusic.m */; };
-		BC4CF26C28D025EA00961C61 /* HomeQualityMusic.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4CF26B28D025EA00961C61 /* HomeQualityMusic.xib */; };
-		BC4CF27028D0283300961C61 /* HomeQualityMusicCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CF26E28D0283300961C61 /* HomeQualityMusicCollectionCell.m */; };
-		BC4CF27128D0283300961C61 /* HomeQualityMusicCollectionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4CF26F28D0283300961C61 /* HomeQualityMusicCollectionCell.xib */; };
-		BC4CF27428D0285400961C61 /* HomeQualityMusicCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CF27328D0285400961C61 /* HomeQualityMusicCellView.m */; };
-		BC4CF27628D0285A00961C61 /* HomeQualityMusicCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4CF27528D0285A00961C61 /* HomeQualityMusicCellView.xib */; };
 		BC4CF28E28D072C000961C61 /* WidgetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CF28D28D072C000961C61 /* WidgetViewController.m */; };
 		BC4CF29128D072EF00961C61 /* WidgetNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4CF29028D072EF00961C61 /* WidgetNavView.m */; };
 		BC4CF29328D072F600961C61 /* WidgetNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4CF29228D072F600961C61 /* WidgetNavView.xib */; };
@@ -1749,6 +1748,14 @@
 		BC12636B28FEA20100509E90 /* RecentMusicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecentMusicView.h; sourceTree = "<group>"; };
 		BC12636C28FEA20100509E90 /* RecentMusicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecentMusicView.m; sourceTree = "<group>"; };
 		BC12636E28FEA20800509E90 /* RecentMusicView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecentMusicView.xib; sourceTree = "<group>"; };
+		BC12639328FF8D2200509E90 /* HomeMusicModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeMusicModel.h; sourceTree = "<group>"; };
+		BC12639428FF8D2300509E90 /* HomeMusicModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeMusicModel.m; sourceTree = "<group>"; };
+		BC12639628FF8E0F00509E90 /* HomeNewMusicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeNewMusicView.h; sourceTree = "<group>"; };
+		BC12639728FF8E0F00509E90 /* HomeNewMusicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeNewMusicView.m; sourceTree = "<group>"; };
+		BC12639928FF8E1700509E90 /* HomeNewMusicView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeNewMusicView.xib; sourceTree = "<group>"; };
+		BC12639B28FF8E6D00509E90 /* HomeRecommendMusicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeRecommendMusicView.h; sourceTree = "<group>"; };
+		BC12639C28FF8E6D00509E90 /* HomeRecommendMusicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeRecommendMusicView.m; sourceTree = "<group>"; };
+		BC12639E28FF8E7400509E90 /* HomeRecommendMusicView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeRecommendMusicView.xib; sourceTree = "<group>"; };
 		BC27A068280FF56B00F91E27 /* AccompanyEvaluateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccompanyEvaluateCell.h; sourceTree = "<group>"; };
 		BC27A069280FF56B00F91E27 /* AccompanyStudentEvaCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccompanyStudentEvaCell.h; sourceTree = "<group>"; };
 		BC27A06A280FF56B00F91E27 /* AccompanyEvaluateCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccompanyEvaluateCell.xib; sourceTree = "<group>"; };
@@ -1808,15 +1815,6 @@
 		BC49BAEB28D98C500031FF06 /* KSMetronomePlayer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSMetronomePlayer.m; sourceTree = "<group>"; };
 		BC4CC415288FD689004AD8EC /* LaunchAnimationView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LaunchAnimationView.h; sourceTree = "<group>"; };
 		BC4CC416288FD689004AD8EC /* LaunchAnimationView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LaunchAnimationView.m; sourceTree = "<group>"; };
-		BC4CF26828D025E200961C61 /* HomeQualityMusic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeQualityMusic.h; sourceTree = "<group>"; };
-		BC4CF26928D025E200961C61 /* HomeQualityMusic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeQualityMusic.m; sourceTree = "<group>"; };
-		BC4CF26B28D025EA00961C61 /* HomeQualityMusic.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeQualityMusic.xib; sourceTree = "<group>"; };
-		BC4CF26D28D0283300961C61 /* HomeQualityMusicCollectionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeQualityMusicCollectionCell.h; sourceTree = "<group>"; };
-		BC4CF26E28D0283300961C61 /* HomeQualityMusicCollectionCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeQualityMusicCollectionCell.m; sourceTree = "<group>"; };
-		BC4CF26F28D0283300961C61 /* HomeQualityMusicCollectionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeQualityMusicCollectionCell.xib; sourceTree = "<group>"; };
-		BC4CF27228D0285400961C61 /* HomeQualityMusicCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeQualityMusicCellView.h; sourceTree = "<group>"; };
-		BC4CF27328D0285400961C61 /* HomeQualityMusicCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeQualityMusicCellView.m; sourceTree = "<group>"; };
-		BC4CF27528D0285A00961C61 /* HomeQualityMusicCellView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeQualityMusicCellView.xib; sourceTree = "<group>"; };
 		BC4CF28C28D072C000961C61 /* WidgetViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WidgetViewController.h; sourceTree = "<group>"; };
 		BC4CF28D28D072C000961C61 /* WidgetViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WidgetViewController.m; sourceTree = "<group>"; };
 		BC4CF28F28D072EF00961C61 /* WidgetNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WidgetNavView.h; sourceTree = "<group>"; };
@@ -2906,6 +2904,8 @@
 		275FA1F527E7356A00CFEA2E /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				BC12639328FF8D2200509E90 /* HomeMusicModel.h */,
+				BC12639428FF8D2300509E90 /* HomeMusicModel.m */,
 				BC2DFF5928C097D00056105A /* AnimationSource */,
 				BCD457AD28646B580010B493 /* NoticeSourceModel.h */,
 				BCD457AE28646B580010B493 /* NoticeSourceModel.m */,
@@ -2934,8 +2934,9 @@
 		275FA1F627E7356A00CFEA2E /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC12639228FF8C1E00509E90 /* HomeNewMusic */,
+				BC12639128FF8C0300509E90 /* HomeRecommendMusic */,
 				BC8B641228F3B58A00A08D16 /* AwardAlert */,
-				BC4CF26728D025CB00961C61 /* QualityMusic */,
 				BCFDA66328BDF0530022B497 /* TeacherStyle */,
 				BCFDA65928BCAE7C0022B497 /* HomePageView */,
 				BCFDA63328BCA1850022B497 /* RecentCourse */,
@@ -4438,6 +4439,26 @@
 			path = ChatUserInfo;
 			sourceTree = "<group>";
 		};
+		BC12639128FF8C0300509E90 /* HomeRecommendMusic */ = {
+			isa = PBXGroup;
+			children = (
+				BC12639B28FF8E6D00509E90 /* HomeRecommendMusicView.h */,
+				BC12639C28FF8E6D00509E90 /* HomeRecommendMusicView.m */,
+				BC12639E28FF8E7400509E90 /* HomeRecommendMusicView.xib */,
+			);
+			path = HomeRecommendMusic;
+			sourceTree = "<group>";
+		};
+		BC12639228FF8C1E00509E90 /* HomeNewMusic */ = {
+			isa = PBXGroup;
+			children = (
+				BC12639628FF8E0F00509E90 /* HomeNewMusicView.h */,
+				BC12639728FF8E0F00509E90 /* HomeNewMusicView.m */,
+				BC12639928FF8E1700509E90 /* HomeNewMusicView.xib */,
+			);
+			path = HomeNewMusic;
+			sourceTree = "<group>";
+		};
 		BC25C18D28F50C46009E31BD /* RecordManager */ = {
 			isa = PBXGroup;
 			children = (
@@ -4546,22 +4567,6 @@
 			path = View;
 			sourceTree = "<group>";
 		};
-		BC4CF26728D025CB00961C61 /* QualityMusic */ = {
-			isa = PBXGroup;
-			children = (
-				BC4CF26828D025E200961C61 /* HomeQualityMusic.h */,
-				BC4CF26928D025E200961C61 /* HomeQualityMusic.m */,
-				BC4CF26B28D025EA00961C61 /* HomeQualityMusic.xib */,
-				BC4CF26D28D0283300961C61 /* HomeQualityMusicCollectionCell.h */,
-				BC4CF26E28D0283300961C61 /* HomeQualityMusicCollectionCell.m */,
-				BC4CF26F28D0283300961C61 /* HomeQualityMusicCollectionCell.xib */,
-				BC4CF27228D0285400961C61 /* HomeQualityMusicCellView.h */,
-				BC4CF27328D0285400961C61 /* HomeQualityMusicCellView.m */,
-				BC4CF27528D0285A00961C61 /* HomeQualityMusicCellView.xib */,
-			);
-			path = QualityMusic;
-			sourceTree = "<group>";
-		};
 		BC4CF28828D058E600961C61 /* Widget */ = {
 			isa = PBXGroup;
 			children = (
@@ -6246,7 +6251,6 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BC4CF27128D0283300961C61 /* HomeQualityMusicCollectionCell.xib in Resources */,
 				BCC583CB28A9EC6400BAB4CF /* cloud_animation_7.png in Resources */,
 				BC71D1052881A2420010F14B /* TencentOpenApi_IOS_Bundle.bundle in Resources */,
 				BC802DBF28BC8E350079E350 /* HomeHotLiveCourseView.xib in Resources */,
@@ -6325,6 +6329,7 @@
 				BC119280280FB10900A716F7 /* AccompanyRemarkCell.xib in Resources */,
 				BC8A45B6283DC33400094BBB /* NoWiredTipsAlert.xib in Resources */,
 				BC71D271288804CD0010F14B /* img_26.png in Resources */,
+				BC12639F28FF8E7400509E90 /* HomeRecommendMusicView.xib in Resources */,
 				2723B63527F157D500E0B90B /* GroupApplyChooseCell.xib in Resources */,
 				2723B5C227F157B100E0B90B /* GroupListViewCell.xib in Resources */,
 				BCBFDF432811573D0052AFE5 /* HomeButtonView.xib in Resources */,
@@ -6374,7 +6379,6 @@
 				BC7663162827E49900C91A1D /* NotiferHeadView.xib in Resources */,
 				BC802D9928BC4FE90079E350 /* HomeHotMusicView.xib in Resources */,
 				BCB908F22850B08D00F5FF69 /* ShareMusicCellContentView.xib in Resources */,
-				BC4CF27628D0285A00961C61 /* HomeQualityMusicCellView.xib in Resources */,
 				BCC583CF28A9EC6400BAB4CF /* cloud_animation_1.png in Resources */,
 				2723B5C427F157B100E0B90B /* KSChatListSearchView.xib in Resources */,
 				BC8A459A283DC33400094BBB /* SubjectFinger.plist in Resources */,
@@ -6438,7 +6442,6 @@
 				BCFE53E82812765600AD6786 /* HomeHotAlbumCell.xib in Resources */,
 				BC119239280ED98E00A716F7 /* AccompanyCourseCell.xib in Resources */,
 				BC27A076280FF61300F91E27 /* AccompanyDetailBottomView.xib in Resources */,
-				BC4CF26C28D025EA00961C61 /* HomeQualityMusic.xib in Resources */,
 				BCBFDF4D28115C7A0052AFE5 /* HomeHotCourseView.xib in Resources */,
 				BC71D2892888083B0010F14B /* tabbar5.json in Resources */,
 				BC8A45B4283DC33400094BBB /* EvaluateResultAlert.xib in Resources */,
@@ -6451,6 +6454,7 @@
 				BC71D248288804CD0010F14B /* img_39.png in Resources */,
 				BC11926C280FAF5900A716F7 /* AccompanyAlertView.xib in Resources */,
 				BC802DA428BC5F8D0079E350 /* HomeHotMusicCellView.xib in Resources */,
+				BC12639A28FF8E1700509E90 /* HomeNewMusicView.xib in Resources */,
 				2723B66F27F15CFC00E0B90B /* AboutUsBodyView.xib in Resources */,
 				275FA23827E7356B00CFEA2E /* FirstSettingBodyView.xib in Resources */,
 				BC542E622840A60E00633781 /* UseBodyView.xib in Resources */,
@@ -6699,6 +6703,7 @@
 				BCB6356E27F6D2A300ACFDCF /* ClassSongMessage.m in Sources */,
 				BCFDA66228BDC3640022B497 /* TalentTeacherModel.m in Sources */,
 				BC8B6DC92856CFB800866917 /* KSDocument.m in Sources */,
+				BC12639828FF8E0F00509E90 /* HomeNewMusicView.m in Sources */,
 				275FA1E927E7351900CFEA2E /* KSNetTypeManager.m in Sources */,
 				BC756CC128FE7D9500AA9ECB /* UserDetailNavView.m in Sources */,
 				2723B66B27F15CFC00E0B90B /* PhoneCheckBodyView.m in Sources */,
@@ -6832,7 +6837,6 @@
 				2723B62327F157D500E0B90B /* LFPopupMenuDefaultConfig.m in Sources */,
 				2779351627E324A60010E277 /* NSMutableArray+KSSafe.m in Sources */,
 				BC119247280EDA5800A716F7 /* kSJXCollectionView.m in Sources */,
-				BC4CF27028D0283300961C61 /* HomeQualityMusicCollectionCell.m in Sources */,
 				2779358927E324A80010E277 /* CoinModel.m in Sources */,
 				BCB9091728530E9C00F5FF69 /* KSShopCardView.m in Sources */,
 				275FA1EA27E7351900CFEA2E /* KSRCIMDataSource.m in Sources */,
@@ -6900,7 +6904,6 @@
 				277935B827E324A90010E277 /* FSCalendar.m in Sources */,
 				BCB6356C27F6D2A300ACFDCF /* Whiteboard.m in Sources */,
 				275FA23527E7356B00CFEA2E /* UserInfoManager.m in Sources */,
-				BC4CF26A28D025E200961C61 /* HomeQualityMusic.m in Sources */,
 				2779353327E324A60010E277 /* UIScreen+Extend.m in Sources */,
 				BC8A45AE283DC33400094BBB /* SoundCheckView.m in Sources */,
 				BC71D13A2887CEB70010F14B /* LaunchAnimationViewController.m in Sources */,
@@ -6949,7 +6952,6 @@
 				2723B61D27F157D500E0B90B /* GroupNoticeViewController.m in Sources */,
 				BC0212F727FC4A080040569F /* SubjectImageCell.m in Sources */,
 				277935D027E324A90010E277 /* ALCalendarDate.m in Sources */,
-				BC4CF27428D0285400961C61 /* HomeQualityMusicCellView.m in Sources */,
 				BCB9FA2F286D7B02005D766B /* GuideViewController.m in Sources */,
 				BCFE540328152A8500AD6786 /* KSOrderManager.m in Sources */,
 				2723B64427F15B5900E0B90B /* SCIndexViewConfiguration.m in Sources */,
@@ -7171,6 +7173,7 @@
 				277935B027E324A90010E277 /* MSSBrowseActionSheetCell.m in Sources */,
 				2779358827E324A80010E277 /* NSObject+Archiving.m in Sources */,
 				2779354427E324A60010E277 /* NSObject+AutoProperty.m in Sources */,
+				BC12639528FF8D2300509E90 /* HomeMusicModel.m in Sources */,
 				BCFDA62428BC94400022B497 /* HomeNavSearchView.m in Sources */,
 				275FA23427E7356B00CFEA2E /* UserInfo.m in Sources */,
 				27F9033A27E87FD500C08A19 /* MineBodyView.m in Sources */,
@@ -7191,6 +7194,7 @@
 				BCFE54002814E1BE00AD6786 /* HomeVideoGroupModel.m in Sources */,
 				BC542E5A28409EC900633781 /* InstrumentHeaderView.m in Sources */,
 				2779356627E324A70010E277 /* ShopMessBtn.m in Sources */,
+				BC12639D28FF8E6D00509E90 /* HomeRecommendMusicView.m in Sources */,
 				BC11921D280ED6A900A716F7 /* NewClassPopCell.m in Sources */,
 				277935B727E324A90010E277 /* FSCalendarStickyHeader.m in Sources */,
 				2779356927E324A70010E277 /* YKMultiLevelTableView.m in Sources */,

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


+ 2 - 2
KulexiuForStudent/KulexiuForStudent.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -62,8 +62,8 @@
             filePath = "KulexiuForStudent/Module/Home/Controller/HomeViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "551"
-            endingLineNumber = "551"
+            startingLineNumber = "584"
+            endingLineNumber = "584"
             landmarkName = "-requestHotAlbum"
             landmarkType = "7">
          </BreakpointContent>

+ 4 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/Controller/KSChatUserDetailViewController.m

@@ -43,7 +43,10 @@
     [self.view addSubview:imageView];
     
     [self.view addSubview:self.navView];
-    
+    [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(kNaviBarHeight);
+    }];
     self.scrollView.backgroundColor = [UIColor clearColor];
     self.scrollView.delegate = self;
     

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

@@ -155,6 +155,10 @@ NSString *const kChatUserInfoUsername = @"username";
 - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
 {
     id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
     return [object isEqual:[NSNull null]] ? nil : object;
 }
 

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

@@ -259,6 +259,10 @@ NSString *const kRecentPracticeModelSubmitAuditTime = @"submitAuditTime";
 - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
 {
     id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
     return [object isEqual:[NSNull null]] ? nil : object;
 }
 

+ 243 - 12
KulexiuForStudent/KulexiuForStudent/Module/Home/Controller/HomeViewController.m

@@ -67,6 +67,10 @@
 #import "WidgetViewController.h"
 #import "KSAwardAlertView.h"
 
+#import "HomeNewMusicView.h"
+#import "HomeRecommendMusicView.h"
+#import "HomeMusicModel.h"
+
 #define BUTTONWIDTH (65)
 #define BUTTONHEIGHT (80)
 
@@ -111,6 +115,17 @@
 @property (nonatomic, strong) UICollectionView *albumCollectionView; // 专辑容器
 @property (nonatomic, assign) CGFloat albumViewHeight; // album 高度
 
+// 推荐曲目
+@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) HomeHotMusicView *hotMusicView;
@@ -241,12 +256,30 @@
         make.height.mas_equalTo(self.albumViewHeight);
     }];
     
+    // 推荐曲目
+    [self.headView addSubview:self.recommendMusicView];
+    self.recommendMusicViewHeight = [HomeRecommendMusicView getViewHeight];
+    [self.recommendMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.headView);
+        make.top.mas_equalTo(self.albumView.mas_bottom);
+        make.height.mas_equalTo(self.recommendMusicViewHeight);
+    }];
+    
+    // 最新曲目
+    [self.headView addSubview:self.newestMusicView];
+    self.newestMusicViewHeight = [HomeNewMusicView getViewHeight];
+    [self.newestMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.headView);
+        make.top.mas_equalTo(self.recommendMusicView.mas_bottom);
+        make.height.mas_equalTo(self.newestMusicViewHeight);
+    }];
+    
     // 热门曲目
     [self.headView addSubview:self.hotMusicView];
     self.musicViewHeight = [HomeHotMusicView getViewHeight];
     [self.hotMusicView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.right.mas_equalTo(self.headView);
-        make.top.mas_equalTo(self.albumView.mas_bottom);
+        make.top.mas_equalTo(self.newestMusicView.mas_bottom);
         make.height.mas_equalTo(self.musicViewHeight);
     }];
     
@@ -294,7 +327,7 @@
 
 - (void)refreshHeadHeight {
     CGFloat bottomSpace = 20.0f;
-    self.headViewHeight = self.bannerViewHeight + self.buttonViewHeight + self.noticeViewHeight + self.courseViewHeight + self.albumViewHeight + self.musicViewHeight + self.talentViewHeight + self.liveViewHeight + self.videoViewHeight + bottomSpace;
+    self.headViewHeight = self.bannerViewHeight + self.buttonViewHeight + self.noticeViewHeight + self.courseViewHeight + self.albumViewHeight + self.recommendMusicViewHeight + self.newestMusicViewHeight + self.musicViewHeight + self.talentViewHeight + self.liveViewHeight + self.videoViewHeight + bottomSpace;
     [self.pagerView reloadData];
 }
 
@@ -633,18 +666,35 @@
 }
 
 
-- (void)requestHotMusic {
+- (void)requestHomeMusicMessage {
     dispatch_group_enter(self.requestGroup);
-    [KSNetworkingManager homeMusicListRequest:KS_POST version:[USER_MANAGER getCurrentVersion] success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager homeAppMusicSheetRequest:KS_POST version:[USER_MANAGER getCurrentVersion] success:^(NSDictionary * _Nonnull dic) {
         dispatch_group_leave(self.requestGroup);
         if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
-            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
-            NSMutableArray *musicArray = [NSMutableArray array];
-            for (NSDictionary *parm in sourceArray) {
-                HomeHotMusicModel *model = [[HomeHotMusicModel alloc] initWithDictionary:parm];
-                [musicArray addObject:model];
+            NSDictionary *result = [dic dictionaryValueForKey:@"data"];
+            NSArray *hotMusicSheet = [result arrayValueForKey:@"hotMusicSheet"]; // 最热曲目
+            NSMutableArray *hotArray = [NSMutableArray array];
+            for (NSDictionary *parm in hotMusicSheet) {
+                HomeMusicModel *model = [[HomeMusicModel alloc] initWithDictionary:parm];
+                [hotArray addObject:model];
+            }
+            self.musicArray = [NSMutableArray arrayWithArray:hotArray];
+            
+            NSArray *newMusicSheet = [result arrayValueForKey:@"newMusicSheet"]; // 最新曲目
+            NSMutableArray *newMusicArray = [NSMutableArray array];
+            for (NSDictionary *parm in newMusicSheet) {
+                HomeMusicModel *model = [[HomeMusicModel alloc] initWithDictionary:parm];
+                [newMusicArray addObject:model];
             }
-            self.musicArray = [NSMutableArray arrayWithArray:musicArray];
+            self.newestMusicArray = [NSMutableArray arrayWithArray:newMusicArray];
+            
+            NSArray *topMusicSheet = [result 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 {
             [self MBPShow:MESSAGEKEY];
@@ -654,6 +704,7 @@
     }];
 }
 
+
 - (void)requestTalentSource {
     dispatch_group_enter(self.requestGroup);
     [KSNetworkingManager queryHotTeacherListRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
@@ -748,8 +799,7 @@
     // 达人
     [self requestTalentSource];
     [self requestHotAlbum];
-    [self requestHotMusic];
-    
+    [self requestHomeMusicMessage];
     [self requestTeacherStyle];
     [self requestLiveList];
     [self requestInformationList];
@@ -1042,6 +1092,33 @@
 }
 
 - (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.musicArray.count) {
         self.musicViewHeight = [HomeHotMusicView getViewHeight];
@@ -1223,6 +1300,16 @@
     if (collectionView == self.albumCollectionView) { // 专辑
         return self.albumArray.count;
     }
+    else if (collectionView == self.recommendMusicCollectionView) {
+        NSInteger lastRowCount = (self.recommendMusicArray.count % 3) > 0 ? 1 : 0;
+        NSInteger count = self.recommendMusicArray.count / 3 + lastRowCount;
+        return count;
+    }
+    else if (collectionView == self.newestMusicCollectionView) {
+        NSInteger lastRowCount = (self.newestMusicArray.count % 3) > 0 ? 1 : 0;
+        NSInteger count = self.newestMusicArray.count / 3 + lastRowCount;
+        return count;
+    }
     else if (collectionView == self.musicCollectionView) { // 乐谱
         NSInteger lastRowCount = (self.musicArray.count % 3) > 0 ? 1 : 0;
         NSInteger count = self.musicArray.count / 3 + lastRowCount;
@@ -1247,6 +1334,32 @@
         [cell configWithAlbumModel:model];
         return cell;
     }
+    else if (collectionView == self.recommendMusicCollectionView) {
+        NSMutableArray *songArray = [NSMutableArray array];
+        NSInteger length = indexPath.item * 3 + 3 > self.recommendMusicArray.count ? self.recommendMusicArray.count - indexPath.item * 3: 3;
+        NSRange range = NSMakeRange(indexPath.item * 3, 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 * 3 + 3 > self.newestMusicArray.count ? self.newestMusicArray.count - indexPath.item * 3: 3;
+        NSRange range = NSMakeRange(indexPath.item * 3, 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 if (collectionView == self.musicCollectionView) {
         NSMutableArray *songArray = [NSMutableArray array];
         NSInteger length = indexPath.item * 3 + 3 > self.musicArray.count ? self.musicArray.count - indexPath.item * 3: 3;
@@ -1363,6 +1476,12 @@
     if (collectionView == self.albumCollectionView) {
         return CGSizeMake(100, 134);
     }
+    else if (collectionView == self.recommendMusicCollectionView) {
+        return CGSizeMake(KPortraitWidth * 0.83, 240);
+    }
+    else if (collectionView == self.newestMusicCollectionView) {
+        return CGSizeMake(KPortraitWidth * 0.83, 240);
+    }
     else if (collectionView == self.musicCollectionView) {
         return CGSizeMake(KPortraitWidth * 0.83, 240);
     }
@@ -1687,7 +1806,119 @@
     [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) {
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+        _recommendMusicCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+        _recommendMusicCollectionView.backgroundColor = [UIColor clearColor];
+        _recommendMusicCollectionView.delegate = self;
+        _recommendMusicCollectionView.dataSource = self;
+        _recommendMusicCollectionView.showsVerticalScrollIndicator = NO;
+        _recommendMusicCollectionView.showsHorizontalScrollIndicator = 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) {
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+        _newestMusicCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+        _newestMusicCollectionView.backgroundColor = [UIColor clearColor];
+        _newestMusicCollectionView.delegate = self;
+        _newestMusicCollectionView.dataSource = self;
+        _newestMusicCollectionView.showsVerticalScrollIndicator = NO;
+        _newestMusicCollectionView.showsHorizontalScrollIndicator = 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) {

+ 70 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeMusicModel.h

@@ -0,0 +1,70 @@
+//
+//  HomeMusicModel.h
+//
+//  Created by Steven  on 2022/10/19
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface HomeMusicModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *metronomeUrl;
+@property (nonatomic, strong) NSString *musicSheetName;
+@property (nonatomic, assign) double albumNums;
+@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *xmlFileUrl;
+@property (nonatomic, assign) double showFingering;
+@property (nonatomic, assign) double albumSortNumber;
+@property (nonatomic, assign) double state;
+@property (nonatomic, strong) NSString *remark;
+@property (nonatomic, strong) NSString *titleImg;
+@property (nonatomic, assign) double notation;
+@property (nonatomic, strong) NSString *musicImg;
+@property (nonatomic, assign) double favoriteCount;
+@property (nonatomic, strong) NSString *url;
+@property (nonatomic, assign) double musicPrice;
+@property (nonatomic, assign) double sortNumber;
+@property (nonatomic, assign) double exquisiteFlag;
+@property (nonatomic, strong) NSString *play;
+@property (nonatomic, strong) NSString *addUserAvatar;
+@property (nonatomic, strong) NSString *audioType;
+@property (nonatomic, assign) double canEvaluate;
+@property (nonatomic, assign) BOOL delFlag;
+@property (nonatomic, strong) NSString *musicTagNames;
+@property (nonatomic, strong) NSString *subjectNames;
+@property (nonatomic, strong) NSString *chargeType;
+@property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, assign) double updateBy;
+@property (nonatomic, strong) NSString *musicTag;
+@property (nonatomic, strong) NSString *extConfigJson;
+@property (nonatomic, strong) NSString *addName;
+@property (nonatomic, strong) NSString *paymentType;
+@property (nonatomic, assign) double favorite;
+@property (nonatomic, strong) NSString *auditStatus;
+@property (nonatomic, assign) double createBy;
+@property (nonatomic, strong) NSString *accompanimentType;
+@property (nonatomic, assign) double topFlag;
+@property (nonatomic, strong) NSString *midiUrl;
+@property (nonatomic, strong) NSString *composer;
+@property (nonatomic, strong) NSString *sourceType;
+@property (nonatomic, strong) NSString *firstPassAuditTime;
+@property (nonatomic, strong) NSString *mp3Type;
+@property (nonatomic, strong) NSString *hotFlag;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, assign) double playSpeed;
+@property (nonatomic, strong) NSString *hasBeat;
+@property (nonatomic, strong) NSString *audioFileUrl;
+@property (nonatomic, strong) NSString *reason;
+@property (nonatomic, assign) double auditVersion;
+@property (nonatomic, strong) NSString *musicSubject;
+@property (nonatomic, assign) double userId;
+@property (nonatomic, strong) NSString *submitAuditTime;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 449 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeMusicModel.m

@@ -0,0 +1,449 @@
+//
+//  HomeMusicModel.m
+//
+//  Created by Steven  on 2022/10/19
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "HomeMusicModel.h"
+
+
+NSString *const kHomeMusicModelMetronomeUrl = @"metronomeUrl";
+NSString *const kHomeMusicModelMusicSheetName = @"musicSheetName";
+NSString *const kHomeMusicModelAlbumNums = @"albumNums";
+NSString *const kHomeMusicModelId = @"id";
+NSString *const kHomeMusicModelXmlFileUrl = @"xmlFileUrl";
+NSString *const kHomeMusicModelShowFingering = @"showFingering";
+NSString *const kHomeMusicModelAlbumSortNumber = @"albumSortNumber";
+NSString *const kHomeMusicModelState = @"state";
+NSString *const kHomeMusicModelRemark = @"remark";
+NSString *const kHomeMusicModelTitleImg = @"titleImg";
+NSString *const kHomeMusicModelNotation = @"notation";
+NSString *const kHomeMusicModelMusicImg = @"musicImg";
+NSString *const kHomeMusicModelFavoriteCount = @"favoriteCount";
+NSString *const kHomeMusicModelUrl = @"url";
+NSString *const kHomeMusicModelMusicPrice = @"musicPrice";
+NSString *const kHomeMusicModelSortNumber = @"sortNumber";
+NSString *const kHomeMusicModelExquisiteFlag = @"exquisiteFlag";
+NSString *const kHomeMusicModelPlay = @"play";
+NSString *const kHomeMusicModelAddUserAvatar = @"addUserAvatar";
+NSString *const kHomeMusicModelAudioType = @"audioType";
+NSString *const kHomeMusicModelCanEvaluate = @"canEvaluate";
+NSString *const kHomeMusicModelDelFlag = @"delFlag";
+NSString *const kHomeMusicModelMusicTagNames = @"musicTagNames";
+NSString *const kHomeMusicModelSubjectNames = @"subjectNames";
+NSString *const kHomeMusicModelChargeType = @"chargeType";
+NSString *const kHomeMusicModelUpdateTime = @"updateTime";
+NSString *const kHomeMusicModelUpdateBy = @"updateBy";
+NSString *const kHomeMusicModelMusicTag = @"musicTag";
+NSString *const kHomeMusicModelExtConfigJson = @"extConfigJson";
+NSString *const kHomeMusicModelAddName = @"addName";
+NSString *const kHomeMusicModelPaymentType = @"paymentType";
+NSString *const kHomeMusicModelFavorite = @"favorite";
+NSString *const kHomeMusicModelAuditStatus = @"auditStatus";
+NSString *const kHomeMusicModelCreateBy = @"createBy";
+NSString *const kHomeMusicModelAccompanimentType = @"accompanimentType";
+NSString *const kHomeMusicModelTopFlag = @"topFlag";
+NSString *const kHomeMusicModelMidiUrl = @"midiUrl";
+NSString *const kHomeMusicModelComposer = @"composer";
+NSString *const kHomeMusicModelSourceType = @"sourceType";
+NSString *const kHomeMusicModelFirstPassAuditTime = @"firstPassAuditTime";
+NSString *const kHomeMusicModelMp3Type = @"mp3Type";
+NSString *const kHomeMusicModelHotFlag = @"hotFlag";
+NSString *const kHomeMusicModelCreateTime = @"createTime";
+NSString *const kHomeMusicModelPlaySpeed = @"playSpeed";
+NSString *const kHomeMusicModelHasBeat = @"hasBeat";
+NSString *const kHomeMusicModelAudioFileUrl = @"audioFileUrl";
+NSString *const kHomeMusicModelReason = @"reason";
+NSString *const kHomeMusicModelAuditVersion = @"auditVersion";
+NSString *const kHomeMusicModelMusicSubject = @"musicSubject";
+NSString *const kHomeMusicModelUserId = @"userId";
+NSString *const kHomeMusicModelSubmitAuditTime = @"submitAuditTime";
+
+
+@interface HomeMusicModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation HomeMusicModel
+
+@synthesize metronomeUrl = _metronomeUrl;
+@synthesize musicSheetName = _musicSheetName;
+@synthesize albumNums = _albumNums;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize xmlFileUrl = _xmlFileUrl;
+@synthesize showFingering = _showFingering;
+@synthesize albumSortNumber = _albumSortNumber;
+@synthesize state = _state;
+@synthesize remark = _remark;
+@synthesize titleImg = _titleImg;
+@synthesize notation = _notation;
+@synthesize musicImg = _musicImg;
+@synthesize favoriteCount = _favoriteCount;
+@synthesize url = _url;
+@synthesize musicPrice = _musicPrice;
+@synthesize sortNumber = _sortNumber;
+@synthesize exquisiteFlag = _exquisiteFlag;
+@synthesize play = _play;
+@synthesize addUserAvatar = _addUserAvatar;
+@synthesize audioType = _audioType;
+@synthesize canEvaluate = _canEvaluate;
+@synthesize delFlag = _delFlag;
+@synthesize musicTagNames = _musicTagNames;
+@synthesize subjectNames = _subjectNames;
+@synthesize chargeType = _chargeType;
+@synthesize updateTime = _updateTime;
+@synthesize updateBy = _updateBy;
+@synthesize musicTag = _musicTag;
+@synthesize extConfigJson = _extConfigJson;
+@synthesize addName = _addName;
+@synthesize paymentType = _paymentType;
+@synthesize favorite = _favorite;
+@synthesize auditStatus = _auditStatus;
+@synthesize createBy = _createBy;
+@synthesize accompanimentType = _accompanimentType;
+@synthesize topFlag = _topFlag;
+@synthesize midiUrl = _midiUrl;
+@synthesize composer = _composer;
+@synthesize sourceType = _sourceType;
+@synthesize firstPassAuditTime = _firstPassAuditTime;
+@synthesize mp3Type = _mp3Type;
+@synthesize hotFlag = _hotFlag;
+@synthesize createTime = _createTime;
+@synthesize playSpeed = _playSpeed;
+@synthesize hasBeat = _hasBeat;
+@synthesize audioFileUrl = _audioFileUrl;
+@synthesize reason = _reason;
+@synthesize auditVersion = _auditVersion;
+@synthesize musicSubject = _musicSubject;
+@synthesize userId = _userId;
+@synthesize submitAuditTime = _submitAuditTime;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.metronomeUrl = [self objectOrNilForKey:kHomeMusicModelMetronomeUrl fromDictionary:dict];
+            self.musicSheetName = [self objectOrNilForKey:kHomeMusicModelMusicSheetName fromDictionary:dict];
+            self.albumNums = [[self objectOrNilForKey:kHomeMusicModelAlbumNums fromDictionary:dict] doubleValue];
+            self.internalBaseClassIdentifier = [[self objectOrNilForKey:kHomeMusicModelId fromDictionary:dict] doubleValue];
+            self.xmlFileUrl = [self objectOrNilForKey:kHomeMusicModelXmlFileUrl fromDictionary:dict];
+            self.showFingering = [[self objectOrNilForKey:kHomeMusicModelShowFingering fromDictionary:dict] doubleValue];
+            self.albumSortNumber = [[self objectOrNilForKey:kHomeMusicModelAlbumSortNumber fromDictionary:dict] doubleValue];
+            self.state = [[self objectOrNilForKey:kHomeMusicModelState fromDictionary:dict] doubleValue];
+            self.remark = [self objectOrNilForKey:kHomeMusicModelRemark fromDictionary:dict];
+            self.titleImg = [self objectOrNilForKey:kHomeMusicModelTitleImg fromDictionary:dict];
+            self.notation = [[self objectOrNilForKey:kHomeMusicModelNotation fromDictionary:dict] doubleValue];
+            self.musicImg = [self objectOrNilForKey:kHomeMusicModelMusicImg fromDictionary:dict];
+            self.favoriteCount = [[self objectOrNilForKey:kHomeMusicModelFavoriteCount fromDictionary:dict] doubleValue];
+            self.url = [self objectOrNilForKey:kHomeMusicModelUrl fromDictionary:dict];
+            self.musicPrice = [[self objectOrNilForKey:kHomeMusicModelMusicPrice fromDictionary:dict] doubleValue];
+            self.sortNumber = [[self objectOrNilForKey:kHomeMusicModelSortNumber fromDictionary:dict] doubleValue];
+            self.exquisiteFlag = [[self objectOrNilForKey:kHomeMusicModelExquisiteFlag fromDictionary:dict] doubleValue];
+            self.play = [self objectOrNilForKey:kHomeMusicModelPlay fromDictionary:dict];
+            self.addUserAvatar = [self objectOrNilForKey:kHomeMusicModelAddUserAvatar fromDictionary:dict];
+            self.audioType = [self objectOrNilForKey:kHomeMusicModelAudioType fromDictionary:dict];
+            self.canEvaluate = [[self objectOrNilForKey:kHomeMusicModelCanEvaluate fromDictionary:dict] doubleValue];
+            self.delFlag = [[self objectOrNilForKey:kHomeMusicModelDelFlag fromDictionary:dict] boolValue];
+            self.musicTagNames = [self objectOrNilForKey:kHomeMusicModelMusicTagNames fromDictionary:dict];
+            self.subjectNames = [self objectOrNilForKey:kHomeMusicModelSubjectNames fromDictionary:dict];
+            self.chargeType = [self objectOrNilForKey:kHomeMusicModelChargeType fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kHomeMusicModelUpdateTime fromDictionary:dict];
+            self.updateBy = [[self objectOrNilForKey:kHomeMusicModelUpdateBy fromDictionary:dict] doubleValue];
+            self.musicTag = [self objectOrNilForKey:kHomeMusicModelMusicTag fromDictionary:dict];
+            self.extConfigJson = [self objectOrNilForKey:kHomeMusicModelExtConfigJson fromDictionary:dict];
+            self.addName = [self objectOrNilForKey:kHomeMusicModelAddName fromDictionary:dict];
+            self.paymentType = [self objectOrNilForKey:kHomeMusicModelPaymentType fromDictionary:dict];
+            self.favorite = [[self objectOrNilForKey:kHomeMusicModelFavorite fromDictionary:dict] doubleValue];
+            self.auditStatus = [self objectOrNilForKey:kHomeMusicModelAuditStatus fromDictionary:dict];
+            self.createBy = [[self objectOrNilForKey:kHomeMusicModelCreateBy fromDictionary:dict] doubleValue];
+            self.accompanimentType = [self objectOrNilForKey:kHomeMusicModelAccompanimentType fromDictionary:dict];
+            self.topFlag = [[self objectOrNilForKey:kHomeMusicModelTopFlag fromDictionary:dict] doubleValue];
+            self.midiUrl = [self objectOrNilForKey:kHomeMusicModelMidiUrl fromDictionary:dict];
+            self.composer = [self objectOrNilForKey:kHomeMusicModelComposer fromDictionary:dict];
+            self.sourceType = [self objectOrNilForKey:kHomeMusicModelSourceType fromDictionary:dict];
+            self.firstPassAuditTime = [self objectOrNilForKey:kHomeMusicModelFirstPassAuditTime fromDictionary:dict];
+            self.mp3Type = [self objectOrNilForKey:kHomeMusicModelMp3Type fromDictionary:dict];
+            self.hotFlag = [self objectOrNilForKey:kHomeMusicModelHotFlag fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kHomeMusicModelCreateTime fromDictionary:dict];
+            self.playSpeed = [[self objectOrNilForKey:kHomeMusicModelPlaySpeed fromDictionary:dict] doubleValue];
+            self.hasBeat = [self objectOrNilForKey:kHomeMusicModelHasBeat fromDictionary:dict];
+            self.audioFileUrl = [self objectOrNilForKey:kHomeMusicModelAudioFileUrl fromDictionary:dict];
+            self.reason = [self objectOrNilForKey:kHomeMusicModelReason fromDictionary:dict];
+            self.auditVersion = [[self objectOrNilForKey:kHomeMusicModelAuditVersion fromDictionary:dict] doubleValue];
+            self.musicSubject = [self objectOrNilForKey:kHomeMusicModelMusicSubject fromDictionary:dict];
+            self.userId = [[self objectOrNilForKey:kHomeMusicModelUserId fromDictionary:dict] doubleValue];
+            self.submitAuditTime = [self objectOrNilForKey:kHomeMusicModelSubmitAuditTime fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.metronomeUrl forKey:kHomeMusicModelMetronomeUrl];
+    [mutableDict setValue:self.musicSheetName forKey:kHomeMusicModelMusicSheetName];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.albumNums] forKey:kHomeMusicModelAlbumNums];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kHomeMusicModelId];
+    [mutableDict setValue:self.xmlFileUrl forKey:kHomeMusicModelXmlFileUrl];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.showFingering] forKey:kHomeMusicModelShowFingering];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.albumSortNumber] forKey:kHomeMusicModelAlbumSortNumber];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.state] forKey:kHomeMusicModelState];
+    [mutableDict setValue:self.remark forKey:kHomeMusicModelRemark];
+    [mutableDict setValue:self.titleImg forKey:kHomeMusicModelTitleImg];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.notation] forKey:kHomeMusicModelNotation];
+    [mutableDict setValue:self.musicImg forKey:kHomeMusicModelMusicImg];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.favoriteCount] forKey:kHomeMusicModelFavoriteCount];
+    [mutableDict setValue:self.url forKey:kHomeMusicModelUrl];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.musicPrice] forKey:kHomeMusicModelMusicPrice];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.sortNumber] forKey:kHomeMusicModelSortNumber];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.exquisiteFlag] forKey:kHomeMusicModelExquisiteFlag];
+    [mutableDict setValue:self.play forKey:kHomeMusicModelPlay];
+    [mutableDict setValue:self.addUserAvatar forKey:kHomeMusicModelAddUserAvatar];
+    [mutableDict setValue:self.audioType forKey:kHomeMusicModelAudioType];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.canEvaluate] forKey:kHomeMusicModelCanEvaluate];
+    [mutableDict setValue:[NSNumber numberWithBool:self.delFlag] forKey:kHomeMusicModelDelFlag];
+    [mutableDict setValue:self.musicTagNames forKey:kHomeMusicModelMusicTagNames];
+    [mutableDict setValue:self.subjectNames forKey:kHomeMusicModelSubjectNames];
+    [mutableDict setValue:self.chargeType forKey:kHomeMusicModelChargeType];
+    [mutableDict setValue:self.updateTime forKey:kHomeMusicModelUpdateTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.updateBy] forKey:kHomeMusicModelUpdateBy];
+    [mutableDict setValue:self.musicTag forKey:kHomeMusicModelMusicTag];
+    [mutableDict setValue:self.extConfigJson forKey:kHomeMusicModelExtConfigJson];
+    [mutableDict setValue:self.addName forKey:kHomeMusicModelAddName];
+    [mutableDict setValue:self.paymentType forKey:kHomeMusicModelPaymentType];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.favorite] forKey:kHomeMusicModelFavorite];
+    [mutableDict setValue:self.auditStatus forKey:kHomeMusicModelAuditStatus];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.createBy] forKey:kHomeMusicModelCreateBy];
+    [mutableDict setValue:self.accompanimentType forKey:kHomeMusicModelAccompanimentType];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.topFlag] forKey:kHomeMusicModelTopFlag];
+    [mutableDict setValue:self.midiUrl forKey:kHomeMusicModelMidiUrl];
+    [mutableDict setValue:self.composer forKey:kHomeMusicModelComposer];
+    [mutableDict setValue:self.sourceType forKey:kHomeMusicModelSourceType];
+    [mutableDict setValue:self.firstPassAuditTime forKey:kHomeMusicModelFirstPassAuditTime];
+    [mutableDict setValue:self.mp3Type forKey:kHomeMusicModelMp3Type];
+    [mutableDict setValue:self.hotFlag forKey:kHomeMusicModelHotFlag];
+    [mutableDict setValue:self.createTime forKey:kHomeMusicModelCreateTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.playSpeed] forKey:kHomeMusicModelPlaySpeed];
+    [mutableDict setValue:self.hasBeat forKey:kHomeMusicModelHasBeat];
+    [mutableDict setValue:self.audioFileUrl forKey:kHomeMusicModelAudioFileUrl];
+    [mutableDict setValue:self.reason forKey:kHomeMusicModelReason];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.auditVersion] forKey:kHomeMusicModelAuditVersion];
+    [mutableDict setValue:self.musicSubject forKey:kHomeMusicModelMusicSubject];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.userId] forKey:kHomeMusicModelUserId];
+    [mutableDict setValue:self.submitAuditTime forKey:kHomeMusicModelSubmitAuditTime];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.metronomeUrl = [aDecoder decodeObjectForKey:kHomeMusicModelMetronomeUrl];
+    self.musicSheetName = [aDecoder decodeObjectForKey:kHomeMusicModelMusicSheetName];
+    self.albumNums = [aDecoder decodeDoubleForKey:kHomeMusicModelAlbumNums];
+    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kHomeMusicModelId];
+    self.xmlFileUrl = [aDecoder decodeObjectForKey:kHomeMusicModelXmlFileUrl];
+    self.showFingering = [aDecoder decodeDoubleForKey:kHomeMusicModelShowFingering];
+    self.albumSortNumber = [aDecoder decodeDoubleForKey:kHomeMusicModelAlbumSortNumber];
+    self.state = [aDecoder decodeDoubleForKey:kHomeMusicModelState];
+    self.remark = [aDecoder decodeObjectForKey:kHomeMusicModelRemark];
+    self.titleImg = [aDecoder decodeObjectForKey:kHomeMusicModelTitleImg];
+    self.notation = [aDecoder decodeDoubleForKey:kHomeMusicModelNotation];
+    self.musicImg = [aDecoder decodeObjectForKey:kHomeMusicModelMusicImg];
+    self.favoriteCount = [aDecoder decodeDoubleForKey:kHomeMusicModelFavoriteCount];
+    self.url = [aDecoder decodeObjectForKey:kHomeMusicModelUrl];
+    self.musicPrice = [aDecoder decodeDoubleForKey:kHomeMusicModelMusicPrice];
+    self.sortNumber = [aDecoder decodeDoubleForKey:kHomeMusicModelSortNumber];
+    self.exquisiteFlag = [aDecoder decodeDoubleForKey:kHomeMusicModelExquisiteFlag];
+    self.play = [aDecoder decodeObjectForKey:kHomeMusicModelPlay];
+    self.addUserAvatar = [aDecoder decodeObjectForKey:kHomeMusicModelAddUserAvatar];
+    self.audioType = [aDecoder decodeObjectForKey:kHomeMusicModelAudioType];
+    self.canEvaluate = [aDecoder decodeDoubleForKey:kHomeMusicModelCanEvaluate];
+    self.delFlag = [aDecoder decodeBoolForKey:kHomeMusicModelDelFlag];
+    self.musicTagNames = [aDecoder decodeObjectForKey:kHomeMusicModelMusicTagNames];
+    self.subjectNames = [aDecoder decodeObjectForKey:kHomeMusicModelSubjectNames];
+    self.chargeType = [aDecoder decodeObjectForKey:kHomeMusicModelChargeType];
+    self.updateTime = [aDecoder decodeObjectForKey:kHomeMusicModelUpdateTime];
+    self.updateBy = [aDecoder decodeDoubleForKey:kHomeMusicModelUpdateBy];
+    self.musicTag = [aDecoder decodeObjectForKey:kHomeMusicModelMusicTag];
+    self.extConfigJson = [aDecoder decodeObjectForKey:kHomeMusicModelExtConfigJson];
+    self.addName = [aDecoder decodeObjectForKey:kHomeMusicModelAddName];
+    self.paymentType = [aDecoder decodeObjectForKey:kHomeMusicModelPaymentType];
+    self.favorite = [aDecoder decodeDoubleForKey:kHomeMusicModelFavorite];
+    self.auditStatus = [aDecoder decodeObjectForKey:kHomeMusicModelAuditStatus];
+    self.createBy = [aDecoder decodeDoubleForKey:kHomeMusicModelCreateBy];
+    self.accompanimentType = [aDecoder decodeObjectForKey:kHomeMusicModelAccompanimentType];
+    self.topFlag = [aDecoder decodeDoubleForKey:kHomeMusicModelTopFlag];
+    self.midiUrl = [aDecoder decodeObjectForKey:kHomeMusicModelMidiUrl];
+    self.composer = [aDecoder decodeObjectForKey:kHomeMusicModelComposer];
+    self.sourceType = [aDecoder decodeObjectForKey:kHomeMusicModelSourceType];
+    self.firstPassAuditTime = [aDecoder decodeObjectForKey:kHomeMusicModelFirstPassAuditTime];
+    self.mp3Type = [aDecoder decodeObjectForKey:kHomeMusicModelMp3Type];
+    self.hotFlag = [aDecoder decodeObjectForKey:kHomeMusicModelHotFlag];
+    self.createTime = [aDecoder decodeObjectForKey:kHomeMusicModelCreateTime];
+    self.playSpeed = [aDecoder decodeDoubleForKey:kHomeMusicModelPlaySpeed];
+    self.hasBeat = [aDecoder decodeObjectForKey:kHomeMusicModelHasBeat];
+    self.audioFileUrl = [aDecoder decodeObjectForKey:kHomeMusicModelAudioFileUrl];
+    self.reason = [aDecoder decodeObjectForKey:kHomeMusicModelReason];
+    self.auditVersion = [aDecoder decodeDoubleForKey:kHomeMusicModelAuditVersion];
+    self.musicSubject = [aDecoder decodeObjectForKey:kHomeMusicModelMusicSubject];
+    self.userId = [aDecoder decodeDoubleForKey:kHomeMusicModelUserId];
+    self.submitAuditTime = [aDecoder decodeObjectForKey:kHomeMusicModelSubmitAuditTime];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_metronomeUrl forKey:kHomeMusicModelMetronomeUrl];
+    [aCoder encodeObject:_musicSheetName forKey:kHomeMusicModelMusicSheetName];
+    [aCoder encodeDouble:_albumNums forKey:kHomeMusicModelAlbumNums];
+    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kHomeMusicModelId];
+    [aCoder encodeObject:_xmlFileUrl forKey:kHomeMusicModelXmlFileUrl];
+    [aCoder encodeDouble:_showFingering forKey:kHomeMusicModelShowFingering];
+    [aCoder encodeDouble:_albumSortNumber forKey:kHomeMusicModelAlbumSortNumber];
+    [aCoder encodeDouble:_state forKey:kHomeMusicModelState];
+    [aCoder encodeObject:_remark forKey:kHomeMusicModelRemark];
+    [aCoder encodeObject:_titleImg forKey:kHomeMusicModelTitleImg];
+    [aCoder encodeDouble:_notation forKey:kHomeMusicModelNotation];
+    [aCoder encodeObject:_musicImg forKey:kHomeMusicModelMusicImg];
+    [aCoder encodeDouble:_favoriteCount forKey:kHomeMusicModelFavoriteCount];
+    [aCoder encodeObject:_url forKey:kHomeMusicModelUrl];
+    [aCoder encodeDouble:_musicPrice forKey:kHomeMusicModelMusicPrice];
+    [aCoder encodeDouble:_sortNumber forKey:kHomeMusicModelSortNumber];
+    [aCoder encodeDouble:_exquisiteFlag forKey:kHomeMusicModelExquisiteFlag];
+    [aCoder encodeObject:_play forKey:kHomeMusicModelPlay];
+    [aCoder encodeObject:_addUserAvatar forKey:kHomeMusicModelAddUserAvatar];
+    [aCoder encodeObject:_audioType forKey:kHomeMusicModelAudioType];
+    [aCoder encodeDouble:_canEvaluate forKey:kHomeMusicModelCanEvaluate];
+    [aCoder encodeBool:_delFlag forKey:kHomeMusicModelDelFlag];
+    [aCoder encodeObject:_musicTagNames forKey:kHomeMusicModelMusicTagNames];
+    [aCoder encodeObject:_subjectNames forKey:kHomeMusicModelSubjectNames];
+    [aCoder encodeObject:_chargeType forKey:kHomeMusicModelChargeType];
+    [aCoder encodeObject:_updateTime forKey:kHomeMusicModelUpdateTime];
+    [aCoder encodeDouble:_updateBy forKey:kHomeMusicModelUpdateBy];
+    [aCoder encodeObject:_musicTag forKey:kHomeMusicModelMusicTag];
+    [aCoder encodeObject:_extConfigJson forKey:kHomeMusicModelExtConfigJson];
+    [aCoder encodeObject:_addName forKey:kHomeMusicModelAddName];
+    [aCoder encodeObject:_paymentType forKey:kHomeMusicModelPaymentType];
+    [aCoder encodeDouble:_favorite forKey:kHomeMusicModelFavorite];
+    [aCoder encodeObject:_auditStatus forKey:kHomeMusicModelAuditStatus];
+    [aCoder encodeDouble:_createBy forKey:kHomeMusicModelCreateBy];
+    [aCoder encodeObject:_accompanimentType forKey:kHomeMusicModelAccompanimentType];
+    [aCoder encodeDouble:_topFlag forKey:kHomeMusicModelTopFlag];
+    [aCoder encodeObject:_midiUrl forKey:kHomeMusicModelMidiUrl];
+    [aCoder encodeObject:_composer forKey:kHomeMusicModelComposer];
+    [aCoder encodeObject:_sourceType forKey:kHomeMusicModelSourceType];
+    [aCoder encodeObject:_firstPassAuditTime forKey:kHomeMusicModelFirstPassAuditTime];
+    [aCoder encodeObject:_mp3Type forKey:kHomeMusicModelMp3Type];
+    [aCoder encodeObject:_hotFlag forKey:kHomeMusicModelHotFlag];
+    [aCoder encodeObject:_createTime forKey:kHomeMusicModelCreateTime];
+    [aCoder encodeDouble:_playSpeed forKey:kHomeMusicModelPlaySpeed];
+    [aCoder encodeObject:_hasBeat forKey:kHomeMusicModelHasBeat];
+    [aCoder encodeObject:_audioFileUrl forKey:kHomeMusicModelAudioFileUrl];
+    [aCoder encodeObject:_reason forKey:kHomeMusicModelReason];
+    [aCoder encodeDouble:_auditVersion forKey:kHomeMusicModelAuditVersion];
+    [aCoder encodeObject:_musicSubject forKey:kHomeMusicModelMusicSubject];
+    [aCoder encodeDouble:_userId forKey:kHomeMusicModelUserId];
+    [aCoder encodeObject:_submitAuditTime forKey:kHomeMusicModelSubmitAuditTime];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    HomeMusicModel *copy = [[HomeMusicModel alloc] init];
+    
+    if (copy) {
+
+        copy.metronomeUrl = [self.metronomeUrl copyWithZone:zone];
+        copy.musicSheetName = [self.musicSheetName copyWithZone:zone];
+        copy.albumNums = self.albumNums;
+        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.xmlFileUrl = [self.xmlFileUrl copyWithZone:zone];
+        copy.showFingering = self.showFingering;
+        copy.albumSortNumber = self.albumSortNumber;
+        copy.state = self.state;
+        copy.remark = [self.remark copyWithZone:zone];
+        copy.titleImg = [self.titleImg copyWithZone:zone];
+        copy.notation = self.notation;
+        copy.musicImg = [self.musicImg copyWithZone:zone];
+        copy.favoriteCount = self.favoriteCount;
+        copy.url = [self.url copyWithZone:zone];
+        copy.musicPrice = self.musicPrice;
+        copy.sortNumber = self.sortNumber;
+        copy.exquisiteFlag = self.exquisiteFlag;
+        copy.play = [self.play copyWithZone:zone];
+        copy.addUserAvatar = [self.addUserAvatar copyWithZone:zone];
+        copy.audioType = [self.audioType copyWithZone:zone];
+        copy.canEvaluate = self.canEvaluate;
+        copy.delFlag = self.delFlag;
+        copy.musicTagNames = [self.musicTagNames copyWithZone:zone];
+        copy.subjectNames = [self.subjectNames copyWithZone:zone];
+        copy.chargeType = [self.chargeType copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.updateBy = self.updateBy;
+        copy.musicTag = [self.musicTag copyWithZone:zone];
+        copy.extConfigJson = [self.extConfigJson copyWithZone:zone];
+        copy.addName = [self.addName copyWithZone:zone];
+        copy.paymentType = [self.paymentType copyWithZone:zone];
+        copy.favorite = self.favorite;
+        copy.auditStatus = [self.auditStatus copyWithZone:zone];
+        copy.createBy = self.createBy;
+        copy.accompanimentType = [self.accompanimentType copyWithZone:zone];
+        copy.topFlag = self.topFlag;
+        copy.midiUrl = [self.midiUrl copyWithZone:zone];
+        copy.composer = [self.composer copyWithZone:zone];
+        copy.sourceType = [self.sourceType copyWithZone:zone];
+        copy.firstPassAuditTime = [self.firstPassAuditTime copyWithZone:zone];
+        copy.mp3Type = [self.mp3Type copyWithZone:zone];
+        copy.hotFlag = [self.hotFlag copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.playSpeed = self.playSpeed;
+        copy.hasBeat = [self.hasBeat copyWithZone:zone];
+        copy.audioFileUrl = [self.audioFileUrl copyWithZone:zone];
+        copy.reason = [self.reason copyWithZone:zone];
+        copy.auditVersion = self.auditVersion;
+        copy.musicSubject = [self.musicSubject copyWithZone:zone];
+        copy.userId = self.userId;
+        copy.submitAuditTime = [self.submitAuditTime copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 4 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/Model/HomeTeacherLiveModel.m

@@ -79,6 +79,10 @@ NSString *const kHomeTeacherLiveModelAvatar = @"avatar";
 - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
 {
     id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
     return [object isEqual:[NSNull null]] ? nil : object;
 }
 

+ 5 - 6
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusic.h → KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.h

@@ -1,24 +1,23 @@
 //
-//  HomeQualityMusic.h
+//  HomeNewMusicView.h
 //  KulexiuForStudent
 //
-//  Created by 王智 on 2022/9/13.
+//  Created by 王智 on 2022/10/19.
 //
 
 #import <UIKit/UIKit.h>
 
 NS_ASSUME_NONNULL_BEGIN
 
-typedef void(^HomeQualityMusicBlock)(void);
+typedef void(^HomeNewMusicActionBlock)(void);
 
-
-@interface HomeQualityMusic : UIView
+@interface HomeNewMusicView : UIView
 
 @property (weak, nonatomic) IBOutlet UIView *musicContentView;
 
 + (instancetype)shareInstance;
 
-- (void)homeMusicMore:(HomeQualityMusicBlock)callback;
+- (void)homeMusicMore:(HomeNewMusicActionBlock)callback;
 
 + (CGFloat)getViewHeight;
 

+ 9 - 9
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusic.m → KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.m

@@ -1,26 +1,26 @@
 //
-//  HomeQualityMusic.m
+//  HomeNewMusicView.m
 //  KulexiuForStudent
 //
-//  Created by 王智 on 2022/9/13.
+//  Created by 王智 on 2022/10/19.
 //
 
-#import "HomeQualityMusic.h"
+#import "HomeNewMusicView.h"
 
-@interface HomeQualityMusic ()
+@interface HomeNewMusicView ()
 
-@property (nonatomic, copy) HomeQualityMusicBlock callback;
+@property (nonatomic, copy) HomeNewMusicActionBlock callback;
 
 @end
 
-@implementation HomeQualityMusic
+@implementation HomeNewMusicView
 
 + (instancetype)shareInstance {
-    HomeQualityMusic *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeQualityMusic" owner:nil options:nil] firstObject];
+    HomeNewMusicView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeNewMusicView" owner:nil options:nil] firstObject];
     return view;
 }
 
-- (void)homeMusicMore:(HomeQualityMusicBlock)callback {
+- (void)homeMusicMore:(HomeNewMusicActionBlock)callback {
     if (callback) {
         self.callback = callback;
     }
@@ -33,7 +33,7 @@
 }
 
 + (CGFloat)getViewHeight {
-    return 304;
+    return 304.0f;
 }
 
 /*

+ 49 - 49
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusic.xib → KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeNewMusic/HomeNewMusicView.xib

@@ -1,23 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
-    <device id="retina6_1" orientation="portrait" appearance="light"/>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeQualityMusic">
-            <rect key="frame" x="0.0" y="0.0" width="414" height="304"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeNewMusicView">
+            <rect key="frame" x="0.0" y="0.0" width="390" height="308"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lPT-H8-gYH">
-                    <rect key="frame" x="355" y="32" width="45" height="18"/>
-                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fy2-nu-LBW">
+                    <rect key="frame" x="331" y="32" width="45" height="18"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="0.10000000000000001" colorSpace="calibratedRGB"/>
                     <constraints>
-                        <constraint firstAttribute="height" constant="18" id="rqo-E9-b6q"/>
+                        <constraint firstAttribute="height" constant="18" id="ydg-Ix-Mz0"/>
                     </constraints>
                     <userDefinedRuntimeAttributes>
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
@@ -25,87 +25,87 @@
                         </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                 </view>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="精品曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xtD-wk-lfc">
-                    <rect key="frame" x="24" y="30" width="73.5" height="22"/>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="最新曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6CW-e0-al3">
+                    <rect key="frame" x="24" y="30" width="73.666666666666671" height="22"/>
                     <constraints>
-                        <constraint firstAttribute="height" constant="22" id="GCx-Ai-iPi"/>
+                        <constraint firstAttribute="height" constant="22" id="ykn-Z7-imu"/>
                     </constraints>
                     <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                     <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
-                <button opaque="NO" tag="1008" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="w8u-6P-UD0">
-                    <rect key="frame" x="361" y="26" width="34" height="30"/>
+                <button opaque="NO" tag="1008" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="csk-1t-0jz">
+                    <rect key="frame" x="337" y="26" width="34" height="30"/>
                     <constraints>
-                        <constraint firstAttribute="height" constant="30" id="z8P-gp-qVr"/>
+                        <constraint firstAttribute="height" constant="30" id="M3e-Eg-6I0"/>
                     </constraints>
                     <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                     <state key="normal">
                         <color key="titleColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
                     </state>
                     <connections>
-                        <action selector="moreMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="u7G-43-8r5"/>
+                        <action selector="moreMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="ct8-zE-u5F"/>
                     </connections>
                 </button>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="更多" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hff-Ky-dYH">
-                    <rect key="frame" x="361" y="34" width="25" height="14.5"/>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="更多" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2pb-rc-jX4">
+                    <rect key="frame" x="337" y="33.666666666666664" width="25" height="14.666666666666664"/>
                     <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
+                    <color key="textColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_more" translatesAutoresizingMaskIntoConstraints="NO" id="4ND-Zx-0De">
-                    <rect key="frame" x="389" y="37" width="6" height="8"/>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_more_green" translatesAutoresizingMaskIntoConstraints="NO" id="lcO-IB-Crt">
+                    <rect key="frame" x="365" y="37" width="6" height="8"/>
                     <constraints>
-                        <constraint firstAttribute="width" constant="6" id="1cL-Os-olf"/>
-                        <constraint firstAttribute="height" constant="8" id="AA6-Yn-afz"/>
+                        <constraint firstAttribute="width" constant="6" id="Hcf-3X-Mrv"/>
+                        <constraint firstAttribute="height" constant="8" id="SAN-px-udA"/>
                     </constraints>
                 </imageView>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_left" translatesAutoresizingMaskIntoConstraints="NO" id="A0I-27-Obf">
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_left" translatesAutoresizingMaskIntoConstraints="NO" id="Gnt-En-BW7">
                     <rect key="frame" x="14" y="32" width="4" height="18"/>
                     <constraints>
-                        <constraint firstAttribute="width" constant="4" id="tUz-af-bVs"/>
-                        <constraint firstAttribute="height" constant="18" id="x0h-NC-fZU"/>
+                        <constraint firstAttribute="height" constant="18" id="B5g-ev-PbH"/>
+                        <constraint firstAttribute="width" constant="4" id="Jx9-Q2-wT3"/>
                     </constraints>
                 </imageView>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fx6-Fa-y4K">
-                    <rect key="frame" x="0.0" y="64" width="414" height="240"/>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="csN-Ie-7a8">
+                    <rect key="frame" x="0.0" y="68" width="390" height="240"/>
                     <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                     <constraints>
-                        <constraint firstAttribute="height" constant="240" id="iKE-PR-OQe"/>
+                        <constraint firstAttribute="height" constant="240" id="MyF-Wi-MeL"/>
                     </constraints>
                 </view>
             </subviews>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
-                <constraint firstItem="hff-Ky-dYH" firstAttribute="centerY" secondItem="xtD-wk-lfc" secondAttribute="centerY" id="1gj-B1-ja3"/>
-                <constraint firstItem="4ND-Zx-0De" firstAttribute="centerY" secondItem="xtD-wk-lfc" secondAttribute="centerY" id="7l9-L0-3Uz"/>
-                <constraint firstItem="xtD-wk-lfc" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="30" id="AD4-Jl-yII"/>
-                <constraint firstItem="hff-Ky-dYH" firstAttribute="leading" secondItem="lPT-H8-gYH" secondAttribute="leading" constant="6" id="IE2-Rp-Rds"/>
-                <constraint firstAttribute="trailing" secondItem="lPT-H8-gYH" secondAttribute="trailing" constant="14" id="IwF-RJ-ca2"/>
-                <constraint firstAttribute="trailing" secondItem="fx6-Fa-y4K" secondAttribute="trailing" id="V8J-iY-IKF"/>
-                <constraint firstItem="w8u-6P-UD0" firstAttribute="centerY" secondItem="xtD-wk-lfc" secondAttribute="centerY" id="VUh-lm-mOL"/>
-                <constraint firstItem="4ND-Zx-0De" firstAttribute="leading" secondItem="hff-Ky-dYH" secondAttribute="trailing" constant="3" id="YPP-aj-QAe"/>
-                <constraint firstItem="A0I-27-Obf" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="a4e-J3-6Dc"/>
-                <constraint firstItem="fx6-Fa-y4K" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="hqs-f6-oXc"/>
-                <constraint firstItem="hff-Ky-dYH" firstAttribute="leading" secondItem="w8u-6P-UD0" secondAttribute="leading" id="i2q-4t-g9I"/>
-                <constraint firstItem="lPT-H8-gYH" firstAttribute="centerY" secondItem="hff-Ky-dYH" secondAttribute="centerY" id="i6d-23-f5H"/>
-                <constraint firstItem="xtD-wk-lfc" firstAttribute="centerY" secondItem="A0I-27-Obf" secondAttribute="centerY" id="jJn-Gv-pq4"/>
-                <constraint firstItem="4ND-Zx-0De" firstAttribute="trailing" secondItem="lPT-H8-gYH" secondAttribute="trailing" constant="-5" id="k7K-QU-8B2"/>
-                <constraint firstItem="xtD-wk-lfc" firstAttribute="leading" secondItem="A0I-27-Obf" secondAttribute="trailing" constant="6" id="lAX-HW-Nos"/>
-                <constraint firstItem="4ND-Zx-0De" firstAttribute="trailing" secondItem="w8u-6P-UD0" secondAttribute="trailing" id="uiR-an-LoO"/>
-                <constraint firstItem="fx6-Fa-y4K" firstAttribute="top" secondItem="xtD-wk-lfc" secondAttribute="bottom" constant="12" id="xbb-eK-wFh"/>
+                <constraint firstItem="fy2-nu-LBW" firstAttribute="centerY" secondItem="2pb-rc-jX4" secondAttribute="centerY" id="AWf-kl-zgq"/>
+                <constraint firstItem="6CW-e0-al3" firstAttribute="centerY" secondItem="Gnt-En-BW7" secondAttribute="centerY" id="BaT-WH-9yM"/>
+                <constraint firstAttribute="trailing" secondItem="fy2-nu-LBW" secondAttribute="trailing" constant="14" id="C4h-mj-8Jc"/>
+                <constraint firstItem="lcO-IB-Crt" firstAttribute="trailing" secondItem="csk-1t-0jz" secondAttribute="trailing" id="FJn-ed-iAe"/>
+                <constraint firstItem="lcO-IB-Crt" firstAttribute="trailing" secondItem="fy2-nu-LBW" secondAttribute="trailing" constant="-5" id="H4r-bu-SAz"/>
+                <constraint firstItem="csN-Ie-7a8" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="K1Y-fg-RQv"/>
+                <constraint firstItem="Gnt-En-BW7" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="Mgl-Vu-HI9"/>
+                <constraint firstItem="lcO-IB-Crt" firstAttribute="leading" secondItem="2pb-rc-jX4" secondAttribute="trailing" constant="3" id="PVy-22-561"/>
+                <constraint firstItem="csN-Ie-7a8" firstAttribute="top" secondItem="csk-1t-0jz" secondAttribute="bottom" constant="12" id="Puf-fP-R0z"/>
+                <constraint firstAttribute="trailing" secondItem="csN-Ie-7a8" secondAttribute="trailing" id="WCb-7V-4Xm"/>
+                <constraint firstItem="6CW-e0-al3" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="30" id="a2j-vq-f2z"/>
+                <constraint firstItem="2pb-rc-jX4" firstAttribute="centerY" secondItem="6CW-e0-al3" secondAttribute="centerY" id="b6v-h7-2c0"/>
+                <constraint firstItem="2pb-rc-jX4" firstAttribute="leading" secondItem="csk-1t-0jz" secondAttribute="leading" id="dx0-PV-TnS"/>
+                <constraint firstItem="6CW-e0-al3" firstAttribute="leading" secondItem="Gnt-En-BW7" secondAttribute="trailing" constant="6" id="fI8-yL-qTO"/>
+                <constraint firstItem="2pb-rc-jX4" firstAttribute="leading" secondItem="fy2-nu-LBW" secondAttribute="leading" constant="6" id="i1k-cJ-1as"/>
+                <constraint firstItem="lcO-IB-Crt" firstAttribute="centerY" secondItem="6CW-e0-al3" secondAttribute="centerY" id="jG3-Lk-KHu"/>
+                <constraint firstItem="csk-1t-0jz" firstAttribute="centerY" secondItem="6CW-e0-al3" secondAttribute="centerY" id="lrP-rE-aW8"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>
             <nil key="simulatedBottomBarMetrics"/>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
-                <outlet property="musicContentView" destination="fx6-Fa-y4K" id="8dC-xz-C7v"/>
+                <outlet property="musicContentView" destination="csN-Ie-7a8" id="97f-Jb-JoE"/>
             </connections>
-            <point key="canvasLocation" x="131.8840579710145" y="-122.54464285714285"/>
+            <point key="canvasLocation" x="101.53846153846153" y="-56.872037914691937"/>
         </view>
     </objects>
     <resources>
         <image name="home_left" width="4" height="12"/>
-        <image name="home_more" width="6" height="8"/>
+        <image name="home_more_green" width="5" height="8"/>
     </resources>
 </document>

+ 26 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.h

@@ -0,0 +1,26 @@
+//
+//  HomeRecommendMusicView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2022/10/19.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^HomeRecommendMusicActionBlock)(void);
+
+@interface HomeRecommendMusicView : UIView
+
+@property (weak, nonatomic) IBOutlet UIView *musicContentView;
+
++ (instancetype)shareInstance;
+
+- (void)homeMusicMore:(HomeRecommendMusicActionBlock)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 48 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.m

@@ -0,0 +1,48 @@
+//
+//  HomeRecommendMusicView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2022/10/19.
+//
+
+#import "HomeRecommendMusicView.h"
+
+@interface HomeRecommendMusicView ()
+
+@property (nonatomic, strong) HomeRecommendMusicActionBlock callback;
+
+@end
+
+@implementation HomeRecommendMusicView
+
++ (instancetype)shareInstance {
+    HomeRecommendMusicView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeRecommendMusicView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)homeMusicMore:(HomeRecommendMusicActionBlock)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)moreMusic:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
++ (CGFloat)getViewHeight {
+    return 304.0f;
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 111 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeRecommendMusic/HomeRecommendMusicView.xib

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeRecommendMusicView">
+            <rect key="frame" x="0.0" y="0.0" width="390" height="308"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gSD-Yz-KRC">
+                    <rect key="frame" x="331" y="32" width="45" height="18"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="0.10000000000000001" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="18" id="kBH-qS-EqY"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="9"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="推荐曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Gb-9V-Vs2">
+                    <rect key="frame" x="24" y="30" width="73.666666666666671" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="22" id="j7f-c1-B4o"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
+                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <button opaque="NO" tag="1008" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0Ql-Fk-cYb">
+                    <rect key="frame" x="337" y="26" width="34" height="30"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="30" id="t0v-AC-yCX"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <state key="normal">
+                        <color key="titleColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
+                    </state>
+                    <connections>
+                        <action selector="moreMusic:" destination="iN0-l3-epB" eventType="touchUpInside" id="nbh-dJ-kNs"/>
+                    </connections>
+                </button>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="更多" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mli-0b-3pS">
+                    <rect key="frame" x="337" y="33.666666666666664" width="25" height="14.666666666666664"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                    <color key="textColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_more_green" translatesAutoresizingMaskIntoConstraints="NO" id="IEk-2m-N7I">
+                    <rect key="frame" x="365" y="37" width="6" height="8"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="6" id="byI-Z3-gT0"/>
+                        <constraint firstAttribute="height" constant="8" id="qoy-h5-4Bu"/>
+                    </constraints>
+                </imageView>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_left" translatesAutoresizingMaskIntoConstraints="NO" id="Te8-hi-wDF">
+                    <rect key="frame" x="14" y="32" width="4" height="18"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="18" id="0nb-Nj-2lG"/>
+                        <constraint firstAttribute="width" constant="4" id="g6O-Mb-yas"/>
+                    </constraints>
+                </imageView>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sOs-N5-Dh3">
+                    <rect key="frame" x="0.0" y="68" width="390" height="240"/>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="240" id="J92-zM-Vmh"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="Mli-0b-3pS" firstAttribute="leading" secondItem="0Ql-Fk-cYb" secondAttribute="leading" id="6pf-y6-Wao"/>
+                <constraint firstItem="Mli-0b-3pS" firstAttribute="centerY" secondItem="4Gb-9V-Vs2" secondAttribute="centerY" id="7BW-Dc-nmW"/>
+                <constraint firstItem="gSD-Yz-KRC" firstAttribute="centerY" secondItem="Mli-0b-3pS" secondAttribute="centerY" id="837-8X-pmv"/>
+                <constraint firstItem="Te8-hi-wDF" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="8cI-bD-Tsc"/>
+                <constraint firstItem="IEk-2m-N7I" firstAttribute="leading" secondItem="Mli-0b-3pS" secondAttribute="trailing" constant="3" id="9Qa-kh-8Ez"/>
+                <constraint firstItem="IEk-2m-N7I" firstAttribute="trailing" secondItem="gSD-Yz-KRC" secondAttribute="trailing" constant="-5" id="AKW-PK-EIG"/>
+                <constraint firstItem="4Gb-9V-Vs2" firstAttribute="leading" secondItem="Te8-hi-wDF" secondAttribute="trailing" constant="6" id="EPn-Mj-O3D"/>
+                <constraint firstAttribute="trailing" secondItem="gSD-Yz-KRC" secondAttribute="trailing" constant="14" id="JMj-P1-q8L"/>
+                <constraint firstItem="4Gb-9V-Vs2" firstAttribute="centerY" secondItem="Te8-hi-wDF" secondAttribute="centerY" id="Pj3-mD-xum"/>
+                <constraint firstItem="4Gb-9V-Vs2" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="30" id="Pt2-sD-VP8"/>
+                <constraint firstItem="IEk-2m-N7I" firstAttribute="centerY" secondItem="4Gb-9V-Vs2" secondAttribute="centerY" id="TpR-es-wzb"/>
+                <constraint firstItem="Mli-0b-3pS" firstAttribute="leading" secondItem="gSD-Yz-KRC" secondAttribute="leading" constant="6" id="VFz-yi-c52"/>
+                <constraint firstItem="sOs-N5-Dh3" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Yn3-lz-qgY"/>
+                <constraint firstAttribute="trailing" secondItem="sOs-N5-Dh3" secondAttribute="trailing" id="ZKj-Zg-Isk"/>
+                <constraint firstItem="IEk-2m-N7I" firstAttribute="trailing" secondItem="0Ql-Fk-cYb" secondAttribute="trailing" id="crv-Dd-v7v"/>
+                <constraint firstItem="0Ql-Fk-cYb" firstAttribute="centerY" secondItem="4Gb-9V-Vs2" secondAttribute="centerY" id="goy-VI-GLl"/>
+                <constraint firstItem="sOs-N5-Dh3" firstAttribute="top" secondItem="0Ql-Fk-cYb" secondAttribute="bottom" constant="12" id="ljt-Ui-TI9"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="musicContentView" destination="sOs-N5-Dh3" id="ara-7Z-J8V"/>
+            </connections>
+            <point key="canvasLocation" x="101.53846153846153" y="-82.464454976303315"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="home_left" width="4" height="12"/>
+        <image name="home_more_green" width="5" height="8"/>
+    </resources>
+</document>

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicCellView.h

@@ -6,7 +6,7 @@
 //
 
 #import <UIKit/UIKit.h>
-#import "HomeHotMusicModel.h"
+#import "HomeMusicModel.h"
 
 typedef void(^HotMusicDetailBlock)(NSString * _Nonnull songId);
 
@@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (instancetype)shareInstance;
 
-- (void)configWithMusicModel:(HomeHotMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(HotMusicDetailBlock)callback;
+- (void)configWithMusicModel:(HomeMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(HotMusicDetailBlock)callback;
 
 @end
 

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicCellView.m

@@ -19,7 +19,7 @@
 
 @property (nonatomic, copy) HotMusicDetailBlock callback;
 
-@property (nonatomic, strong) HomeHotMusicModel *model;
+@property (nonatomic, strong) HomeMusicModel *model;
 
 @property (weak, nonatomic) IBOutlet UIImageView *qualityMusicTag;
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *qualityTagWidth;
@@ -36,7 +36,7 @@
     return view;
 }
 
-- (void)configWithMusicModel:(HomeHotMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(HotMusicDetailBlock)callback {
+- (void)configWithMusicModel:(HomeMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(HotMusicDetailBlock)callback {
     if (callback) {
         self.callback = callback;
     }

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicView.m

@@ -33,7 +33,7 @@
 }
 
 + (CGFloat)getViewHeight {
-    return 304;
+    return 304.0f;
 }
 /*
 // Only override drawRect: if you perform custom drawing.

+ 5 - 7
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HotMusic/HomeHotMusicView.xib

@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -26,7 +25,7 @@
                         </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                 </view>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="热曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="t7j-WY-6gF">
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="热曲目" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="t7j-WY-6gF">
                     <rect key="frame" x="24" y="30" width="73.5" height="22"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="22" id="5Zd-6z-MkK"/>
@@ -76,13 +75,12 @@
                     </constraints>
                 </view>
             </subviews>
-            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
                 <constraint firstItem="2OG-Ff-YNg" firstAttribute="leading" secondItem="3Up-TV-A6N" secondAttribute="leading" id="3IU-bV-Bwj"/>
-                <constraint firstItem="5PX-DV-Tle" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="4lU-fp-zTR"/>
+                <constraint firstItem="5PX-DV-Tle" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="4lU-fp-zTR"/>
                 <constraint firstItem="2OG-Ff-YNg" firstAttribute="leading" secondItem="aLQ-YK-tTY" secondAttribute="leading" constant="6" id="4mW-s8-Ipb"/>
-                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="aLQ-YK-tTY" secondAttribute="trailing" constant="14" id="4xK-PM-d0A"/>
+                <constraint firstAttribute="trailing" secondItem="aLQ-YK-tTY" secondAttribute="trailing" constant="14" id="4xK-PM-d0A"/>
                 <constraint firstItem="RXl-RQ-VTX" firstAttribute="trailing" secondItem="3Up-TV-A6N" secondAttribute="trailing" id="8dG-Ih-dcP"/>
                 <constraint firstItem="t7j-WY-6gF" firstAttribute="leading" secondItem="DQd-nL-Wor" secondAttribute="trailing" constant="6" id="987-JH-aK9"/>
                 <constraint firstItem="5PX-DV-Tle" firstAttribute="top" secondItem="t7j-WY-6gF" secondAttribute="bottom" constant="12" id="9L4-j0-7Ud"/>
@@ -94,7 +92,7 @@
                 <constraint firstItem="aLQ-YK-tTY" firstAttribute="centerY" secondItem="2OG-Ff-YNg" secondAttribute="centerY" id="WuF-B0-7jc"/>
                 <constraint firstItem="RXl-RQ-VTX" firstAttribute="trailing" secondItem="aLQ-YK-tTY" secondAttribute="trailing" constant="-5" id="aJ8-A6-XsG"/>
                 <constraint firstItem="DQd-nL-Wor" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="e2G-Q7-sFN"/>
-                <constraint firstItem="5PX-DV-Tle" firstAttribute="trailing" secondItem="vUN-kp-3ea" secondAttribute="trailing" id="qak-uV-tbh"/>
+                <constraint firstItem="5PX-DV-Tle" firstAttribute="trailing" secondItem="iN0-l3-epB" secondAttribute="trailing" id="qak-uV-tbh"/>
                 <constraint firstItem="2OG-Ff-YNg" firstAttribute="centerY" secondItem="t7j-WY-6gF" secondAttribute="centerY" id="x6Q-2j-qka"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>

+ 0 - 23
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.h

@@ -1,23 +0,0 @@
-//
-//  HomeQualityMusicCellView.h
-//  KulexiuForStudent
-//
-//  Created by 王智 on 2022/9/13.
-//
-
-#import <UIKit/UIKit.h>
-#import "HomeHotMusicModel.h"
-
-typedef void(^QualityMusicDetailBlock)(NSString * _Nonnull songId);
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface HomeQualityMusicCellView : UIView
-
-+ (instancetype)shareInstance;
-
-- (void)configWithMusicModel:(HomeHotMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(QualityMusicDetailBlock)callback;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 166
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.m

@@ -1,166 +0,0 @@
-//
-//  HomeQualityMusicCellView.m
-//  KulexiuForStudent
-//
-//  Created by 王智 on 2022/9/13.
-//
-
-#import "HomeQualityMusicCellView.h"
-
-@interface HomeQualityMusicCellView ()
-
-@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
-@property (weak, nonatomic) IBOutlet UIView *statusView;
-@property (weak, nonatomic) IBOutlet UILabel *songNameLabel;
-@property (weak, nonatomic) IBOutlet UILabel *songAuth;
-@property (weak, nonatomic) IBOutlet UILabel *uploadName;
-
-@property (weak, nonatomic) IBOutlet UIView *tagView;
-@property (weak, nonatomic) IBOutlet UIView *lineView;
-
-@property (nonatomic, copy) QualityMusicDetailBlock callback;
-
-@property (nonatomic, strong) HomeHotMusicModel *model;
-
-@end
-
-@implementation HomeQualityMusicCellView
-
-
-+ (instancetype)shareInstance {
-    HomeQualityMusicCellView *view = [[[NSBundle mainBundle] loadNibNamed:@"HomeQualityMusicCellView" owner:nil options:nil] firstObject];
-    return view;
-}
-
-- (void)configWithMusicModel:(HomeHotMusicModel *)sourceModel hiddenLineView:(BOOL)hideLineView callback:(QualityMusicDetailBlock)callback {
-    if (callback) {
-        self.callback = callback;
-    }
-    self.model = sourceModel;
-    if ([NSString isEmptyString:sourceModel.musicSheetName]) {
-        self.songNameLabel.text = @"";
-    }
-    else {
-        NSString *musicName = @"";
-        if (sourceModel.musicSheetName.length > 10) {
-            musicName = [NSString stringWithFormat:@"%@...",[sourceModel.musicSheetName substringToIndex:9]];
-        }
-        else {
-            musicName = sourceModel.musicSheetName;
-        }
-        self.songNameLabel.text = musicName;
-    }
-    if ([NSString isEmptyString:sourceModel.composer]) {
-        self.songAuth.text = @"";
-    }
-    else {
-        NSString *songAuth = @"";
-        if (sourceModel.composer.length > 4) {
-            songAuth = [NSString stringWithFormat:@"-%@...",[sourceModel.composer substringToIndex:4]];
-        }
-        else {
-            songAuth = [NSString stringWithFormat:@"-%@",sourceModel.composer];
-        }
-        self.songAuth.text = songAuth;
-    }
-    NSArray *tagArray = nil;
-    if (![NSString isEmptyString:sourceModel.subjectNames]) {
-        tagArray = [sourceModel.subjectNames componentsSeparatedByString:@","];
-    }
-    
-    NSString *owner = @"";
-    if ([NSString isEmptyString:sourceModel.addName]) {
-        owner = [NSString stringWithFormat:@"上传者:游客%.0f",sourceModel.userId];
-    }
-    else {
-        owner = sourceModel.addName;
-        if (sourceModel.addName.length > 4) {
-            owner = [NSString stringWithFormat:@"上传者:%@...",[sourceModel.addName substringToIndex:4]];
-        }
-        else {
-            owner = [NSString stringWithFormat:@"上传者:%@",sourceModel.addName];
-        }
-    }
-    self.uploadName.text = owner;
-
-    CGFloat maxWidth = [self getTagViewMaxWidth:owner];
-    [self configTagViewWithTagArray:tagArray maxWidth:maxWidth];
-    self.lineView.hidden = hideLineView;
-    
-    if ([sourceModel.chargeType isEqualToString:@"VIP"]) {
-        self.statusView.layer.borderColor = HexRGB(0xCD863E).CGColor;
-        self.statusLabel.text = @"会员";
-        self.statusLabel.textColor = HexRGB(0xCD863E);
-    }
-    else if ([sourceModel.chargeType isEqualToString:@"CHARGE"]) {
-        self.statusView.layer.borderColor = HexRGB(0x3591CE).CGColor;
-        self.statusLabel.text = @"点播";
-        self.statusLabel.textColor = HexRGB(0x3591CE);
-    }
-    else {
-        self.statusView.layer.borderColor = HexRGB(0x01B84F).CGColor;
-        self.statusLabel.text = @"免费";
-        self.statusLabel.textColor = HexRGB(0x01B84F);
-    }
-}
-
-- (CGFloat)getTagViewMaxWidth:(NSString *)teacherName {
-    CGFloat width = [self getStringWidthInLabel:teacherName font:[UIFont systemFontOfSize:12.0f]];
-    return kScreenWidth*0.83 - 48 - width - 12;
-}
-
-- (void)configTagViewWithTagArray:(NSArray *)tagArray maxWidth:(CGFloat)maxWidth {
-    [self.tagView removeAllSubViews];
-    CGFloat width = maxWidth;
-    CGFloat xSpace = 0.0f;
-    for (NSInteger i = 0; i < tagArray.count; i++) {
-        NSString *tagString = tagArray[i];
-        CGFloat labelWidth = [self getStringWidthInLabel:tagString font:[UIFont systemFontOfSize:10.0f]];
-        CGFloat viewWidth = labelWidth + 10;
-        if (xSpace + viewWidth > width) {
-            return;
-        }
-        CGRect frame = CGRectMake(xSpace, 0, viewWidth, 16.0f);
-        [self createTagLabelViewWithName:tagString frame:frame];
-        xSpace += (viewWidth + 5);
-    }
-}
-
-- (CGFloat)getStringWidthInLabel:(NSString *)tagString font:(UIFont *)font {
-    CGFloat width = [tagString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 16.0f) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size.width+1;
-    return width;
-}
-
-- (void)createTagLabelViewWithName:(NSString *)name frame:(CGRect)frame {
-    UIView *bgView = [[UIView alloc] initWithFrame:frame];
-    bgView.backgroundColor = HexRGB(0xEFFBF9);
-    bgView.layer.cornerRadius = 8.0f;
-    [self.tagView addSubview:bgView];
-    
-    UILabel *tagLabel = [[UILabel alloc] init];
-    tagLabel.text = name;
-    tagLabel.textColor = THEMECOLOR;
-    tagLabel.font = [UIFont systemFontOfSize:10.0f];
-    tagLabel.textAlignment = NSTextAlignmentCenter;
-    [bgView addSubview:tagLabel];
-    [tagLabel mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.mas_equalTo(bgView.mas_left).offset(5);
-        make.right.mas_equalTo(bgView.mas_right).offset(-5);
-        make.top.bottom.mas_equalTo(bgView);
-    }];
-}
-- (IBAction)buttonAction:(id)sender {
-    if (self.callback) {
-        NSString *songId = [NSString stringWithFormat:@"%.0f",self.model.internalBaseClassIdentifier];
-        self.callback(songId);
-    }
-}
-/*
-// Only override drawRect: if you perform custom drawing.
-// An empty implementation adversely affects performance during animation.
-- (void)drawRect:(CGRect)rect {
-    // Drawing code
-}
-*/
-
-@end

+ 0 - 154
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCellView.xib

@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
-    <device id="retina6_1" orientation="portrait" appearance="light"/>
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
-        <capability name="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="HomeQualityMusicCellView">
-            <rect key="frame" x="0.0" y="0.0" width="414" height="76"/>
-            <autoresizingMask key="autoresizingMask"/>
-            <subviews>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="-周杰伦" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bMh-Ig-EXo">
-                    <rect key="frame" x="169" y="11" width="43" height="15"/>
-                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
-                    <nil key="highlightedColor"/>
-                </label>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="enw-Zc-6ly">
-                    <rect key="frame" x="11" y="75.5" width="390" height="0.5"/>
-                    <color key="backgroundColor" red="0.90980392160000001" green="0.90980392160000001" blue="0.90980392160000001" alpha="1" colorSpace="calibratedRGB"/>
-                    <constraints>
-                        <constraint firstAttribute="height" constant="0.5" id="ffG-qD-zRD"/>
-                    </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="ooE-dG-95h">
-                    <rect key="frame" x="11" y="40.5" width="123" height="15"/>
-                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
-                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
-                    <nil key="highlightedColor"/>
-                </label>
-                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="最伟大的作品" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lOd-BK-RpK">
-                    <rect key="frame" x="66" y="8.5" width="98" height="20"/>
-                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
-                    <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="calibratedRGB"/>
-                    <nil key="highlightedColor"/>
-                </label>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ezP-fo-Bd0">
-                    <rect key="frame" x="146" y="40" width="220" height="16"/>
-                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-                    <constraints>
-                        <constraint firstAttribute="height" constant="16" id="75t-8f-cek"/>
-                    </constraints>
-                </view>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jKC-KV-7YE">
-                    <rect key="frame" x="11" y="10" width="31" height="17"/>
-                    <subviews>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="免费" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dAJ-DA-DwA">
-                            <rect key="frame" x="5" y="1" width="21" height="14"/>
-                            <constraints>
-                                <constraint firstAttribute="height" constant="14" id="M1C-DA-m9J"/>
-                            </constraints>
-                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="10"/>
-                            <color key="textColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
-                            <nil key="highlightedColor"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                    <real key="value" value="4"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                        </label>
-                    </subviews>
-                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                    <constraints>
-                        <constraint firstAttribute="trailing" secondItem="dAJ-DA-DwA" secondAttribute="trailing" constant="5" id="74Q-AP-Va1"/>
-                        <constraint firstItem="dAJ-DA-DwA" firstAttribute="top" secondItem="jKC-KV-7YE" secondAttribute="top" constant="1" id="Mu5-cn-6Cj"/>
-                        <constraint firstAttribute="bottom" secondItem="dAJ-DA-DwA" secondAttribute="bottom" constant="2" id="NzK-AH-7RJ"/>
-                        <constraint firstAttribute="width" constant="31" id="Vwl-t7-akm"/>
-                        <constraint firstItem="dAJ-DA-DwA" firstAttribute="leading" secondItem="jKC-KV-7YE" secondAttribute="leading" constant="5" id="wfG-Nz-FIc"/>
-                    </constraints>
-                    <userDefinedRuntimeAttributes>
-                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                            <real key="value" value="4"/>
-                        </userDefinedRuntimeAttribute>
-                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
-                            <real key="value" value="1"/>
-                        </userDefinedRuntimeAttribute>
-                    </userDefinedRuntimeAttributes>
-                </view>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="home_music_play" translatesAutoresizingMaskIntoConstraints="NO" id="Gee-ao-VvB">
-                    <rect key="frame" x="371" y="26" width="24" height="24"/>
-                    <constraints>
-                        <constraint firstAttribute="width" constant="24" id="P0u-bD-AJp"/>
-                        <constraint firstAttribute="height" constant="24" id="TtK-xA-5DI"/>
-                    </constraints>
-                </imageView>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="quality_tag" translatesAutoresizingMaskIntoConstraints="NO" id="oej-cG-7t5">
-                    <rect key="frame" x="47" y="10" width="14" height="17"/>
-                    <constraints>
-                        <constraint firstAttribute="width" constant="14" id="Kle-GR-r8s"/>
-                        <constraint firstAttribute="height" constant="17" id="nZC-ud-pC9"/>
-                    </constraints>
-                </imageView>
-                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YDh-qy-4zR">
-                    <rect key="frame" x="0.0" y="0.0" width="414" height="76"/>
-                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
-                    <connections>
-                        <action selector="buttonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="as6-4S-4Tg"/>
-                    </connections>
-                </button>
-            </subviews>
-            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-            <constraints>
-                <constraint firstItem="lOd-BK-RpK" firstAttribute="centerY" secondItem="jKC-KV-7YE" secondAttribute="centerY" id="0Gc-uo-cn9"/>
-                <constraint firstAttribute="bottom" secondItem="YDh-qy-4zR" secondAttribute="bottom" id="5qF-hs-bvd"/>
-                <constraint firstItem="Gee-ao-VvB" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="61L-GU-EMs"/>
-                <constraint firstItem="ezP-fo-Bd0" firstAttribute="centerY" secondItem="ooE-dG-95h" secondAttribute="centerY" id="7dY-hB-AFe"/>
-                <constraint firstItem="ooE-dG-95h" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="11" id="7zN-kf-VRL"/>
-                <constraint firstAttribute="trailing" secondItem="enw-Zc-6ly" secondAttribute="trailing" constant="13" id="97n-rJ-kOK"/>
-                <constraint firstItem="ooE-dG-95h" firstAttribute="top" secondItem="lOd-BK-RpK" secondAttribute="bottom" constant="12" id="BGR-2w-rcI"/>
-                <constraint firstItem="lOd-BK-RpK" firstAttribute="leading" secondItem="oej-cG-7t5" secondAttribute="trailing" constant="5" id="CUS-LP-wWr"/>
-                <constraint firstItem="enw-Zc-6ly" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="11" id="Epj-gl-jOP"/>
-                <constraint firstItem="YDh-qy-4zR" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Ja4-dV-KwW"/>
-                <constraint firstAttribute="trailing" secondItem="YDh-qy-4zR" secondAttribute="trailing" id="QMx-PT-siH"/>
-                <constraint firstItem="bMh-Ig-EXo" firstAttribute="centerY" secondItem="lOd-BK-RpK" secondAttribute="centerY" id="Rsb-fE-N6e"/>
-                <constraint firstItem="ezP-fo-Bd0" firstAttribute="leading" secondItem="ooE-dG-95h" secondAttribute="trailing" constant="12" id="Sl7-ct-Oxa"/>
-                <constraint firstItem="YDh-qy-4zR" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="T8F-eW-soQ"/>
-                <constraint firstItem="Gee-ao-VvB" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="bMh-Ig-EXo" secondAttribute="trailing" constant="10" id="Toa-wC-w1H"/>
-                <constraint firstItem="jKC-KV-7YE" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="cRQ-EO-Crg"/>
-                <constraint firstItem="oej-cG-7t5" firstAttribute="centerY" secondItem="jKC-KV-7YE" secondAttribute="centerY" id="f8u-zC-Y9L"/>
-                <constraint firstItem="bMh-Ig-EXo" firstAttribute="leading" secondItem="lOd-BK-RpK" secondAttribute="trailing" constant="5" id="hLd-6k-q1I"/>
-                <constraint firstItem="jKC-KV-7YE" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="11" id="heC-iE-kkj"/>
-                <constraint firstAttribute="bottom" secondItem="enw-Zc-6ly" secondAttribute="bottom" id="kbn-HE-kEb"/>
-                <constraint firstItem="oej-cG-7t5" firstAttribute="leading" secondItem="jKC-KV-7YE" secondAttribute="trailing" constant="5" id="pAM-Oo-8N9"/>
-                <constraint firstItem="Gee-ao-VvB" firstAttribute="leading" secondItem="ezP-fo-Bd0" secondAttribute="trailing" constant="5" id="pfM-UG-4Bf"/>
-                <constraint firstAttribute="trailing" secondItem="Gee-ao-VvB" secondAttribute="trailing" constant="19" id="y4W-Sv-SPn"/>
-            </constraints>
-            <nil key="simulatedTopBarMetrics"/>
-            <nil key="simulatedBottomBarMetrics"/>
-            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
-            <connections>
-                <outlet property="lineView" destination="enw-Zc-6ly" id="nhX-K3-ze4"/>
-                <outlet property="songAuth" destination="bMh-Ig-EXo" id="zNe-oZ-AtU"/>
-                <outlet property="songNameLabel" destination="lOd-BK-RpK" id="zCb-DL-R8W"/>
-                <outlet property="statusLabel" destination="dAJ-DA-DwA" id="x7Z-ju-8Y9"/>
-                <outlet property="statusView" destination="jKC-KV-7YE" id="QFY-7g-Bdg"/>
-                <outlet property="tagView" destination="ezP-fo-Bd0" id="MxV-R3-5Yi"/>
-                <outlet property="uploadName" destination="ooE-dG-95h" id="lTE-8T-VdF"/>
-            </connections>
-            <point key="canvasLocation" x="131.8840579710145" y="-198.88392857142856"/>
-        </view>
-    </objects>
-    <resources>
-        <image name="home_music_play" width="24" height="24"/>
-        <image name="quality_tag" width="14" height="17"/>
-        <systemColor name="systemBackgroundColor">
-            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
-    </resources>
-</document>

+ 0 - 19
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.h

@@ -1,19 +0,0 @@
-//
-//  HomeQualityMusicCollectionCell.h
-//  KulexiuForStudent
-//
-//  Created by 王智 on 2022/9/13.
-//
-
-#import <UIKit/UIKit.h>
-#import "HomeQualityMusicCellView.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface HomeQualityMusicCollectionCell : UICollectionViewCell
-
-- (void)configWithSourceArray:(NSMutableArray *)songArray callback:(QualityMusicDetailBlock)callback;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 62
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.m

@@ -1,62 +0,0 @@
-//
-//  HomeQualityMusicCollectionCell.m
-//  KulexiuForStudent
-//
-//  Created by 王智 on 2022/9/13.
-//
-
-#import "HomeQualityMusicCollectionCell.h"
-
-@interface HomeQualityMusicCollectionCell ()
-
-@property (weak, nonatomic) IBOutlet UIView *containerView;
-
-@property (nonatomic, copy) QualityMusicDetailBlock callback;
-
-@end
-
-@implementation HomeQualityMusicCollectionCell
-
-- (void)awakeFromNib {
-    [super awakeFromNib];
-    // Initialization code
-    
-    CAGradientLayer *layer = [self createGradientLayerFromColor:HexRGB(0xFFF4EC) startPoint:CGPointMake(0.5, 0) endColor:HexRGB(0xFFFDFB) endPoint:CGPointMake(0.5, 1) bounds:CGRectMake(0, 0, KPortraitWidth * 0.83, 240)];
-    layer.cornerRadius = 10.0f;
-    layer.masksToBounds = YES;
-    [self.containerView.layer addSublayer:layer];
-}
-
-- (CAGradientLayer *)createGradientLayerFromColor:(UIColor *)fromColor startPoint:(CGPoint)startPoint endColor:(UIColor *)endColor endPoint:(CGPoint)endPoint bounds:(CGRect)bounds {
-    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
-    gradientLayer.colors = @[(__bridge id)fromColor.CGColor, (__bridge id)endColor.CGColor];
-    gradientLayer.startPoint = startPoint;
-    gradientLayer.endPoint = endPoint;
-    gradientLayer.frame = bounds;
-    gradientLayer.locations = @[@(0),@(1.0f)];
-    return gradientLayer;
-}
-
-- (void)configWithSourceArray:(NSMutableArray *)songArray callback:(QualityMusicDetailBlock)callback {
-    if (callback) {
-        self.callback = callback;
-    }
-    [self.containerView removeAllSubViews];
-    CGFloat width = KPortraitWidth * 0.83;
-    for (NSInteger i = 0; i < songArray.count; i++) {
-        // 添加按钮
-        HomeQualityMusicCellView *cell = [HomeQualityMusicCellView shareInstance];
-        cell.frame = CGRectMake(0, 80 * i, width, 80);
-        BOOL hideLineView = i == songArray.count - 1 ? YES : NO;
-        MJWeakSelf;
-        [cell configWithMusicModel:songArray[i] hiddenLineView:hideLineView callback:^(NSString * _Nonnull songId) {
-            if (weakSelf.callback) {
-                weakSelf.callback(songId);
-            }
-        }];
-        [self.containerView addSubview:cell];
-    }
-    
-}
-
-@end

+ 0 - 57
KulexiuForStudent/KulexiuForStudent/Module/Home/View/QualityMusic/HomeQualityMusicCollectionCell.xib

@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
-    <device id="retina6_1" orientation="portrait" appearance="light"/>
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <objects>
-        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
-        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="HomeQualityMusicCollectionCell">
-            <rect key="frame" x="0.0" y="0.0" width="283" height="215"/>
-            <autoresizingMask key="autoresizingMask"/>
-            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
-                <rect key="frame" x="0.0" y="0.0" width="283" height="215"/>
-                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                <subviews>
-                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nES-5a-lQe">
-                        <rect key="frame" x="0.0" y="0.0" width="283" height="215"/>
-                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-                        <userDefinedRuntimeAttributes>
-                            <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
-                                <size key="value" width="0.0" height="2"/>
-                            </userDefinedRuntimeAttribute>
-                            <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
-                                <color key="value" red="0.8980392157" green="0.8980392157" blue="0.8980392157" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="calibratedRGB"/>
-                            </userDefinedRuntimeAttribute>
-                            <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
-                                <real key="value" value="1"/>
-                            </userDefinedRuntimeAttribute>
-                            <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
-                                <real key="value" value="2"/>
-                            </userDefinedRuntimeAttribute>
-                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                <real key="value" value="10"/>
-                            </userDefinedRuntimeAttribute>
-                        </userDefinedRuntimeAttributes>
-                    </view>
-                </subviews>
-            </view>
-            <viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
-            <constraints>
-                <constraint firstAttribute="bottom" secondItem="nES-5a-lQe" secondAttribute="bottom" id="WCC-Kn-8Og"/>
-                <constraint firstItem="nES-5a-lQe" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="X5c-4T-rDj"/>
-                <constraint firstItem="nES-5a-lQe" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="ewL-RL-8Ll"/>
-                <constraint firstAttribute="trailing" secondItem="nES-5a-lQe" secondAttribute="trailing" id="qyi-0y-TNA"/>
-            </constraints>
-            <size key="customSize" width="283" height="215"/>
-            <connections>
-                <outlet property="containerView" destination="nES-5a-lQe" id="JDf-wS-K7C"/>
-            </connections>
-            <point key="canvasLocation" x="300.72463768115944" y="130.24553571428572"/>
-        </collectionViewCell>
-    </objects>
-</document>

+ 12 - 12
KulexiuForStudent/KulexiuForStudent/Module/Live/Controller/LiveVideoRoomViewController.m

@@ -530,8 +530,8 @@ static int clickPraiseBtnTimes  = 0;
             [seatArray addObject:user.userId];
         }
     }
-    if (self.micStatus == MICSTATUS_CONNECTING && ![seatArray containsObject:UserDefault(UIDKey)]) {
-        [seatArray addObject:UserDefault(UIDKey)];
+    if (self.micStatus == MICSTATUS_CONNECTING && ![seatArray containsObject:UserDefault(RongCloudID)]) {
+        [seatArray addObject:UserDefault(RongCloudID)];
     }
     
     if (seatArray.count) {
@@ -1211,7 +1211,7 @@ static int clickPraiseBtnTimes  = 0;
     SEATRESPONSE type = isApprove ? SEATRESPONSE_AUDIENCEAPPROVE : SEATRESPONSE_AUDIENCEREJECT;
     KSLiveChatroomSeatResponse *responseMessage = [[KSLiveChatroomSeatResponse alloc] init];
     responseMessage.type = type;
-    responseMessage.audienceId = UserDefault(UIDKey);
+    responseMessage.audienceId = UserDefault(RongCloudID);
     responseMessage.audienceName = UserDefault(NicknameKey);
     MJWeakSelf;
     [self sendMessage:responseMessage displayMessage:YES callback:^(BOOL success) {
@@ -1351,7 +1351,7 @@ static int clickPraiseBtnTimes  = 0;
                 }
                 else if ([rcMessage.content isMemberOfClass:[KSLiveChatroomWelcome class]]) {
                     //  过滤自己发送的欢迎消息
-                    if ([rcMessage.senderUserId isEqualToString:UserDefault(UIDKey)]) {
+                    if ([rcMessage.senderUserId isEqualToString:UserDefault(RongCloudID)]) {
                         return;
                     }
 //                    if ([rcMessage.senderUserId isEqual:self.createrId]) { // 如果是老师 重置连麦申请状态
@@ -1373,7 +1373,7 @@ static int clickPraiseBtnTimes  = 0;
                 }
                 else if ([rcMessage.content isMemberOfClass:[KSLiveChatroomKickOut class]]) {
                     KSLiveChatroomKickOut *kickMessage = (KSLiveChatroomKickOut *)rcMessage.content;
-                    NSString *currentUserId = UserDefault(UIDKey);
+                    NSString *currentUserId = UserDefault(RongCloudID);
                     if ([kickMessage.targetId isEqualToString:currentUserId]) {
                         __blockSelf.micStatus = MICSTATUS_NOMAL;
                         [__blockSelf kickOutLiveRoom];
@@ -1410,7 +1410,7 @@ static int clickPraiseBtnTimes  = 0;
                 else if ([rcMessage.content isMemberOfClass:[KSLiveChatroomSeatApply class]]) {
                     KSLiveChatroomSeatApply *seatApplyMessage = (KSLiveChatroomSeatApply *)rcMessage.content;
                     // 只处理和自己相关的消息
-                    if (![seatApplyMessage.audienceId isEqualToString:UserDefault(UIDKey)]) {
+                    if (![seatApplyMessage.audienceId isEqualToString:UserDefault(RongCloudID)]) {
                         // 刷新麦序
                         return;
                     }
@@ -1433,7 +1433,7 @@ static int clickPraiseBtnTimes  = 0;
                 // 连麦回复消息(暂不处理)
                 else if ([rcMessage.content isMemberOfClass:[KSLiveChatroomSeatResponse class]]) {
                     KSLiveChatroomSeatResponse *seatResponseMessage = (KSLiveChatroomSeatResponse *)rcMessage.content;
-                    if (![seatResponseMessage.audienceId isEqualToString:UserDefault(UIDKey)]) { // 只处理和自己相关的消息
+                    if (![seatResponseMessage.audienceId isEqualToString:UserDefault(RongCloudID)]) { // 只处理和自己相关的消息
                         return;
                     }
                     if (seatResponseMessage.type == SEATRESPONSE_TEACHERAPPROVE && __blockSelf.micStatus == MICSTATUS_WAITING) { //
@@ -1488,14 +1488,14 @@ static int clickPraiseBtnTimes  = 0;
                 }
                 else if ([rcMessage.content isMemberOfClass:[KSLiveBlockUser class]]) { // 黑名单
                     KSLiveBlockUser *blockMessage = (KSLiveBlockUser *)rcMessage.content;
-                    if ([blockMessage.userId isEqualToString:UserDefault(UIDKey)]) {
+                    if ([blockMessage.userId isEqualToString:UserDefault(RongCloudID)]) {
                         __blockSelf.blacklistFlag = YES;
                         [__blockSelf resetConnectionStatus];
                     }
                 }
                 else if ([rcMessage.content isMemberOfClass:[KSLiveUnBlockUser class]]) {
                     KSLiveUnBlockUser *unBlockMessage = (KSLiveUnBlockUser *)rcMessage.content;
-                    if ([unBlockMessage.userId isEqualToString:UserDefault(UIDKey)]) {
+                    if ([unBlockMessage.userId isEqualToString:UserDefault(RongCloudID)]) {
                         __blockSelf.blacklistFlag = NO;
                     }
                 }
@@ -1576,7 +1576,7 @@ static int clickPraiseBtnTimes  = 0;
             RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_CHATROOM targetId:__weakself.roomId direction:MessageDirection_SEND content:messageContent];
             message.content.senderUserInfo = [RCIM sharedRCIM].currentUserInfo;
             
-            message.senderUserId = UserDefault(UIDKey);
+            message.senderUserId = UserDefault(RongCloudID);
             if (displayMessage) {
                 [__weakself appendAndDisplayMessage:message];
             }
@@ -1724,7 +1724,7 @@ static int clickPraiseBtnTimes  = 0;
     SEATHANDLE type = isApply ? SEATHANDLE_APPLY : SEATHANDLE_CANCELAPPLY;
     KSLiveChatroomSeatApply *applyMessage = [[KSLiveChatroomSeatApply alloc] init];
     applyMessage.type = type;
-    applyMessage.audienceId = UserDefault(UIDKey);
+    applyMessage.audienceId = UserDefault(RongCloudID);
     applyMessage.audienceName = UserDefault(NicknameKey);
     applyMessage.audienceAvatar = UserDefault(AvatarUrlKey);
     applyMessage.teacherId = self.createrId;
@@ -2253,7 +2253,7 @@ static int clickPraiseBtnTimes  = 0;
 
 - (void)sendDownSeatMessage {
     KSLiveChatroomDownSeat *downSeatMessage = [[KSLiveChatroomDownSeat alloc] init];
-    downSeatMessage.audienceId = UserDefault(UIDKey);
+    downSeatMessage.audienceId = UserDefault(RongCloudID);
     downSeatMessage.audienceName = UserDefault(NicknameKey);
     MJWeakSelf;
     [self sendMessage:downSeatMessage displayMessage:NO callback:^(BOOL success) {