Browse Source

消息模块,曲谱模块

Steven 2 years ago
parent
commit
980cf8cdd2
100 changed files with 4259 additions and 1784 deletions
  1. 42 6
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForStudent/KulexiuForStudent.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist
  3. BIN
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate
  4. 2 34
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  5. 6 0
      KulexiuForStudent/KulexiuForStudent/AppDelegate.h
  6. 42 23
      KulexiuForStudent/KulexiuForStudent/AppDelegate.m
  7. 6 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/Contents.json
  8. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/Contents.json
  9. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/alert_cancle@2x.png
  10. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/alert_cancle@3x.png
  11. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/upAlert_bg.imageset/Contents.json
  12. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/upAlert_bg.imageset/upAlert_bg@2x.png
  13. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/upAlert_bg.imageset/upAlert_bg@3x.png
  14. 6 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/Contents.json
  15. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/Contents.json
  16. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/clear_notifer@2x.png
  17. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/clear_notifer@3x.png
  18. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/Contents.json
  19. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/course_cell@2x.png
  20. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/course_cell@3x.png
  21. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/Contents.json
  22. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/message_all@2x.png
  23. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/message_all@3x.png
  24. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/Contents.json
  25. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/message_course@2x.png
  26. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/message_course@3x.png
  27. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/Contents.json
  28. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/message_notice@2x.png
  29. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/message_notice@3x.png
  30. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/Contents.json
  31. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/message_system@2x.png
  32. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/message_system@3x.png
  33. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/Contents.json
  34. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/notice_cell@2x.png
  35. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/notice_cell@3x.png
  36. 22 0
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/Contents.json
  37. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/system_cell@2x.png
  38. BIN
      KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/system_cell@3x.png
  39. 2 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSBaseViewController.h
  40. 18 1
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSBaseWKWebViewController.m
  41. 51 1
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h
  42. 78 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m
  43. 1 1
      KulexiuForStudent/KulexiuForStudent/Common/Tools/Custom/KSImageButton.m
  44. 2 0
      KulexiuForStudent/KulexiuForStudent/Common/Tools/Extension/NSString+Extension.h
  45. 5 0
      KulexiuForStudent/KulexiuForStudent/Common/Tools/Extension/NSString+Extension.m
  46. 3 3
      KulexiuForStudent/KulexiuForStudent/Common/Tools/KSVideoHelper.m
  47. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupApplyChooseCell.m
  48. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupApplyMemberCell.m
  49. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupMemberListCell.m
  50. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupSettingBodyView.m
  51. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Search/View/KSSearchResultViewCell.m
  52. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/View/GroupListViewCell.m
  53. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/View/AccompanyCourseInfoCell.m
  54. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Course/View/AccompanyCourseCell.m
  55. 73 8
      KulexiuForStudent/KulexiuForStudent/Module/Home/Controller/HomeViewController.m
  56. 0 31
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NoticeMessageViewController.m
  57. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NotiferMessageViewController.h
  58. 333 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NotiferMessageViewController.m
  59. 34 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Model/NotiferMessageModel.h
  60. 197 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Model/NotiferMessageModel.m
  61. 32 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.h
  62. 204 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.m
  63. 346 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.xib
  64. 21 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.h
  65. 79 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.m
  66. 95 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.xib
  67. 8 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeBannerCell.m
  68. 3 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeBannerCell.xib
  69. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeHotAlbumCell.m
  70. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeInformationCell.m
  71. 8 2
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeLiveCouseCell.m
  72. 8 2
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeVideoCourseCell.m
  73. 27 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.h
  74. 70 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.m
  75. 79 0
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.xib
  76. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Home/View/TeacherShowCell.m
  77. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Live/Controller/LiveVideoRoomViewController.m
  78. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Live/View/LiveSeatApplyCell.m
  79. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Login/Controller/SubjectChooseViewController.m
  80. 44 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/AddressList/Controller/AddressListViewController.m
  81. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Controller/MineViewController.m
  82. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Homework/View/HomeworkListCell.m
  83. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/Model/VideoCourseModel.m
  84. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/View/MyLiveCourseCell.m
  85. 2 2
      KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/View/VideoCourseCell.m
  86. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/SettingViewController.m
  87. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/VeriCheckView.m
  88. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Mine/View/MineBodyView.m
  89. 1 0
      KulexiuForStudent/Podfile
  90. 5 1
      KulexiuForStudent/Podfile.lock
  91. 5 1
      KulexiuForStudent/Pods/Manifest.lock
  92. 1995 1614
      KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj
  93. 33 26
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist
  94. 17 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.markdown
  95. 23 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.plist
  96. 1 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Debug-input-files.xcfilelist
  97. 1 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Debug-output-files.xcfilelist
  98. 1 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Release-input-files.xcfilelist
  99. 1 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Release-output-files.xcfilelist
  100. 2 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks.sh

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

@@ -431,7 +431,7 @@
 		BC40BA0C28117B3B00DEC0D1 /* TYPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA0828117B3A00DEC0D1 /* TYPageControl.m */; };
 		BC40BA0D28117B3B00DEC0D1 /* TYCyclePagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA0928117B3A00DEC0D1 /* TYCyclePagerView.m */; };
 		BC40BA0E28117B3B00DEC0D1 /* TYCyclePagerTransformLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA0A28117B3A00DEC0D1 /* TYCyclePagerTransformLayout.m */; };
-		BC40BA1828124D3D00DEC0D1 /* NoticeMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA1728124D3D00DEC0D1 /* NoticeMessageViewController.m */; };
+		BC40BA1828124D3D00DEC0D1 /* NotiferMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA1728124D3D00DEC0D1 /* NotiferMessageViewController.m */; };
 		BC40BA1B281251ED00DEC0D1 /* HomeMessageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA1A281251ED00DEC0D1 /* HomeMessageModel.m */; };
 		BC40BA1F2812552300DEC0D1 /* KSHomeButton.m in Sources */ = {isa = PBXBuildFile; fileRef = BC40BA1C2812552200DEC0D1 /* KSHomeButton.m */; };
 		BC40BA202812552300DEC0D1 /* KSHomeButton.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC40BA1D2812552200DEC0D1 /* KSHomeButton.xib */; };
@@ -440,6 +440,11 @@
 		BC50171227FC0D5600F8BCBC /* SubjectChooseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC50171127FC0D5600F8BCBC /* SubjectChooseViewController.m */; };
 		BC50171527FC0D8300F8BCBC /* SubjectChooseBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC50171427FC0D8300F8BCBC /* SubjectChooseBodyView.m */; };
 		BC50171727FC0D8E00F8BCBC /* SubjectChooseBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC50171627FC0D8D00F8BCBC /* SubjectChooseBodyView.xib */; };
+		BC76630E2827E48800C91A1D /* NotiferMessageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76630C2827E48800C91A1D /* NotiferMessageModel.m */; };
+		BC7663152827E49900C91A1D /* NotiferHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76630F2827E49800C91A1D /* NotiferHeadView.m */; };
+		BC7663162827E49900C91A1D /* NotiferHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7663102827E49800C91A1D /* NotiferHeadView.xib */; };
+		BC7663172827E49900C91A1D /* NotiferMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7663122827E49800C91A1D /* NotiferMessageCell.m */; };
+		BC7663182827E49900C91A1D /* NotiferMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7663132827E49900C91A1D /* NotiferMessageCell.xib */; };
 		BC8C2C572823F57100FBA5D5 /* AddressDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C452823F57100FBA5D5 /* AddressDetailViewController.m */; };
 		BC8C2C582823F57100FBA5D5 /* AddressListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C462823F57100FBA5D5 /* AddressListViewController.m */; };
 		BC8C2C592823F57100FBA5D5 /* AddressListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C482823F57100FBA5D5 /* AddressListModel.m */; };
@@ -451,6 +456,8 @@
 		BC8C2C5F2823F57100FBA5D5 /* MyAddressListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C522823F57100FBA5D5 /* MyAddressListCell.m */; };
 		BC8C2C602823F57100FBA5D5 /* AddressBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8C2C532823F57100FBA5D5 /* AddressBottomView.m */; };
 		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 */; };
 		BCB6345D27F6D29600ACFDCF /* KSLiveChatroomWelcome.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6340D27F6D29500ACFDCF /* KSLiveChatroomWelcome.m */; };
 		BCB6345E27F6D29600ACFDCF /* KSLiveChatroomLeave.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6340E27F6D29500ACFDCF /* KSLiveChatroomLeave.m */; };
 		BCB6345F27F6D29600ACFDCF /* KSLiveChatroomEnter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB6340F27F6D29500ACFDCF /* KSLiveChatroomEnter.m */; };
@@ -1402,8 +1409,8 @@
 		BC40BA0928117B3A00DEC0D1 /* TYCyclePagerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TYCyclePagerView.m; sourceTree = "<group>"; };
 		BC40BA0A28117B3A00DEC0D1 /* TYCyclePagerTransformLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TYCyclePagerTransformLayout.m; sourceTree = "<group>"; };
 		BC40BA0B28117B3A00DEC0D1 /* TYPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TYPageControl.h; sourceTree = "<group>"; };
-		BC40BA1628124D3D00DEC0D1 /* NoticeMessageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NoticeMessageViewController.h; sourceTree = "<group>"; };
-		BC40BA1728124D3D00DEC0D1 /* NoticeMessageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NoticeMessageViewController.m; sourceTree = "<group>"; };
+		BC40BA1628124D3D00DEC0D1 /* NotiferMessageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotiferMessageViewController.h; sourceTree = "<group>"; };
+		BC40BA1728124D3D00DEC0D1 /* NotiferMessageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotiferMessageViewController.m; sourceTree = "<group>"; };
 		BC40BA19281251EC00DEC0D1 /* HomeMessageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeMessageModel.h; sourceTree = "<group>"; };
 		BC40BA1A281251ED00DEC0D1 /* HomeMessageModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeMessageModel.m; sourceTree = "<group>"; };
 		BC40BA1C2812552200DEC0D1 /* KSHomeButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSHomeButton.m; sourceTree = "<group>"; };
@@ -1417,6 +1424,14 @@
 		BC50171327FC0D8300F8BCBC /* SubjectChooseBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubjectChooseBodyView.h; sourceTree = "<group>"; };
 		BC50171427FC0D8300F8BCBC /* SubjectChooseBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubjectChooseBodyView.m; sourceTree = "<group>"; };
 		BC50171627FC0D8D00F8BCBC /* SubjectChooseBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SubjectChooseBodyView.xib; sourceTree = "<group>"; };
+		BC76630C2827E48800C91A1D /* NotiferMessageModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotiferMessageModel.m; sourceTree = "<group>"; };
+		BC76630D2827E48800C91A1D /* NotiferMessageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotiferMessageModel.h; sourceTree = "<group>"; };
+		BC76630F2827E49800C91A1D /* NotiferHeadView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotiferHeadView.m; sourceTree = "<group>"; };
+		BC7663102827E49800C91A1D /* NotiferHeadView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NotiferHeadView.xib; sourceTree = "<group>"; };
+		BC7663112827E49800C91A1D /* NotiferMessageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotiferMessageCell.h; sourceTree = "<group>"; };
+		BC7663122827E49800C91A1D /* NotiferMessageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotiferMessageCell.m; sourceTree = "<group>"; };
+		BC7663132827E49900C91A1D /* NotiferMessageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NotiferMessageCell.xib; sourceTree = "<group>"; };
+		BC7663142827E49900C91A1D /* NotiferHeadView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotiferHeadView.h; sourceTree = "<group>"; };
 		BC8C2C432823F57100FBA5D5 /* AddressDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddressDetailViewController.h; sourceTree = "<group>"; };
 		BC8C2C442823F57100FBA5D5 /* AddressListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddressListViewController.h; sourceTree = "<group>"; };
 		BC8C2C452823F57100FBA5D5 /* AddressDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddressDetailViewController.m; sourceTree = "<group>"; };
@@ -1435,6 +1450,9 @@
 		BC8C2C542823F57100FBA5D5 /* AddressDetailBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddressDetailBodyView.h; sourceTree = "<group>"; };
 		BC8C2C552823F57100FBA5D5 /* KSAddressPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSAddressPickerView.h; sourceTree = "<group>"; };
 		BC8C2C562823F57100FBA5D5 /* MyAddressListCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MyAddressListCell.xib; sourceTree = "<group>"; };
+		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>"; };
 		BCB6340C27F6D29500ACFDCF /* KSRCMessageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSRCMessageModel.h; sourceTree = "<group>"; };
 		BCB6340D27F6D29500ACFDCF /* KSLiveChatroomWelcome.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSLiveChatroomWelcome.m; sourceTree = "<group>"; };
 		BCB6340E27F6D29500ACFDCF /* KSLiveChatroomLeave.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSLiveChatroomLeave.m; sourceTree = "<group>"; };
@@ -2037,6 +2055,9 @@
 		275FA1F627E7356A00CFEA2E /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC8C2C7B28265D8D00FBA5D5 /* KSNewsAlert.h */,
+				BC8C2C7C28265D8D00FBA5D5 /* KSNewsAlert.m */,
+				BC8C2C7D28265D8E00FBA5D5 /* KSNewsAlert.xib */,
 				BCBFDF3528110C660052AFE5 /* HomeNavView.h */,
 				BCBFDF3628110C660052AFE5 /* HomeNavView.m */,
 				BCBFDF3828110C6F0052AFE5 /* HomeNavView.xib */,
