فهرست منبع

1.首页专辑切换
2.课件缓存
3.缓存清理
4.UI样式修改。

Steven 11 ماه پیش
والد
کامیت
c2a55ff984
39فایلهای تغییر یافته به همراه1349 افزوده شده و 115 حذف شده
  1. 38 4
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForStudent/KulexiuForStudent.xcodeproj/xcshareddata/xcschemes/KulexiuForStudent.xcscheme
  3. 2 2
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/Contents.json
  4. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/albumChoosed_img@2x.png
  5. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/albumChoosed_img@3x.png
  6. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/Contents.json
  7. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/albumSwitch_title@2x.png
  8. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/albumSwitch_title@3x.png
  9. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/darkPage_switch.imageset/darkPage_switch@2x.png
  10. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/darkPage_switch.imageset/darkPage_switch@3x.png
  11. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/Contents.json
  12. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/tenant_homeSwitch@2x.png
  13. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/tenant_homeSwitch@3x.png
  14. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_logo.imageset/tenant_logo@2x.png
  15. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_logo.imageset/tenant_logo@3x.png
  16. 18 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h
  17. 28 2
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m
  18. 2 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/LoginManger/KSLoginManager.m
  19. 3 0
      KulexiuForStudent/KulexiuForStudent/Common/Define/UserKeyHeader.h
  20. 171 53
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Controller/TenantDarkViewController.m
  21. 47 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Model/GroupAlbumModel.h
  22. 250 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Model/GroupAlbumModel.m
  23. 4 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.h
  24. 59 1
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.m
  25. 58 14
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.xib
  26. 19 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.h
  27. 70 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.m
  28. 107 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.xib
  29. 32 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.h
  30. 172 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.m
  31. 79 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.xib
  32. 21 1
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/Controller/INSSettingViewController.m
  33. 1 0
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.h
  34. 1 1
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.m
  35. 61 8
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.xib
  36. 2 2
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/InstitutionMineBodyView.xib
  37. 1 0
      KulexiuForStudent/KulexiuForStudent/Module/Chat/View/ChatAddressBodyView.m
  38. 58 26
      KulexiuForStudent/KulexiuForStudent/ToolKit/KSToolLibrary.framework/Headers/VoNetWorking.h
  39. BIN
      KulexiuForStudent/KulexiuForStudent/ToolKit/KSToolLibrary.framework/KSToolLibrary

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

@@ -177,6 +177,8 @@
 		27F9033C27E87FE100C08A19 /* MineBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27F9033B27E87FE100C08A19 /* MineBodyView.xib */; };
 		7ED0E7B1704A93EF8D10E5E6 /* libPods-KulexiuForStudent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 75A6EF369C91D11DAF0A6D45 /* libPods-KulexiuForStudent.a */; };
 		AD7BEC2B25F75B750CC7F1DD /* libPods-KulexiuForStudentTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C2692D619D5966546A5F19 /* libPods-KulexiuForStudentTests.a */; };
+		BC0078712BCD17ED0076CD22 /* GroupAlbumModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC00786F2BCD17EC0076CD22 /* GroupAlbumModel.m */; };
+		BC0078732BCE59210076CD22 /* KSToolLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC0078722BCE59210076CD22 /* KSToolLibrary.framework */; };
 		BC00A6612BB58FDC00231B74 /* LLPhotoBrowse.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BC00A65F2BB58FDB00231B74 /* LLPhotoBrowse.bundle */; };
 		BC00A6622BB58FDC00231B74 /* WMPlayer.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BC00A6602BB58FDC00231B74 /* WMPlayer.bundle */; };
 		BC0212F727FC4A080040569F /* SubjectImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0212F527FC4A080040569F /* SubjectImageCell.m */; };
@@ -373,7 +375,6 @@
 		BC31BF312B21925700F7D538 /* IACircleSliderThumbLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BC31BF062B21925700F7D538 /* IACircleSliderThumbLayer.m */; };
 		BC31BF322B21925700F7D538 /* WidgetSpeedView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC31BF072B21925700F7D538 /* WidgetSpeedView.m */; };
 		BC31BF332B21925700F7D538 /* WidgetBottomButtonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC31BF092B21925700F7D538 /* WidgetBottomButtonView.xib */; };
-		BC3300062BBAB0E2003D4921 /* KSToolLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC3300052BBAB0E2003D4921 /* KSToolLibrary.framework */; };
 		BC3300182BBAB623003D4921 /* CoursewareDownloadManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300122BBAB623003D4921 /* CoursewareDownloadManager.m */; };
 		BC3300192BBAB623003D4921 /* KnowledgePointListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300142BBAB623003D4921 /* KnowledgePointListModel.m */; };
 		BC33001A2BBAB623003D4921 /* MaterialList.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300162BBAB623003D4921 /* MaterialList.m */; };
@@ -655,6 +656,10 @@
 		BC8C2C612823F57100FBA5D5 /* MyAddressListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8C2C562823F57100FBA5D5 /* MyAddressListCell.xib */; };
 		BC8C2C7E28265D8E00FBA5D5 /* KSNewsAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C7C28265D8D00FBA5D5 /* KSNewsAlert.m */; };
 		BC8C2C7F28265D8E00FBA5D5 /* KSNewsAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8C2C7D28265D8E00FBA5D5 /* KSNewsAlert.xib */; };
+		BC98527C2BCCC56C008F0435 /* AlbumSwitchView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC98527B2BCCC56C008F0435 /* AlbumSwitchView.m */; };
+		BC98527E2BCCC571008F0435 /* AlbumSwitchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC98527D2BCCC571008F0435 /* AlbumSwitchView.xib */; };
+		BC9852822BCCC821008F0435 /* AlbumSwitchCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9852812BCCC821008F0435 /* AlbumSwitchCell.xib */; };
+		BC9852832BCCC821008F0435 /* AlbumSwitchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9852802BCCC821008F0435 /* AlbumSwitchCell.m */; };
 		BC9AA0B52ABC1C2400CD954D /* GroupQuitAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9AA0B42ABC1C2400CD954D /* GroupQuitAlert.m */; };
 		BC9AA0B72ABC1C2A00CD954D /* GroupQuitAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9AA0B62ABC1C2A00CD954D /* GroupQuitAlert.xib */; };
 		BC9AA0BA2ABC288000CD954D /* ChatComplainBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9AA0B92ABC288000CD954D /* ChatComplainBottomView.m */; };
@@ -1301,6 +1306,9 @@
 		95C2692D619D5966546A5F19 /* libPods-KulexiuForStudentTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-KulexiuForStudentTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		9D4193415CEED1E4C1E2D929 /* Pods-KulexiuForStudent.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KulexiuForStudent.dev.xcconfig"; path = "Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent.dev.xcconfig"; sourceTree = "<group>"; };
 		AA1C681F4E10FA17C7F2DB87 /* Pods-KulexiuForStudentTests.test.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KulexiuForStudentTests.test.xcconfig"; path = "Target Support Files/Pods-KulexiuForStudentTests/Pods-KulexiuForStudentTests.test.xcconfig"; sourceTree = "<group>"; };
+		BC00786F2BCD17EC0076CD22 /* GroupAlbumModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupAlbumModel.m; sourceTree = "<group>"; };
+		BC0078702BCD17ED0076CD22 /* GroupAlbumModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupAlbumModel.h; sourceTree = "<group>"; };
+		BC0078722BCE59210076CD22 /* KSToolLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KSToolLibrary.framework; sourceTree = "<group>"; };
 		BC00A65F2BB58FDB00231B74 /* LLPhotoBrowse.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = LLPhotoBrowse.bundle; sourceTree = "<group>"; };
 		BC00A6602BB58FDC00231B74 /* WMPlayer.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = WMPlayer.bundle; sourceTree = "<group>"; };
 		BC0212F427FC4A080040569F /* SubjectImageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubjectImageCell.h; sourceTree = "<group>"; };
@@ -1644,7 +1652,6 @@
 		BC31BF0A2B21925700F7D538 /* WidgetNavView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetNavView.h; sourceTree = "<group>"; };
 		BC31BF0B2B21925700F7D538 /* WidgetFunctionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetFunctionView.h; sourceTree = "<group>"; };
 		BC31BF0C2B21925700F7D538 /* WidgetDotView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetDotView.h; sourceTree = "<group>"; };
-		BC3300052BBAB0E2003D4921 /* KSToolLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KSToolLibrary.framework; sourceTree = "<group>"; };
 		BC3300112BBAB623003D4921 /* CoursewareDownloadManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoursewareDownloadManager.h; sourceTree = "<group>"; };
 		BC3300122BBAB623003D4921 /* CoursewareDownloadManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoursewareDownloadManager.m; sourceTree = "<group>"; };
 		BC3300132BBAB623003D4921 /* KnowledgePointListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KnowledgePointListModel.h; sourceTree = "<group>"; };
@@ -2054,6 +2061,12 @@
 		BC8C2C7B28265D8D00FBA5D5 /* KSNewsAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSNewsAlert.h; sourceTree = "<group>"; };
 		BC8C2C7C28265D8D00FBA5D5 /* KSNewsAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSNewsAlert.m; sourceTree = "<group>"; };
 		BC8C2C7D28265D8E00FBA5D5 /* KSNewsAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSNewsAlert.xib; sourceTree = "<group>"; };
+		BC98527A2BCCC56C008F0435 /* AlbumSwitchView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlbumSwitchView.h; sourceTree = "<group>"; };
+		BC98527B2BCCC56C008F0435 /* AlbumSwitchView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AlbumSwitchView.m; sourceTree = "<group>"; };
+		BC98527D2BCCC571008F0435 /* AlbumSwitchView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumSwitchView.xib; sourceTree = "<group>"; };
+		BC98527F2BCCC821008F0435 /* AlbumSwitchCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlbumSwitchCell.h; sourceTree = "<group>"; };
+		BC9852802BCCC821008F0435 /* AlbumSwitchCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AlbumSwitchCell.m; sourceTree = "<group>"; };
+		BC9852812BCCC821008F0435 /* AlbumSwitchCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumSwitchCell.xib; sourceTree = "<group>"; };
 		BC9AA0B32ABC1C2400CD954D /* GroupQuitAlert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroupQuitAlert.h; sourceTree = "<group>"; };
 		BC9AA0B42ABC1C2400CD954D /* GroupQuitAlert.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroupQuitAlert.m; sourceTree = "<group>"; };
 		BC9AA0B62ABC1C2A00CD954D /* GroupQuitAlert.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GroupQuitAlert.xib; sourceTree = "<group>"; };
@@ -2539,7 +2552,7 @@
 				BCFEE1932AD15C0E000E888F /* SoundpipeAudioKit in Frameworks */,
 				BC3A556D2BAA7B1A002E1616 /* CloudAccompanyLibrary.framework in Frameworks */,
 				BCFEE18D2AD15BD4000E888F /* AudioKitEX in Frameworks */,
-				BC3300062BBAB0E2003D4921 /* KSToolLibrary.framework in Frameworks */,
+				BC0078732BCE59210076CD22 /* KSToolLibrary.framework in Frameworks */,
 				BC8B6E152856E20800866917 /* WebKit.framework in Frameworks */,
 				BC8A45CB283DDEA100094BBB /* AVFoundation.framework in Frameworks */,
 				BCD9294F28F8FCA4006793E4 /* AudioKit in Frameworks */,
@@ -4179,6 +4192,8 @@
 				BCF425F62AB991E600BCD942 /* TenantAlbumModel.m */,
 				BCB5B2CF2ABAFE8E005BF25D /* HomeMusicSheetLayout.h */,
 				BCB5B2D02ABAFE8E005BF25D /* HomeMusicSheetLayout.m */,