@@ -3417,8 +3438,8 @@
 		BC40BA1028124D0C00DEC0D1 /* Controller */ = {
 			isa = PBXGroup;
 			children = (
-				BC40BA1628124D3D00DEC0D1 /* NoticeMessageViewController.h */,
-				BC40BA1728124D3D00DEC0D1 /* NoticeMessageViewController.m */,
+				BC40BA1628124D3D00DEC0D1 /* NotiferMessageViewController.h */,
+				BC40BA1728124D3D00DEC0D1 /* NotiferMessageViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -3426,6 +3447,8 @@
 		BC40BA1128124D0C00DEC0D1 /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				BC76630D2827E48800C91A1D /* NotiferMessageModel.h */,
+				BC76630C2827E48800C91A1D /* NotiferMessageModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -3433,6 +3456,12 @@
 		BC40BA1228124D0C00DEC0D1 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC7663142827E49900C91A1D /* NotiferHeadView.h */,
+				BC76630F2827E49800C91A1D /* NotiferHeadView.m */,
+				BC7663102827E49800C91A1D /* NotiferHeadView.xib */,
+				BC7663112827E49800C91A1D /* NotiferMessageCell.h */,
+				BC7663122827E49800C91A1D /* NotiferMessageCell.m */,
+				BC7663132827E49900C91A1D /* NotiferMessageCell.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -4212,6 +4241,7 @@
 				2723B5C327F157B100E0B90B /* ChatNavView.xib in Resources */,
 				BCFE53F22812898700AD6786 /* HomeVideoCourseCell.xib in Resources */,
 				2723B5BA27F157B100E0B90B /* ChatAddressHeaderView.xib in Resources */,
+				BC8C2C7F28265D8E00FBA5D5 /* KSNewsAlert.xib in Resources */,
 				BC119235280ED97C00A716F7 /* CourseForLiveCell.xib in Resources */,
 				2723B62E27F157D500E0B90B /* GroupApplyChooseAllCell.xib in Resources */,
 				275FA23A27E7356B00CFEA2E /* VefiBodyView.xib in Resources */,
@@ -4243,6 +4273,7 @@
 				BC119270280FAF7D00A716F7 /* AccompanyCourseInfoCell.xib in Resources */,
 				BC8C2C5B2823F57100FBA5D5 /* AddressBottomView.xib in Resources */,
 				BC40BA202812552300DEC0D1 /* KSHomeButton.xib in Resources */,
+				BC7663162827E49900C91A1D /* NotiferHeadView.xib in Resources */,
 				2723B5C427F157B100E0B90B /* KSChatListSearchView.xib in Resources */,
 				2779359B27E324A80010E277 /* TZImagePickerController.bundle in Resources */,
 				277935C327E324A90010E277 /* SDQWMaskCustomView.xib in Resources */,
@@ -4259,6 +4290,7 @@
 				275FA24527E73E0100CFEA2E /* InstrumentDescView.xib in Resources */,
 				BC11922D280ED8E800A716F7 /* CourseNavView.xib in Resources */,
 				BC11929D280FD2EF00A716F7 /* HomeworkBottomView.xib in Resources */,
+				BC7663182827E49900C91A1D /* NotiferMessageCell.xib in Resources */,
 				BCB6348127F6D29600ACFDCF /* LiveSeatApplyCell.xib in Resources */,
 				2723B62D27F157D500E0B90B /* GroupApplyMemberCell.xib in Resources */,
 				BCB6347427F6D29600ACFDCF /* BaseEmoji.plist in Resources */,
@@ -4489,6 +4521,7 @@
 				275FA1DC27E7351900CFEA2E /* KSAQRecordManager.m in Sources */,
 				BC40B9F82811767A00DEC0D1 /* HotInformationHeadView.m in Sources */,
 				BCB6356827F6D2A300ACFDCF /* ApplySpeechResultMessage.m in Sources */,
+				BC7663152827E49900C91A1D /* NotiferHeadView.m in Sources */,
 				2779351427E324A50010E277 /* NSMutableDictionary+KSSafe.m in Sources */,
 				2779356F27E324A70010E277 /* SkipTextField.m in Sources */,
 				2723B67F27F15D3D00E0B90B /* AboutUsViewController.m in Sources */,
@@ -4774,6 +4807,7 @@
 				BCB6356627F6D2A300ACFDCF /* DeviceMessage.m in Sources */,
 				BCBFDF3728110C660052AFE5 /* HomeNavView.m in Sources */,
 				277935D127E324A90010E277 /* ALCalendarCollectionView.m in Sources */,
+				BC76630E2827E48800C91A1D /* NotiferMessageModel.m in Sources */,
 				BCFE5406281545C600AD6786 /* HomeAlbumModel.m in Sources */,
 				2779355427E324A70010E277 /* VoNetWorking.m in Sources */,
 				275FA1EE27E7351900CFEA2E /* KSBaseViewController.m in Sources */,
@@ -4798,6 +4832,7 @@
 				2779355227E324A70010E277 /* VoMemoryCache.m in Sources */,
 				2779352A27E324A60010E277 /* UIView+Dealloc.m in Sources */,
 				2779352D27E324A60010E277 /* NSString+CZHSizeExtension.m in Sources */,
+				BC8C2C7E28265D8E00FBA5D5 /* KSNewsAlert.m in Sources */,
 				BC119259280FA85300A716F7 /* HomeworkListCell.m in Sources */,
 				2779353827E324A60010E277 /* UIView+KSExtension.m in Sources */,
 				2723B5CD27F157BE00E0B90B /* GroupListModel.m in Sources */,
@@ -4863,6 +4898,7 @@
 				2779353D27E324A60010E277 /* UIScrollView+KSTouch.m in Sources */,
 				BCB6353227F6D2A300ACFDCF /* InputView.m in Sources */,
 				275FA23927E7356B00CFEA2E /* FirstSettingBodyView.m in Sources */,
+				BC7663172827E49900C91A1D /* NotiferMessageCell.m in Sources */,
 				BCB6346527F6D29600ACFDCF /* KSLiveChatroomLike.m in Sources */,
 				BCB6356927F6D2A300ACFDCF /* TurnPageMessage.m in Sources */,
 				277935CA27E324A90010E277 /* TAAnimatedDotView.m in Sources */,
@@ -4899,7 +4935,7 @@
 				2779357527E324A70010E277 /* LifeButton.m in Sources */,
 				27F9032C27E87C2E00C08A19 /* KSNetworkAlert.m in Sources */,
 				2779353627E324A60010E277 /* CALayer+Layout.m in Sources */,
-				BC40BA1828124D3D00DEC0D1 /* NoticeMessageViewController.m in Sources */,
+				BC40BA1828124D3D00DEC0D1 /* NotiferMessageViewController.m in Sources */,
 				275FA22D27E7356B00CFEA2E /* ChatViewController.m in Sources */,
 				BCB6354127F6D2A300ACFDCF /* VideoListCell.m in Sources */,
 				2723B5A427F1578300E0B90B /* KSChatConversationViewController.m in Sources */,

+ 1 - 1
KulexiuForStudent/KulexiuForStudent.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,7 +7,7 @@
 		<key>KulexiuForStudent.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>30</integer>
+			<integer>31</integer>
 		</dict>
 	</dict>
 </dict>

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


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

@@ -62,8 +62,8 @@
             filePath = "KulexiuForStudent/Module/Home/Controller/HomeViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "913"
-            endingLineNumber = "913"
+            startingLineNumber = "931"
+            endingLineNumber = "931"
             landmarkName = "-homeCourseChooseAction:"
             landmarkType = "7">
          </BreakpointContent>
@@ -103,38 +103,6 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "8A2379FD-DD15-49C1-A722-62AE22807377"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForStudent/Common/Base/KSBaseWKWebViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "54"
-            endingLineNumber = "54"
-            landmarkName = "-operationDealCallbackMessage:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "88106977-85A3-48AA-A3EE-39F89AF225EF"
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForStudent/Module/Home/Controller/HomeViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "364"
-            endingLineNumber = "364"
-            landmarkName = "-requestCourseInfo"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
             uuid = "9C309015-F943-43C8-AD3C-0A595D5701FD"
             shouldBeEnabled = "No"
             ignoreCount = "0"

+ 6 - 0
KulexiuForStudent/KulexiuForStudent/AppDelegate.h

@@ -18,6 +18,12 @@
 //记录当前界面是否支持横竖屏旋转
 @property (assign, nonatomic)BOOL allowAutoRotate;
 
+@property (nonatomic, assign) BOOL isShowMemoAlert;
+
+@property (nonatomic, assign) BOOL isShowFlashAlert; // 是否显示首页 news alert
+
+- (void)showMemoAlert;
+
 - (void)initTableBar;
 - (void)requestRongCloudToken;
 - (void)appTrackActionAuth;

+ 42 - 23
KulexiuForStudent/KulexiuForStudent/AppDelegate.m

@@ -50,6 +50,8 @@
 
 @property (nonatomic, strong) KSUpdateAlert *alertView;
 
+@property (nonatomic, strong) NSMutableDictionary *messageDict;
+
 @property (nonatomic, assign) BOOL hasCheckTrackAuth;
 
 @end
@@ -169,28 +171,28 @@
         [KSUpdateManager ks_updateWithAPPID:@"1487057217" withBundleId:nil block:^(NSString * _Nonnull currentVersion, NSString * _Nonnull storeVersion, NSString * _Nonnull openUrl, BOOL isUpdate) {
             if (isUpdate) {
                 
-//                [KSRequestManager appVersionInfoRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
-//                    if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
-//
-//                        NSString *serviceVersion = [[dic dictionaryValueForKey:@"data"] stringValueForKey:@"version"];
-//                        if ([serviceVersion isEqualToString:storeVersion] || [self isLowerVersionCompareLocalVersion:currentVersion serviceVersion:serviceVersion]) {
-//                            // desc
-//                            NSString *descMessage = [[dic dictionaryValueForKey:@"data"] stringValueForKey:@"description"];
-//                            // 判断
-//                            if ([[dic dictionaryValueForKey:@"data"] boolValueForKey:@"isForceUpdate"]) {
-//                                self.isNeedUpdate = YES;
-//                                [self showAlertWithMemo:storeVersion descMessage:descMessage isforce:YES openUrl:openUrl];
-//                            }
-//                            else {
-//                                self.isNeedUpdate = NO;
-//                                [self showAlertWithMemo:storeVersion descMessage:descMessage isforce:NO openUrl:openUrl];
-//                            }
-//                        }
-//
-//                    }
-//                } faliure:^(NSError * _Nonnull error) {
-//                    [self showAlertWithMemo:storeVersion descMessage:@"全新版本上线了,赶快来体验吧!" isforce:NO openUrl:openUrl];
-//                }];
+                [KSNetworkingManager appVersionInfoRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
+                    if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+                        
+                        NSString *serviceVersion = [[dic dictionaryValueForKey:@"data"] stringValueForKey:@"version"];
+                        if ([serviceVersion isEqualToString:storeVersion] || [self isLowerVersionCompareLocalVersion:currentVersion serviceVersion:serviceVersion]) {
+                            // desc
+                            NSString *descMessage = [[dic dictionaryValueForKey:@"data"] stringValueForKey:@"description"];
+                            // 判断
+                            if ([[dic dictionaryValueForKey:@"data"] boolValueForKey:@"isForceUpdate"]) {
+                                self.isNeedUpdate = YES;
+                                [self showAlertWithMemo:storeVersion descMessage:descMessage isforce:YES openUrl:openUrl];
+                            }
+                            else {
+                                self.isNeedUpdate = NO;
+                                [self showAlertWithMemo:storeVersion descMessage:descMessage isforce:NO openUrl:openUrl];
+                            }
+                        }
+                        
+                    }
+                } faliure:^(NSError * _Nonnull error) {
+                    [self showAlertWithMemo:storeVersion descMessage:@"全新版本上线了,赶快来体验吧!" isforce:NO openUrl:openUrl];
+                }];
             }
             else {
                 NSLog(@"当前版本%@,商店版本%@,不需要更新",currentVersion,storeVersion);
@@ -515,10 +517,26 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
     }
 }
 
+- (void)showMemoAlert {
+    if (_isShowFlashAlert == NO && self.messageDict != nil) {
+        [self showAlertWithMemo:[self.messageDict stringValueForKey:@"memo"] descMessage:[self.messageDict stringValueForKey:@"descMessage"] isforce:[self.messageDict boolValueForKey:@"isforce"] openUrl:[self.messageDict stringValueForKey:@"openUrl"]];
+    }
+}
 
 - (void)showAlertWithMemo:(NSString *)memo descMessage:(NSString *)descMessage isforce:(BOOL)isforce openUrl:(NSString *)openUrl {
-
+    if (_isShowFlashAlert) {
+        NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+        [parm setValue:memo forKey:@"memo"];
+        [parm setValue:descMessage forKey:@"descMessage"];
+        [parm setValue:@(isforce) forKey:@"isforce"];
+        [parm setValue:openUrl forKey:@"openUrl"];
+        self.messageDict = [parm mutableCopy];
+        return;
+    }
+    self.messageDict = nil;
+    MJWeakSelf;
     [self.alertView configWithMemo:memo desc:descMessage isForce:isforce callback:^(BOOL isSure) {
+        weakSelf.isShowMemoAlert = NO;
         if (isSure) {
             if (@available(iOS 10.0, *)) {
                 if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
@@ -544,6 +562,7 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
         }
     }];
     [self.alertView showAlert];
+    self.isShowMemoAlert = YES;
 }
 
 

+ 6 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/Contents.json

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

+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/alert_cancle@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/alert_cancle.imageset/alert_cancle@3x.png


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

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/upAlert_bg.imageset/upAlert_bg@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/Common/upAlert_bg.imageset/upAlert_bg@3x.png


+ 6 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/Contents.json

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

+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/clear_notifer@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/clear_notifer.imageset/clear_notifer@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/course_cell@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/course_cell.imageset/course_cell@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/message_all@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_all.imageset/message_all@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/message_course@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_course.imageset/message_course@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/message_notice@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_notice.imageset/message_notice@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/message_system@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/message_system.imageset/message_system@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/notice_cell@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/notice_cell.imageset/notice_cell@3x.png


+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/Contents.json

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

BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/system_cell@2x.png


BIN
KulexiuForStudent/KulexiuForStudent/Assets.xcassets/MessageCenter/system_cell.imageset/system_cell@3x.png


+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSBaseViewController.h

@@ -64,6 +64,8 @@ NS_ASSUME_NONNULL_BEGIN
 - (void)backAction; // 返回
 -(void)allocTitle:(NSString*)Ntitle withColor:(UIColor *)color;
 
+- (void)selectBarHomeWithIndex:(NSInteger)index;
+
 //结束页面编辑
 - (void)endViewEditing;
 // 重置数据

+ 18 - 1
KulexiuForStudent/KulexiuForStudent/Common/Base/KSBaseWKWebViewController.m

@@ -412,7 +412,24 @@
         NSString *infoMessage = [[parm dictionaryValueForKey:@"content"] stringValueForKey:@"payInfo"];
         [KSOrderManager dealWithAliOrder:infoMessage];
     }
-    
+    else if ([[parm stringValueForKey:@"api"] isEqualToString:@"joinChatGroup"]) {
+        NSDictionary *valueDic = [parm dictionaryValueForKey:@"content"];
+        NSString *targetId = [valueDic stringValueForKey:@"id"];
+        if ([valueDic stringValueForKey:@"single"]) { // 单聊
+            
+            KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+            ctrl.targetId = targetId;
+            ctrl.conversationType = ConversationType_PRIVATE;
+            [self.navigationController pushViewController:ctrl animated:YES];
+            
+        }
+        else if ([valueDic stringValueForKey:@"multi"]) { // 群聊
+            KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+            ctrl.targetId = targetId;
+            ctrl.conversationType = ConversationType_GROUP;
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+    }
 //    else if ([[parm stringValueForKey:@"api"] isEqualToString:@"enterLiveRoom"]) { // 进入直播间
 //        NSDictionary *valueDic = [parm dictionaryValueForKey:@"content"];
 //        NSString *roomId = [valueDic stringValueForKey:@"roomId"];

+ 51 - 1
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h

@@ -24,6 +24,10 @@ NS_ASSUME_NONNULL_BEGIN
 // 退出登录操作
 + (void)logoutAction;
 
+#pragma mark ----- version
+// api-admin/appVersionInfo/queryByPlatform
++ (void)appVersionInfoRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 #pragma mark ---- 图片上传
 /**
  图片上传
@@ -528,7 +532,7 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)queryAddressDetailRequst:(NSString *)get addressId:(NSString *)addressId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
 // 修改收货地址
-// /mall-portal-server/member/address/update/{id}
+// /api-mall-portal/member/address/update/{id}
 
 /// 修改收获地址
 /// @param post post
@@ -544,6 +548,52 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param success 成功
 /// @param faliure 失败
 + (void)updateAddressRequest:(NSString *)post addressId:(NSString *)addressId name:(NSString *)name phoneNumber:(NSString *)phoneNumber defaultStatus:(NSInteger)defaultStatus detailAddress:(NSString *)detailAddress province:(NSString *)province city:(NSString *)city region:(NSString *)region postCode:(NSString *)postCode success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-mall-portal/member/address/delete/{id}
+
+/// 删除收货地址
+/// @param post post
+/// @param addressId 地址id
+/// @param success 成功
+/// @param faliure 失败
++ (void)deleteAddressRequest:(NSString *)post addressId:(NSString *)addressId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+#pragma mark ------- 消息中心
+// /api-student/sysMessage/list
+
+/// 消息列表
+/// @param post post
+/// @param group 消息组 SYSTEM:系统消息 COURSE:课程信息 NOTICE:公告
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)sysMessageListRequest:(NSString *)post group:(NSString *)group page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-student/sysMessage/queryCountOfUnread
+
+/// 获取未读消息条数
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryCountOfUnreadRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+    
+// /api-student/sysMessage/setRead/{id}
+
+/// 设置消息已读
+/// @param post post
+/// @param messageId 消息id
+/// @param success 成功
+/// @param faliure 失败
++ (void)setReadMessage:(NSString *)post messageId:(NSString *)messageId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+
+// /api-student/sysMessage/batchSetRead
+
+/// 消息一键已读
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)batchSetReadRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 @end
 
 NS_ASSUME_NONNULL_END

+ 78 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m

@@ -297,6 +297,15 @@
     }];
 }
 
+#pragma mark ----- version
+// api-admin/appVersionInfo/queryByPlatform
++ (void)appVersionInfoRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-admin/appVersionInfo/queryByPlatform"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@"iOS-student" forKey:@"platform"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 #pragma mark ---- 图片上传
 /**
  图片上传
@@ -1122,6 +1131,75 @@
     [parm setValue:region forKey:@"region"];
     [parm setValue:postCode forKey:@"postCode"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-mall-portal/member/address/delete/{id}
+
+/// 删除收货地址
+/// @param post post
+/// @param addressId 地址id
+/// @param success 成功
+/// @param faliure 失败
++ (void)deleteAddressRequest:(NSString *)post addressId:(NSString *)addressId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", hostURL, @"/api-mall-portal/member/address/delete/",addressId];
+    [self request:post andWithUrl:url and:nil success:success faliure:faliure];
+}
+
+#pragma mark ------- 消息中心
+// /api-student/sysMessage/list
+
+/// 消息列表
+/// @param post post
+/// @param group 消息组 SYSTEM:系统消息 COURSE:课程信息 NOTICE:公告
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)sysMessageListRequest:(NSString *)post group:(NSString *)group page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-student/sysMessage/list"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:group forKey:@"group"];
+    [parm setValue:@(page) forKey:@"page"];
+    [parm setValue:@(rows) forKey:@"rows"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-student/sysMessage/queryCountOfUnread
+
+/// 获取未读消息条数
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryCountOfUnreadRequest:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-student/sysMessage/queryCountOfUnread"];
+    [self request:get andWithUrl:url and:nil success:success faliure:faliure];
+}
     
+// /api-student/sysMessage/setRead/{id}
+
+/// 设置消息已读
+/// @param post post
+/// @param messageId 消息id
+/// @param success 成功
+/// @param faliure 失败
++ (void)setReadMessage:(NSString *)post messageId:(NSString *)messageId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@%@", hostURL, @"/api-student/sysMessage/setRead/",messageId];
+    [self request:post andWithUrl:url and:nil success:success faliure:faliure];
+}
+
+
+// /api-student/sysMessage/batchSetRead
+
+/// 消息一键已读
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)batchSetReadRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-student/sysMessage/batchSetRead"];
+    [self request:post andWithUrl:url and:nil success:success faliure:faliure];
 }
 @end

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Common/Tools/Custom/KSImageButton.m

@@ -28,7 +28,7 @@
     button.frame = frame;
     
     if ([image isKindOfClass:[NSString class]]) {
-        [button sd_setBackgroundImageWithURL:[NSURL URLWithString:image] forState:UIControlStateNormal completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
+        [button sd_setBackgroundImageWithURL:[NSURL URLWithString:[image getUrlEndcodeString]] forState:UIControlStateNormal completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
             button.displayImage = image;
         }];
     } else {

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Common/Tools/Extension/NSString+Extension.h

@@ -30,6 +30,8 @@ typedef NS_ENUM(NSInteger,CHECKTYPE){
 + (NSString*)deviceVersion;//获取手机型号
 + (NSString*)dictionaryToJson:(NSDictionary *)dic;
 - (NSString *)dateFormatString; // 返回年月日 传入格式 YYYY-MM-dd hh:mm:ss
+// url encoding
+- (NSString *)getUrlEndcodeString;
 
 /**
  获取字符串首字母(传入汉字字符串,返回大写拼音首字母)

+ 5 - 0
KulexiuForStudent/KulexiuForStudent/Common/Tools/Extension/NSString+Extension.m

@@ -233,6 +233,11 @@
     }
 }
 
+// url encoding
+- (NSString *)getUrlEndcodeString {
+    return [self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];;
+}
+
 /**
  获取字符串首字母(传入汉字字符串,返回大写拼音首字母)
  

+ 3 - 3
KulexiuForStudent/KulexiuForStudent/Common/Tools/KSVideoHelper.m

@@ -14,7 +14,7 @@
 @implementation KSVideoHelper
 
 + (void)getVideoPreviewImageUrl:(NSString *)videoUrl forImageView:(UIImageView *)imageView placeholder:(UIImage *)placeHolder {
-
+    videoUrl = [videoUrl getUrlEndcodeString];
     [[SDImageCache sharedImageCache] queryCacheOperationForKey:videoUrl done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
         //是否有缓存图片
         if(image){
@@ -29,7 +29,7 @@
 // 获取视频第一帧
 + (void)getVideoFirstViewImage:(NSString *)videoURL forImageView:(UIImageView *)imageView placeHolderImage:(UIImage *)placeHolder {
    
-    NSString *url = videoURL;
+    NSString *url = [videoURL getUrlEndcodeString];
     __block UIImage *videoImage;
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
         AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:url] options:nil];
@@ -55,7 +55,7 @@
                 
             }else{
                 //如果不是视频就设置图片
-                [imageView sd_setImageWithURL:[NSURL URLWithString:videoURL] placeholderImage:placeHolder];
+                [imageView sd_setImageWithURL:[NSURL URLWithString:[videoURL getUrlEndcodeString]] placeholderImage:placeHolder];
             }
         });
           

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupApplyChooseCell.m

@@ -35,7 +35,7 @@
         [self.userAvatal setImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
     }
     else {
-        [self.userAvatal sd_setImageWithURL:[NSURL URLWithString:source.avatar] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
+        [self.userAvatal sd_setImageWithURL:[NSURL URLWithString:[source.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
     }
     if ([NSString isEmptyString:source.username]) {
         self.userName.text = [NSString stringWithFormat:@"用户:%@",source.userId];

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupApplyMemberCell.m

@@ -32,7 +32,7 @@
         [self.userAvatal setImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
     }
     else {
-        [self.userAvatal sd_setImageWithURL:[NSURL URLWithString:source.avatar] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
+        [self.userAvatal sd_setImageWithURL:[NSURL URLWithString:[source.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
     }
     if ([NSString isEmptyString:source.username]) {
         self.userName.text = [NSString stringWithFormat:@"用户:%@",source.userId];

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupMemberListCell.m

@@ -39,7 +39,7 @@
         self.chatButton.userInteractionEnabled = YES;
         GroupMemberModel *model = source;
         self.sourceModel = source;
-        [self.memberLogo sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
+        [self.memberLogo sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
         if ([NSString isEmptyString:model.nickname]) {
             self.memberName.text = [NSString stringWithFormat:@"用户:%@",model.userId];
         }

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupSettingBodyView.m

@@ -77,7 +77,7 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
     if (callback) {
         self.callback = callback;
     }
-    [self.memberLogo sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
+    [self.memberLogo sd_setImageWithURL:[NSURL URLWithString:[url getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
     self.memberLabel.text = [NSString returnNoNullStringWithString:name];
     self.targetId = targetId;
 }
@@ -117,7 +117,7 @@ typedef void(^ChooseMemberCallback)(NSString *targetId);
             [self.groupImage setImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
         }
         else {
-            [self.groupImage sd_setImageWithURL:[NSURL URLWithString:model.img] placeholderImage:[UIImage imageNamed:GROUP_LOGO]];
+            [self.groupImage sd_setImageWithURL:[NSURL URLWithString:[model.img getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:GROUP_LOGO]];
         }
         
         self.groupName.text = [NSString returnNoNullStringWithString:model.name];

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Chat/Search/View/KSSearchResultViewCell.m

@@ -99,12 +99,12 @@
     } else {
         if (model.conversationType == ConversationType_GROUP) {
             [self.headerView
-                sd_setImageWithURL:[NSURL URLWithString:model.portraitUri]
+                sd_setImageWithURL:[NSURL URLWithString:[model.portraitUri getUrlEndcodeString]]
                   placeholderImage:[self imageNamed:@"default_group_portrait" ofBundle:@"RongCloud.bundle"]];
         }
         else {
             [self.headerView
-                sd_setImageWithURL:[NSURL URLWithString:model.portraitUri]
+                sd_setImageWithURL:[NSURL URLWithString:[model.portraitUri getUrlEndcodeString]]
                   placeholderImage:[self imageNamed:@"default_portrait_msg" ofBundle:@"RongCloud.bundle"]];
         }
         

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/View/GroupListViewCell.m

@@ -46,7 +46,7 @@
             [self.groupLogo setImage:[UIImage imageNamed:defaultLogo]];
         }
         else {
-            [self.groupLogo sd_setImageWithURL:[NSURL URLWithString:model.img] placeholderImage:[UIImage imageNamed:defaultLogo]];
+            [self.groupLogo sd_setImageWithURL:[NSURL URLWithString:[model.img getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:defaultLogo]];
         }
     }
 }

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Course/AccompanyCourse/View/AccompanyCourseInfoCell.m

@@ -45,7 +45,7 @@
     self.courseTime.text = [NSString stringWithFormat:@"%@~%@",[NSString returnNoNullStringWithString:lessonBegin],[NSString returnNoNullStringWithString:lessonEnd]];
     
     self.studentName.text = [NSString returnNoNullStringWithString:teacherName];
-    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:teacherAvatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:[teacherAvatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.studentSubject.text = [NSString returnNoNullStringWithString:courseSubject];
 
     self.userId = teacherId;

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Course/View/AccompanyCourseCell.m

@@ -46,7 +46,7 @@
         self.callback = callback;
     }
     self.sourceModel = model;
-    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.studentName.text = [NSString returnNoNullStringWithString:model.userName];
     self.studentSubject.text = [NSString returnNoNullStringWithString:model.subjectName];
     // time
@@ -102,7 +102,7 @@
     }
     self.lessonModel = model;
     
-    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:model.cover] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.studentAvatar sd_setImageWithURL:[NSURL URLWithString:[model.cover getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.studentName.text = [NSString returnNoNullStringWithString:model.name];
     self.studentSubject.text = [NSString returnNoNullStringWithString:model.subjectName];
     

+ 73 - 8
KulexiuForStudent/KulexiuForStudent/Module/Home/Controller/HomeViewController.m

@@ -7,7 +7,7 @@
 
 #import "HomeViewController.h"
 #import "KSBaseWKWebViewController.h"
-#import "NoticeMessageViewController.h"
+#import "NotiferMessageViewController.h"
 #import "SubjectChooseViewController.h"
 #import "HomeNavView.h"
 #import "HomeBannerView.h"
@@ -45,6 +45,8 @@
 #import "HomeVideoGroupModel.h"
 
 #import "WMPlayer.h"  // 播放相关
+#import "AppDelegate.h"
+#import "KSNewsAlert.h"
 
 #define BUTTONWIDTH (65)
 #define BUTTONHEIGHT (80)
@@ -185,8 +187,9 @@
     NSString *accompanyUrl = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/practiceClass"];
     NSString *liveUrl = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/liveClass"];
     NSString *videoUrl = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/videoClass"];
+    NSString *musicUrl = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-songbook"];
     NSString *teacherUrl = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/teacherElegant"];
-    NSArray *linkUrlArray = @[accompanyUrl,liveUrl,videoUrl,@"",teacherUrl];
+    NSArray *linkUrlArray = @[accompanyUrl,liveUrl,videoUrl,musicUrl,teacherUrl];
     for (NSInteger i = 0; i < titleArray.count; i++) {
         HomeMessageModel *model = [[HomeMessageModel alloc] init];
         model.title = titleArray[i];
@@ -270,7 +273,7 @@
 }
 
 - (void)requestData {
-    [self requestUserInfo]; // 获取老师声部
+    [self requestUserInfo]; // 获取声部
     [self requestNewsList]; //
     [self requestCourseInfo];
     [self requestTeacherStyle];
@@ -301,6 +304,13 @@
 //            self.buttonArray = [NSMutableArray arrayWithArray:buttonInfoArray];
 //            [self showButtonMessage];
             
+            // news
+            NSArray *flashArray = [result arrayValueForKey:@"flashPage"];
+            if (flashArray.count) {
+                HomeMessageModel *newsModel = [[HomeMessageModel alloc] initWithDictionary:[flashArray firstObject]];
+                [self showNewsWithSource:newsModel];
+            }
+            
             // information
             NSArray *information = [result arrayValueForKey:@"information"];
             NSMutableArray *informationInfoArray = [NSMutableArray array];
@@ -622,6 +632,12 @@
             webCtrl.url = model.linkUrl;
             [self.navigationController pushViewController:webCtrl animated:YES];
         }
+        else {
+            // 跳转
+            KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+            webCtrl.url = [NSString stringWithFormat:@"%@%@%@",WEBHOST,@"/#/specialdetail?id=",model.internalBaseClassIdentifier];
+            [self.navigationController pushViewController:webCtrl animated:YES];
+        }
     }
     else if (tableView == self.liveCourseTable) { // 直播课详情
         HomeLiveGroupModel *model = self.liveCourseArray[indexPath.row];
@@ -683,7 +699,10 @@
 
 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
     if (collectionView == self.albumCollectionView) { // 专辑详情
-        
+        HomeAlbumModel *model = self.albumArray[indexPath.item];
+        KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
+        ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/music-album-detail/",model.internalBaseClassIdentifier];
+        [self.navigationController pushViewController:ctrl animated:YES];
     }
     else { // 老师风采详情
         TeacherStyleModel *model = self.teacherArray[indexPath.item];
@@ -821,9 +840,8 @@
 }
 
 - (void)moreAlbumDetail {
-    return;
     KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @""];
+    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-album"];
     [self.navigationController pushViewController:ctrl animated:YES];
 }
 
@@ -1044,7 +1062,7 @@
 
 - (void)moreInformation {
     KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/teacherList"];
+    ctrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/special"];
     [self.navigationController pushViewController:ctrl animated:YES];
 }
 
@@ -1080,7 +1098,7 @@
         [self showInstrumentView];;
     }
     else { // 消息中心
-        NoticeMessageViewController *ctrl = [[NoticeMessageViewController alloc] init];
+        NotiferMessageViewController *ctrl = [[NotiferMessageViewController alloc] init];
         [self.navigationController pushViewController:ctrl animated:YES];
     }
 }
@@ -1152,6 +1170,53 @@
 - (void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
+
+
+- (void)showNewsWithSource:(HomeMessageModel *)sourceModel {
+    // 登录之后才弹窗
+    if ([self checkIsLoginToLoginView:NO]) {
+        NSString *useId = UserDefault(UIDKey);
+        NSMutableArray *newArray = UserDefault(useId);
+        if (newArray.count) {
+            if ([newArray containsObject:sourceModel.coverImage]) {
+                return;
+            }
+            else {
+                [self displayAlert:sourceModel];
+            }
+        }
+        else {
+            [self displayAlert:sourceModel];
+        }
+    }
+}
+
+- (void)displayAlert:(HomeMessageModel *)sourceModel {
+    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    if (appDelegate.isShowMemoAlert) {
+        return;
+    }
+    NSString *useId = UserDefault(UIDKey);
+    UserDefaultRemoveObjectForKey(useId);
+    NSMutableArray *sourceArray = [NSMutableArray arrayWithArray:UserDefault(useId)];
+    [sourceArray addObject:sourceModel.coverImage];
+    UserDefaultSetObjectForKey(sourceArray, useId);
+    KSNewsAlert *newAlert = [KSNewsAlert shareInstance];
+    MJWeakSelf;
+    [newAlert evaluateWithMessage:sourceModel.coverImage linkUrl:sourceModel.linkUrl callbackAction:^(BOOL isSure, NSString * _Nonnull linkUrl) {
+        appDelegate.isShowFlashAlert = NO;
+        if (isSure) {
+            if (![NSString isEmptyString:linkUrl]) {
+                KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+                webCtrl.url = [linkUrl getUrlEndcodeString];
+                [weakSelf.navigationController pushViewController:webCtrl animated:YES];
+            }
+        }
+        [appDelegate showMemoAlert]; // 检测是否需要弹窗版本更新
+    }];
+    [newAlert showAlert];
+    appDelegate.isShowFlashAlert = YES;
+}
 /*
 #pragma mark - Navigation
 

+ 0 - 31
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NoticeMessageViewController.m

@@ -1,31 +0,0 @@
-//
-//  NoticeMessageViewController.m
-//  KulexiuForStudent
-//
-//  Created by 王智 on 2022/4/22.
-//
-
-#import "NoticeMessageViewController.h"
-
-@interface NoticeMessageViewController ()
-
-@end
-
-@implementation NoticeMessageViewController
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-    // Do any additional setup after loading the view.
-}
-
-/*
-#pragma mark - Navigation
-
-// In a storyboard-based application, you will often want to do a little preparation before navigation
-- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
-    // Get the new view controller using [segue destinationViewController].
-    // Pass the selected object to the new view controller.
-}
-*/
-
-@end

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NoticeMessageViewController.h → KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NotiferMessageViewController.h

@@ -1,5 +1,5 @@
 //
-//  NoticeMessageViewController.h
+//  NotiferMessageViewController.h
 //  KulexiuForStudent
 //
 //  Created by 王智 on 2022/4/22.
@@ -9,7 +9,7 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface NoticeMessageViewController : KSBaseViewController
+@interface NotiferMessageViewController : KSBaseViewController
 
 @end
 

+ 333 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Controller/NotiferMessageViewController.m

@@ -0,0 +1,333 @@
+//
+//  NotiferMessageViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/18.
+//
+
+#import "NotiferMessageViewController.h"
+#import "NotiferMessageCell.h"
+#import "NotiferHeadView.h"
+#import "NotiferMessageModel.h"
+#import "KSBaseWKWebViewController.h"
+#import "CustomNavViewController.h"
+//#import "ReceiveEvaluateListController.h"
+#import "HomeworkDetailViewController.h"
+#import "UIButton+EnlargeEdge.h"
+
+@interface NotiferMessageViewController ()<UITableViewDelegate, UITableViewDataSource>
+
+@property (nonatomic, strong) NotiferHeadView *headView;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, strong) NSString *groupType;
+
+@end
+
+@implementation NotiferMessageViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"消息盒子"];
+    [self configRightButton];
+    [self configUI];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self queryUnReadCount];
+    [self resetSourceAndRequest];
+}
+
+- (void)configRightButton {
+    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeCustom];
+    [rightButton setTitle:@"全部已读" forState:UIControlStateNormal];
+    [rightButton setTitleColor:HexRGB(0x999999) forState:UIControlStateNormal];
+    [rightButton setImage:[UIImage imageNamed:@"clear_notifer"] forState:UIControlStateNormal];
+    rightButton.frame =CGRectMake(0, 0, 80, 40);
+    //使图片在右边,文字在左边(正常情况下是文字在右边,图片在左边)
+    [rightButton setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];
+    //设置图片和文字之间的间隙
+    rightButton.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
+    [rightButton.titleLabel setFont:[UIFont systemFontOfSize:11.0f]];
+    [rightButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10];
+    [rightButton addTarget:self action:@selector(rightBtnClick) forControlEvents:UIControlEventTouchUpInside];
+    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithCustomView:rightButton];
+    self.navigationItem.rightBarButtonItem = rightItem;
+}
+
+- (void)rightBtnClick {
+    [KSNetworkingManager batchSetReadRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [self MBPShow:@"清除成功"];
+            [self resetSourceAndRequest];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    [self.view addSubview:self.headView];
+    [self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(100);
+    }];
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.headView.mas_bottom);
+        make.bottom.mas_equalTo(self.view.mas_bottom).offset(-iPhoneXSafeBottomMargin);
+    }];
+    
+    MJWeakSelf;
+    self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+        [weakSelf resetSourceAndRequest];
+    }];
+    self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+        if (weakSelf.isLoadMore) {
+            weakSelf.pages += 1;
+            [weakSelf requestData];
+        }
+        else {
+            [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+        }
+    }];
+}
+
+- (void)resetSourceAndRequest {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)queryUnReadCount {
+    [KSNetworkingManager queryCountOfUnreadRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *countArray = [dic arrayValueForKey:@"data"];
+            NSInteger courseCount = 0;
+            NSInteger sysCount = 0;
+            NSInteger noticeCount = 0;
+            for (NSDictionary *parm in countArray) {
+                if ([[parm stringValueForKey:@"key"] isEqualToString:@"COURSE"]) {
+                    courseCount = [parm integerValueForKey:@"value"];
+                }
+                if ([[parm stringValueForKey:@"key"] isEqualToString:@"SYSTEM"]) {
+                    sysCount = [parm integerValueForKey:@"value"];
+                }
+                if ([[parm stringValueForKey:@"key"] isEqualToString:@"NOTICE"]) {
+                    noticeCount = [parm integerValueForKey:@"value"];
+                }
+            }
+            
+            [self.headView configUnreadCountCourse:0 sysMessage:0 noticeCount:0];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)resetParamenter {
+    self.pages = 1;
+    self.isLoadMore = YES;
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无消息~" imageName:@"empty_message" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+- (void)endRefresh {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [self.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+    });
+}
+- (void)requestData {
+    [self showhud];
+    [KSNetworkingManager sysMessageListRequest:KS_POST group:self.groupType page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        [self endRefresh];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            // rows
+            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            for (NSDictionary *parm in sourceArray) {
+                NotiferMessageModel *model = [[NotiferMessageModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+        [self.tableView reloadData];
+        [self changePromptLabelState];
+
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.tableView reloadData];
+        [self changePromptLabelState];
+    }];
+}
+
+#pragma mark ----- table data source
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    NotiferMessageModel *model = self.dataArray[indexPath.row];
+    NotiferMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NotiferMessageCell"];
+    [cell configCellWithSource:model];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    // 选择跳转
+    NotiferMessageModel *model = self.dataArray[indexPath.row];
+    if (model.readStatus == 0) {
+        NotiferMessageCell *cell = [tableView cellForRowAtIndexPath:indexPath];
+        [self readMessage:model baseCell:cell];
+    }
+    else {
+        // 跳转页面
+        [self toDetailViewWithTypeString:model.memo];
+    }
+}
+
+- (void)readMessage:(NotiferMessageModel *)model baseCell:(NotiferMessageCell *)cell {
+    [KSNetworkingManager setReadMessage:KS_POST messageId:model.internalBaseClassIdentifier success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            model.readStatus = 1;
+            cell.isRead = YES;
+            // 跳转页面
+            [self toDetailViewWithTypeString:model.memo];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)toDetailViewWithTypeString:(NSString *)memo {
+    if (![NSString isEmptyString:memo]) {
+        NSString *headStr = [[memo componentsSeparatedByString:@"?"] firstObject];
+        if ([headStr isEqualToString:@"buyPractice"] || [headStr isEqualToString:@"courseRemind"]) { // 课表
+            [self toCourseTable];
+        }
+        else if ([headStr isEqualToString:@"evaluate"]) { // 评价页面
+//            ReceiveEvaluateListController *ctrl = [[ReceiveEvaluateListController alloc] init];
+//            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+        else if ([headStr isEqualToString:@"H5"]) { // web
+            NSString *valueStr = [[memo componentsSeparatedByString:@"?"] lastObject];
+            KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
+            webCtrl.url = valueStr;
+            CustomNavViewController *navCtrl = self.tabBarController.selectedViewController;
+            [navCtrl pushViewController:webCtrl animated:YES];
+        }
+        else if ([headStr isEqualToString:@"homework"]) { // 作业详情
+            NSString *valueStr = [[memo componentsSeparatedByString:@"?"] lastObject];
+            NSArray *parmArray = [valueStr componentsSeparatedByString:@"&"];
+            NSString *courseId = nil;
+            for (NSString *subStr in parmArray) {
+                if ([subStr containsString:@"courseId"]) {
+                    courseId = [[subStr componentsSeparatedByString:@"="] lastObject];
+                }
+            }
+            HomeworkDetailViewController *detailVC = [[HomeworkDetailViewController alloc] init];
+            detailVC.courseId = courseId;
+            [self.navigationController pushViewController:detailVC animated:YES];
+        }
+    }
+}
+
+- (void)toCourseTable {
+    [self selectBarHomeWithIndex:1];
+    [self.navigationController popToRootViewControllerAnimated:YES];
+}
+
+#pragma mark ---- lazying
+- (NotiferHeadView *)headView {
+    if (!_headView) {
+        _headView = [NotiferHeadView shareIntance];
+        MJWeakSelf;
+        [_headView chooseTypeCallback:^(NOTIFER_TYPE type) {
+            [weakSelf chooseTypeSort:type];
+        }];
+    }
+    return _headView;
+}
+
+- (void)chooseTypeSort:(NOTIFER_TYPE)type {
+    switch (type) {
+        case NOTIFER_TYPE_ALL:
+        {
+            self.groupType = nil;
+        }
+            break;
+        case NOTIFER_TYPE_COURSE:
+        {
+            self.groupType = @"COURSE";
+        }
+            break;
+        case NOTIFER_TYPE_SYSMSG:
+        {
+            self.groupType = @"SYSTEM";
+        }
+            break;
+        case NOTIFER_TYPE_NOTICE:
+        {
+            self.groupType = @"NOTICE";
+        }
+            break;
+        default:
+            break;
+    }
+    [self resetSourceAndRequest];
+}
+
+- (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:@"NotiferMessageCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"NotiferMessageCell"];
+        _tableView.estimatedRowHeight = 125.0f;
+        _tableView.rowHeight = UITableViewAutomaticDimension;
+        UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 15)];
+        bottomView.backgroundColor = HexRGB(0xf6f8f9);
+        _tableView.tableFooterView = bottomView;
+    }
+    return _tableView;
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 34 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Model/NotiferMessageModel.h

@@ -0,0 +1,34 @@
+//
+//  NotiferMessageModel.h
+//
+//  Created by Steven  on 2022/5/7
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface NotiferMessageModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *modifyOn;
+@property (nonatomic, strong) NSString *clientId;
+@property (nonatomic, strong) NSString *sendTime;
+@property (nonatomic, strong) NSString *receiver;
+@property (nonatomic, strong) NSString *errorMsg;
+@property (nonatomic, strong) NSString *createOn;
+@property (nonatomic, strong) NSString *memo;
+@property (nonatomic, strong) NSString *content;
+@property (nonatomic, strong) NSString *type;
+@property (nonatomic, strong) NSString *title;
+@property (nonatomic, strong) NSString *userId;
+@property (nonatomic, strong) NSString *group;
+@property (nonatomic, assign) double readStatus;
+@property (nonatomic, strong) NSString *status;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 197 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/Model/NotiferMessageModel.m

@@ -0,0 +1,197 @@
+//
+//  NotiferMessageModel.m
+//
+//  Created by Steven  on 2022/5/7
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "NotiferMessageModel.h"
+
+
+NSString *const kNotiferMessageModelId = @"id";
+NSString *const kNotiferMessageModelModifyOn = @"modifyOn";
+NSString *const kNotiferMessageModelClientId = @"clientId";
+NSString *const kNotiferMessageModelSendTime = @"sendTime";
+NSString *const kNotiferMessageModelReceiver = @"receiver";
+NSString *const kNotiferMessageModelErrorMsg = @"errorMsg";
+NSString *const kNotiferMessageModelCreateOn = @"createOn";
+NSString *const kNotiferMessageModelMemo = @"memo";
+NSString *const kNotiferMessageModelContent = @"content";
+NSString *const kNotiferMessageModelType = @"type";
+NSString *const kNotiferMessageModelTitle = @"title";
+NSString *const kNotiferMessageModelUserId = @"userId";
+NSString *const kNotiferMessageModelGroup = @"group";
+NSString *const kNotiferMessageModelReadStatus = @"readStatus";
+NSString *const kNotiferMessageModelStatus = @"status";
+
+
+@interface NotiferMessageModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation NotiferMessageModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize modifyOn = _modifyOn;
+@synthesize clientId = _clientId;
+@synthesize sendTime = _sendTime;
+@synthesize receiver = _receiver;
+@synthesize errorMsg = _errorMsg;
+@synthesize createOn = _createOn;
+@synthesize memo = _memo;
+@synthesize content = _content;
+@synthesize type = _type;
+@synthesize title = _title;
+@synthesize userId = _userId;
+@synthesize group = _group;
+@synthesize readStatus = _readStatus;
+@synthesize status = _status;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kNotiferMessageModelId fromDictionary:dict];
+            self.modifyOn = [self objectOrNilForKey:kNotiferMessageModelModifyOn fromDictionary:dict];
+            self.clientId = [self objectOrNilForKey:kNotiferMessageModelClientId fromDictionary:dict];
+            self.sendTime = [self objectOrNilForKey:kNotiferMessageModelSendTime fromDictionary:dict];
+            self.receiver = [self objectOrNilForKey:kNotiferMessageModelReceiver fromDictionary:dict];
+            self.errorMsg = [self objectOrNilForKey:kNotiferMessageModelErrorMsg fromDictionary:dict];
+            self.createOn = [self objectOrNilForKey:kNotiferMessageModelCreateOn fromDictionary:dict];
+            self.memo = [self objectOrNilForKey:kNotiferMessageModelMemo fromDictionary:dict];
+            self.content = [self objectOrNilForKey:kNotiferMessageModelContent fromDictionary:dict];
+            self.type = [self objectOrNilForKey:kNotiferMessageModelType fromDictionary:dict];
+            self.title = [self objectOrNilForKey:kNotiferMessageModelTitle fromDictionary:dict];
+            self.userId = [self objectOrNilForKey:kNotiferMessageModelUserId fromDictionary:dict];
+            self.group = [self objectOrNilForKey:kNotiferMessageModelGroup fromDictionary:dict];
+            self.readStatus = [[self objectOrNilForKey:kNotiferMessageModelReadStatus fromDictionary:dict] doubleValue];
+            self.status = [self objectOrNilForKey:kNotiferMessageModelStatus fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kNotiferMessageModelId];
+    [mutableDict setValue:self.modifyOn forKey:kNotiferMessageModelModifyOn];
+    [mutableDict setValue:self.clientId forKey:kNotiferMessageModelClientId];
+    [mutableDict setValue:self.sendTime forKey:kNotiferMessageModelSendTime];
+    [mutableDict setValue:self.receiver forKey:kNotiferMessageModelReceiver];
+    [mutableDict setValue:self.errorMsg forKey:kNotiferMessageModelErrorMsg];
+    [mutableDict setValue:self.createOn forKey:kNotiferMessageModelCreateOn];
+    [mutableDict setValue:self.memo forKey:kNotiferMessageModelMemo];
+    [mutableDict setValue:self.content forKey:kNotiferMessageModelContent];
+    [mutableDict setValue:self.type forKey:kNotiferMessageModelType];
+    [mutableDict setValue:self.title forKey:kNotiferMessageModelTitle];
+    [mutableDict setValue:self.userId forKey:kNotiferMessageModelUserId];
+    [mutableDict setValue:self.group forKey:kNotiferMessageModelGroup];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.readStatus] forKey:kNotiferMessageModelReadStatus];
+    [mutableDict setValue:self.status forKey:kNotiferMessageModelStatus];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kNotiferMessageModelId];
+    self.modifyOn = [aDecoder decodeObjectForKey:kNotiferMessageModelModifyOn];
+    self.clientId = [aDecoder decodeObjectForKey:kNotiferMessageModelClientId];
+    self.sendTime = [aDecoder decodeObjectForKey:kNotiferMessageModelSendTime];
+    self.receiver = [aDecoder decodeObjectForKey:kNotiferMessageModelReceiver];
+    self.errorMsg = [aDecoder decodeObjectForKey:kNotiferMessageModelErrorMsg];
+    self.createOn = [aDecoder decodeObjectForKey:kNotiferMessageModelCreateOn];
+    self.memo = [aDecoder decodeObjectForKey:kNotiferMessageModelMemo];
+    self.content = [aDecoder decodeObjectForKey:kNotiferMessageModelContent];
+    self.type = [aDecoder decodeObjectForKey:kNotiferMessageModelType];
+    self.title = [aDecoder decodeObjectForKey:kNotiferMessageModelTitle];
+    self.userId = [aDecoder decodeObjectForKey:kNotiferMessageModelUserId];
+    self.group = [aDecoder decodeObjectForKey:kNotiferMessageModelGroup];
+    self.readStatus = [aDecoder decodeDoubleForKey:kNotiferMessageModelReadStatus];
+    self.status = [aDecoder decodeObjectForKey:kNotiferMessageModelStatus];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kNotiferMessageModelId];
+    [aCoder encodeObject:_modifyOn forKey:kNotiferMessageModelModifyOn];
+    [aCoder encodeObject:_clientId forKey:kNotiferMessageModelClientId];
+    [aCoder encodeObject:_sendTime forKey:kNotiferMessageModelSendTime];
+    [aCoder encodeObject:_receiver forKey:kNotiferMessageModelReceiver];
+    [aCoder encodeObject:_errorMsg forKey:kNotiferMessageModelErrorMsg];
+    [aCoder encodeObject:_createOn forKey:kNotiferMessageModelCreateOn];
+    [aCoder encodeObject:_memo forKey:kNotiferMessageModelMemo];
+    [aCoder encodeObject:_content forKey:kNotiferMessageModelContent];
+    [aCoder encodeObject:_type forKey:kNotiferMessageModelType];
+    [aCoder encodeObject:_title forKey:kNotiferMessageModelTitle];
+    [aCoder encodeObject:_userId forKey:kNotiferMessageModelUserId];
+    [aCoder encodeObject:_group forKey:kNotiferMessageModelGroup];
+    [aCoder encodeDouble:_readStatus forKey:kNotiferMessageModelReadStatus];
+    [aCoder encodeObject:_status forKey:kNotiferMessageModelStatus];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    NotiferMessageModel *copy = [[NotiferMessageModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.modifyOn = [self.modifyOn copyWithZone:zone];
+        copy.clientId = [self.clientId copyWithZone:zone];
+        copy.sendTime = [self.sendTime copyWithZone:zone];
+        copy.receiver = [self.receiver copyWithZone:zone];
+        copy.errorMsg = [self.errorMsg copyWithZone:zone];
+        copy.createOn = [self.createOn copyWithZone:zone];
+        copy.memo = [self.memo copyWithZone:zone];
+        copy.content = [self.content copyWithZone:zone];
+        copy.type = [self.type copyWithZone:zone];
+        copy.title = [self.title copyWithZone:zone];
+        copy.userId = [self.userId copyWithZone:zone];
+        copy.group = [self.group copyWithZone:zone];
+        copy.readStatus = self.readStatus;
+        copy.status = [self.status copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 32 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.h

@@ -0,0 +1,32 @@
+//
+//  NotiferHeadView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/5/6.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, NOTIFER_TYPE) {
+    NOTIFER_TYPE_ALL,
+    NOTIFER_TYPE_COURSE,
+    NOTIFER_TYPE_SYSMSG,
+    NOTIFER_TYPE_NOTICE,
+};
+
+typedef void(^NotiferChooseAction)(NOTIFER_TYPE type);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NotiferHeadView : UIView
+
+
++ (instancetype)shareIntance;
+
+- (void)configUnreadCountCourse:(NSInteger)courseCount sysMessage:(NSInteger)sysMessageCount noticeCount:(NSInteger)noticeCount;
+
+- (void)chooseTypeCallback:(NotiferChooseAction)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 204 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.m

@@ -0,0 +1,204 @@
+//
+//  NotiferHeadView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/5/6.
+//
+
+#import "NotiferHeadView.h"
+
+@interface NotiferHeadView ()
+
+@property (weak, nonatomic) IBOutlet UIView *allView;
+
+@property (weak, nonatomic) IBOutlet UILabel *allLabel;
+
+@property (weak, nonatomic) IBOutlet UIView *courseView;
+
+@property (weak, nonatomic) IBOutlet UILabel *courseLabel;
+
+@property (weak, nonatomic) IBOutlet UIView *systemView;
+
+@property (weak, nonatomic) IBOutlet UILabel *systemLabel;
+
+@property (weak, nonatomic) IBOutlet UIView *noticeView;
+
+@property (weak, nonatomic) IBOutlet UILabel *noticeLabel;
+
+@property (nonatomic, assign) NOTIFER_TYPE type;
+
+@property (nonatomic, copy) NotiferChooseAction callback;
+
+@property (weak, nonatomic) IBOutlet UILabel *allCountLabel;
+@property (weak, nonatomic) IBOutlet UILabel *courseCountLabel;
+@property (weak, nonatomic) IBOutlet UILabel *systemCountLabel;
+@property (weak, nonatomic) IBOutlet UILabel *noticeCountLabel;
+
+@end
+
+@implementation NotiferHeadView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self configDefault];
+}
+
+- (void)configDefault {
+    self.type = NOTIFER_TYPE_ALL;
+    [self configUnreadCountCourse:0 sysMessage:0 noticeCount:0];
+}
+
++ (instancetype)shareIntance {
+    NotiferHeadView *view = [[[NSBundle mainBundle] loadNibNamed:@"NotiferHeadView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)chooseTypeCallback:(NotiferChooseAction)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)configUnreadCountCourse:(NSInteger)courseCount sysMessage:(NSInteger)sysMessageCount noticeCount:(NSInteger)noticeCount {
+    NSInteger allCount = courseCount + sysMessageCount + noticeCount;
+    // 全部
+    if (allCount <= 0) {
+        self.allView.hidden = YES;
+    }
+    else {
+        self.allView.hidden = NO;
+        NSString *countString = @"";
+        if (allCount > 99) {
+            countString = @"99+";
+        }
+        else {
+            countString = [NSString stringWithFormat:@"%zd",allCount];
+        }
+        self.allCountLabel.text = countString;
+    }
+    // 课程
+    if (courseCount == 0) {
+        self.courseView.hidden = YES;
+    }
+    else {
+        self.courseView.hidden = NO;
+        NSString *countString = @"";
+        if (courseCount > 99) {
+            countString = @"99+";
+        }
+        else {
+            countString = [NSString stringWithFormat:@"%zd",courseCount];
+        }
+        self.courseCountLabel.text = countString;
+    }
+    
+    // 系统
+    if (sysMessageCount == 0) {
+        self.systemView.hidden = YES;
+    }
+    else {
+        self.systemView.hidden = NO;
+        NSString *countString = @"";
+        if (sysMessageCount > 99) {
+            countString = @"99+";
+        }
+        else {
+            countString = [NSString stringWithFormat:@"%zd",sysMessageCount];
+        }
+        self.noticeCountLabel.text = countString;
+    }
+    
+    // 公共
+    if (noticeCount == 0) {
+        self.noticeView.hidden = YES;
+    }
+    else {
+        self.noticeView.hidden = NO;
+        NSString *countString = @"";
+        if (noticeCount > 99) {
+            countString = @"99+";
+        }
+        else {
+            countString = [NSString stringWithFormat:@"%zd",noticeCount];
+        }
+        self.systemCountLabel.text = countString;
+    }
+}
+
+
+- (IBAction)chooseAll:(id)sender {
+    self.type = NOTIFER_TYPE_ALL;
+    if (self.callback) {
+        self.callback(self.type);
+    }
+}
+
+- (IBAction)chooseCourse:(id)sender {
+    self.type = NOTIFER_TYPE_COURSE;
+    if (self.callback) {
+        self.callback(self.type);
+    }
+}
+
+- (IBAction)chooseSystem:(id)sender {
+    self.type = NOTIFER_TYPE_SYSMSG;
+    if (self.callback) {
+        self.callback(self.type);
+    }
+}
+
+- (IBAction)chooseNotice:(id)sender {
+    self.type = NOTIFER_TYPE_NOTICE;
+    if (self.callback) {
+        self.callback(self.type);
+    }
+}
+
+- (void)setType:(NOTIFER_TYPE)type {
+    _type = type;
+    switch (type) {
+        case NOTIFER_TYPE_ALL:
+        {
+            self.allLabel.textColor = HexRGB(0x3333333);
+            self.courseLabel.textColor = HexRGB(0x999999);
+            self.systemLabel.textColor = HexRGB(0x999999);
+            self.noticeLabel.textColor = HexRGB(0x999999);
+        }
+            break;
+        case NOTIFER_TYPE_COURSE:
+        {
+            self.allLabel.textColor = HexRGB(0x999999);
+            self.courseLabel.textColor = HexRGB(0x3333333);
+            self.systemLabel.textColor = HexRGB(0x999999);
+            self.noticeLabel.textColor = HexRGB(0x999999);
+        }
+            break;
+        case NOTIFER_TYPE_SYSMSG:
+        {
+            self.allLabel.textColor = HexRGB(0x999999);
+            self.courseLabel.textColor = HexRGB(0x999999);
+            self.systemLabel.textColor = HexRGB(0x3333333);
+            self.noticeLabel.textColor = HexRGB(0x999999);
+        }
+            break;
+        case NOTIFER_TYPE_NOTICE:
+        {
+            self.allLabel.textColor = HexRGB(0x999999);
+            self.courseLabel.textColor = HexRGB(0x999999);
+            self.systemLabel.textColor = HexRGB(0x999999);
+            self.noticeLabel.textColor = HexRGB(0x3333333);
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 346 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferHeadView.xib

@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="NotiferHeadView">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3Jh-gC-egy">
+                    <rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Pkz-EP-p4Q">
+                            <rect key="frame" x="27" y="0.0" width="80.5" height="100"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message_all" translatesAutoresizingMaskIntoConstraints="NO" id="N8l-kR-aoj">
+                                    <rect key="frame" x="12" y="22" width="56" height="56"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="56" id="3Wd-gG-xg9"/>
+                                        <constraint firstAttribute="width" constant="56" id="E7d-pn-3mD"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="全部" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Aal-ZD-MlT">
+                                    <rect key="frame" x="27.5" y="79" width="25" height="14.5"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                    <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TI9-h7-JQo">
+                                    <rect key="frame" x="47" y="54" width="21" height="14"/>
+                                    <subviews>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="19" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e5M-E8-SSs">
+                                            <rect key="frame" x="4" y="0.0" width="13" height="14"/>
+                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
+                                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" red="1" green="0.074509803921568626" blue="0.074509803921568626" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="trailing" secondItem="e5M-E8-SSs" secondAttribute="trailing" constant="4" id="EdX-nD-NcK"/>
+                                        <constraint firstAttribute="bottom" secondItem="e5M-E8-SSs" secondAttribute="bottom" id="OFc-sp-NzZ"/>
+                                        <constraint firstItem="e5M-E8-SSs" firstAttribute="leading" secondItem="TI9-h7-JQo" secondAttribute="leading" constant="4" id="Smh-zq-Y7a"/>
+                                        <constraint firstItem="e5M-E8-SSs" firstAttribute="top" secondItem="TI9-h7-JQo" secondAttribute="top" id="Tf2-Fu-sS9"/>
+                                        <constraint firstAttribute="height" constant="14" id="chU-X5-U69"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="7"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Hxb-AV-79g">
+                                    <rect key="frame" x="12" y="22" width="56" height="71.5"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="chooseAll:" destination="iN0-l3-epB" eventType="touchUpInside" id="gxr-MQ-ykS"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="N8l-kR-aoj" firstAttribute="centerX" secondItem="Pkz-EP-p4Q" secondAttribute="centerX" id="5XZ-17-Vec"/>
+                                <constraint firstItem="N8l-kR-aoj" firstAttribute="centerY" secondItem="Pkz-EP-p4Q" secondAttribute="centerY" id="9yG-IL-ewx"/>
+                                <constraint firstItem="Hxb-AV-79g" firstAttribute="top" secondItem="N8l-kR-aoj" secondAttribute="top" id="FRE-eD-FoY"/>
+                                <constraint firstItem="Hxb-AV-79g" firstAttribute="trailing" secondItem="N8l-kR-aoj" secondAttribute="trailing" id="IGS-pH-2yp"/>
+                                <constraint firstItem="Aal-ZD-MlT" firstAttribute="centerX" secondItem="N8l-kR-aoj" secondAttribute="centerX" id="dix-GQ-gSF"/>
+                                <constraint firstItem="Aal-ZD-MlT" firstAttribute="top" secondItem="N8l-kR-aoj" secondAttribute="bottom" constant="1" id="i1g-8e-IRF"/>
+                                <constraint firstItem="Hxb-AV-79g" firstAttribute="leading" secondItem="N8l-kR-aoj" secondAttribute="leading" id="iBg-4z-Iji"/>
+                                <constraint firstItem="TI9-h7-JQo" firstAttribute="trailing" secondItem="N8l-kR-aoj" secondAttribute="trailing" id="l5R-U5-zLe"/>
+                                <constraint firstItem="TI9-h7-JQo" firstAttribute="bottom" secondItem="N8l-kR-aoj" secondAttribute="bottom" constant="-10" id="u2O-gZ-dcJ"/>
+                                <constraint firstItem="Aal-ZD-MlT" firstAttribute="bottom" secondItem="Hxb-AV-79g" secondAttribute="bottom" id="vrV-Ml-Wzc"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kR0-tA-2uF">
+                            <rect key="frame" x="107.5" y="0.0" width="80" height="100"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message_course" translatesAutoresizingMaskIntoConstraints="NO" id="8Z5-lf-RVU">
+                                    <rect key="frame" x="12" y="22" width="56" height="56"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="56" id="bfW-hq-s3W"/>
+                                        <constraint firstAttribute="height" constant="56" id="yLb-Jd-Kfp"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="课程信息" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8Ql-22-T6t">
+                                    <rect key="frame" x="15" y="79" width="49.5" height="14.5"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oMw-71-EQZ">
+                                    <rect key="frame" x="47" y="54" width="21" height="14"/>
+                                    <subviews>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="19" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Ev-de-Era">
+                                            <rect key="frame" x="4" y="0.0" width="13" height="14"/>
+                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
+                                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" red="1" green="0.074509803920000006" blue="0.074509803920000006" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstItem="0Ev-de-Era" firstAttribute="leading" secondItem="oMw-71-EQZ" secondAttribute="leading" constant="4" id="Gr7-FD-bFG"/>
+                                        <constraint firstAttribute="trailing" secondItem="0Ev-de-Era" secondAttribute="trailing" constant="4" id="KMC-tF-L2A"/>
+                                        <constraint firstItem="0Ev-de-Era" firstAttribute="top" secondItem="oMw-71-EQZ" secondAttribute="top" id="bSk-S2-fGH"/>
+                                        <constraint firstAttribute="bottom" secondItem="0Ev-de-Era" secondAttribute="bottom" id="qc5-26-N56"/>
+                                        <constraint firstAttribute="height" constant="14" id="szo-02-4bz"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="7"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XuM-Lg-sm7">
+                                    <rect key="frame" x="12" y="22" width="56" height="71.5"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="chooseCourse:" destination="iN0-l3-epB" eventType="touchUpInside" id="bWc-aR-VJd"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="oMw-71-EQZ" firstAttribute="trailing" secondItem="8Z5-lf-RVU" secondAttribute="trailing" id="30r-Hx-POG"/>
+                                <constraint firstItem="oMw-71-EQZ" firstAttribute="bottom" secondItem="8Z5-lf-RVU" secondAttribute="bottom" constant="-10" id="C8d-5e-iUn"/>
+                                <constraint firstItem="8Ql-22-T6t" firstAttribute="top" secondItem="8Z5-lf-RVU" secondAttribute="bottom" constant="1" id="EWQ-Yi-Zo0"/>
+                                <constraint firstItem="8Z5-lf-RVU" firstAttribute="top" secondItem="XuM-Lg-sm7" secondAttribute="top" id="Lel-B2-nF4"/>
+                                <constraint firstItem="8Ql-22-T6t" firstAttribute="centerX" secondItem="8Z5-lf-RVU" secondAttribute="centerX" id="Quv-Ys-Rou"/>
+                                <constraint firstItem="8Z5-lf-RVU" firstAttribute="centerY" secondItem="kR0-tA-2uF" secondAttribute="centerY" id="VZU-Ga-Wym"/>
+                                <constraint firstItem="8Z5-lf-RVU" firstAttribute="leading" secondItem="XuM-Lg-sm7" secondAttribute="leading" id="dJw-ip-hsE"/>
+                                <constraint firstItem="8Z5-lf-RVU" firstAttribute="centerX" secondItem="kR0-tA-2uF" secondAttribute="centerX" id="knO-Ib-wqa"/>
+                                <constraint firstItem="8Ql-22-T6t" firstAttribute="bottom" secondItem="XuM-Lg-sm7" secondAttribute="bottom" id="qcI-Mh-jaD"/>
+                                <constraint firstItem="8Z5-lf-RVU" firstAttribute="trailing" secondItem="XuM-Lg-sm7" secondAttribute="trailing" id="seO-ea-nqI"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QCV-gH-UT2">
+                            <rect key="frame" x="187.5" y="0.0" width="80.5" height="100"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message_system" translatesAutoresizingMaskIntoConstraints="NO" id="ALm-DM-xIP">
+                                    <rect key="frame" x="12" y="22" width="56" height="56"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="56" id="Av4-mU-hXq"/>
+                                        <constraint firstAttribute="height" constant="56" id="gta-F5-xNK"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="系统消息" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZT2-JL-dMl">
+                                    <rect key="frame" x="15.5" y="79" width="49.5" height="14.5"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="PnS-8p-3Z9">
+                                    <rect key="frame" x="47" y="54" width="21" height="14"/>
+                                    <subviews>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="19" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="43u-at-Vor">
+                                            <rect key="frame" x="4" y="0.0" width="13" height="14"/>
+                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
+                                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" red="1" green="0.074509803920000006" blue="0.074509803920000006" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstItem="43u-at-Vor" firstAttribute="leading" secondItem="PnS-8p-3Z9" secondAttribute="leading" constant="4" id="9XC-dG-siH"/>
+                                        <constraint firstAttribute="trailing" secondItem="43u-at-Vor" secondAttribute="trailing" constant="4" id="Kqx-aN-PC2"/>
+                                        <constraint firstAttribute="height" constant="14" id="bNV-H0-xoS"/>
+                                        <constraint firstItem="43u-at-Vor" firstAttribute="top" secondItem="PnS-8p-3Z9" secondAttribute="top" id="vAd-Z8-UfQ"/>
+                                        <constraint firstAttribute="bottom" secondItem="43u-at-Vor" secondAttribute="bottom" id="ya9-SB-vcT"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="7"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="03g-eS-bHv">
+                                    <rect key="frame" x="12" y="22" width="56" height="71.5"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="chooseSystem:" destination="iN0-l3-epB" eventType="touchUpInside" id="baU-me-4pJ"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="PnS-8p-3Z9" firstAttribute="bottom" secondItem="ALm-DM-xIP" secondAttribute="bottom" constant="-10" id="FMk-Tg-HiP"/>
+                                <constraint firstItem="PnS-8p-3Z9" firstAttribute="trailing" secondItem="ALm-DM-xIP" secondAttribute="trailing" id="Iym-n2-dE5"/>
+                                <constraint firstItem="ALm-DM-xIP" firstAttribute="centerY" secondItem="QCV-gH-UT2" secondAttribute="centerY" id="Kzx-C9-hMH"/>
+                                <constraint firstItem="ZT2-JL-dMl" firstAttribute="centerX" secondItem="ALm-DM-xIP" secondAttribute="centerX" id="LK1-Hs-L8w"/>
+                                <constraint firstItem="ALm-DM-xIP" firstAttribute="top" secondItem="03g-eS-bHv" secondAttribute="top" id="Ytj-Ci-mFT"/>
+                                <constraint firstItem="ALm-DM-xIP" firstAttribute="leading" secondItem="03g-eS-bHv" secondAttribute="leading" id="bX9-bz-a35"/>
+                                <constraint firstItem="ALm-DM-xIP" firstAttribute="centerX" secondItem="QCV-gH-UT2" secondAttribute="centerX" id="imn-KT-bbt"/>
+                                <constraint firstItem="ZT2-JL-dMl" firstAttribute="top" secondItem="ALm-DM-xIP" secondAttribute="bottom" constant="1" id="mwG-b9-az2"/>
+                                <constraint firstItem="ALm-DM-xIP" firstAttribute="trailing" secondItem="03g-eS-bHv" secondAttribute="trailing" id="r6X-Rs-3YH"/>
+                                <constraint firstItem="ZT2-JL-dMl" firstAttribute="bottom" secondItem="03g-eS-bHv" secondAttribute="bottom" id="voU-Gi-fym"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fQd-6C-OHk">
+                            <rect key="frame" x="268" y="0.0" width="80" height="100"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message_notice" translatesAutoresizingMaskIntoConstraints="NO" id="pZt-Oo-gp5">
+                                    <rect key="frame" x="12" y="22" width="56" height="56"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="56" id="Kv2-rZ-mvB"/>
+                                        <constraint firstAttribute="width" constant="56" id="PgP-KG-Z5c"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="公告" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HPj-WQ-UEe">
+                                    <rect key="frame" x="27.5" y="79" width="25" height="14.5"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
+                                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HFT-lc-XxE">
+                                    <rect key="frame" x="47" y="54" width="21" height="14"/>
+                                    <subviews>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="19" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eSf-NN-z0H">
+                                            <rect key="frame" x="4" y="0.0" width="13" height="14"/>
+                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
+                                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" red="1" green="0.074509803920000006" blue="0.074509803920000006" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="bottom" secondItem="eSf-NN-z0H" secondAttribute="bottom" id="Ao6-V2-K7x"/>
+                                        <constraint firstAttribute="trailing" secondItem="eSf-NN-z0H" secondAttribute="trailing" constant="4" id="P8c-bz-7La"/>
+                                        <constraint firstItem="eSf-NN-z0H" firstAttribute="top" secondItem="HFT-lc-XxE" secondAttribute="top" id="g29-vT-Syl"/>
+                                        <constraint firstItem="eSf-NN-z0H" firstAttribute="leading" secondItem="HFT-lc-XxE" secondAttribute="leading" constant="4" id="lcq-U7-od2"/>
+                                        <constraint firstAttribute="height" constant="14" id="nVm-N4-ebc"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="7"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gMB-qb-caO">
+                                    <rect key="frame" x="12" y="22" width="56" height="71.5"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="chooseNotice:" destination="iN0-l3-epB" eventType="touchUpInside" id="NbI-SQ-tv4"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="pZt-Oo-gp5" firstAttribute="trailing" secondItem="gMB-qb-caO" secondAttribute="trailing" id="04x-KE-Efe"/>
+                                <constraint firstItem="HFT-lc-XxE" firstAttribute="trailing" secondItem="pZt-Oo-gp5" secondAttribute="trailing" id="1Ki-Zu-wQ9"/>
+                                <constraint firstItem="pZt-Oo-gp5" firstAttribute="centerY" secondItem="fQd-6C-OHk" secondAttribute="centerY" id="6Uc-tu-c8E"/>
+                                <constraint firstItem="pZt-Oo-gp5" firstAttribute="centerX" secondItem="fQd-6C-OHk" secondAttribute="centerX" id="DGp-cN-87P"/>
+                                <constraint firstItem="HFT-lc-XxE" firstAttribute="bottom" secondItem="pZt-Oo-gp5" secondAttribute="bottom" constant="-10" id="DId-eC-xtY"/>
+                                <constraint firstItem="pZt-Oo-gp5" firstAttribute="top" secondItem="gMB-qb-caO" secondAttribute="top" id="I11-F0-hN5"/>
+                                <constraint firstItem="HPj-WQ-UEe" firstAttribute="centerX" secondItem="pZt-Oo-gp5" secondAttribute="centerX" id="QTq-0M-Qj2"/>
+                                <constraint firstItem="pZt-Oo-gp5" firstAttribute="leading" secondItem="gMB-qb-caO" secondAttribute="leading" id="TY7-WD-hzE"/>
+                                <constraint firstItem="HPj-WQ-UEe" firstAttribute="bottom" secondItem="gMB-qb-caO" secondAttribute="bottom" id="dYO-dM-HQn"/>
+                                <constraint firstItem="HPj-WQ-UEe" firstAttribute="top" secondItem="pZt-Oo-gp5" secondAttribute="bottom" constant="1" id="yJD-DK-Eqd"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="kR0-tA-2uF" firstAttribute="leading" secondItem="Pkz-EP-p4Q" secondAttribute="trailing" id="1Ip-8J-r0Y"/>
+                        <constraint firstItem="QCV-gH-UT2" firstAttribute="leading" secondItem="kR0-tA-2uF" secondAttribute="trailing" id="5XL-gG-2d1"/>
+                        <constraint firstItem="QCV-gH-UT2" firstAttribute="top" secondItem="3Jh-gC-egy" secondAttribute="top" id="83M-kH-ZX2"/>
+                        <constraint firstAttribute="bottom" secondItem="QCV-gH-UT2" secondAttribute="bottom" id="9n2-1w-ajk"/>
+                        <constraint firstAttribute="bottom" secondItem="fQd-6C-OHk" secondAttribute="bottom" id="CkM-y7-C53"/>
+                        <constraint firstItem="fQd-6C-OHk" firstAttribute="leading" secondItem="QCV-gH-UT2" secondAttribute="trailing" id="ICS-ae-fgD"/>
+                        <constraint firstItem="kR0-tA-2uF" firstAttribute="top" secondItem="3Jh-gC-egy" secondAttribute="top" id="Krt-V9-C5o"/>
+                        <constraint firstItem="kR0-tA-2uF" firstAttribute="width" secondItem="Pkz-EP-p4Q" secondAttribute="width" id="KwJ-3g-Oyd"/>
+                        <constraint firstItem="fQd-6C-OHk" firstAttribute="width" secondItem="Pkz-EP-p4Q" secondAttribute="width" id="Lam-1s-b14"/>
+                        <constraint firstItem="fQd-6C-OHk" firstAttribute="top" secondItem="3Jh-gC-egy" secondAttribute="top" id="OmA-Vs-5a4"/>
+                        <constraint firstItem="QCV-gH-UT2" firstAttribute="width" secondItem="Pkz-EP-p4Q" secondAttribute="width" id="UDC-kF-oA1"/>
+                        <constraint firstAttribute="bottom" secondItem="Pkz-EP-p4Q" secondAttribute="bottom" id="Xe3-qK-0uc"/>
+                        <constraint firstAttribute="trailing" secondItem="fQd-6C-OHk" secondAttribute="trailing" constant="27" id="an7-AV-hCa"/>
+                        <constraint firstItem="Pkz-EP-p4Q" firstAttribute="leading" secondItem="3Jh-gC-egy" secondAttribute="leading" constant="27" id="gwc-XA-mID"/>
+                        <constraint firstItem="Pkz-EP-p4Q" firstAttribute="top" secondItem="3Jh-gC-egy" secondAttribute="top" id="hzy-aK-mPq"/>
+                        <constraint firstAttribute="bottom" secondItem="kR0-tA-2uF" secondAttribute="bottom" id="igt-71-5Ke"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="3Jh-gC-egy" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="5cR-eo-oqb"/>
+                <constraint firstItem="3Jh-gC-egy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Pjl-Eu-PVe"/>
+                <constraint firstAttribute="bottom" secondItem="3Jh-gC-egy" secondAttribute="bottom" id="ceN-NI-xsi"/>
+                <constraint firstAttribute="trailing" secondItem="3Jh-gC-egy" secondAttribute="trailing" id="dWr-Ly-BNN"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="allCountLabel" destination="e5M-E8-SSs" id="K0U-Gl-zvZ"/>
+                <outlet property="allLabel" destination="Aal-ZD-MlT" id="qXn-oy-bSz"/>
+                <outlet property="allView" destination="TI9-h7-JQo" id="qgI-md-1u4"/>
+                <outlet property="courseCountLabel" destination="0Ev-de-Era" id="cKf-js-cO3"/>
+                <outlet property="courseLabel" destination="8Ql-22-T6t" id="8Fh-PC-Qtm"/>
+                <outlet property="courseView" destination="oMw-71-EQZ" id="UtK-s0-Kf4"/>
+                <outlet property="noticeCountLabel" destination="eSf-NN-z0H" id="7yQ-Yb-0Zz"/>
+                <outlet property="noticeLabel" destination="HPj-WQ-UEe" id="i39-mh-PC6"/>
+                <outlet property="noticeView" destination="HFT-lc-XxE" id="AEn-pk-RrT"/>
+                <outlet property="systemCountLabel" destination="43u-at-Vor" id="FPQ-la-BzB"/>
+                <outlet property="systemLabel" destination="ZT2-JL-dMl" id="XSb-em-5Kr"/>
+                <outlet property="systemView" destination="PnS-8p-3Z9" id="QV4-d4-ySy"/>
+            </connections>
+            <point key="canvasLocation" x="28.260869565217394" y="-52.901785714285715"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="message_all" width="56" height="56"/>
+        <image name="message_course" width="56" height="56"/>
+        <image name="message_notice" width="56" height="56"/>
+        <image name="message_system" width="56" height="56"/>
+    </resources>
+</document>

+ 21 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.h

@@ -0,0 +1,21 @@
+//
+//  NotiferMessageCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/18.
+//
+
+#import <UIKit/UIKit.h>
+#import "NotiferMessageModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NotiferMessageCell : UITableViewCell
+
+@property (nonatomic, assign) BOOL isRead; // 是否已读
+
+- (void)configCellWithSource:(NotiferMessageModel *)model;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 79 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.m

@@ -0,0 +1,79 @@
+//
+//  NotiferMessageCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/18.
+//
+
+#import "NotiferMessageCell.h"
+
+@interface NotiferMessageCell ()
+
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
+@property (weak, nonatomic) IBOutlet UIImageView *messageTypeView;
+
+@property (weak, nonatomic) IBOutlet UIView *redDot;
+
+@property (weak, nonatomic) IBOutlet UILabel *topTitleLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *descMessageLabel;
+
+@property (nonatomic, strong) NotiferMessageModel *model;
+
+@end
+
+@implementation NotiferMessageCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)configCellWithSource:(NotiferMessageModel *)model {
+    self.model = model;
+    self.isRead = model.readStatus == 1 ? YES : NO;
+    // 根据type设置图片
+    NSDateFormatter *dateFormatter = [NSObject getDateformatter];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    NSDate *messageDate = [dateFormatter dateFromString:model.createOn];
+    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
+    NSString *dateStr = [dateFormatter stringFromDate:messageDate];
+    self.timeLabel.text = [NSString returnNoNullStringWithString:dateStr];
+    self.topTitleLabel.text = [NSString returnNoNullStringWithString:model.title];
+    
+    NSString *messgage = [NSString returnNoNullStringWithString:self.model.content];
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:4];//调整行间距
+    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:messgage attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:13.0f],NSForegroundColorAttributeName:HexRGB(0x7a7a7a)}];
+    self.descMessageLabel.attributedText = attrStr;
+    if ([model.group isEqualToString:@"COURSE"]) {
+        [self.messageTypeView setImage:[UIImage imageNamed:@"course_cell"]];
+    }
+    else if ([model.group isEqualToString:@"SYSTEM"]) {
+        [self.messageTypeView setImage:[UIImage imageNamed:@"system_cell"]];
+    }
+    else if ([model.group isEqualToString:@"NOTICE"]) {
+        [self.messageTypeView setImage:[UIImage imageNamed:@"notice_cell"]];
+    }
+}
+
+- (void)setIsRead:(BOOL)isRead {
+    _isRead = isRead;
+    if (isRead) {
+        self.redDot.hidden = YES;
+    }
+    else {
+        self.redDot.hidden = NO;
+    }
+}
+
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 95 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/NoticeCenter/View/NotiferMessageCell.xib

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell autoresizesSubviews="NO" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="108" id="KGk-i7-Jjw" customClass="NotiferMessageCell">
+            <rect key="frame" x="0.0" y="0.0" width="425" height="108"/>
+            <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="425" height="108"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_cell" translatesAutoresizingMaskIntoConstraints="NO" id="3FS-75-ZgU">
+                        <rect key="frame" x="16" y="32" width="44" height="44"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="44" id="Abw-Pq-4OW"/>
+                            <constraint firstAttribute="width" constant="44" id="cte-lB-Tzl"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="22"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </imageView>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="上课提醒" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dWN-rA-dKm">
+                        <rect key="frame" x="70" y="22" width="66" height="22"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="22" id="Amz-LZ-Qr5"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="您好,长笛基础教学·李老师的直播课60分钟后…教学·李老师的直播课60分钟后…" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aCp-hw-uSQ">
+                        <rect key="frame" x="70" y="46" width="339" height="40"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                        <color key="textColor" red="0.47843137254901957" green="0.47843137254901957" blue="0.47843137254901957" alpha="1" colorSpace="calibratedRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2022-3-25" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PnY-EC-LkF">
+                        <rect key="frame" x="350" y="26" width="59" height="14"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="heX-9o-hn0">
+                        <rect key="frame" x="141" y="19" width="6" height="6"/>
+                        <color key="backgroundColor" red="1" green="0.074509803921568626" blue="0.074509803921568626" alpha="1" colorSpace="calibratedRGB"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="6" id="4aE-tI-b0y"/>
+                            <constraint firstAttribute="height" constant="6" id="dxV-BU-vQb"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="3"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="bottom" secondItem="aCp-hw-uSQ" secondAttribute="bottom" constant="22" id="0DI-6H-dc0"/>
+                    <constraint firstItem="dWN-rA-dKm" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="22" id="0gk-xb-9OT"/>
+                    <constraint firstItem="dWN-rA-dKm" firstAttribute="leading" secondItem="3FS-75-ZgU" secondAttribute="trailing" constant="10" id="FNS-ca-wiG"/>
+                    <constraint firstItem="aCp-hw-uSQ" firstAttribute="leading" secondItem="dWN-rA-dKm" secondAttribute="leading" id="GSa-tm-lZr"/>
+                    <constraint firstItem="3FS-75-ZgU" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="Lvw-p8-dTf"/>
+                    <constraint firstItem="heX-9o-hn0" firstAttribute="leading" secondItem="dWN-rA-dKm" secondAttribute="trailing" constant="5" id="Pz3-5h-Y3h"/>
+                    <constraint firstItem="heX-9o-hn0" firstAttribute="centerY" secondItem="dWN-rA-dKm" secondAttribute="top" id="Rcd-NR-oK0"/>
+                    <constraint firstItem="PnY-EC-LkF" firstAttribute="centerY" secondItem="dWN-rA-dKm" secondAttribute="centerY" id="U2W-vQ-SXe"/>
+                    <constraint firstItem="aCp-hw-uSQ" firstAttribute="top" secondItem="dWN-rA-dKm" secondAttribute="bottom" constant="2" id="X0T-fD-Ccl"/>
+                    <constraint firstAttribute="trailing" secondItem="aCp-hw-uSQ" secondAttribute="trailing" constant="16" id="YQg-oV-3Kc"/>
+                    <constraint firstItem="3FS-75-ZgU" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="16" id="j1p-Kp-mXl"/>
+                    <constraint firstAttribute="trailing" secondItem="PnY-EC-LkF" secondAttribute="trailing" constant="16" id="qnJ-3l-15h"/>
+                </constraints>
+            </tableViewCellContentView>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="descMessageLabel" destination="aCp-hw-uSQ" id="UbP-ED-VTA"/>
+                <outlet property="messageTypeView" destination="3FS-75-ZgU" id="5O0-dQ-mpQ"/>
+                <outlet property="redDot" destination="heX-9o-hn0" id="tAI-79-1Gy"/>
+                <outlet property="timeLabel" destination="PnY-EC-LkF" id="vJS-8I-7KV"/>
+                <outlet property="topTitleLabel" destination="dWN-rA-dKm" id="lsT-AW-Yo5"/>
+            </connections>
+            <point key="canvasLocation" x="207.97101449275365" y="58.258928571428569"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="course_cell" width="44" height="43"/>
+    </resources>
+</document>