+				BC0078702BCD17ED0076CD22 /* GroupAlbumModel.h */,
+				BC00786F2BCD17EC0076CD22 /* GroupAlbumModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -4186,6 +4201,7 @@
 		BC2932E32AAEC15E0024D98E /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC9852792BCCC55A008F0435 /* TenantSwitchAlbum */,
 				BCCE95DF2AB053E700AB6385 /* MoreMusicPage */,
 				BC2932EC2AAEC3AA0024D98E /* InstitutionNomalNavView.h */,
 				BC2932ED2AAEC3AA0024D98E /* InstitutionNomalNavView.m */,
@@ -4615,7 +4631,7 @@
 				BC00A65F2BB58FDB00231B74 /* LLPhotoBrowse.bundle */,
 				BC00A6602BB58FDC00231B74 /* WMPlayer.bundle */,
 				BC3A556A2BAA7B1A002E1616 /* CloudAccompanyLibrary.framework */,
-				BC3300052BBAB0E2003D4921 /* KSToolLibrary.framework */,
+				BC0078722BCE59210076CD22 /* KSToolLibrary.framework */,
 				BC3A55682BAA7B19002E1616 /* KSTunerLibrary.framework */,
 				BC3BF62F2B9EAFC800831494 /* client.p12 */,
 			);
@@ -5368,6 +5384,19 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC9852792BCCC55A008F0435 /* TenantSwitchAlbum */ = {
+			isa = PBXGroup;
+			children = (
+				BC98527A2BCCC56C008F0435 /* AlbumSwitchView.h */,
+				BC98527B2BCCC56C008F0435 /* AlbumSwitchView.m */,
+				BC98527D2BCCC571008F0435 /* AlbumSwitchView.xib */,
+				BC98527F2BCCC821008F0435 /* AlbumSwitchCell.h */,
+				BC9852802BCCC821008F0435 /* AlbumSwitchCell.m */,
+				BC9852812BCCC821008F0435 /* AlbumSwitchCell.xib */,
+			);
+			path = TenantSwitchAlbum;
+			sourceTree = "<group>";
+		};
 		BC9AA0D72ABC434900CD954D /* LoadingManager */ = {
 			isa = PBXGroup;
 			children = (
@@ -6574,6 +6603,7 @@
 				BCB574EC2BC4D643005EE78F /* cloudCourse_Ani.json in Resources */,
 				BCC583BF28A9EC6400BAB4CF /* cloud_animation_18.png in Resources */,
 				BC31BF332B21925700F7D538 /* WidgetBottomButtonView.xib in Resources */,
+				BC9852822BCCC821008F0435 /* AlbumSwitchCell.xib in Resources */,
 				BCCE95F42AB05F3D00AB6385 /* TenantHotAlbumCell.xib in Resources */,
 				BC8B641728F3B5B300A08D16 /* KSAwardAlertView.xib in Resources */,
 				BC71D265288804CD0010F14B /* img_55.png in Resources */,
@@ -6645,6 +6675,7 @@
 				BCFDA63128BC99410022B497 /* HomeBannerView.xib in Resources */,
 				BC31BF112B21925700F7D538 /* tick.wav in Resources */,
 				BC11927B280FB07F00A716F7 /* AccompanyArrangeCell.xib in Resources */,
+				BC98527E2BCCC571008F0435 /* AlbumSwitchView.xib in Resources */,
 				BCCE95C92AB0363100AB6385 /* TenantDarkSearhView.xib in Resources */,
 				BC40B9FF281177BD00DEC0D1 /* HomeInformationCell.xib in Resources */,
 				BC31BF2E2B21925700F7D538 /* WidgetDotView.xib in Resources */,
@@ -6870,6 +6901,7 @@
 				2723B68327F15D3D00E0B90B /* ModifyViewController.m in Sources */,
 				BCF425F72AB991E600BCD942 /* TenantAlbumModel.m in Sources */,
 				BC106C062A933829000759A9 /* TXLiveMessageStatSync.m in Sources */,
+				BC0078712BCD17ED0076CD22 /* GroupAlbumModel.m in Sources */,
 				BC43CAC92A88C9570011EB5D /* KSTXGroupChatViewController.m in Sources */,
 				275FA1DA27E7351900CFEA2E /* KSNetworkingManager.m in Sources */,
 				BC8A45B0283DC33400094BBB /* CloudHelpView.m in Sources */,
@@ -7167,6 +7199,7 @@
 				BCC0F6072A8CD86C00C4EFA4 /* TXClassroomMsgCenter.m in Sources */,
 				BCC0F6E62A8CE24400C4EFA4 /* WhiteUtils.m in Sources */,
 				275FA1E127E7351900CFEA2E /* KSTabBarViewController.m in Sources */,
+				BC98527C2BCCC56C008F0435 /* AlbumSwitchView.m in Sources */,
 				BC11926B280FAF5900A716F7 /* AccompanyAlertView.m in Sources */,
 				BCC0F66C2A8CD8F500C4EFA4 /* TXClassTitleView.m in Sources */,
 				BC31BF0E2B21925700F7D538 /* ToneTuningViewController.m in Sources */,
@@ -7225,6 +7258,7 @@
 				275FA23B27E7356B00CFEA2E /* PasswordBodyView.m in Sources */,
 				BCB9090B2852EE9600F5FF69 /* KSLiveWebViewController.m in Sources */,
 				BC2932F82AAEC46B0024D98E /* InstitutionMineBodyView.m in Sources */,
+				BC9852832BCCC821008F0435 /* AlbumSwitchCell.m in Sources */,
 				BCC0F6AA2A8CDD4000C4EFA4 /* RolePortraitView.m in Sources */,
 				BCC0F6682A8CD8F500C4EFA4 /* KSDanInputBarControl.m in Sources */,
 				BC106C3E2A9338F6000759A9 /* TXLiveForceKickMsg.m in Sources */,

+ 1 - 1
KulexiuForStudent/KulexiuForStudent.xcodeproj/xcshareddata/xcschemes/KulexiuForStudent.xcscheme

@@ -51,7 +51,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "TEST"
+      buildConfiguration = "DEV"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/darkPage_switch.imageset/Contents.json → KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "darkPage_switch@2x.png",
+      "filename" : "albumChoosed_img@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "darkPage_switch@3x.png",
+      "filename" : "albumChoosed_img@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/albumChoosed_img@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumChoosed_img.imageset/albumChoosed_img@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/albumSwitch_title@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/albumSwitch_title.imageset/albumSwitch_title@3x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/darkPage_switch.imageset/darkPage_switch@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/darkPage_switch.imageset/darkPage_switch@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/tenant_homeSwitch@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_homeSwitch.imageset/tenant_homeSwitch@3x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_logo.imageset/tenant_logo@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Institution/Home/tenant_logo.imageset/tenant_logo@3x.png


+ 18 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h

@@ -893,6 +893,24 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)userTenantAlbumRecordRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+// tenantGroupAlbum/buyAlbumInfo
+
+/// 查询学生可购买专辑信息
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)userTenantAlbumListRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-student/tenantGroupAlbum/buyAlbumInfoDetail
+
+
+/// 查询专辑详情
+/// @param get get
+/// @param tenantAlbumId 专辑id'
+/// @param success 成功
+/// @param faliure 失败
++ (void)userBuyAlbumInfoDetailRequest:(NSString *)get tenantAlbumId:(NSString *)tenantAlbumId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 /// 查询配置客服电话和手机号
 /// @param post post
 /// @param success 成功

+ 28 - 2
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m

@@ -97,7 +97,7 @@
  */
 + (void)request:(NSString *)post andWithUrl:(NSString *)myUrl and:(id)parm success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     __block NSDictionary *dic;
-//    NSLog(@"----url ------%@",myUrl);
+    NSLog(@"----url ------%@",myUrl);
 #pragma mark  ----- 签名
 //    parm = [NSString signToMD5:parm];
 //    NSLog(@"%@",[parm mj_JSONString]);