+ 8 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeBannerCell.m

@@ -21,7 +21,14 @@
 }
 
 - (void)configCellWithModel:(HomeMessageModel *)sourceModel {
-    [self.bannerImage sd_setImageWithURL:[NSURL URLWithString:sourceModel.coverImage] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    NSString *url = sourceModel.coverImage;
+    if ([NSString isEmptyString:url]) {
+        [self.bannerImage setImage:[UIImage imageNamed:@"video_placeholder"]];
+    }
+    else {
+        url = [url getUrlEndcodeString];
+        [self.bannerImage sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    }
 }
 
 @end

+ 3 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeBannerCell.xib

@@ -35,6 +35,9 @@
                 <constraint firstItem="KRw-yx-PyP" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="o6d-XR-yAa"/>
             </constraints>
             <size key="customSize" width="389" height="143"/>
+            <connections>
+                <outlet property="bannerImage" destination="KRw-yx-PyP" id="DfY-uY-Wlk"/>
+            </connections>
             <point key="canvasLocation" x="377.536231884058" y="102.79017857142857"/>
         </collectionViewCell>
     </objects>

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeHotAlbumCell.m

@@ -25,7 +25,7 @@
 }
 
 - (void)configWithAlbumModel:(HomeAlbumModel *)model {
-    [self.albumImage sd_setImageWithURL:[NSURL URLWithString:model.albumCoverUrl] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.albumImage sd_setImageWithURL:[NSURL URLWithString:[model.albumCoverUrl getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     self.albumNameLabel.text = [NSString returnNoNullStringWithString:model.albumName];
     NSString *collectString = [NSString stringWithFormat:@"%zd人收藏",model.albumFavoriteCount];
     NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:collectString attributes:@{NSForegroundColorAttributeName:HexRGB(0x63ffe1),NSFontAttributeName:[UIFont systemFontOfSize:11.0f weight:UIFontWeightMedium]}];

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeInformationCell.m

@@ -30,7 +30,7 @@
 - (void)configCellWithSource:(HomeMessageModel *)model rowIndex:(ROWINDEX)rowIndex {
     self.messageTitle.text = [NSString returnNoNullStringWithString:model.title];
     self.timeLabel.text = [model.updateTime dateFormatString];
-    [self.messageImage sd_setImageWithURL:[NSURL URLWithString:model.coverImage] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.messageImage sd_setImageWithURL:[NSURL URLWithString:[model.coverImage getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     if (rowIndex == ROWINDEX_TOP) {
         UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, kScreenWidth - 28, 108) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(8, 8)];
         CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];

+ 8 - 2
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeLiveCouseCell.m

@@ -36,9 +36,15 @@
 }
 
 - (void)configWithSource:(HomeLiveGroupModel *)source {
-    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:source.avatar] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:[source.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     self.courseName.text = [NSString returnNoNullStringWithString:source.courseGroupName];
-    self.teacherName.text = [NSString stringWithFormat:@"老师:%@",[NSString returnNoNullStringWithString:source.teacherName]];
+    
+    if ([NSString isEmptyString:source.teacherName]) {
+        self.teacherName.text = [NSString stringWithFormat:@"老师:游客%@",source.teacherId];
+    }
+    else {
+        self.teacherName.text = [NSString stringWithFormat:@"老师:%@",source.teacherName];
+    }
     self.priceLabel.text = [NSString stringWithFormat:@"¥%.2f",source.courseGroupPrice];
     self.courseCountLabel.text = [NSString stringWithFormat:@"%zd课时",source.courseNum];
     self.descLabel.text = [NSString stringWithFormat:@"%zd人已购买",source.buyCount];

+ 8 - 2
KulexiuForStudent/KulexiuForStudent/Module/Home/View/HomeVideoCourseCell.m

@@ -33,9 +33,15 @@
 }
 
 - (void)configWithSource:(HomeVideoGroupModel *)source {
-    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:source.lessonCoverUrl] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:[source.lessonCoverUrl getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     self.courseName.text = [NSString returnNoNullStringWithString:source.videoGroupName];
-    self.teacherName.text = [NSString stringWithFormat:@"老师:%@",[NSString returnNoNullStringWithString:source.teacherName]];
+    if ([NSString isEmptyString:source.teacherName]) {
+        self.teacherName.text = [NSString stringWithFormat:@"老师:游客%@",source.teacherId];
+    }
+    else {
+        self.teacherName.text = [NSString stringWithFormat:@"老师:%@",source.teacherName];
+
+    }
     self.coursePrice.text = [NSString stringWithFormat:@"¥%.2f",source.lessonPrice];
     self.courseCount.text = [NSString stringWithFormat:@"%zd课时",source.lessonCount];
     self.descLabel.text = [NSString stringWithFormat:@"%zd人已购买",source.buyCount];

+ 27 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.h

@@ -0,0 +1,27 @@
+//
+//  KSNewsAlert.h
+//  StudentDaya
+//
+//  Created by Kyle on 2020/2/26.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^NewsCallback)(BOOL isSure, NSString *linkUrl);
+
+@interface KSNewsAlert : UIView
+
++ (instancetype)shareInstance;
+
+- (void)evaluateWithMessage:(NSString *)imgUrl linkUrl:(NSString *)linkUrl callbackAction:(NewsCallback)callback;
+
+- (void)showAlert;
+
+- (void)hiddenAction;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.m

@@ -0,0 +1,70 @@
+//
+//  KSNewsAlert.m
+//  StudentDaya
+//
+//  Created by Kyle on 2020/2/26.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSNewsAlert.h"
+#import "UIView+Animation.h"
+
+
+@interface KSNewsAlert ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *newsImage;
+
+@property (nonatomic, copy) NewsCallback callback;
+
+@property (nonatomic, strong) NSString *linkUrl;
+
+@end
+
+@implementation KSNewsAlert
+
+
++ (instancetype)shareInstance {
+    KSNewsAlert *view = [[[NSBundle mainBundle] loadNibNamed:@"KSNewsAlert" owner:nil options:nil] firstObject];
+    view.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
+    return view;
+};
+
+- (void)evaluateWithMessage:(NSString *)imgUrl linkUrl:(NSString *)linkUrl callbackAction:(NewsCallback)callback {
+    self.linkUrl = linkUrl;
+    [self.newsImage sd_setImageWithURL:[NSURL URLWithString:imgUrl] placeholderImage:[UIImage new]];
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)showAlert {
+    [[UIApplication sharedApplication].keyWindow addSubview:self];
+    [self setPopAnimation];
+}
+
+- (void)hiddenAction {
+    [self removeFromSuperview];
+}
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        self.callback(YES, self.linkUrl);
+    }
+    [self hiddenAction];
+}
+- (IBAction)cancleAction:(id)sender {
+    if (self.callback) {
+        self.callback(NO, self.linkUrl);
+    }
+    [self hiddenAction];
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 79 - 0
KulexiuForStudent/KulexiuForStudent/Module/Home/View/KSNewsAlert.xib

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSNewsAlert">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Gsq-Tz-yIf">
+                    <rect key="frame" x="59" y="244" width="296" height="408"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="HXm-Ev-vPb">
+                            <rect key="frame" x="0.0" y="0.0" width="296" height="408"/>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="HXm-Ev-vPb" secondAttribute="trailing" id="2P7-XJ-EPD"/>
+                        <constraint firstAttribute="bottom" secondItem="HXm-Ev-vPb" secondAttribute="bottom" id="Qpp-wB-uxm"/>
+                        <constraint firstItem="HXm-Ev-vPb" firstAttribute="leading" secondItem="Gsq-Tz-yIf" secondAttribute="leading" id="XwL-c1-LHh"/>
+                        <constraint firstAttribute="width" secondItem="Gsq-Tz-yIf" secondAttribute="height" multiplier="257:354" id="oFR-jZ-Oa5"/>
+                        <constraint firstItem="HXm-Ev-vPb" firstAttribute="top" secondItem="Gsq-Tz-yIf" secondAttribute="top" id="zBx-Lc-1F1"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7KA-JY-2rT">
+                    <rect key="frame" x="59" y="244" width="296" height="408"/>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="jan-N6-kCS"/>
+                    </connections>
+                </button>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Cj7-J3-MRD">
+                    <rect key="frame" x="187" y="662" width="40" height="40"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="oFj-tN-HYo"/>
+                        <constraint firstAttribute="width" constant="40" id="s4j-Jf-jr8"/>
+                    </constraints>
+                    <state key="normal" image="alert_cancle"/>
+                    <connections>
+                        <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="frR-2Q-pXb"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.46000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="7KA-JY-2rT" firstAttribute="trailing" secondItem="Gsq-Tz-yIf" secondAttribute="trailing" id="2fw-Wf-fCj"/>
+                <constraint firstItem="Cj7-J3-MRD" firstAttribute="top" secondItem="Gsq-Tz-yIf" secondAttribute="bottom" constant="10" id="6rr-Br-qO9"/>
+                <constraint firstItem="7KA-JY-2rT" firstAttribute="bottom" secondItem="Gsq-Tz-yIf" secondAttribute="bottom" id="AB3-bn-Jcm"/>
+                <constraint firstItem="7KA-JY-2rT" firstAttribute="top" secondItem="Gsq-Tz-yIf" secondAttribute="top" id="AVK-Uh-3gL"/>
+                <constraint firstItem="Gsq-Tz-yIf" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="59" id="Q6d-Wn-JeM"/>
+                <constraint firstItem="Gsq-Tz-yIf" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="YbC-cb-sUv"/>
+                <constraint firstAttribute="trailing" secondItem="Gsq-Tz-yIf" secondAttribute="trailing" constant="59" id="lri-IY-MDQ"/>
+                <constraint firstItem="7KA-JY-2rT" firstAttribute="leading" secondItem="Gsq-Tz-yIf" secondAttribute="leading" id="rFm-1T-ygB"/>
+                <constraint firstItem="Cj7-J3-MRD" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="sbo-nk-xsy"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="newsImage" destination="HXm-Ev-vPb" id="Wq2-P3-OeD"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="138.61607142857142"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="alert_cancle" width="28" height="28"/>
+    </resources>
+</document>

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Home/View/TeacherShowCell.m

@@ -46,7 +46,7 @@
     self.model = sourceModel;
     [KSVideoHelper getVideoPreviewImageUrl:sourceModel.videoUrl forImageView:self.videoCover placeholder:[UIImage imageNamed:@"video_placeholder"]];
     self.descLabel.text = [NSString returnNoNullStringWithString:sourceModel.describe];
-    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:sourceModel.avatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:[sourceModel.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.teacherNameLabel.text = [NSString returnNoNullStringWithString:sourceModel.username];
     self.watchCount.text = [NSString stringWithFormat:@"%@已观看",sourceModel.browse];
     

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

@@ -183,7 +183,7 @@ static int clickPraiseBtnTimes  = 0;
     [self.view addSubview:self.headView];
     self.headView.boardcastName.text = [NSString returnNoNullStringWithString:self.createrName];
     if (![NSString isEmptyString:self.createrAvatal]) {
-        [self.headView.boardcastAvatal sd_setImageWithURL:[NSURL URLWithString:self.createrAvatal] placeholderImage:[UIImage imageNamed:@"teacher_logo"]];
+        [self.headView.boardcastAvatal sd_setImageWithURL:[NSURL URLWithString:[self.createrAvatal getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"teacher_logo"]];
     }
     [self countLikeMessageCount];
     

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Live/View/LiveSeatApplyCell.m

@@ -38,7 +38,7 @@
         self.callback = callback;
     }
     self.member = member;
-    [self.userAvatar sd_setImageWithURL:[NSURL URLWithString:member.avatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.userAvatar sd_setImageWithURL:[NSURL URLWithString:[member.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.userName.text = [NSString returnNoNullStringWithString:member.name];
     if (member.isConnected) {
         self.refuseButton.hidden = YES;

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Login/Controller/SubjectChooseViewController.m

@@ -179,7 +179,7 @@
 - (__kindof UICollectionViewCell *)cycleScrollView:(ZKCycleScrollView *)cycleScrollView cellForItemAtIndex:(NSInteger)index {
     SubjectImageCell *cell = [cycleScrollView dequeueReusableCellWithReuseIdentifier:@"SubjectImageCell" forIndex:index];
     InstrumentMessageModel *model = self.imageArray[index];
-    [cell.instrumentImage sd_setImageWithURL:[NSURL URLWithString:model.img]];
+    [cell.instrumentImage sd_setImageWithURL:[NSURL URLWithString:[model.img getUrlEndcodeString]]];
     return cell;
 }
 

+ 44 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/AddressList/Controller/AddressListViewController.m

@@ -10,6 +10,7 @@
 #import "AddressBottomView.h"
 #import "AddressDetailViewController.h"
 #import "AddressListModel.h"
+#import "KSImageAlert.h"
 
 @interface AddressListViewController ()<UITableViewDataSource,UITableViewDelegate>
 
@@ -120,6 +121,49 @@
     [self.navigationController pushViewController:ctrl animated:YES];
 }
 
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+    return YES;
+}
+
+- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
+    AddressListModel *model = self.dataArray[indexPath.row];
+    UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
+        [self deleteAddressConfirm:model.internalBaseClassIdentifier];
+    }];
+    deleteRowAction.backgroundColor = THEMECOLOR;
+    
+    return @[deleteRowAction];
+}
+// 删除
+- (void)deleteAddressConfirm:(NSString *)addressId {
+    KSImageAlert *alertView = [KSImageAlert shareInstance];
+    MJWeakSelf;
+    alertView.titleLabel.text = @"确认删除收获地址吗";
+    [alertView.cancleButton setTitle:@"取消" forState:UIControlStateNormal];
+    [alertView.sureButton setTitle:@"确定" forState:UIControlStateNormal];
+    [alertView sureCallback:^(BOOL isSure) {
+        if (isSure) {
+            [weakSelf deleteAddress:addressId];
+        }
+    }];
+    [alertView showAlert];
+}
+
+- (void)deleteAddress:(NSString *)addressId {
+    [self showhud];
+    [KSNetworkingManager deleteAddressRequest:KS_POST addressId:addressId success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200) {
+            [self MBPShow:@"删除成功"];
+            [self refreshAndRequestData];
+        }
+        else {
+            [self MBPShow:[dic stringValueForKey:@"message"]];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
 - (UITableView *)tableView {
     if (!_tableView) {
         _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/Controller/MineViewController.m

@@ -161,7 +161,7 @@
         case MINEVIEWTYPE_HELP:
         {
             KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
-            webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/help"];
+            webCtrl.url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/helpCenter"];
             [self.navigationController pushViewController:webCtrl animated:YES];
         }
             break;

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/Homework/View/HomeworkListCell.m

@@ -48,7 +48,7 @@
     self.courseTime.text = [NSString stringWithFormat:@"%@~%@",[NSString returnNoNullStringWithString:lessonBegin],[NSString returnNoNullStringWithString:lessonEnd]];
     
     self.studentNameLabel.text = [NSString returnNoNullStringWithString:sourceModel.teacherName];
-    [self.studentAvatal sd_setImageWithURL:[NSURL URLWithString:sourceModel.teacherAvatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.studentAvatal sd_setImageWithURL:[NSURL URLWithString:[sourceModel.teacherAvatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     self.subjectLabel.text = [NSString returnNoNullStringWithString:sourceModel.subjectName];
 
     self.userId = sourceModel.studentId;

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/Model/VideoCourseModel.m

@@ -19,7 +19,7 @@ NSString *const kVideoCourseModelAvatar = @"avatar";
 NSString *const kVideoCourseModelLessonSubject = @"lessonSubject";
 NSString *const kVideoCourseModelTeacherId = @"teacherId";
 NSString *const kVideoCourseModelHotFlag = @"hotFlag";
-NSString *const kVideoCourseModelUsername = @"username";
+NSString *const kVideoCourseModelUsername = @"userName";
 NSString *const kVideoCourseModelCreateTime = @"createTime";
 NSString *const kVideoCourseModelAuditStatus = @"auditStatus";
 NSString *const kVideoCourseModelSortNumber = @"sortNumber";

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/View/MyLiveCourseCell.m

@@ -36,7 +36,7 @@
     if (callback) {
         self.callback = callback;
     }
-    [self.courseCoverImage sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.courseCoverImage sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     
     self.courseNameLabel.text = [NSString returnNoNullStringWithString:model.name];
     self.subjectName.text = [NSString returnNoNullStringWithString:model.subjectName];

+ 2 - 2
KulexiuForStudent/KulexiuForStudent/Module/Mine/MineCourse/View/VideoCourseCell.m

@@ -33,9 +33,9 @@
 }
 
 - (void)configSourceModel:(VideoCourseModel *)model isInCheck:(BOOL)isCheck {
-    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:model.lessonCoverUrl] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
+    [self.coverImage sd_setImageWithURL:[NSURL URLWithString:[model.lessonCoverUrl getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"video_placeholder"]];
     self.courseTitle.text = [NSString returnNoNullStringWithString:model.lessonName];
-    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     if ([NSString isEmptyString:model.username]) {
         self.teacherName.text = [NSString stringWithFormat:@"游客%.0f",model.teacherId];
     }

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/SettingViewController.m

@@ -59,7 +59,7 @@
 
 - (void)configMessage {
     if (![NSString isEmptyString:self.mineInfo.avatar]) {
-        [self.bodyView.userAvatal sd_setImageWithURL:[NSURL URLWithString:self.mineInfo.avatar] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+        [self.bodyView.userAvatal sd_setImageWithURL:[NSURL URLWithString:[self.mineInfo.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     }
     else {
         [self.bodyView.userAvatal setImage:[UIImage imageNamed:USERDEFAULT_LOGO]];

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/VeriCheckView.m

@@ -108,7 +108,7 @@
     self.phoneNo = phoneNo;
     NSString *url = [NSString stringWithFormat:@"%@%@?phone=%@",hostURL, @"/api-student/code/getImageCode",phoneNo];
     [[SDImageCache sharedImageCache] removeImageForKey:url withCompletion:^{
-        [self.checkImage sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"image_placeholder"] options:SDWebImageRefreshCached];
+        [self.checkImage sd_setImageWithURL:[NSURL URLWithString:[url getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:@"image_placeholder"] options:SDWebImageRefreshCached];
     }];
 }
 

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Mine/View/MineBodyView.m

@@ -64,7 +64,7 @@
     self.userName.text = userName;
     self.userIdLabel.text = [NSString stringWithFormat:@"学号:%@",sourceModel.userId];
     self.memberCountLabel.text = [NSString stringWithFormat:@"会员有效期剩余%.0f天",sourceModel.membershipDays];
-    [self.userAvatar sd_setImageWithURL:[NSURL URLWithString:sourceModel.heardUrl] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
+    [self.userAvatar sd_setImageWithURL:[NSURL URLWithString:[sourceModel.heardUrl getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
 }
 
 - (IBAction)toMemberDetail:(id)sender {

+ 1 - 0
KulexiuForStudent/Podfile

@@ -37,6 +37,7 @@ target 'KulexiuForStudent' do
   pod 'RongCloudIM/Sight',  '~> 5.2.0'
   pod 'RongCloudRTC/RongRTCLib','~> 5.2.1'
 
+  pod "iOS-KS3SDK", "~>1.0.5"
   # Pods for KulexiuForStudent
 
   target 'KulexiuForStudentTests' do

+ 5 - 1
KulexiuForStudent/Podfile.lock

@@ -33,6 +33,7 @@ PODS:
   - CHIPageControl/Paprika (0.2)
   - CHIPageControl/Puya (0.2)
   - dsBridge (3.0.6)
+  - iOS-KS3SDK (1.0.5)
   - IQKeyboardManager (6.5.9)
   - JCore (2.7.1-noidfa)
   - JPush (4.3.0):
@@ -108,6 +109,7 @@ DEPENDENCIES:
   - AFNetworking (~> 4.0)
   - Bugly
   - CHIPageControl
+  - iOS-KS3SDK (~> 1.0.5)
   - IQKeyboardManager
   - JCore (= 2.7.1-noidfa)
   - JPush (= 4.3.0)
@@ -138,6 +140,7 @@ SPEC REPOS:
     - Bugly
     - CHIPageControl
     - dsBridge
+    - iOS-KS3SDK
     - IQKeyboardManager
     - JCore
     - JPush
@@ -166,6 +169,7 @@ SPEC CHECKSUMS:
   Bugly: afe841bba2ea6de6d432a3c125240a5e75949c55
   CHIPageControl: a787bf7205c9b7e7fbfc412be36c5e8636b68f86
   dsBridge: 48b62ee8a411ad601a88d6f6c8cf6cb634b206b7
+  iOS-KS3SDK: 688f6c6a3b91af8e0bd0bd9c1e727cd5315293dd
   IQKeyboardManager: 241cc94ccabc9deb8f8bd7d12f00d73288d13ecc
   JCore: b9d49b2e5364cce65dec86056c60b1b72825893a
   JPush: 88d6361fbec4be7c8b55b20b7fe1c292228f6bc2
@@ -189,6 +193,6 @@ SPEC CHECKSUMS:
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
   ZKCycleScrollView: 4b353d17b7f469b245a1c606d5a977e72b940895
 
-PODFILE CHECKSUM: d1525614cc0e9f425131238bd58c1c5c566c494b
+PODFILE CHECKSUM: 3fa48a0c876d24bb53478e9c3b6a588814a4b5df
 
 COCOAPODS: 1.11.3

+ 5 - 1
KulexiuForStudent/Pods/Manifest.lock

@@ -33,6 +33,7 @@ PODS:
   - CHIPageControl/Paprika (0.2)
   - CHIPageControl/Puya (0.2)
   - dsBridge (3.0.6)
+  - iOS-KS3SDK (1.0.5)
   - IQKeyboardManager (6.5.9)
   - JCore (2.7.1-noidfa)
   - JPush (4.3.0):
@@ -108,6 +109,7 @@ DEPENDENCIES:
   - AFNetworking (~> 4.0)
   - Bugly
   - CHIPageControl
+  - iOS-KS3SDK (~> 1.0.5)
   - IQKeyboardManager
   - JCore (= 2.7.1-noidfa)
   - JPush (= 4.3.0)
@@ -138,6 +140,7 @@ SPEC REPOS:
     - Bugly
     - CHIPageControl
     - dsBridge
+    - iOS-KS3SDK
     - IQKeyboardManager
     - JCore
     - JPush
@@ -166,6 +169,7 @@ SPEC CHECKSUMS:
   Bugly: afe841bba2ea6de6d432a3c125240a5e75949c55
   CHIPageControl: a787bf7205c9b7e7fbfc412be36c5e8636b68f86
   dsBridge: 48b62ee8a411ad601a88d6f6c8cf6cb634b206b7
+  iOS-KS3SDK: 688f6c6a3b91af8e0bd0bd9c1e727cd5315293dd
   IQKeyboardManager: 241cc94ccabc9deb8f8bd7d12f00d73288d13ecc
   JCore: b9d49b2e5364cce65dec86056c60b1b72825893a
   JPush: 88d6361fbec4be7c8b55b20b7fe1c292228f6bc2
@@ -189,6 +193,6 @@ SPEC CHECKSUMS:
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
   ZKCycleScrollView: 4b353d17b7f469b245a1c606d5a977e72b940895
 
-PODFILE CHECKSUM: d1525614cc0e9f425131238bd58c1c5c566c494b
+PODFILE CHECKSUM: 3fa48a0c876d24bb53478e9c3b6a588814a4b5df
 
 COCOAPODS: 1.11.3

File diff suppressed because it is too large
+ 1995 - 1614
KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj


+ 33 - 26
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -30,182 +30,182 @@
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>4</integer>
+			<integer>5</integer>
 		</dict>
 		<key>JCore.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>5</integer>
+			<integer>6</integer>
 		</dict>
 		<key>JPush.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>6</integer>
+			<integer>7</integer>
 		</dict>
 		<key>JXCategoryView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>7</integer>
+			<integer>8</integer>
 		</dict>
 		<key>JXPagingView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>8</integer>
+			<integer>9</integer>
 		</dict>
 		<key>MBProgressHUD.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>10</integer>
+			<integer>11</integer>
 		</dict>
 		<key>MJExtension.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>11</integer>
+			<integer>12</integer>
 		</dict>
 		<key>MJRefresh.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>12</integer>
+			<integer>13</integer>
 		</dict>
 		<key>Masonry.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>9</integer>
+			<integer>10</integer>
 		</dict>
 		<key>Pods-KulexiuForStudent-KulexiuForStudentUITests.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>14</integer>
+			<integer>15</integer>
 		</dict>
 		<key>Pods-KulexiuForStudent.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>13</integer>
+			<integer>14</integer>
 		</dict>
 		<key>Pods-KulexiuForStudentTests.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>15</integer>
+			<integer>16</integer>
 		</dict>
 		<key>RSKImageCropper.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>19</integer>
+			<integer>20</integer>
 		</dict>
 		<key>Reachability.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>16</integer>
+			<integer>17</integer>
 		</dict>
 		<key>RongCloudIM.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>17</integer>
+			<integer>18</integer>
 		</dict>
 		<key>RongCloudRTC.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>18</integer>
+			<integer>19</integer>
 		</dict>
 		<key>SDWebImage.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>20</integer>
+			<integer>21</integer>
 		</dict>
 		<key>SSZipArchive.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>22</integer>
+			<integer>23</integer>
 		</dict>
 		<key>SocketRocket.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>21</integer>
+			<integer>22</integer>
 		</dict>
 		<key>UMAPM.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>23</integer>
+			<integer>24</integer>
 		</dict>
 		<key>UMCommon.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>24</integer>
+			<integer>25</integer>
 		</dict>
 		<key>UMDevice.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>25</integer>
+			<integer>26</integer>
 		</dict>
 		<key>Whiteboard-Whiteboard.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>27</integer>
+			<integer>28</integer>
 		</dict>
 		<key>Whiteboard.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>26</integer>
+			<integer>27</integer>
 		</dict>
 		<key>YYModel.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>28</integer>
+			<integer>29</integer>
 		</dict>
 		<key>ZKCycleScrollView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>29</integer>
+			<integer>30</integer>
 		</dict>
 		<key>dsBridge.xcscheme</key>
 		<dict>
@@ -214,6 +214,13 @@
 			<key>orderHint</key>
 			<integer>3</integer>
 		</dict>
+		<key>iOS-KS3SDK.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+			<key>orderHint</key>
+			<integer>4</integer>
+		</dict>
 	</dict>
 	<key>SuppressBuildableAutocreation</key>
 	<dict/>

+ 17 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.markdown

@@ -440,4 +440,21 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
+
+## iOS-KS3SDK
+
+Copyright (c) 2017 Kingsoft.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
 Generated by CocoaPods - https://cocoapods.org

+ 23 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.plist

@@ -604,6 +604,29 @@ SOFTWARE.
 		</dict>
 		<dict>
 			<key>FooterText</key>
+			<string>Copyright (c) 2017 Kingsoft.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+</string>
+			<key>License</key>
+			<string>Apache License, Version 2.0</string>
+			<key>Title</key>
+			<string>iOS-KS3SDK</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
 			<string>Generated by CocoaPods - https://cocoapods.org</string>
 			<key>Title</key>
 			<string></string>

+ 1 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Debug-input-files.xcfilelist

@@ -17,6 +17,7 @@ ${BUILT_PRODUCTS_DIR}/Whiteboard/Whiteboard.framework
 ${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework
 ${BUILT_PRODUCTS_DIR}/ZKCycleScrollView/ZKCycleScrollView.framework
 ${BUILT_PRODUCTS_DIR}/dsBridge/dsBridge.framework
+${BUILT_PRODUCTS_DIR}/iOS-KS3SDK/iOS_KS3SDK.framework
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/ChatRoom/RongChatRoom.framework/RongChatRoom
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/CustomerService/RongCustomerService.framework/RongCustomerService
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/Discussion/RongDiscussion.framework/RongDiscussion

+ 1 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Debug-output-files.xcfilelist

@@ -16,6 +16,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Whiteboard.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYModel.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZKCycleScrollView.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dsBridge.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/iOS_KS3SDK.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongChatRoom.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongCustomerService.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongDiscussion.framework

+ 1 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Release-input-files.xcfilelist

@@ -17,6 +17,7 @@ ${BUILT_PRODUCTS_DIR}/Whiteboard/Whiteboard.framework
 ${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework
 ${BUILT_PRODUCTS_DIR}/ZKCycleScrollView/ZKCycleScrollView.framework
 ${BUILT_PRODUCTS_DIR}/dsBridge/dsBridge.framework
+${BUILT_PRODUCTS_DIR}/iOS-KS3SDK/iOS_KS3SDK.framework
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/ChatRoom/RongChatRoom.framework/RongChatRoom
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/CustomerService/RongCustomerService.framework/RongCustomerService
 ${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/Discussion/RongDiscussion.framework/RongDiscussion

+ 1 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks-Release-output-files.xcfilelist

@@ -16,6 +16,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Whiteboard.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYModel.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZKCycleScrollView.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dsBridge.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/iOS_KS3SDK.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongChatRoom.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongCustomerService.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RongDiscussion.framework

+ 2 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-frameworks.sh

@@ -194,6 +194,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ZKCycleScrollView/ZKCycleScrollView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/dsBridge/dsBridge.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/iOS-KS3SDK/iOS_KS3SDK.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/ChatRoom/RongChatRoom.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/CustomerService/RongCustomerService.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/Discussion/RongDiscussion.framework"
@@ -224,6 +225,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/YYModel/YYModel.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ZKCycleScrollView/ZKCycleScrollView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/dsBridge/dsBridge.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/iOS-KS3SDK/iOS_KS3SDK.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/ChatRoom/RongChatRoom.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/CustomerService/RongCustomerService.framework"
   install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/RongCloudIM/Discussion/RongDiscussion.framework"

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