@@ -164,7 +164,7 @@
             return ;
             
         } failBlock:^(NSError *error) {
-//            NSLog(@"%@",error.description);
+            NSLog(@"%@",error.description);
             faliure(error);
             if (error.code == -1001) {
                 [self showMessage:@"网络请求超时"];
@@ -1760,6 +1760,32 @@
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
+/// 查询学生可购买专辑信息
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)userTenantAlbumListRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-student/tenantGroupAlbum/buyAlbumInfo"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-student/tenantGroupAlbum/buyAlbumInfoDetail
+
+
+/// 查询专辑详情
+/// @param get get
+/// @param tenantAlbumId 专辑id'
+/// @param success 成功
+/// @param faliure 失败
++ (void)userBuyAlbumInfoDetailRequest:(NSString *)get tenantAlbumId:(NSString *)tenantAlbumId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-student/tenantGroupAlbum/buyAlbumInfoDetail"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:tenantAlbumId forKey:@"tenantAlbumId"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 /// 查询配置客服电话和手机号
 /// @param post post
 /// @param success 成功

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/LoginManger/KSLoginManager.m

@@ -67,6 +67,8 @@
     [[NSUserDefaults standardUserDefaults] removeObjectForKey:RefreshToken];
     [[NSUserDefaults standardUserDefaults] removeObjectForKey:IM_TOKEN];
     [[NSUserDefaults standardUserDefaults] removeObjectForKey:TENANT_ID];
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:TENANT_ALBUMID];
+
     // 返回登录页面
     UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
     if ([vc isKindOfClass:[UITabBarController class]]) {

+ 3 - 0
KulexiuForStudent/KulexiuForStudent/Common/Define/UserKeyHeader.h

@@ -107,4 +107,7 @@
 
 #define A4_FREQUENCE_INTABLE (440.0)
 
+
+#define TENANT_ALBUMID (@"TENANT_ALBUMID")
+
 #endif /* UserKeyHeader_h */

+ 171 - 53
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Controller/TenantDarkViewController.m

@@ -18,6 +18,7 @@
 #import "TenantTicketAlert.h"
 #import "AppDelegate+AppService.h"
 #import "TenantAlbumModel.h"
+#import "AlbumSwitchView.h"
 
 @interface TenantDarkViewController ()<TYCyclePagerViewDelegate, TYCyclePagerViewDataSource>
 
@@ -45,10 +46,16 @@
 
 @property (nonatomic, assign) BOOL isFirstLoad;
 
-@property (nonatomic, assign) NSInteger tenantAlbumStatus; // 专辑状态
+@property (nonatomic, assign) BOOL tenantAlbumStatus; // 当前专辑状态 是否可用
 
 @property (nonatomic, strong) NSMutableArray *sourceArray; // 分类数据
 
+@property (nonatomic, assign) NSInteger albumCount; // 专辑数量
+
+@property (nonatomic, strong) NSString *chooseAlbumId; // 选择的专辑编号
+
+@property (nonatomic, strong) NSMutableArray *albumListArray; // 专辑数据
+
 @end
 
 @implementation TenantDarkViewController
@@ -65,10 +72,11 @@
     [self configUI];
     self.isFirstLoad = YES;
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:@"appDidBecomeActive" object:nil];
+    self.chooseAlbumId = UserDefault(TENANT_ALBUMID);
 }
 
 - (void)didBecomeActive {
-    if (self.tenantAlbumStatus == 0) {
+    if (self.sourceArray.count == 0) {
         [self.emptyAniView startPlay];
     }
     else {
@@ -167,49 +175,24 @@
 - (void)requestData {
     
     dispatch_group_enter(self.requestGroup);
-    [KSNetworkingManager userTenantAlbumRecordRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
+    [KSNetworkingManager userTenantAlbumListRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
         dispatch_group_leave(self.requestGroup);
+        
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
-            NSDictionary *parm = [dic ks_dictionaryValueForKey:@"data"];
-            self.tenantAlbumStatus = [parm ks_integerValueForKey:@"tenantAlbumStatus"];
-            NSInteger subjectCount = [parm ks_integerValueForKey:@"subjectCounts"];
-            NSInteger musicCount = [parm ks_integerValueForKey:@"musicCounts"];
-            NSInteger ensembleCount = [parm ks_integerValueForKey:@"ensembleCounts"];
-            NSMutableArray *sourceArray = [NSMutableArray array];
-            NSMutableArray *aniArray = [NSMutableArray array];
-            // 声部
-            if (subjectCount > 0) {
-                TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
-                model.subjectType = @"SUBJECT";
-                [sourceArray addObject:model];
-                [aniArray addObject:@"subject_Ani.json"];
-            }
-            
-            // 独奏
-            if (musicCount > 0) {
-                TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
-                model.subjectType = @"MUSIC";
-                [sourceArray addObject:model];
-                [aniArray addObject:@"singleMusic_Ani.json"];
-            }
-            
-            // 合奏
-            if (ensembleCount > 0) {
-                TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
-                model.subjectType = @"ENSEMBLE";
-                [sourceArray addObject:model];
-                [aniArray addObject:@"mutiMusic_Ani.json"];
+            NSArray *albumList = [dic ks_arrayValueForKey:@"data"];
+            NSMutableArray *list = [NSMutableArray array];
+            for (NSDictionary *parm in albumList) {
+                GroupAlbumModel *model = [[GroupAlbumModel alloc] initWithDictionary:parm];
+                [list addObject:model];
             }
-            self.sourceArray = [NSMutableArray arrayWithArray:sourceArray];
-            self.animationNameArray = [NSMutableArray arrayWithArray:aniArray];
+            self.albumListArray = [NSMutableArray arrayWithArray:list];
         }
         else {
-            
             [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
         }
+        
     } faliure:^(NSError * _Nonnull error) {
         dispatch_group_leave(self.requestGroup);
-        
     }];
 }
 
@@ -222,15 +205,91 @@
     self.emptyAniView.hidden = YES;
     [self.emptyAniView stopPlay];
 }
+
 - (void)refreshView {
     self.navView.tenantName.text = [NSString returnNoNullStringWithString:self.mineInfo.tenantName];
-    if (self.tenantAlbumStatus == 0) {
+    self.albumCount = self.albumListArray.count;
+    // 有专辑数据
+    if (self.albumListArray.count > 0) {
+        // 如果没有选择专辑 取第一个
+        GroupAlbumModel *displayModel = nil;
+        if ([NSString isEmptyString:self.chooseAlbumId]) {
+            GroupAlbumModel *model = self.albumListArray[0];
+            displayModel = model;
+        }
+        else {
+            // 数据处理
+            for (GroupAlbumModel *model in self.albumListArray) {
+                if ([self.chooseAlbumId isEqualToString:model.internalBaseClassIdentifier]) {
+                    displayModel = model;
+                }
+            }
+            if (displayModel == nil) {
+                GroupAlbumModel *model = self.albumListArray[0];
+                displayModel = model;
+            }
+        }
+        
+        [self refreshWithModel:displayModel];
+    }
+    else { // 空
+        self.sourceArray = [NSMutableArray array];
+        self.animationNameArray = [NSMutableArray array];
         [self showEmptyView];
         [self.pagerView reloadData];
     }
-    else {
+}
+
+- (void)refreshWithModel:(GroupAlbumModel *)displayModel {
+    
+    self.chooseAlbumId = displayModel.internalBaseClassIdentifier;
+    UserDefaultSet(self.chooseAlbumId, TENANT_ALBUMID);
+    
+    self.tenantAlbumStatus = displayModel.status;
+    [self.navView configAlbumName:displayModel.name];
+    NSMutableArray *sourceArray = [NSMutableArray array];
+    NSMutableArray *aniArray = [NSMutableArray array];
+    // 声部
+    if (displayModel.subjectCounts > 0) {
+        TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
+        model.subjectType = @"SUBJECT";
+        [sourceArray addObject:model];
+        [aniArray addObject:@"subject_Ani.json"];
+    }
+    
+    // 独奏
+    if (displayModel.musicCounts > 0) {
+        TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
+        model.subjectType = @"MUSIC";
+        [sourceArray addObject:model];
+        [aniArray addObject:@"singleMusic_Ani.json"];
+    }
+    
+    // 合奏
+    if (displayModel.ensembleCounts > 0) {
+        TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
+        model.subjectType = @"ENSEMBLE";
+        [sourceArray addObject:model];
+        [aniArray addObject:@"mutiMusic_Ani.json"];
+    }
+    
+    // COURSEWARE
+    if (displayModel.coursewareCounts > 0) {
+        TenantAlbumModel *model = [[TenantAlbumModel alloc] init];
+        model.subjectType = @"COURSEWARE";
+        [sourceArray addObject:model];
+        [aniArray addObject:@"cloudCourse_Ani.json"];
+    }
+    
+    self.sourceArray = [NSMutableArray arrayWithArray:sourceArray];
+    self.animationNameArray = [NSMutableArray arrayWithArray:aniArray];
+    [self.pagerView reloadData];
+    
+    if (self.sourceArray.count > 0) {
         [self hideEmptyView];
-        [self.pagerView reloadData];
+    }
+    else {
+        [self showEmptyView];
     }
 }
 
@@ -286,16 +345,11 @@
 
 #pragma mark ------ TYCyclePagerViewDataSource
 - (NSInteger)numberOfItemsInPagerView:(TYCyclePagerView *)pageView {
-    if (self.tenantAlbumStatus > 0) {
-        return self.sourceArray.count;
-    }
-    else {
-        return 0;
-    }
+    return self.sourceArray.count;
 }
 
 - (__kindof UICollectionViewCell *)pagerView:(TYCyclePagerView *)pagerView cellForItemAtIndex:(NSInteger)index {
-    BOOL isLock = self.tenantAlbumStatus == 1 ? YES : NO;
+    BOOL isLock = self.tenantAlbumStatus == YES ? NO : YES;
     TenantHomeSubjectListCell *cell = [pagerView dequeueReusableCellWithReuseIdentifier:@"TenantHomeSubjectListCell" forIndex:index];
     [cell configWithJsonSting:self.animationNameArray[index] isLock:isLock];
     if (pagerView.curIndex == index) {
@@ -317,26 +371,33 @@
     layout.itemSpacing = 16.0f;
     layout.layoutType = TYCyclePagerTransformLayoutLinear;
     layout.sectionInset = UIEdgeInsetsMake(0, (KPortraitWidth - width) / 2.0f, 0, (KPortraitWidth - width) / 2.0f);
-    return layout;;
+    return layout;
 }
 
 - (void)pagerView:(TYCyclePagerView *)pageView didSelectedItemCell:(__kindof UICollectionViewCell *)cell atIndex:(NSInteger)index {
-    BOOL isLock = self.tenantAlbumStatus == 1 ? YES : NO;
+    BOOL isLock = self.tenantAlbumStatus == YES ? NO : YES;
     if (isLock) {
         TenantAlbumModel *model = self.sourceArray[index];
         NSString *subjectType = model.subjectType;
         
         KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-        ctrl.url = [NSString stringWithFormat:@"%@%@?subjectType=%@",TENANT_WEBHOST,@"/#/train-tool",subjectType];
+        ctrl.url = [NSString stringWithFormat:@"%@%@?subjectType=%@&albumId=%@",TENANT_WEBHOST,@"/#/train-tool",subjectType,self.chooseAlbumId];
         [self.navigationController pushViewController:ctrl animated:YES];
     }
     else { // 跳转到对应页面
         TenantAlbumModel *model = self.sourceArray[index];
         NSString *subjectType = model.subjectType;
+        if ([subjectType isEqualToString:@"COURSEWARE"]) { // 云教程
+            KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+            webCtrl.url = [NSString stringWithFormat:@"%@/#/lessonCourseware?albumId=%@", TENANT_WEBHOST, self.chooseAlbumId];
+            [self.navigationController pushViewController:webCtrl animated:YES];
+        }
+        else {
+            KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+            webCtrl.url = [NSString stringWithFormat:@"%@/#/train-list?subjectType=%@&albumId=%@", TENANT_WEBHOST,subjectType, self.chooseAlbumId];
+            [self.navigationController pushViewController:webCtrl animated:YES];
+        }
         
-        KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
-        webCtrl.url = [NSString stringWithFormat:@"%@/#/train-list?subjectType=%@", TENANT_WEBHOST,subjectType];
-        [self.navigationController pushViewController:webCtrl animated:YES];
     }
 }
 
@@ -351,6 +412,12 @@
 }
 
 #pragma mark --- lazying
+- (NSMutableArray *)albumListArray {
+    if (!_albumListArray) {
+        _albumListArray = [NSMutableArray array];
+    }
+    return _albumListArray;
+}
 - (NSMutableArray *)animationNameArray {
     if (!_animationNameArray) {
         _animationNameArray = [NSMutableArray array];
@@ -386,17 +453,58 @@
         _navView = [InstitutionNomalNavView shareInstance];
         MJWeakSelf;
         [_navView moreSwitch:^{
-            [weakSelf switchMoreAction];
+            [weakSelf switchAlbumAction];
         }];
     }
     return _navView;
 }
 
+- (void)switchAlbumAction {
+    AlbumSwitchView *transferView = [AlbumSwitchView shareInstance];
+    NSInteger lastChooseIndex = 0;
+    for (NSInteger index = 0; index < self.albumListArray.count; index++) {
+        GroupAlbumModel *model = self.albumListArray[index];
+        model.isChoose = NO;
+        if ([self.chooseAlbumId isEqualToString:model.internalBaseClassIdentifier]) {
+            lastChooseIndex = index;
+        }
+    }
+    [transferView albumChooseCallback:^(ALBUMSWITCH_TYPE type, NSInteger chooseIndex) {
+        if (type == ALBUMSWITCH_TYPE_SWITCH) {
+            GroupAlbumModel *model = self.albumListArray[chooseIndex];
+            [self queryAlbumMessage:model.internalBaseClassIdentifier];
+        }
+    }];
+    [transferView configWithSource:self.albumListArray lastChooseIndex:lastChooseIndex];
+    [transferView showInDisplayView:self.view];
+}
+
+- (void)queryAlbumMessage:(NSString *)tenantAlbumId {
+//    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager userBuyAlbumInfoDetailRequest:KS_GET tenantAlbumId:tenantAlbumId success:^(NSDictionary * _Nonnull dic) {
+//        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSDictionary *parm = [dic ks_dictionaryValueForKey:@"data"];
+            GroupAlbumModel *model = [[GroupAlbumModel alloc] initWithDictionary:parm];
+            [self refreshWithModel:model];
+            [self.pagerView scrollToItemAtIndex:0 animate:NO];
+        }
+        else {
+            
+        }
+    } faliure:^(NSError * _Nonnull error) {
+//        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+/*
 - (void)switchMoreAction {
     if (self.callback) {
         self.callback();
     }
 }
+ */
+
 - (TenantDarkSearhView *)searchView {
     if (!_searchView) {
         _searchView = [TenantDarkSearhView shareInstance];
@@ -443,6 +551,16 @@
     }
     return _requestGroup;
 }
+
+- (void)setAlbumCount:(NSInteger)albumCount {
+    _albumCount = albumCount;
+    if (albumCount > 1) { // 显示切换
+        self.navView.needSwitchButton = YES;
+    }
+    else { // 隐藏切换
+        self.navView.needSwitchButton = NO;
+    }
+}
 /*
 #pragma mark - Navigation
 

+ 47 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Model/GroupAlbumModel.h

@@ -0,0 +1,47 @@
+//
+//  GroupAlbumModel.h
+//
+//  Created by Steven  on 2024/4/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface GroupAlbumModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, assign) double originalPrice;
+@property (nonatomic, strong) NSString *tenantGroupId;
+@property (nonatomic, assign) BOOL status;
+@property (nonatomic, assign) NSInteger ensembleCounts;
+@property (nonatomic, assign) NSInteger subjectCounts;
+@property (nonatomic, assign) NSInteger musicNum;
+@property (nonatomic, strong) NSString *subjectTypes;
+@property (nonatomic, assign) NSInteger buyedTimes;
+@property (nonatomic, strong) NSString *purchasePeriod;
+@property (nonatomic, strong) NSString *coverImg;
+@property (nonatomic, strong) NSString *purchaseJson;
+@property (nonatomic, assign) NSInteger purchaseNum;
+@property (nonatomic, strong) NSString *tenantGroupAlbumId;
+@property (nonatomic, assign) BOOL buyTimesFlag;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, assign) NSInteger buyTimes;
+@property (nonatomic, strong) NSString *describe;
+@property (nonatomic, assign) NSInteger musicCounts;
+@property (nonatomic, assign) double actualPrice;
+@property (nonatomic, strong) NSString *purchaseTypes;
+
+@property (nonatomic, assign) NSInteger coursewareCounts;
+@property (nonatomic, strong) NSString *expireTime;
+
+
+@property (nonatomic, assign) BOOL isChoose; // 是否选中
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 250 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/Model/GroupAlbumModel.m

@@ -0,0 +1,250 @@
+//
+//  GroupAlbumModel.m
+//
+//  Created by Steven  on 2024/4/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "GroupAlbumModel.h"
+
+
+NSString *const kGroupAlbumModelOriginalPrice = @"originalPrice";
+NSString *const kGroupAlbumModelTenantGroupId = @"tenantGroupId";
+NSString *const kGroupAlbumModelStatus = @"status";
+NSString *const kGroupAlbumModelEnsembleCounts = @"ensembleCounts";
+NSString *const kGroupAlbumModelSubjectCounts = @"subjectCounts";
+NSString *const kGroupAlbumModelMusicNum = @"musicNum";
+NSString *const kGroupAlbumModelSubjectTypes = @"subjectTypes";
+NSString *const kGroupAlbumModelBuyedTimes = @"buyedTimes";
+NSString *const kGroupAlbumModelPurchasePeriod = @"purchasePeriod";
+NSString *const kGroupAlbumModelCoverImg = @"coverImg";
+NSString *const kGroupAlbumModelPurchaseJson = @"purchaseJson";
+NSString *const kGroupAlbumModelPurchaseNum = @"purchaseNum";
+NSString *const kGroupAlbumModelTenantGroupAlbumId = @"tenantGroupAlbumId";
+NSString *const kGroupAlbumModelBuyTimesFlag = @"buyTimesFlag";
+NSString *const kGroupAlbumModelName = @"name";
+NSString *const kGroupAlbumModelId = @"id";
+NSString *const kGroupAlbumModelBuyTimes = @"buyTimes";
+NSString *const kGroupAlbumModelDescribe = @"describe";
+NSString *const kGroupAlbumModelMusicCounts = @"musicCounts";
+NSString *const kGroupAlbumModelActualPrice = @"actualPrice";
+NSString *const kGroupAlbumModelPurchaseTypes = @"purchaseTypes";
+NSString *const kGroupAlbumModelCoursewareCounts = @"coursewareCounts";
+NSString *const kGroupAlbumModelExpireTime = @"expireTime";
+
+
+@interface GroupAlbumModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation GroupAlbumModel
+
+@synthesize originalPrice = _originalPrice;
+@synthesize tenantGroupId = _tenantGroupId;
+@synthesize status = _status;
+@synthesize ensembleCounts = _ensembleCounts;
+@synthesize subjectCounts = _subjectCounts;
+@synthesize musicNum = _musicNum;
+@synthesize subjectTypes = _subjectTypes;
+@synthesize buyedTimes = _buyedTimes;
+@synthesize purchasePeriod = _purchasePeriod;
+@synthesize coverImg = _coverImg;
+@synthesize purchaseJson = _purchaseJson;
+@synthesize purchaseNum = _purchaseNum;
+@synthesize tenantGroupAlbumId = _tenantGroupAlbumId;
+@synthesize buyTimesFlag = _buyTimesFlag;
+@synthesize name = _name;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize buyTimes = _buyTimes;
+@synthesize describe = _describe;
+@synthesize musicCounts = _musicCounts;
+@synthesize actualPrice = _actualPrice;
+@synthesize purchaseTypes = _purchaseTypes;
+@synthesize coursewareCounts = _coursewareCounts;
+@synthesize expireTime = _expireTime;
+
++ (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.originalPrice = [[self objectOrNilForKey:kGroupAlbumModelOriginalPrice fromDictionary:dict] doubleValue];
+        self.tenantGroupId = [self objectOrNilForKey:kGroupAlbumModelTenantGroupId fromDictionary:dict];
+        self.status = [[self objectOrNilForKey:kGroupAlbumModelStatus fromDictionary:dict] boolValue];
+        self.ensembleCounts = [[self objectOrNilForKey:kGroupAlbumModelEnsembleCounts fromDictionary:dict] integerValue];
+        self.subjectCounts = [[self objectOrNilForKey:kGroupAlbumModelSubjectCounts fromDictionary:dict] integerValue];
+        self.musicNum = [[self objectOrNilForKey:kGroupAlbumModelMusicNum fromDictionary:dict] integerValue];
+        self.subjectTypes = [self objectOrNilForKey:kGroupAlbumModelSubjectTypes fromDictionary:dict];
+        self.buyedTimes = [[self objectOrNilForKey:kGroupAlbumModelBuyedTimes fromDictionary:dict] integerValue];
+        self.purchasePeriod = [self objectOrNilForKey:kGroupAlbumModelPurchasePeriod fromDictionary:dict];
+        self.coverImg = [self objectOrNilForKey:kGroupAlbumModelCoverImg fromDictionary:dict];
+        self.purchaseJson = [self objectOrNilForKey:kGroupAlbumModelPurchaseJson fromDictionary:dict];
+        self.purchaseNum = [[self objectOrNilForKey:kGroupAlbumModelPurchaseNum fromDictionary:dict] integerValue];
+        self.tenantGroupAlbumId = [self objectOrNilForKey:kGroupAlbumModelTenantGroupAlbumId fromDictionary:dict];
+        self.buyTimesFlag = [[self objectOrNilForKey:kGroupAlbumModelBuyTimesFlag fromDictionary:dict] boolValue];
+        self.name = [self objectOrNilForKey:kGroupAlbumModelName fromDictionary:dict];
+        self.internalBaseClassIdentifier = [self objectOrNilForKey:kGroupAlbumModelId fromDictionary:dict];
+        self.buyTimes = [[self objectOrNilForKey:kGroupAlbumModelBuyTimes fromDictionary:dict] integerValue];
+        self.describe = [self objectOrNilForKey:kGroupAlbumModelDescribe fromDictionary:dict];
+        self.musicCounts = [[self objectOrNilForKey:kGroupAlbumModelMusicCounts fromDictionary:dict] integerValue];
+        self.actualPrice = [[self objectOrNilForKey:kGroupAlbumModelActualPrice fromDictionary:dict] doubleValue];
+        self.purchaseTypes = [self objectOrNilForKey:kGroupAlbumModelPurchaseTypes fromDictionary:dict];
+        self.coursewareCounts = [[self objectOrNilForKey:kGroupAlbumModelCoursewareCounts fromDictionary:dict] integerValue];
+        self.expireTime = [self objectOrNilForKey:kGroupAlbumModelExpireTime fromDictionary:dict];
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.originalPrice] forKey:kGroupAlbumModelOriginalPrice];
+    [mutableDict setValue:self.tenantGroupId forKey:kGroupAlbumModelTenantGroupId];
+    [mutableDict setValue:[NSNumber numberWithBool:self.status] forKey:kGroupAlbumModelStatus];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.ensembleCounts] forKey:kGroupAlbumModelEnsembleCounts];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.subjectCounts] forKey:kGroupAlbumModelSubjectCounts];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.musicNum] forKey:kGroupAlbumModelMusicNum];
+    [mutableDict setValue:self.subjectTypes forKey:kGroupAlbumModelSubjectTypes];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.buyedTimes] forKey:kGroupAlbumModelBuyedTimes];
+    [mutableDict setValue:self.purchasePeriod forKey:kGroupAlbumModelPurchasePeriod];
+    [mutableDict setValue:self.coverImg forKey:kGroupAlbumModelCoverImg];
+    [mutableDict setValue:self.purchaseJson forKey:kGroupAlbumModelPurchaseJson];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.purchaseNum] forKey:kGroupAlbumModelPurchaseNum];
+    [mutableDict setValue:self.tenantGroupAlbumId forKey:kGroupAlbumModelTenantGroupAlbumId];
+    [mutableDict setValue:[NSNumber numberWithBool:self.buyTimesFlag] forKey:kGroupAlbumModelBuyTimesFlag];
+    [mutableDict setValue:self.name forKey:kGroupAlbumModelName];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kGroupAlbumModelId];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.buyTimes] forKey:kGroupAlbumModelBuyTimes];
+    [mutableDict setValue:self.describe forKey:kGroupAlbumModelDescribe];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.musicCounts] forKey:kGroupAlbumModelMusicCounts];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.actualPrice] forKey:kGroupAlbumModelActualPrice];
+    [mutableDict setValue:self.purchaseTypes forKey:kGroupAlbumModelPurchaseTypes];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.coursewareCounts] forKey:kGroupAlbumModelCoursewareCounts];
+    [mutableDict setValue:self.expireTime forKey:kGroupAlbumModelExpireTime];
+    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.originalPrice = [aDecoder decodeDoubleForKey:kGroupAlbumModelOriginalPrice];
+    self.tenantGroupId = [aDecoder decodeObjectForKey:kGroupAlbumModelTenantGroupId];
+    self.status = [aDecoder decodeBoolForKey:kGroupAlbumModelStatus];
+    self.ensembleCounts = [aDecoder decodeIntegerForKey:kGroupAlbumModelEnsembleCounts];
+    self.subjectCounts = [aDecoder decodeIntegerForKey:kGroupAlbumModelSubjectCounts];
+    self.musicNum = [aDecoder decodeIntegerForKey:kGroupAlbumModelMusicNum];
+    self.subjectTypes = [aDecoder decodeObjectForKey:kGroupAlbumModelSubjectTypes];
+    self.buyedTimes = [aDecoder decodeIntegerForKey:kGroupAlbumModelBuyedTimes];
+    self.purchasePeriod = [aDecoder decodeObjectForKey:kGroupAlbumModelPurchasePeriod];
+    self.coverImg = [aDecoder decodeObjectForKey:kGroupAlbumModelCoverImg];
+    self.purchaseJson = [aDecoder decodeObjectForKey:kGroupAlbumModelPurchaseJson];
+    self.purchaseNum = [aDecoder decodeIntegerForKey:kGroupAlbumModelPurchaseNum];
+    self.tenantGroupAlbumId = [aDecoder decodeObjectForKey:kGroupAlbumModelTenantGroupAlbumId];
+    self.buyTimesFlag = [aDecoder decodeBoolForKey:kGroupAlbumModelBuyTimesFlag];
+    self.name = [aDecoder decodeObjectForKey:kGroupAlbumModelName];
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kGroupAlbumModelId];
+    self.buyTimes = [aDecoder decodeIntegerForKey:kGroupAlbumModelBuyTimes];
+    self.describe = [aDecoder decodeObjectForKey:kGroupAlbumModelDescribe];
+    self.musicCounts = [aDecoder decodeIntegerForKey:kGroupAlbumModelMusicCounts];
+    self.actualPrice = [aDecoder decodeDoubleForKey:kGroupAlbumModelActualPrice];
+    self.purchaseTypes = [aDecoder decodeObjectForKey:kGroupAlbumModelPurchaseTypes];
+    self.coursewareCounts = [aDecoder decodeIntegerForKey:kGroupAlbumModelCoursewareCounts];
+    self.expireTime = [aDecoder decodeObjectForKey:kGroupAlbumModelExpireTime];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeDouble:_originalPrice forKey:kGroupAlbumModelOriginalPrice];
+    [aCoder encodeObject:_tenantGroupId forKey:kGroupAlbumModelTenantGroupId];
+    [aCoder encodeBool:_status forKey:kGroupAlbumModelStatus];
+    [aCoder encodeInteger:_ensembleCounts forKey:kGroupAlbumModelEnsembleCounts];
+    [aCoder encodeInteger:_subjectCounts forKey:kGroupAlbumModelSubjectCounts];
+    [aCoder encodeInteger:_musicNum forKey:kGroupAlbumModelMusicNum];
+    [aCoder encodeObject:_subjectTypes forKey:kGroupAlbumModelSubjectTypes];
+    [aCoder encodeInteger:_buyedTimes forKey:kGroupAlbumModelBuyedTimes];
+    [aCoder encodeObject:_purchasePeriod forKey:kGroupAlbumModelPurchasePeriod];
+    [aCoder encodeObject:_coverImg forKey:kGroupAlbumModelCoverImg];
+    [aCoder encodeObject:_purchaseJson forKey:kGroupAlbumModelPurchaseJson];
+    [aCoder encodeInteger:_purchaseNum forKey:kGroupAlbumModelPurchaseNum];
+    [aCoder encodeObject:_tenantGroupAlbumId forKey:kGroupAlbumModelTenantGroupAlbumId];
+    [aCoder encodeBool:_buyTimesFlag forKey:kGroupAlbumModelBuyTimesFlag];
+    [aCoder encodeObject:_name forKey:kGroupAlbumModelName];
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kGroupAlbumModelId];
+    [aCoder encodeInteger:_buyTimes forKey:kGroupAlbumModelBuyTimes];
+    [aCoder encodeObject:_describe forKey:kGroupAlbumModelDescribe];
+    [aCoder encodeInteger:_musicCounts forKey:kGroupAlbumModelMusicCounts];
+    [aCoder encodeDouble:_actualPrice forKey:kGroupAlbumModelActualPrice];
+    [aCoder encodeObject:_purchaseTypes forKey:kGroupAlbumModelPurchaseTypes];
+    [aCoder encodeInteger:_coursewareCounts forKey:kGroupAlbumModelCoursewareCounts];
+    [aCoder encodeObject:_expireTime forKey:kGroupAlbumModelExpireTime];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    GroupAlbumModel *copy = [[GroupAlbumModel alloc] init];
+    
+    if (copy) {
+
+        copy.originalPrice = self.originalPrice;
+        copy.tenantGroupId = [self.tenantGroupId copyWithZone:zone];
+        copy.status = self.status;
+        copy.ensembleCounts = self.ensembleCounts;
+        copy.subjectCounts = self.subjectCounts;
+        copy.musicNum = self.musicNum;
+        copy.subjectTypes = [self.subjectTypes copyWithZone:zone];
+        copy.buyedTimes = self.buyedTimes;
+        copy.purchasePeriod = [self.purchasePeriod copyWithZone:zone];
+        copy.coverImg = [self.coverImg copyWithZone:zone];
+        copy.purchaseJson = [self.purchaseJson copyWithZone:zone];
+        copy.purchaseNum = self.purchaseNum;
+        copy.tenantGroupAlbumId = [self.tenantGroupAlbumId copyWithZone:zone];
+        copy.buyTimesFlag = self.buyTimesFlag;
+        copy.name = [self.name copyWithZone:zone];
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.buyTimes = self.buyTimes;
+        copy.describe = [self.describe copyWithZone:zone];
+        copy.musicCounts = self.musicCounts;
+        copy.actualPrice = self.actualPrice;
+        copy.purchaseTypes = [self.purchaseTypes copyWithZone:zone];
+        copy.coursewareCounts = self.coursewareCounts;
+        copy.expireTime = [self.expireTime copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 4 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.h

@@ -12,12 +12,16 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface InstitutionNomalNavView : UIView
 
+@property (nonatomic, assign) BOOL needSwitchButton;
+
 @property (weak, nonatomic) IBOutlet UILabel *tenantName;
 
 + (instancetype)shareInstance;
 
 - (void)moreSwitch:(DarkActionCallback)callback;
 
+- (void)configAlbumName:(NSString *)albumName;
+
 + (CGFloat)getViewHeight;
 
 @end

+ 59 - 1
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.m

@@ -6,16 +6,32 @@
 //
 
 #import "InstitutionNomalNavView.h"
+#import <KSToolLibrary/UIButton+EnlargeEdge.h>
 
 @interface InstitutionNomalNavView ()
 
+@property (weak, nonatomic) IBOutlet UIView *switchView;
+@property (weak, nonatomic) IBOutlet UIButton *switchButton;
+
+@property (weak, nonatomic) IBOutlet UILabel *albumLabel;
+
 @property (nonatomic ,copy) DarkActionCallback callback;
 
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *switchViewRight;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *albumLabelLeft;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *albumLabelRight;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *switchImgWidth;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *switchImgRight;
+
 @end
 
 @implementation InstitutionNomalNavView
 
-
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self resetSwitchView];
+    [self.switchButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10];
+}
 + (instancetype)shareInstance {
     InstitutionNomalNavView *view = [[[NSBundle mainBundle] loadNibNamed:@"InstitutionNomalNavView" owner:nil options:nil] firstObject];
     return view;
@@ -34,9 +50,51 @@
     }
 }
 
+- (void)configAlbumName:(NSString *)albumName {
+    if (self.needSwitchButton) {
+        if (albumName.length > 5) {
+            albumName = [albumName substringToIndex:5];
+        }
+        self.albumLabel.text = [NSString returnNoNullStringWithString:albumName];
+    }
+    else {
+        self.albumLabel.text = @"";
+    }
+}
+
 + (CGFloat)getViewHeight {
     return kNaviBarHeight;
 }
+
+- (void)setNeedSwitchButton:(BOOL)needSwitchButton {
+    _needSwitchButton = needSwitchButton;
+    
+    if (needSwitchButton) {
+        self.switchView.hidden = NO;
+        self.switchViewRight.constant = 12.0f;
+        self.albumLabelLeft.constant = 8.0f;
+        self.albumLabelRight.constant = 4.0f;
+        self.switchImgWidth.constant = 11.0f;
+        self.switchViewRight.constant = 7.0f;
+        self.switchButton.hidden = NO;
+        self.switchButton.userInteractionEnabled = YES;
+    }
+    else {
+        [self resetSwitchView];
+    }
+}
+
+- (void)resetSwitchView {
+    self.switchView.hidden = YES;
+    self.switchViewRight.constant = 0.0f;
+    self.albumLabelLeft.constant = 0.0f;
+    self.albumLabelRight.constant = 0.0f;
+    self.switchImgWidth.constant = 0.0f;
+    self.switchViewRight.constant = 0.0f;
+    self.switchButton.hidden = YES;
+    self.switchButton.userInteractionEnabled = NO;
+}
+
 /*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.

+ 58 - 14
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/InstitutionNomalNavView.xib

@@ -35,29 +35,65 @@
                                     <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <nil key="highlightedColor"/>
                                 </label>
-                                <button hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bw9-rt-S6A">
-                                    <rect key="frame" x="381" y="0.0" width="0.0" height="44"/>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="daT-Ib-Im7">
+                                    <rect key="frame" x="284.66666666666669" y="10" width="96.333333333333314" height="24"/>
+                                    <subviews>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tenant_homeSwitch" translatesAutoresizingMaskIntoConstraints="NO" id="WNz-7a-EqY">
+                                            <rect key="frame" x="78.333333333333314" y="7" width="11" height="10"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="11" id="CIg-IW-BIH"/>
+                                            </constraints>
+                                        </imageView>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" text="宫崎骏合集" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MfF-8w-8uL">
+                                            <rect key="frame" x="8" y="4.3333333333333348" width="66.333333333333329" height="15.666666666666664"/>
+                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="13"/>
+                                            <color key="textColor" red="1" green="0.37647058823529411" blue="0.55686274509803924" alpha="1" colorSpace="calibratedRGB"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bw9-rt-S6A">
+                                            <rect key="frame" x="0.0" y="0.0" width="96.333333333333329" height="24"/>
+                                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                            <connections>
+                                                <action selector="switchClick:" destination="iN0-l3-epB" eventType="touchUpInside" id="npJ-wc-TZD"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <constraints>
-                                        <constraint firstAttribute="width" id="vVK-Ca-qIA"/>
+                                        <constraint firstItem="WNz-7a-EqY" firstAttribute="leading" secondItem="MfF-8w-8uL" secondAttribute="trailing" constant="4" id="CgX-k2-ilo"/>
+                                        <constraint firstAttribute="trailing" secondItem="WNz-7a-EqY" secondAttribute="trailing" constant="7" id="EoZ-yb-8Gl"/>
+                                        <constraint firstItem="WNz-7a-EqY" firstAttribute="centerY" secondItem="daT-Ib-Im7" secondAttribute="centerY" id="GyS-Dy-MOa"/>
+                                        <constraint firstAttribute="height" constant="24" id="L6q-fN-urZ"/>
+                                        <constraint firstItem="bw9-rt-S6A" firstAttribute="leading" secondItem="daT-Ib-Im7" secondAttribute="leading" id="cMg-9O-Koc"/>
+                                        <constraint firstItem="MfF-8w-8uL" firstAttribute="centerY" secondItem="daT-Ib-Im7" secondAttribute="centerY" id="n9V-v1-yfb"/>
+                                        <constraint firstAttribute="bottom" secondItem="bw9-rt-S6A" secondAttribute="bottom" id="nlI-Gp-L39"/>
+                                        <constraint firstItem="bw9-rt-S6A" firstAttribute="top" secondItem="daT-Ib-Im7" secondAttribute="top" id="vNW-dK-E7m"/>
+                                        <constraint firstItem="MfF-8w-8uL" firstAttribute="leading" secondItem="daT-Ib-Im7" secondAttribute="leading" constant="8" id="xSk-Kt-bzB"/>
+                                        <constraint firstAttribute="trailing" secondItem="bw9-rt-S6A" secondAttribute="trailing" id="zdh-Yy-RXa"/>
                                     </constraints>
-                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
-                                    <state key="normal" image="dark_moreMusic"/>
-                                    <connections>
-                                        <action selector="switchClick:" destination="iN0-l3-epB" eventType="touchUpInside" id="npJ-wc-TZD"/>
-                                    </connections>
-                                </button>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="12"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" red="1" green="0.37647058823529411" blue="0.55686274509803924" alpha="1" colorSpace="calibratedRGB"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
                             </subviews>
                             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                             <constraints>
-                                <constraint firstItem="bw9-rt-S6A" firstAttribute="top" secondItem="H68-fe-SI5" secondAttribute="top" id="3Iy-sS-eh1"/>
                                 <constraint firstAttribute="height" constant="44" id="EKt-Rc-y4a"/>
+                                <constraint firstItem="daT-Ib-Im7" firstAttribute="centerY" secondItem="H68-fe-SI5" secondAttribute="centerY" id="Eib-ux-PYP"/>
                                 <constraint firstItem="1Kt-DJ-b4l" firstAttribute="leading" secondItem="H68-fe-SI5" secondAttribute="leading" constant="15" id="KMF-9s-Wiy"/>
-                                <constraint firstItem="bw9-rt-S6A" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Jp7-gK-ZVV" secondAttribute="trailing" constant="20" id="KU8-r6-cDx"/>
+                                <constraint firstItem="daT-Ib-Im7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Jp7-gK-ZVV" secondAttribute="trailing" constant="20" id="N4S-UB-obq"/>
+                                <constraint firstAttribute="trailing" secondItem="daT-Ib-Im7" secondAttribute="trailing" constant="12" id="dsI-tj-kmW"/>
                                 <constraint firstItem="Jp7-gK-ZVV" firstAttribute="centerY" secondItem="H68-fe-SI5" secondAttribute="centerY" id="j9W-xc-XeE"/>
                                 <constraint firstItem="1Kt-DJ-b4l" firstAttribute="centerY" secondItem="H68-fe-SI5" secondAttribute="centerY" id="lUR-Oc-uwm"/>
-                                <constraint firstAttribute="trailing" secondItem="bw9-rt-S6A" secondAttribute="trailing" constant="12" id="qk5-vv-Jcd"/>
                                 <constraint firstItem="Jp7-gK-ZVV" firstAttribute="leading" secondItem="1Kt-DJ-b4l" secondAttribute="trailing" constant="6" id="x0s-Xx-Ae7"/>
-                                <constraint firstAttribute="bottom" secondItem="bw9-rt-S6A" secondAttribute="bottom" id="zNg-OO-WN9"/>
                             </constraints>
                         </view>
                     </subviews>
@@ -80,13 +116,21 @@
             <nil key="simulatedBottomBarMetrics"/>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
+                <outlet property="albumLabel" destination="MfF-8w-8uL" id="3VD-kE-WuS"/>
+                <outlet property="albumLabelLeft" destination="xSk-Kt-bzB" id="xRr-Hd-4Rb"/>
+                <outlet property="albumLabelRight" destination="CgX-k2-ilo" id="hRr-WG-hdM"/>
+                <outlet property="switchButton" destination="bw9-rt-S6A" id="SQh-mI-PgA"/>
+                <outlet property="switchImgRight" destination="EoZ-yb-8Gl" id="owR-yr-Fpq"/>
+                <outlet property="switchImgWidth" destination="CIg-IW-BIH" id="MnL-cE-CCp"/>
+                <outlet property="switchView" destination="daT-Ib-Im7" id="fHQ-Cy-IFf"/>
+                <outlet property="switchViewRight" destination="dsI-tj-kmW" id="guS-Sp-A6U"/>
                 <outlet property="tenantName" destination="Jp7-gK-ZVV" id="XQN-IJ-hfu"/>
             </connections>
             <point key="canvasLocation" x="5.343511450381679" y="-139.78873239436621"/>
         </view>
     </objects>
     <resources>
-        <image name="dark_moreMusic" width="85" height="26"/>
+        <image name="tenant_homeSwitch" width="11" height="10"/>
         <image name="tenant_logo" width="18" height="18"/>
     </resources>
 </document>

+ 19 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.h

@@ -0,0 +1,19 @@
+//
+//  AlbumSwitchCell.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/4/15.
+//
+
+#import <UIKit/UIKit.h>
+#import "GroupAlbumModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AlbumSwitchCell : UITableViewCell
+
+- (void)configWithSource:(GroupAlbumModel *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.m

@@ -0,0 +1,70 @@
+//
+//  AlbumSwitchCell.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/4/15.
+//
+
+#import "AlbumSwitchCell.h"
+
+@interface AlbumSwitchCell ()
+
+@property (weak, nonatomic) IBOutlet UIView *selectedBgView;
+
+@property (weak, nonatomic) IBOutlet UIImageView *albumImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *albumName;
+
+@property (weak, nonatomic) IBOutlet UILabel *expiredTime;
+
+@property (weak, nonatomic) IBOutlet UIImageView *chooseImage;
+
+@end
+
+@implementation AlbumSwitchCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+    [self resetDefaultStatus];
+}
+
+- (void)resetDefaultStatus {
+    self.selectedBgView.hidden = YES;
+    self.chooseImage.hidden = YES;
+    self.expiredTime.textColor = HexRGBAlpha(0xFFFFFF, 0.7f);
+}
+
+- (void)configWithSource:(GroupAlbumModel *)model {
+    if (model.isChoose) {
+        self.selectedBgView.hidden = NO;
+        self.chooseImage.hidden = NO;
+        self.expiredTime.textColor = HexRGB(0xFFFFFF);
+    }
+    else {
+        [self resetDefaultStatus];
+    }
+    
+    [self.albumImage sd_setImageWithURL:[NSURL URLWithString:[model.coverImg getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"album_placeholder"]];
+    self.albumName.text = [NSString returnNoNullStringWithString:model.name];
+    
+    if (model.status == NO) {
+        self.expiredTime.text = @"暂未开通";
+    }
+    else {
+        NSDateFormatter *formatter = [NSObject getDateformatter];
+        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+        NSDate *expireTime = [formatter dateFromString:model.expireTime];
+        [formatter setDateFormat:@"yyyy-MM-dd"];
+        NSString *time = [formatter stringFromDate:expireTime];
+        self.expiredTime.text = [NSString stringWithFormat:@"到期时间:%@", [NSString returnNoNullStringWithString:time]];
+    }
+}
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 107 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchCell.xib

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="80" id="KGk-i7-Jjw" customClass="AlbumSwitchCell">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="80"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="320" height="80"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JsI-4t-iX8">
+                        <rect key="frame" x="10" y="6" width="300" height="68"/>
+                        <color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="68" id="qRR-CR-mHO"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                <real key="value" value="1"/>
+                            </userDefinedRuntimeAttribute>
+                            <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                <color key="value" red="1" green="1" blue="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="album_placeholder" translatesAutoresizingMaskIntoConstraints="NO" id="NfZ-Wk-dKR">
+                        <rect key="frame" x="20" y="16" width="48" height="48"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="48" id="9sZ-gc-WKV"/>
+                            <constraint firstAttribute="width" constant="48" id="dpJ-LS-kVz"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="8"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </imageView>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="宫崎骏合集 | 一起感受宫崎骏的夏…" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J7B-Ce-Ny3">
+                        <rect key="frame" x="78" y="19" width="184" height="21"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="21" id="lVp-lA-Qyt"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
+                        <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="到期时间:2025-03-14" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kwL-hK-x7q">
+                        <rect key="frame" x="78" y="44" width="131" height="17"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="17" id="NWZ-sI-9fl"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                        <color key="textColor" red="1" green="1" blue="1" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="albumChoosed_img" translatesAutoresizingMaskIntoConstraints="NO" id="OJc-yx-QBL">
+                        <rect key="frame" x="282" y="31" width="18" height="18"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="18" id="Gfn-v7-1T0"/>
+                            <constraint firstAttribute="height" constant="18" id="zhj-SB-JRu"/>
+                        </constraints>
+                    </imageView>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="J7B-Ce-Ny3" firstAttribute="leading" secondItem="NfZ-Wk-dKR" secondAttribute="trailing" constant="10" id="4D2-64-uY7"/>
+                    <constraint firstItem="NfZ-Wk-dKR" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="20" id="6dy-qP-5rG"/>
+                    <constraint firstItem="kwL-hK-x7q" firstAttribute="leading" secondItem="J7B-Ce-Ny3" secondAttribute="leading" id="8nO-PP-MZF"/>
+                    <constraint firstItem="J7B-Ce-Ny3" firstAttribute="top" secondItem="NfZ-Wk-dKR" secondAttribute="top" constant="3" id="AGK-30-mCn"/>
+                    <constraint firstItem="OJc-yx-QBL" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="LvZ-Ny-WIO"/>
+                    <constraint firstItem="OJc-yx-QBL" firstAttribute="leading" secondItem="J7B-Ce-Ny3" secondAttribute="trailing" constant="20" id="XbO-B7-lKj"/>
+                    <constraint firstItem="JsI-4t-iX8" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="cXd-93-82w"/>
+                    <constraint firstItem="kwL-hK-x7q" firstAttribute="top" secondItem="J7B-Ce-Ny3" secondAttribute="bottom" constant="4" id="gW3-Ae-qHX"/>
+                    <constraint firstItem="NfZ-Wk-dKR" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="mkv-uU-Zws"/>
+                    <constraint firstAttribute="trailing" secondItem="OJc-yx-QBL" secondAttribute="trailing" constant="20" id="qPA-2L-hZD"/>
+                    <constraint firstAttribute="trailing" secondItem="JsI-4t-iX8" secondAttribute="trailing" constant="10" id="wCs-qO-plL"/>
+                    <constraint firstItem="JsI-4t-iX8" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="10" id="wTv-7v-RQu"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="albumImage" destination="NfZ-Wk-dKR" id="b8I-qz-jSq"/>
+                <outlet property="albumName" destination="J7B-Ce-Ny3" id="3OK-wp-K40"/>
+                <outlet property="chooseImage" destination="OJc-yx-QBL" id="nFL-4g-vRo"/>
+                <outlet property="expiredTime" destination="kwL-hK-x7q" id="HBk-kw-Udp"/>
+                <outlet property="selectedBgView" destination="JsI-4t-iX8" id="JeY-h1-ZN3"/>
+            </connections>
+            <point key="canvasLocation" x="4.5801526717557248" y="67.605633802816911"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="albumChoosed_img" width="18" height="18"/>
+        <image name="album_placeholder" width="147" height="147"/>
+    </resources>
+</document>

+ 32 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.h

@@ -0,0 +1,32 @@
+//
+//  AlbumSwitchView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/4/15.
+//
+
+#import <UIKit/UIKit.h>
+#import "GroupAlbumModel.h"
+
+typedef NS_ENUM(NSInteger, ALBUMSWITCH_TYPE) {
+    ALBUMSWITCH_TYPE_CANCLE, //  取消
+    ALBUMSWITCH_TYPE_SWITCH, // 选择
+};
+
+typedef void(^AlbumSwitchCallback)(ALBUMSWITCH_TYPE type, NSInteger chooseIndex);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AlbumSwitchView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)configWithSource:(NSMutableArray *)sourceList lastChooseIndex:(NSInteger)lastChooseIndex;
+
+- (void)showInDisplayView:(UIView *)displayView;
+
+- (void)albumChooseCallback:(AlbumSwitchCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 172 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.m

@@ -0,0 +1,172 @@
+//
+//  AlbumSwitchView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2024/4/15.
+//
+
+#import "AlbumSwitchView.h"
+#import "AlbumSwitchCell.h"
+
+#define ROW_HEIGHT (80)
+
+@interface AlbumSwitchView ()<UITableViewDelegate, UITableViewDataSource,UIGestureRecognizerDelegate>
+@property (weak, nonatomic) IBOutlet UIView *backView;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topSpace;
+
+@property (weak, nonatomic) IBOutlet UIView *albumContainer;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *containerHeight;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, copy) AlbumSwitchCallback callback;
+
+@property (nonatomic, strong) NSMutableArray *sourceArray;
+
+@property (nonatomic, assign) NSInteger lastChooseIndex;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *backViewTop;
+
+@end
+
+@implementation AlbumSwitchView
+
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.topSpace.constant = kNaviBarHeight;
+    self.containerHeight.constant = ROW_HEIGHT;
+    self.backView.layer.cornerRadius = 20.0f;
+    self.backView.layer.maskedCorners = kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
+    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancelSwitchAlbum)];
+    gesture.delegate = self;
+    [self addGestureRecognizer:gesture];
+    self.backViewTop.constant = -300.0f;
+}
+
+- (void)cancelSwitchAlbum {
+    if (self.callback) {
+        self.callback(ALBUMSWITCH_TYPE_CANCLE, 0);
+    }
+    [self removeFromSuperview];
+}
+
+
++ (instancetype)shareInstance {
+    AlbumSwitchView *view = [[[NSBundle mainBundle] loadNibNamed:@"AlbumSwitchView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)showInDisplayView:(UIView *)displayView {
+    [displayView addSubview:self];
+    [self mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(displayView);
+    }];
+    [self.albumContainer addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.albumContainer);
+    }];
+    [self showAnimation];
+}
+
+- (void)showAnimation {
+    [UIView animateWithDuration:0.5f animations:^{
+        self.backViewTop.constant = 0.0f;
+    }];
+}
+
+- (void)configWithSource:(NSMutableArray *)sourceList lastChooseIndex:(NSInteger)lastChooseIndex {
+    self.sourceArray = [NSMutableArray arrayWithArray:sourceList];
+    NSInteger maxCountDisplay = sourceList.count;
+    if (sourceList.count > 5) {
+        maxCountDisplay = 5;
+    }
+    self.containerHeight.constant = maxCountDisplay * ROW_HEIGHT;
+    self.lastChooseIndex = lastChooseIndex + 1000;
+    NSInteger index = self.lastChooseIndex - 1000;
+    GroupAlbumModel *model = self.sourceArray[index];
+    model.isChoose = YES;
+    [self.tableView reloadData];
+}
+
+- (void)albumChooseCallback:(AlbumSwitchCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+#pragma mark ----- table data source
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.sourceArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    GroupAlbumModel *model = self.sourceArray[indexPath.row];
+    AlbumSwitchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumSwitchCell"];
+    [cell configWithSource:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    // 选中
+    GroupAlbumModel *model = self.sourceArray[indexPath.row];
+    model.isChoose = YES;
+    if (self.lastChooseIndex == indexPath.row+1000) {
+        return;
+    }
+    if (self.lastChooseIndex && self.lastChooseIndex != indexPath.row + 1000) {
+        NSInteger index = self.lastChooseIndex -1000;
+        GroupAlbumModel *preModel = self.sourceArray[index];
+        preModel.isChoose = NO;
+    }
+    self.lastChooseIndex = indexPath.row + 1000;
+    [self.tableView reloadData];
+//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        if (self.callback) {
+            self.callback(ALBUMSWITCH_TYPE_SWITCH, self.lastChooseIndex-1000);
+        }
+        [self removeFromSuperview];
+//    });
+}
+
+
+#pragma mark ----- gesture delegate
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
+    if ([touch.view isDescendantOfView:self.backView]) {
+        return NO;
+    }
+    return YES;
+}
+
+#pragma mark ----- lazying
+
+- (NSMutableArray *)sourceArray {
+    if (!_sourceArray) {
+        _sourceArray = [NSMutableArray array];
+    }
+    return _sourceArray;
+}
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.backgroundColor = [UIColor clearColor];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        [_tableView registerNib:[UINib nibWithNibName:@"AlbumSwitchCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"AlbumSwitchCell"];
+        _tableView.rowHeight = ROW_HEIGHT;
+    }
+    return _tableView;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 79 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Home/View/TenantSwitchAlbum/AlbumSwitchView.xib

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <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="AlbumSwitchView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8QR-3U-ffM">
+                    <rect key="frame" x="0.0" y="88" width="393" height="764"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2YN-MK-RCa">
+                            <rect key="frame" x="0.0" y="0.0" width="393" height="300"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="albumSwitch_title" translatesAutoresizingMaskIntoConstraints="NO" id="fVg-KR-avN">
+                                    <rect key="frame" x="20" y="17" width="96" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="96" id="Wwe-x4-k8u"/>
+                                        <constraint firstAttribute="height" constant="16" id="m8N-rt-QCU"/>
+                                    </constraints>
+                                </imageView>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ksc-u8-IFd">
+                                    <rect key="frame" x="0.0" y="43" width="393" height="249"/>
+                                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="249" id="6x3-5k-UIG"/>
+                                    </constraints>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.11764705882352941" green="0.18431372549019609" blue="0.32941176470588235" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="ksc-u8-IFd" firstAttribute="leading" secondItem="2YN-MK-RCa" secondAttribute="leading" id="P6R-xI-CfG"/>
+                                <constraint firstItem="fVg-KR-avN" firstAttribute="leading" secondItem="2YN-MK-RCa" secondAttribute="leading" constant="20" id="T0L-tv-sLu"/>
+                                <constraint firstAttribute="bottom" secondItem="ksc-u8-IFd" secondAttribute="bottom" constant="8" id="ZhZ-Q8-YpC"/>
+                                <constraint firstItem="ksc-u8-IFd" firstAttribute="top" secondItem="fVg-KR-avN" secondAttribute="bottom" constant="10" id="fZo-EU-ubH"/>
+                                <constraint firstItem="fVg-KR-avN" firstAttribute="top" secondItem="2YN-MK-RCa" secondAttribute="top" constant="17" id="l0P-2r-jMm"/>
+                                <constraint firstAttribute="trailing" secondItem="ksc-u8-IFd" secondAttribute="trailing" id="sZf-ow-u08"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstItem="2YN-MK-RCa" firstAttribute="leading" secondItem="8QR-3U-ffM" secondAttribute="leading" id="6Wk-dJ-Vzd"/>
+                        <constraint firstAttribute="trailing" secondItem="2YN-MK-RCa" secondAttribute="trailing" id="MFg-w0-dEs"/>
+                        <constraint firstItem="2YN-MK-RCa" firstAttribute="top" secondItem="8QR-3U-ffM" secondAttribute="top" id="Oij-6z-tNR"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="8QR-3U-ffM" secondAttribute="trailing" id="Cfh-Jn-fow"/>
+                <constraint firstItem="8QR-3U-ffM" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="88" id="GXL-9e-sT5"/>
+                <constraint firstItem="8QR-3U-ffM" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Vhq-9l-y9q"/>
+                <constraint firstAttribute="bottom" secondItem="8QR-3U-ffM" secondAttribute="bottom" id="we1-4O-feQ"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="albumContainer" destination="ksc-u8-IFd" id="vRO-BG-y00"/>
+                <outlet property="backView" destination="2YN-MK-RCa" id="cWA-lQ-IRi"/>
+                <outlet property="backViewTop" destination="Oij-6z-tNR" id="p2w-zh-zqe"/>
+                <outlet property="containerHeight" destination="6x3-5k-UIG" id="I88-kY-pvV"/>
+                <outlet property="topSpace" destination="GXL-9e-sT5" id="NGK-Gz-yFM"/>
+            </connections>
+            <point key="canvasLocation" x="3.8167938931297707" y="19.718309859154932"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="albumSwitch_title" width="96" height="16"/>
+    </resources>
+</document>

+ 21 - 1
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/Controller/INSSettingViewController.m

@@ -134,7 +134,11 @@
             [self.navigationController pushViewController:modifyVC animated:YES];
         }
             break;
-            
+        case INSETTINGTYPE_CLEARCACHE:
+        {
+            [self clearCache];
+        }
+            break;
         case INSETTINGTYPE_LOGOFF:
         {
             AccountDeleteViewController *deleteVC = [[AccountDeleteViewController alloc] init];
@@ -146,6 +150,22 @@
     }
 }
 
+- (void)clearCache {
+    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
+    NSString *bundlePath = [documentsPath stringByAppendingPathComponent:@"CoursewarePath"];
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    BOOL isExist = [fileManager fileExistsAtPath:bundlePath];
+    if (isExist) {
+        BOOL isSuccess =  [fileManager removeItemAtPath:bundlePath error:nil];
+        if (isSuccess) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:@"清理完成"];
+        }
+    }
+    else {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"清理完成"];
+    }
+}
+
 - (void)showInstrumentView {
     InstrumentChooseViewController *ctrl = [[InstrumentChooseViewController alloc] init];
     MJWeakSelf;

+ 1 - 0
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.h

@@ -16,6 +16,7 @@ typedef NS_ENUM(NSInteger, INSETTINGTYPE) {
     INSETTINGTYPE_BIRTHDAY,
     INSETTINGTYPE_PHONE,
     INSETTINGTYPE_PWD,
+    INSETTINGTYPE_CLEARCACHE,
     INSETTINGTYPE_LOGOFF,
 };
 

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.m

@@ -101,7 +101,7 @@
 
 - (CGFloat)getViewHeight {
     
-    return 58 * 8 + 12 + 12 + 78;
+    return 58 * 9 + 12 + 12 + 78;
 }
 /*
 // Only override drawRect: if you perform custom drawing.

+ 61 - 8
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/INSSettingBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -11,7 +11,7 @@
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="INSSettingBodyView">
-            <rect key="frame" x="0.0" y="0.0" width="397" height="658"/>
+            <rect key="frame" x="0.0" y="0.0" width="397" height="678"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
                 <view tag="1001" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dQM-9Y-aDu">
@@ -64,7 +64,7 @@
                     </connections>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="srN-vZ-6qk">
-                    <rect key="frame" x="13" y="102" width="371" height="464"/>
+                    <rect key="frame" x="13" y="102" width="371" height="522"/>
                     <subviews>
                         <view tag="1002" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VWr-of-xFF">
                             <rect key="frame" x="0.0" y="0.0" width="371" height="58"/>
@@ -343,8 +343,8 @@
                                 <outletCollection property="gestureRecognizers" destination="yek-cu-GJB" appends="YES" id="OLc-6P-wdH"/>
                             </connections>
                         </view>
-                        <view tag="1008" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ddD-53-eFq">
-                            <rect key="frame" x="0.0" y="406" width="371" height="58"/>
+                        <view tag="1009" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ddD-53-eFq">
+                            <rect key="frame" x="0.0" y="464" width="371" height="58"/>
                             <subviews>
                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="注销账号" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PdX-Uf-ZDf">
                                     <rect key="frame" x="12" y="19" width="75" height="20"/>
@@ -486,6 +486,51 @@
                                 <constraint firstAttribute="height" constant="58" id="p0l-TO-vbh"/>
                             </constraints>
                         </view>
+                        <view tag="1008" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nek-ia-9Au">
+                            <rect key="frame" x="0.0" y="406" width="371" height="58"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="清除缓存" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4R4-OR-B6f">
+                                    <rect key="frame" x="12" y="19" width="75" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="75" id="YiV-wM-Yp8"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_next" translatesAutoresizingMaskIntoConstraints="NO" id="PWH-eD-VeF">
+                                    <rect key="frame" x="347" y="23" width="12" height="12"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="12" id="mz0-tD-kFU"/>
+                                        <constraint firstAttribute="width" constant="12" id="xqP-mD-lnZ"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gpz-5t-uYf">
+                                    <rect key="frame" x="263" y="29" width="75" height="0.0"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="75" id="yrf-la-L6b"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.66666666669999997" green="0.66666666669999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <gestureRecognizers/>
+                            <constraints>
+                                <constraint firstItem="4R4-OR-B6f" firstAttribute="centerY" secondItem="nek-ia-9Au" secondAttribute="centerY" id="B9y-RO-crb"/>
+                                <constraint firstItem="PWH-eD-VeF" firstAttribute="leading" secondItem="Gpz-5t-uYf" secondAttribute="trailing" constant="9" id="L5w-C7-jef"/>
+                                <constraint firstItem="PWH-eD-VeF" firstAttribute="centerY" secondItem="nek-ia-9Au" secondAttribute="centerY" id="P9h-VR-MeA"/>
+                                <constraint firstAttribute="trailing" secondItem="PWH-eD-VeF" secondAttribute="trailing" constant="12" id="VNL-ID-rtY"/>
+                                <constraint firstItem="PWH-eD-VeF" firstAttribute="centerY" secondItem="nek-ia-9Au" secondAttribute="centerY" id="WAj-UR-uzS"/>
+                                <constraint firstItem="Gpz-5t-uYf" firstAttribute="centerY" secondItem="nek-ia-9Au" secondAttribute="centerY" id="XfR-RG-qCc"/>
+                                <constraint firstAttribute="height" constant="58" id="h6E-Mi-zXW"/>
+                                <constraint firstItem="4R4-OR-B6f" firstAttribute="leading" secondItem="nek-ia-9Au" secondAttribute="leading" constant="12" id="hGo-Vl-0mj"/>
+                            </constraints>
+                            <connections>
+                                <outletCollection property="gestureRecognizers" destination="mnL-fc-p8b" appends="YES" id="SWI-f6-itb"/>
+                            </connections>
+                        </view>
                     </subviews>
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
@@ -493,7 +538,9 @@
                         <constraint firstItem="Gof-T9-GOL" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="2GU-iQ-iGE"/>
                         <constraint firstAttribute="trailing" secondItem="Gof-T9-GOL" secondAttribute="trailing" id="85Q-gr-mJ3"/>
                         <constraint firstAttribute="trailing" secondItem="aqA-az-HLB" secondAttribute="trailing" id="9CH-52-oh3"/>
+                        <constraint firstAttribute="trailing" secondItem="nek-ia-9Au" secondAttribute="trailing" id="9FG-Xu-sot"/>
                         <constraint firstAttribute="trailing" secondItem="VWr-of-xFF" secondAttribute="trailing" id="9On-HV-y7H"/>
+                        <constraint firstItem="nek-ia-9Au" firstAttribute="top" secondItem="Gof-T9-GOL" secondAttribute="bottom" id="CIB-ke-8yh"/>
                         <constraint firstAttribute="trailing" secondItem="ypf-sm-FDJ" secondAttribute="trailing" id="F6w-d0-3as"/>
                         <constraint firstItem="VWr-of-xFF" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="L4J-VU-Mhh"/>
                         <constraint firstAttribute="bottom" secondItem="ddD-53-eFq" secondAttribute="bottom" id="RhH-vA-hro"/>
@@ -503,12 +550,13 @@
                         <constraint firstItem="dDj-nG-TXa" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="U4x-W9-dtS"/>
                         <constraint firstItem="8tP-al-fmS" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="ZiL-4j-hhv"/>
                         <constraint firstItem="ypf-sm-FDJ" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="Zka-FP-bZz"/>
+                        <constraint firstItem="nek-ia-9Au" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="aGU-tG-9LW"/>
                         <constraint firstAttribute="trailing" secondItem="8tP-al-fmS" secondAttribute="trailing" id="b27-A0-dVl"/>
                         <constraint firstItem="aqA-az-HLB" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="b9p-i3-bol"/>
                         <constraint firstItem="ypf-sm-FDJ" firstAttribute="top" secondItem="dDj-nG-TXa" secondAttribute="bottom" id="bOr-Cd-zth"/>
                         <constraint firstItem="aqA-az-HLB" firstAttribute="top" secondItem="8tP-al-fmS" secondAttribute="bottom" id="efs-BG-46A"/>
                         <constraint firstAttribute="trailing" secondItem="dDj-nG-TXa" secondAttribute="trailing" id="eg0-Le-dgb"/>
-                        <constraint firstItem="ddD-53-eFq" firstAttribute="top" secondItem="Gof-T9-GOL" secondAttribute="bottom" id="mZk-ZX-CKm"/>
+                        <constraint firstItem="ddD-53-eFq" firstAttribute="top" secondItem="nek-ia-9Au" secondAttribute="bottom" id="gTI-kR-MFt"/>
                         <constraint firstItem="zZF-SA-MTK" firstAttribute="leading" secondItem="srN-vZ-6qk" secondAttribute="leading" id="nJQ-Ra-KKZ"/>
                         <constraint firstAttribute="trailing" secondItem="ddD-53-eFq" secondAttribute="trailing" id="rgC-z5-YDm"/>
                         <constraint firstItem="dDj-nG-TXa" firstAttribute="top" secondItem="zZF-SA-MTK" secondAttribute="bottom" id="tIO-Qs-qnP"/>
@@ -545,7 +593,7 @@
                 <outlet property="userName" destination="EkB-dg-4QO" id="fy8-vu-492"/>
                 <outlet property="userSex" destination="qTs-K4-6hd" id="BAY-4e-wwE"/>
             </connections>
-            <point key="canvasLocation" x="171.75572519083968" y="-34.507042253521128"/>
+            <point key="canvasLocation" x="171.75572519083968" y="-27.464788732394368"/>
         </view>
         <tapGestureRecognizer id="0qY-N6-54b">
             <connections>
@@ -587,6 +635,11 @@
                 <action selector="tapAction:" destination="iN0-l3-epB" id="O8S-j1-1vJ"/>
             </connections>
         </tapGestureRecognizer>
+        <tapGestureRecognizer id="mnL-fc-p8b">
+            <connections>
+                <action selector="tapAction:" destination="iN0-l3-epB" id="hBr-m1-boY"/>
+            </connections>
+        </tapGestureRecognizer>
     </objects>
     <resources>
         <image name="mine_next" width="8" height="15"/>

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/View/InstitutionMineBodyView.xib

@@ -11,7 +11,7 @@
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="InstitutionMineBodyView">
-            <rect key="frame" x="0.0" y="0.0" width="414" height="750"/>
+            <rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Nbm-ze-ouR">
@@ -501,7 +501,7 @@
                 <outlet property="userName" destination="Nlb-bG-jKG" id="gQI-V1-EYx"/>
                 <outlet property="userNameTop" destination="2Do-ed-2h8" id="scI-hM-fzo"/>
             </connections>
-            <point key="canvasLocation" x="335.87786259541986" y="-228.16901408450704"/>
+            <point key="canvasLocation" x="335.87786259541986" y="-207.74647887323945"/>
         </view>
         <tapGestureRecognizer id="gEi-US-rfA">
             <connections>

+ 1 - 0
KulexiuForStudent/KulexiuForStudent/Module/Chat/View/ChatAddressBodyView.m

@@ -528,6 +528,7 @@
     }
     return _studentArray;
 }
+
 - (NSMutableArray *)sourceIndexArray {
     if (!_sourceIndexArray) {
         _sourceIndexArray = [NSMutableArray array];

+ 58 - 26
KulexiuForStudent/KulexiuForStudent/ToolKit/KSToolLibrary.framework/Headers/VoNetWorking.h

@@ -100,12 +100,13 @@ typedef VoResponseFailBlock VoDownloadFailBlock;
 
 @property (nonatomic, strong) AFHTTPSessionManager *_Nonnull httpSessionManager;
 
+@property (nonatomic, strong) AFHTTPSessionManager *_Nonnull noAuthManager;
+
+
 #pragma mark --- 证书相关
 // 配置
 + (void)configCertificatePath:(NSString *_Nonnull)path baseHost:(NSString *_Nonnull)baseHost needAuth:(BOOL)needAuth;
 
-- (void)configHttpsVerifyAndRequest;
-
 /**
  * 创建一个HttpsManager单例对象
  */
@@ -200,29 +201,6 @@ typedef VoResponseFailBlock VoDownloadFailBlock;
                      successBlock:(VoResponseSuccessBlock _Nullable)successBlock
                         failBlock:(VoResponseFailBlock _Nullable)failBlock;
 
-///**
-// *  POST请求
-// *
-// *  @param url              请求路径
-// *  @param cache            是否缓存
-// *  @param refresh          解释同上
-// *  @param params           拼接参数
-// *  @param progressBlock    进度回调
-// *  @param successBlock     成功回调
-// *  @param failBlock        失败回调
-// *
-// *  @return 返回的对象中可取消请求
-// */
-//
-//- (VoURLSessionTask *)formPostWithUrl:(NSString *)url
-//                   refreshRequest:(BOOL)refresh
-//                            cache:(BOOL)cache
-//                           params:(id)params
-//                    progressBlock:(VoPostProgress)progressBlock
-//                     successBlock:(VoResponseSuccessBlock)successBlock
-//                        failBlock:(VoResponseFailBlock)failBlock;
-
-
 /**
  *  文件上传
  *
@@ -297,6 +275,61 @@ typedef VoResponseFailBlock VoDownloadFailBlock;
                                 progressBlock:(VoDownloadProgress _Nullable)progressBlock
                                  successBlock:(VoMultUploadSuccessBlock _Nullable)successBlock
                                     failBlock:(VoMultUploadFailBlock _Nullable)failBlock;
+
+#pragma mark ----- 无auth 接口
+
+/**
+ *  配置请求头
+ *
+ *  @param httpHeader 请求头
+ */
+- (void)configNoAuthHttpHeader:(NSDictionary *_Nonnull)httpHeader;
+
+/**
+ *  GET请求
+ *
+ *  @param url              请求路径
+ *  @param cache            是否缓存
+ *  @param refresh          是否刷新请求(遇到重复请求,若为YES,则会取消旧的请求,用新的请求,若为NO,则忽略新请求,用旧请求)
+ *  @param params           拼接参数
+ *  @param progressBlock    进度回调
+ *  @param successBlock     成功回调
+ *  @param failBlock        失败回调
+ *
+ *  @return 返回的对象中可取消请求
+ */
+- (VoURLSessionTask *_Nullable)noAuthGetWithUrl:(NSString *_Nonnull)url
+                  refreshRequest:(BOOL)refresh
+                           cache:(BOOL)cache
+                          params:(NSDictionary *_Nullable)params
+                   progressBlock:(VoGetProgress _Nullable)progressBlock
+                    successBlock:(VoResponseSuccessBlock _Nullable)successBlock
+                       failBlock:(VoResponseFailBlock _Nullable)failBlock;
+
+
+
+
+/**
+ *  POST请求
+ *
+ *  @param url              请求路径
+ *  @param cache            是否缓存
+ *  @param refresh          解释同上
+ *  @param params           拼接参数
+ *  @param progressBlock    进度回调
+ *  @param successBlock     成功回调
+ *  @param failBlock        失败回调
+ *
+ *  @return 返回的对象中可取消请求
+ */
+- (VoURLSessionTask *_Nullable)noAuthPostWithUrl:(NSString *_Nonnull)url
+                   refreshRequest:(BOOL)refresh
+                            cache:(BOOL)cache
+                           params:(id _Nullable)params
+                    progressBlock:(VoPostProgress _Nullable)progressBlock
+                     successBlock:(VoResponseSuccessBlock _Nullable)successBlock
+                        failBlock:(VoResponseFailBlock _Nullable)failBlock;
+
 @end
 
 
@@ -341,5 +374,4 @@ typedef VoResponseFailBlock VoDownloadFailBlock;
  */
 + (void)clearDownloadData;
 
-
 @end

BIN
KulexiuForStudent/KulexiuForStudent/ToolKit/KSToolLibrary.framework/KSToolLibrary