Browse Source

客服查询用户信息中间页UI

Steven 7 months ago
parent
commit
039c3b9df7
58 changed files with 1259 additions and 69 deletions
  1. 72 4
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme
  3. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/Contents.json
  4. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/Contents.json
  5. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/userDetail_bg@2x.png
  6. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/userDetail_bg@3x.png
  7. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/Contents.json
  8. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/userDetail_cicle_image@2x.png
  9. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/userDetail_cicle_image@3x.png
  10. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/Contents.json
  11. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/user_detailBack@2x.png
  12. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/user_detailBack@3x.png
  13. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/Contents.json
  14. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/user_tag_student@2x.png
  15. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/user_tag_student@3x.png
  16. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/Contents.json
  17. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/user_tag_teacher@2x.png
  18. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/user_tag_teacher@3x.png
  19. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagSvip.imageset/mineCenter_tagSvip@2x.png
  20. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagSvip.imageset/mineCenter_tagSvip@3x.png
  21. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagSvipExpired.imageset/mineCenter_tagSvipExpired@2x.png
  22. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagSvipExpired.imageset/mineCenter_tagSvipExpired@3x.png
  23. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagVip.imageset/mineCenter_tagVip@2x.png
  24. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagVip.imageset/mineCenter_tagVip@3x.png
  25. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagVipExpired.imageset/mineCenter_tagVipExpired@2x.png
  26. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mineCenter_tagVipExpired.imageset/mineCenter_tagVipExpired@3x.png
  27. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mine_svip.imageset/mine_svip@2x.png
  28. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mine_svip.imageset/mine_svip@3x.png
  29. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mine_vip.imageset/mine_vip@2x.png
  30. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/home_vefi/mine_vip.imageset/mine_vip@3x.png
  31. 17 4
      KulexiuForTeacher/KulexiuForTeacher/Common/LoadingManager/KSHudLoagingManager.m
  32. 8 28
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m
  33. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.h
  34. 132 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.m
  35. 20 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.h
  36. 75 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.m
  37. 417 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.xib
  38. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.h
  39. 51 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.m
  40. 47 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.xib
  41. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.h
  42. 47 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.m
  43. 59 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.xib
  44. 27 6
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m
  45. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.h
  46. 15 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.m
  47. 13 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.xib
  48. 21 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ChatAddressBodyView.m
  49. 3 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.h
  50. 15 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.m
  51. 14 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.xib
  52. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNavView.xib
  53. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeTenantView.xib
  54. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.xib
  55. 3 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/ShareInChat/View/ShareChooseMainView.m
  56. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineHeadView.xib
  57. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/TenantMineHeadView.xib
  58. BIN
      KulexiuForTeacher/KulexiuForTeacher/ToolKit/KSToolLibrary.framework/KSToolLibrary

+ 72 - 4
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -524,6 +524,13 @@
 		BC41104A2806706800800BD9 /* HomeworkListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4110482806706800800BD9 /* HomeworkListCell.xib */; };
 		BC41104D280678E600800BD9 /* HomeworkSortView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC41104C280678E600800BD9 /* HomeworkSortView.m */; };
 		BC41104F280678ED00800BD9 /* HomeworkSortView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC41104E280678ED00800BD9 /* HomeworkSortView.xib */; };
+		BC4217F82C4E3D2B00C70B2F /* KSUserDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4217F72C4E3D2B00C70B2F /* KSUserDetailViewController.m */; };
+		BC4217FB2C4E3DF700C70B2F /* KSUserDetailBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4217FA2C4E3DF700C70B2F /* KSUserDetailBottomView.m */; };
+		BC4217FD2C4E3DFC00C70B2F /* KSUserDetailBottomView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4217FC2C4E3DFC00C70B2F /* KSUserDetailBottomView.xib */; };
+		BC4218002C4E439B00C70B2F /* KSUserDetailNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4217FF2C4E439B00C70B2F /* KSUserDetailNavView.m */; };
+		BC4218022C4E43A100C70B2F /* KSUserDetailNavView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC4218012C4E43A100C70B2F /* KSUserDetailNavView.xib */; };
+		BC42180A2C4E473E00C70B2F /* KSUserDetailBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4218092C4E473D00C70B2F /* KSUserDetailBodyView.m */; };
+		BC42180C2C4E474500C70B2F /* KSUserDetailBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC42180B2C4E474500C70B2F /* KSUserDetailBodyView.xib */; };
 		BC42CAAE2BEC9CDA001F076E /* RhythmChooseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC42CAA92BEC9CDA001F076E /* RhythmChooseView.m */; };
 		BC42CAAF2BEC9CDA001F076E /* RhythmChooseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC42CAAA2BEC9CDA001F076E /* RhythmChooseView.xib */; };
 		BC42CAB02BEC9CDA001F076E /* RhythmView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC42CAAC2BEC9CDA001F076E /* RhythmView.m */; };
@@ -861,6 +868,7 @@
 		BCB399B327F94B5A00AFF376 /* LTSCalendarBottomView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB399B127F94B5A00AFF376 /* LTSCalendarBottomView.xib */; };
 		BCB399BC27F9831D00AFF376 /* CourseForLiveCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB399BA27F9831D00AFF376 /* CourseForLiveCell.m */; };
 		BCB399BD27F9831D00AFF376 /* CourseForLiveCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCB399BB27F9831D00AFF376 /* CourseForLiveCell.xib */; };
+		BCB3D89A2C4E68130091B1EB /* KSToolLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB3D8992C4E68130091B1EB /* KSToolLibrary.framework */; };
 		BCB633F627F6A18200ACFDCF /* LocalRenderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB633DC27F6A18100ACFDCF /* LocalRenderManager.m */; };
 		BCB633F727F6A18200ACFDCF /* ClassroomTimerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB633DD27F6A18100ACFDCF /* ClassroomTimerManager.m */; };
 		BCB633F827F6A18200ACFDCF /* KSTipsView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB633E027F6A18100ACFDCF /* KSTipsView.m */; };
@@ -1082,7 +1090,6 @@
 		BCF61BEF28042F9B0000ACFE /* InstrumentChooseBottonView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF61BEE28042F9B0000ACFE /* InstrumentChooseBottonView.m */; };
 		BCF61BF128042FA90000ACFE /* InstrumentChooseBottonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF61BF028042FA90000ACFE /* InstrumentChooseBottonView.xib */; };
 		BCFC09CC2C47FB5C009A727F /* CloudAccompanyLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCFC09CB2C47FB5C009A727F /* CloudAccompanyLibrary.framework */; };
-		BCFC09CE2C47FB6F009A727F /* KSToolLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCFC09CD2C47FB6F009A727F /* KSToolLibrary.framework */; };
 		BCFC09DD2C48E4A0009A727F /* UserVip.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC09DC2C48E4A0009A727F /* UserVip.m */; };
 		BCFE540928168DFF00AD6786 /* KSButtonStatusView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE540828168DFF00AD6786 /* KSButtonStatusView.m */; };
 		BCFE541028178FF600AD6786 /* MyIncomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE540F28178FF600AD6786 /* MyIncomeViewController.m */; };
@@ -2011,6 +2018,17 @@
 		BC41104B280678E600800BD9 /* HomeworkSortView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeworkSortView.h; sourceTree = "<group>"; };
 		BC41104C280678E600800BD9 /* HomeworkSortView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeworkSortView.m; sourceTree = "<group>"; };
 		BC41104E280678ED00800BD9 /* HomeworkSortView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeworkSortView.xib; sourceTree = "<group>"; };
+		BC4217F62C4E3D2B00C70B2F /* KSUserDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSUserDetailViewController.h; sourceTree = "<group>"; };
+		BC4217F72C4E3D2B00C70B2F /* KSUserDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSUserDetailViewController.m; sourceTree = "<group>"; };
+		BC4217F92C4E3DF700C70B2F /* KSUserDetailBottomView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSUserDetailBottomView.h; sourceTree = "<group>"; };
+		BC4217FA2C4E3DF700C70B2F /* KSUserDetailBottomView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSUserDetailBottomView.m; sourceTree = "<group>"; };
+		BC4217FC2C4E3DFC00C70B2F /* KSUserDetailBottomView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSUserDetailBottomView.xib; sourceTree = "<group>"; };
+		BC4217FE2C4E439B00C70B2F /* KSUserDetailNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSUserDetailNavView.h; sourceTree = "<group>"; };
+		BC4217FF2C4E439B00C70B2F /* KSUserDetailNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSUserDetailNavView.m; sourceTree = "<group>"; };
+		BC4218012C4E43A100C70B2F /* KSUserDetailNavView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSUserDetailNavView.xib; sourceTree = "<group>"; };
+		BC4218082C4E473D00C70B2F /* KSUserDetailBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSUserDetailBodyView.h; sourceTree = "<group>"; };
+		BC4218092C4E473D00C70B2F /* KSUserDetailBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSUserDetailBodyView.m; sourceTree = "<group>"; };
+		BC42180B2C4E474500C70B2F /* KSUserDetailBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSUserDetailBodyView.xib; sourceTree = "<group>"; };
 		BC42CAA82BEC9CDA001F076E /* RhythmView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RhythmView.h; sourceTree = "<group>"; };
 		BC42CAA92BEC9CDA001F076E /* RhythmChooseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RhythmChooseView.m; sourceTree = "<group>"; };
 		BC42CAAA2BEC9CDA001F076E /* RhythmChooseView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RhythmChooseView.xib; sourceTree = "<group>"; };
@@ -2529,6 +2547,7 @@
 		BCB399B927F9831D00AFF376 /* CourseForLiveCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CourseForLiveCell.h; sourceTree = "<group>"; };
 		BCB399BA27F9831D00AFF376 /* CourseForLiveCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CourseForLiveCell.m; sourceTree = "<group>"; };
 		BCB399BB27F9831D00AFF376 /* CourseForLiveCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseForLiveCell.xib; sourceTree = "<group>"; };
+		BCB3D8992C4E68130091B1EB /* KSToolLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KSToolLibrary.framework; sourceTree = "<group>"; };
 		BCB633DA27F6A18100ACFDCF /* LocalRenderManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalRenderManager.h; sourceTree = "<group>"; };
 		BCB633DB27F6A18100ACFDCF /* ClassroomTimerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassroomTimerManager.h; sourceTree = "<group>"; };
 		BCB633DC27F6A18100ACFDCF /* LocalRenderManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalRenderManager.m; sourceTree = "<group>"; };
@@ -2889,7 +2908,6 @@
 		BCF880EE2B91C7310007B8F0 /* Config-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Config-debug.xcconfig"; sourceTree = "<group>"; };
 		BCF880F12B91C7580007B8F0 /* Config-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Config-release.xcconfig"; sourceTree = "<group>"; };
 		BCFC09CB2C47FB5C009A727F /* CloudAccompanyLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CloudAccompanyLibrary.framework; sourceTree = "<group>"; };
-		BCFC09CD2C47FB6F009A727F /* KSToolLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KSToolLibrary.framework; sourceTree = "<group>"; };
 		BCFC09DB2C48E49F009A727F /* UserVip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserVip.h; sourceTree = "<group>"; };
 		BCFC09DC2C48E4A0009A727F /* UserVip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserVip.m; sourceTree = "<group>"; };
 		BCFE540728168DFF00AD6786 /* KSButtonStatusView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSButtonStatusView.h; sourceTree = "<group>"; };
@@ -2922,7 +2940,7 @@
 				BCFEE1902AD15BF5000E888F /* SoundpipeAudioKit in Frameworks */,
 				BC8B6E612856ED0600866917 /* libWeiboSDK.a in Frameworks */,
 				BC8B6E532856ED0600866917 /* UMAPM.framework in Frameworks */,
-				BCFC09CE2C47FB6F009A727F /* KSToolLibrary.framework in Frameworks */,
+				BCB3D89A2C4E68130091B1EB /* KSToolLibrary.framework in Frameworks */,
 				2779333F27E314640010E277 /* CoreVideo.framework in Frameworks */,
 				BC8B6E572856ED0600866917 /* UMDevice.framework in Frameworks */,
 				BC3A55662BAA799B002E1616 /* KSTunerLibrary.framework in Frameworks */,
@@ -3749,6 +3767,7 @@
 		2779360327E32BBF0010E277 /* Controller */ = {
 			isa = PBXGroup;
 			children = (
+				BC4217F52C4E3D0400C70B2F /* UserDetail */,
 				BC15534B2AB325B000C1C347 /* TenantGroup */,
 				BC000D982A84E36A006C5A89 /* TXCustom */,
 				275B171027EB18F10081FDEF /* ChatAddressViewController.h */,
@@ -5210,7 +5229,7 @@
 			children = (
 				BC00A65B2BB58F1700231B74 /* LLPhotoBrowse.bundle */,
 				BC00A6592BB58F0000231B74 /* WMPlayer.bundle */,
-				BCFC09CD2C47FB6F009A727F /* KSToolLibrary.framework */,
+				BCB3D8992C4E68130091B1EB /* KSToolLibrary.framework */,
 				BC3A55612BAA798A002E1616 /* KSTunerLibrary.framework */,
 				BCFC09CB2C47FB5C009A727F /* CloudAccompanyLibrary.framework */,
 				BC24570E286C437D00D1F7C0 /* SoundFontFile */,
@@ -5321,6 +5340,48 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC4217F22C4E3D0400C70B2F /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BC4217F62C4E3D2B00C70B2F /* KSUserDetailViewController.h */,
+				BC4217F72C4E3D2B00C70B2F /* KSUserDetailViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BC4217F32C4E3D0400C70B2F /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BC4217F42C4E3D0400C70B2F /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BC4217F92C4E3DF700C70B2F /* KSUserDetailBottomView.h */,
+				BC4217FA2C4E3DF700C70B2F /* KSUserDetailBottomView.m */,
+				BC4217FC2C4E3DFC00C70B2F /* KSUserDetailBottomView.xib */,
+				BC4217FE2C4E439B00C70B2F /* KSUserDetailNavView.h */,
+				BC4217FF2C4E439B00C70B2F /* KSUserDetailNavView.m */,
+				BC4218012C4E43A100C70B2F /* KSUserDetailNavView.xib */,
+				BC4218082C4E473D00C70B2F /* KSUserDetailBodyView.h */,
+				BC4218092C4E473D00C70B2F /* KSUserDetailBodyView.m */,
+				BC42180B2C4E474500C70B2F /* KSUserDetailBodyView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BC4217F52C4E3D0400C70B2F /* UserDetail */ = {
+			isa = PBXGroup;
+			children = (
+				BC4217F22C4E3D0400C70B2F /* Controller */,
+				BC4217F32C4E3D0400C70B2F /* Model */,
+				BC4217F42C4E3D0400C70B2F /* View */,
+			);
+			path = UserDetail;
+			sourceTree = "<group>";
+		};
 		BC4BCE622823990100522C8B /* AddressList */ = {
 			isa = PBXGroup;
 			children = (
@@ -7323,7 +7384,9 @@
 				BC48C3B028292FBE00EE65C5 /* ReceiveHeaderView.xib in Resources */,
 				BC8B6DBA285327EE00866917 /* MusicShareDisplayView.xib in Resources */,
 				BC58E7D5281B9637004B0893 /* PublicNoticeView.xib in Resources */,
+				BC4218022C4E43A100C70B2F /* KSUserDetailNavView.xib in Resources */,
 				BCEA752D2819134400886A86 /* CardBindResultBodyView.xib in Resources */,
+				BC42180C2C4E474500C70B2F /* KSUserDetailBodyView.xib in Resources */,
 				BC1365BD280D163200EB03E2 /* MyVideoSearchView.xib in Resources */,
 				BC14A61428A0AC880086395C /* MineTeachToolView.xib in Resources */,
 				BC56C96729235C0500AF301F /* CoursewareNavView.xib in Resources */,
@@ -7339,6 +7402,7 @@
 				BC221FA228C72B9500F99802 /* MyStyleVideoCell.xib in Resources */,
 				275E8A7227E18F2300DD3F6E /* Main.storyboard in Resources */,
 				BC71DEFE2A89F470003F165E /* TXTimeView.xib in Resources */,
+				BC4217FD2C4E3DFC00C70B2F /* KSUserDetailBottomView.xib in Resources */,
 				BC3673DE28A606A500059721 /* musicRoom_animation_1.png in Resources */,
 				BC1553532AB3279500C1C347 /* TenentGroupAddMemberCell.xib in Resources */,
 				BCC0F7062A8CF13D00C4EFA4 /* TXDanBottomView.xib in Resources */,
@@ -7790,6 +7854,7 @@
 				2723B68727F1642B00E0B90B /* HomeBodyView.m in Sources */,
 				BC106B252A8F44F8000759A9 /* TXLiveRoomViewController.m in Sources */,
 				2779320827E30FC30010E277 /* KSAudioRecordManager.m in Sources */,
+				BC42180A2C4E473E00C70B2F /* KSUserDetailBodyView.m in Sources */,
 				27F9CAFB27EC1AF3003E0FE4 /* ContractListCell.m in Sources */,
 				BCDB093728058BBE00D0BDAD /* AccompanyLessonModel.m in Sources */,
 				BC12639028FEC8C200509E90 /* KSChatTagView.m in Sources */,
@@ -8057,6 +8122,7 @@
 				BC38C4262AF900E100ABFCC2 /* KSMediaMergeView.m in Sources */,
 				27F9030627E86CBD00C08A19 /* DeviceCheckView.m in Sources */,
 				BC31BF932B219C5700F7D538 /* DialPlateView.m in Sources */,
+				BC4217F82C4E3D2B00C70B2F /* KSUserDetailViewController.m in Sources */,
 				BC31BF972B219C5700F7D538 /* WMGaugeViewStyle3D.m in Sources */,
 				275B16EF27EAF9B20081FDEF /* ChatNavView.m in Sources */,
 				BCA353E92859A6FB00377661 /* MusicRoomHomeworkCell.m in Sources */,
@@ -8095,6 +8161,7 @@
 				2779321127E30FC30010E277 /* YKMultiLevelTableView.m in Sources */,
 				BCC408D82AFCE0D700C60249 /* KSVideoImageSlider.m in Sources */,
 				BC523B1028A09F3000E9D66B /* MineHeadView.m in Sources */,
+				BC4218002C4E439B00C70B2F /* KSUserDetailNavView.m in Sources */,
 				BCDF82292A8A3080005F8B82 /* ZoomControl.m in Sources */,
 				277931CB27E30FC20010E277 /* KSGifRefreshHeader.m in Sources */,
 				2755C07E27EC95CC007D9070 /* GroupNoticeViewController.m in Sources */,
@@ -8232,6 +8299,7 @@
 				BC542E3628406F7700633781 /* UserAuthBodyView.m in Sources */,
 				BC106B832A8F4586000759A9 /* TXLiveMessageLeave.m in Sources */,
 				BCF425F22AB9782500BCD942 /* MineDescView.m in Sources */,
+				BC4217FB2C4E3DF700C70B2F /* KSUserDetailBottomView.m in Sources */,
 				BCA353ED2859B4EC00377661 /* MusicRoomHomeworkStudentController.m in Sources */,
 				BC6BEAA4288A4C2A00022109 /* KSHomeButton.m in Sources */,
 				27A2F63027E70E57009E2380 /* UserInfo.m in Sources */,

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

@@ -93,7 +93,7 @@
       buildConfiguration = "Debug">
    </AnalyzeAction>
    <ArchiveAction
-      buildConfiguration = "TEST"
+      buildConfiguration = "DEV"
       revealArchiveInOrganizer = "YES">
    </ArchiveAction>
 </Scheme>

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/Contents.json

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

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/userDetail_bg@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_bg.imageset/userDetail_bg@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/userDetail_cicle_image@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/userDetail_cicle_image.imageset/userDetail_cicle_image@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/user_detailBack@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_detailBack.imageset/user_detailBack@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/user_tag_student@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_student.imageset/user_tag_student@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/user_tag_teacher@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Converstaion/UserDetail/user_tag_teacher.imageset/user_tag_teacher@3x.png


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


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


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


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


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


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


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


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


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


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


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


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


+ 17 - 4
KulexiuForTeacher/KulexiuForTeacher/Common/LoadingManager/KSHudLoagingManager.m

@@ -83,9 +83,10 @@
         self.HUD = [MBProgressHUD showHUDAddedTo:displayView animated:YES];
         self.HUD.removeFromSuperViewOnHide =YES;
         self.HUD.mode = MBProgressHUDModeText;
-        self.HUD.label.text = str;
+        self.HUD.label.attributedText = [self getAttrStringWithText:str];
         self.HUD.label.numberOfLines = 0;
-        self.HUD.minSize = CGSizeMake(132.f, 60.0f);
+        self.HUD.minSize = CGSizeMake(132.f, 30.0f);
+        self.HUD.margin = 10.0;
         self.HUD.label.textColor = [UIColor whiteColor];
         self.HUD.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
         self.HUD.bezelView.backgroundColor = HexRGBAlpha(0x000000, 0.8f);
@@ -129,10 +130,11 @@
     MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:displayView animated:YES];
     hud.removeFromSuperViewOnHide = YES;
     hud.mode = MBProgressHUDModeText;
-    hud.label.text = message;
+    hud.label.attributedText = [self getAttrStringWithText:message];
     hud.label.numberOfLines = 0;
     hud.label.textColor = [UIColor whiteColor];
-    hud.minSize = CGSizeMake(132.0f, 40.0f);
+    hud.minSize = CGSizeMake(132.0f, 30.0f);
+    hud.margin = 10.0;
     hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
     hud.bezelView.backgroundColor = HexRGBAlpha(0x000000, 0.8);
     [hud hideAnimated:YES afterDelay:PROMPT_TIME];
@@ -212,6 +214,17 @@
         [self removeProgressLoadingNoDelay];
         promptCompletion();
     });
+}
 
+- (NSMutableAttributedString *)getAttrStringWithText:(NSString *)text {
+    if (![NSString isEmptyString:text]) {
+        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+        [paragraphStyle setLineSpacing:6];//调整行间距
+        NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:text attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:HexRGB(0xffffff)}];
+        return attr;
+    }
+    else {
+        return [[NSMutableAttributedString alloc] initWithString:@""];
+    }
 }
 @end

+ 8 - 28
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m

@@ -38,7 +38,7 @@
 #import "TUIVideoMessageCellData.h"
 #import "TUIVoiceMessageCellData.h"
 
-#import "KSChatUserDetailViewController.h"
+#import "KSUserDetailViewController.h"
 #import "ShareMusicViewController.h"
 #import "MinePageViewController.h"
 #import "KSBaseWKWebViewController.h"
@@ -66,7 +66,7 @@ static UIView *gCustomTopView;
 }
 
 - (void)messageController:(TUIBaseMessageController *)controller onSelectMessageAvatar:(TUIMessageCell *)cell {
-    /*
+    
     NSString *userID = nil;
     if (cell.messageData.innerMessage.groupID.length > 0) {
         userID = cell.messageData.innerMessage.sender;
@@ -86,37 +86,17 @@ static UIView *gCustomTopView;
         return;
     }
     // 跳转到用户详情
-    if ([userID isEqualToString:UserDefault(IM_USERID)]) {
-        [self displayMineInfo];
-    }
-    else { // 显示其他
-        if ([userID containsString:@"STUDENT"]) {
-            [self displayStudent:userID];
-        }
-        else {
-            [self displayTeacherInfo:userID];
-        }
-    }
-     */
+    BOOL isC2CChat = [NSString isEmptyString:self.conversationData.groupID] ? YES : NO;
+    [self displayUserInfo:userID isFromSingleChat:isC2CChat];
 }
 
-- (void)displayMineInfo {
-    MinePageViewController *pageCtrl = [[MinePageViewController alloc] init];
-    [self.navigationController pushViewController:pageCtrl animated:YES];
-}
-
-
-- (void)displayTeacherInfo:(NSString *)teacherId {
-    KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
-    ctrl.url = [NSString stringWithFormat:@"%@%@%@", WEBHOST, @"/#/teacherHome?teacherId=", teacherId];
+- (void)displayUserInfo:(NSString *)imUserId isFromSingleChat:(BOOL)fromSingleChat {
+    KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
+    ctrl.imUserId = imUserId;
+    ctrl.fromSingleChat = fromSingleChat;
     [self.navigationController pushViewController:ctrl animated:YES];
 }
 
-- (void)displayStudent:(NSString *)stuentId {
-    KSChatUserDetailViewController *ctrl = [[KSChatUserDetailViewController alloc] init];
-    ctrl.rongCloudId = stuentId;
-    [self.navigationController pushViewController:ctrl animated:YES];
-}
 
 - (void)onShareMusicMoreCellData { // 分享曲谱
     MJWeakSelf;

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.h

@@ -0,0 +1,22 @@
+//
+//  KSUserDetailViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSUserDetailViewController : KSBaseViewController
+
+@property (nonatomic, assign) BOOL fromSingleChat; // 从用户单聊进入
+
+@property (nonatomic, strong) NSString *imUserId; // 用户im id
+
+@property (nonatomic, assign) BOOL isTeacher; // 是否老师
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 132 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.m

@@ -0,0 +1,132 @@
+//
+//  KSUserDetailViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import "KSUserDetailViewController.h"
+#import "KSUserDetailBottomView.h"
+#import "KSUserDetailNavView.h"
+#import "KSChatConversationViewController.h"
+#import "KSUserDetailBodyView.h"
+
+@interface KSUserDetailViewController ()
+
+@property (nonatomic, strong) KSUserDetailNavView *navView;
+
+@property (nonatomic, strong) KSUserDetailBottomView *bottomView;
+
+@property (nonatomic, strong) KSUserDetailBodyView *bodyView;
+
+@end
+
+@implementation KSUserDetailViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self configUI];
+}
+
+- (void)configUI {
+    self.ks_prefersNavigationBarHidden = YES;
+    self.view.backgroundColor = HexRGB(0xF4F5F6);
+    UIImage *bgImage = [UIImage imageNamed:@"userDetail_bg"];
+    CGFloat height = bgImage.size.height / bgImage.size.width * KPortraitWidth;
+    UIImageView *imageView = [[UIImageView alloc] initWithImage:bgImage];
+    imageView.frame = CGRectMake(0, 0, KPortraitWidth, height);
+    [self.view addSubview:imageView];
+    
+    self.scrollView.backgroundColor = [UIColor clearColor];
+    
+    [self.view addSubview:self.navView];
+    CGFloat navHeight = [KSUserDetailNavView getViewHeight];
+    [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(navHeight);
+    }];
+    UIImageView *cicleImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"userDetail_cicle_image"]];
+    [self.view addSubview:cicleImageView];
+    [cicleImageView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.height.mas_equalTo(77.0f);
+        make.right.mas_equalTo(self.view.mas_right).offset(-34);
+        make.top.mas_equalTo(self.navView.mas_bottom).offset(25);
+    }];
+    
+    [self.view bringSubviewToFront:self.scrollView];
+    [self.scrollView bringSubviewToFront:self.navView];
+    [self.view addSubview:self.bottomView];
+    CGFloat bottomHeight = [KSUserDetailBottomView getViewHeight];
+    [self.bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.mas_equalTo(self.view);
+        make.height.mas_equalTo(bottomHeight);
+    }];
+    
+    [self.scrollView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.navView.mas_bottom);
+        make.bottom.mas_equalTo(self.bottomView.mas_top);
+    }];
+    
+    [self.scrollView addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.scrollView.mas_top);
+        make.bottom.mas_equalTo(self.scrollView.mas_bottom);
+    }];
+}
+
+- (void)chatAction {
+    if (self.fromSingleChat) {
+        [self backAction];
+    }
+    else {
+        TUIChatConversationModel *model = [[TUIChatConversationModel alloc] init];
+        model.userID = self.imUserId;
+        KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+        ctrl.conversation = model;
+        [self.navigationController pushViewController:ctrl animated:YES];
+    }
+}
+
+#pragma mark ---- lazying
+- (KSUserDetailNavView *)navView {
+    if (!_navView) {
+        _navView = [KSUserDetailNavView shareInstance];
+        MJWeakSelf;
+        [_navView navViewBack:^{
+            [weakSelf backAction];
+        }];
+    }
+    return _navView;
+}
+
+- (KSUserDetailBottomView *)bottomView {
+    if (!_bottomView) {
+        _bottomView = [KSUserDetailBottomView shareInstance];
+        MJWeakSelf;
+        [_bottomView userDetailChatAction:^{
+            [weakSelf chatAction];
+        }];
+    }
+    return _bottomView;
+}
+
+- (KSUserDetailBodyView *)bodyView {
+    if (!_bodyView) {
+        _bodyView = [KSUserDetailBodyView shareInstance];
+    }
+    return _bodyView;
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 20 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.h

@@ -0,0 +1,20 @@
+//
+//  KSUserDetailBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSUserDetailBodyView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)configWithSource;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 75 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.m

@@ -0,0 +1,75 @@
+//
+//  KSUserDetailBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import "KSUserDetailBodyView.h"
+
+@interface KSUserDetailBodyView ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *userAvatar;
+
+@property (weak, nonatomic) IBOutlet UIImageView *memberTag;
+
+@property (weak, nonatomic) IBOutlet UILabel *userName;
+
+@property (weak, nonatomic) IBOutlet UIImageView *roleTag;
+
+@property (weak, nonatomic) IBOutlet UIImageView *svipTag;
+@property (weak, nonatomic) IBOutlet UILabel *svipDesc;
+
+@property (weak, nonatomic) IBOutlet UIImageView *viptag;
+@property (weak, nonatomic) IBOutlet UILabel *vipDesc;
+@property (weak, nonatomic) IBOutlet UILabel *userIdDesc;
+
+@property (weak, nonatomic) IBOutlet UILabel *sexLabel;
+@property (weak, nonatomic) IBOutlet UILabel *birthDay;
+
+@property (weak, nonatomic) IBOutlet UILabel *subjectLabel;
+@property (weak, nonatomic) IBOutlet UIView *birthdayView;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *birthdayHeight;
+
+@end
+
+@implementation KSUserDetailBodyView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self configWithSource];
+}
+
++ (instancetype)shareInstance {
+    KSUserDetailBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSUserDetailBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configWithSource {
+    NSString *name = @"我的名字很长很长很长很长很…我的名字很长很长很长很长很…";
+    self.userName.text = name;
+    [self.roleTag setImage:[UIImage imageNamed:@"user_tag_student"]];
+    
+    
+    NSString *subjectDesc = @"长笛、中音萨克斯、圆号、打击乐(键盘)、上低音号";
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:4];//调整行间距
+    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
+    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:subjectDesc attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium],NSForegroundColorAttributeName:HexRGB(0x131415)}];
+    self.subjectLabel.attributedText = attrStr;
+}
+
+- (IBAction)copyAction:(id)sender {
+    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
+    pasteboard.string = @"123144";
+    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"复制成功"];
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 417 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.xib

@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSUserDetailBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="525"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CdP-UJ-hN8">
+                    <rect key="frame" x="13" y="65" width="367" height="460"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IjC-Ei-YcH">
+                            <rect key="frame" x="163" y="64" width="0.0" height="25"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="25" id="w4M-NR-ulx"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
+                            <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lag-QX-CR4">
+                            <rect key="frame" x="0.0" y="103" width="367" height="59"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gHU-tu-XNI">
+                                    <rect key="frame" x="15" y="58" width="337" height="1"/>
+                                    <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="VGO-L8-JC7"/>
+                                    </constraints>
+                                </view>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mineCenter_tagSvip" translatesAutoresizingMaskIntoConstraints="NO" id="PN9-FK-gHv">
+                                    <rect key="frame" x="15" y="19" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="DmF-lO-1Y3"/>
+                                        <constraint firstAttribute="width" constant="20" id="TOh-Np-Ng9"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SVIP有效期" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="US6-ZX-klv">
+                                    <rect key="frame" x="41" y="18" width="90" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="B9K-vR-FZu"/>
+                                        <constraint firstAttribute="width" constant="90" id="c1l-LO-bi8"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2tM-Mt-qiB">
+                                    <rect key="frame" x="146" y="18" width="206" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="Mob-2N-dJW"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="1" green="0.4745057225227356" blue="0.28870391845703125" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="PN9-FK-gHv" firstAttribute="top" secondItem="lag-QX-CR4" secondAttribute="top" constant="19" id="0e5-no-2h3"/>
+                                <constraint firstAttribute="trailing" secondItem="2tM-Mt-qiB" secondAttribute="trailing" constant="15" id="6gc-AM-n7t"/>
+                                <constraint firstItem="US6-ZX-klv" firstAttribute="centerY" secondItem="PN9-FK-gHv" secondAttribute="centerY" id="JqP-bu-qzz"/>
+                                <constraint firstItem="PN9-FK-gHv" firstAttribute="leading" secondItem="lag-QX-CR4" secondAttribute="leading" constant="15" id="LaJ-w6-DUi"/>
+                                <constraint firstAttribute="bottom" secondItem="gHU-tu-XNI" secondAttribute="bottom" id="Tzh-nd-Xr4"/>
+                                <constraint firstItem="2tM-Mt-qiB" firstAttribute="leading" secondItem="US6-ZX-klv" secondAttribute="trailing" constant="15" id="ZPI-OU-xjE"/>
+                                <constraint firstAttribute="trailing" secondItem="gHU-tu-XNI" secondAttribute="trailing" constant="15" id="dCe-XN-wE9"/>
+                                <constraint firstAttribute="height" constant="59" id="fhA-cC-zCn"/>
+                                <constraint firstItem="gHU-tu-XNI" firstAttribute="top" secondItem="2tM-Mt-qiB" secondAttribute="bottom" constant="18" id="j1R-MV-YRF"/>
+                                <constraint firstItem="US6-ZX-klv" firstAttribute="leading" secondItem="PN9-FK-gHv" secondAttribute="trailing" constant="6" id="u7N-4i-oIh"/>
+                                <constraint firstItem="gHU-tu-XNI" firstAttribute="leading" secondItem="lag-QX-CR4" secondAttribute="leading" constant="15" id="ufw-PA-gd1"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5Aj-Zi-liT">
+                            <rect key="frame" x="0.0" y="162" width="367" height="59"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="A8f-Ug-P1l">
+                                    <rect key="frame" x="15" y="58" width="337" height="1"/>
+                                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="AKT-3T-ShG"/>
+                                    </constraints>
+                                </view>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mineCenter_tagVip" translatesAutoresizingMaskIntoConstraints="NO" id="apu-uC-5iE">
+                                    <rect key="frame" x="15" y="19" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="NAK-vW-mvx"/>
+                                        <constraint firstAttribute="height" constant="20" id="ddX-DS-TdP"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VIP有效期" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nMo-TK-odm">
+                                    <rect key="frame" x="41" y="18" width="90" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="90" id="Qlz-da-hUq"/>
+                                        <constraint firstAttribute="height" constant="22" id="vBm-sN-A89"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fWa-wP-JA4">
+                                    <rect key="frame" x="146" y="18" width="206" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="FEv-CJ-f7l"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="1" green="0.4745057225" blue="0.28870391849999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="A8f-Ug-P1l" secondAttribute="trailing" constant="15" id="6te-J5-jo0"/>
+                                <constraint firstItem="nMo-TK-odm" firstAttribute="leading" secondItem="apu-uC-5iE" secondAttribute="trailing" constant="6" id="9MF-zE-kdI"/>
+                                <constraint firstItem="nMo-TK-odm" firstAttribute="centerY" secondItem="apu-uC-5iE" secondAttribute="centerY" id="HsO-Ui-jN1"/>
+                                <constraint firstAttribute="height" constant="59" id="NqF-z5-YVz"/>
+                                <constraint firstAttribute="trailing" secondItem="fWa-wP-JA4" secondAttribute="trailing" constant="15" id="Sl3-Ak-BnZ"/>
+                                <constraint firstItem="fWa-wP-JA4" firstAttribute="leading" secondItem="nMo-TK-odm" secondAttribute="trailing" constant="15" id="e75-RV-SaZ"/>
+                                <constraint firstItem="A8f-Ug-P1l" firstAttribute="leading" secondItem="5Aj-Zi-liT" secondAttribute="leading" constant="15" id="kPM-j4-eIN"/>
+                                <constraint firstItem="A8f-Ug-P1l" firstAttribute="top" secondItem="fWa-wP-JA4" secondAttribute="bottom" constant="18" id="kPe-9I-EaG"/>
+                                <constraint firstAttribute="bottom" secondItem="A8f-Ug-P1l" secondAttribute="bottom" id="oIO-se-wvy"/>
+                                <constraint firstItem="apu-uC-5iE" firstAttribute="leading" secondItem="5Aj-Zi-liT" secondAttribute="leading" constant="15" id="rzG-0X-vON"/>
+                                <constraint firstItem="apu-uC-5iE" firstAttribute="top" secondItem="5Aj-Zi-liT" secondAttribute="top" constant="19" id="wbb-TJ-CWJ"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vr4-Wh-PTu">
+                            <rect key="frame" x="0.0" y="221" width="367" height="59"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bSC-FT-dCN">
+                                    <rect key="frame" x="15" y="58" width="337" height="1"/>
+                                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="XIe-kA-VFv"/>
+                                    </constraints>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VER-F2-K5H">
+                                    <rect key="frame" x="15" y="18" width="20" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="SNt-ew-ZKa"/>
+                                        <constraint firstAttribute="height" constant="22" id="UH3-3w-l9Y"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s0T-K5-0WL">
+                                    <rect key="frame" x="50" y="18" width="257.33333333333331" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="Mff-yR-PhF"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="1" green="0.4745057225" blue="0.28870391849999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="复制" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3Vr-QF-h65">
+                                    <rect key="frame" x="319.33333333333331" y="18" width="32.666666666666686" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="sOP-R7-FIm"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zoU-lE-nxn">
+                                    <rect key="frame" x="312.33333333333331" y="0.0" width="54.666666666666686" height="58"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="copyAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="mAl-hb-2fg"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="s0T-K5-0WL" firstAttribute="leading" secondItem="VER-F2-K5H" secondAttribute="trailing" constant="15" id="05t-Zb-nuu"/>
+                                <constraint firstAttribute="trailing" secondItem="zoU-lE-nxn" secondAttribute="trailing" id="1qL-f3-SOW"/>
+                                <constraint firstAttribute="bottom" secondItem="bSC-FT-dCN" secondAttribute="bottom" id="3z0-7h-TSg"/>
+                                <constraint firstItem="VER-F2-K5H" firstAttribute="leading" secondItem="vr4-Wh-PTu" secondAttribute="leading" constant="15" id="DJD-SZ-Kpv"/>
+                                <constraint firstItem="bSC-FT-dCN" firstAttribute="top" secondItem="s0T-K5-0WL" secondAttribute="bottom" constant="18" id="Gd3-Ng-cVa"/>
+                                <constraint firstAttribute="trailing" secondItem="3Vr-QF-h65" secondAttribute="trailing" constant="15" id="Hem-nF-sVu"/>
+                                <constraint firstItem="bSC-FT-dCN" firstAttribute="top" secondItem="zoU-lE-nxn" secondAttribute="bottom" id="JWv-eC-vKv"/>
+                                <constraint firstItem="3Vr-QF-h65" firstAttribute="leading" secondItem="s0T-K5-0WL" secondAttribute="trailing" constant="12" id="PqG-Dq-1AB"/>
+                                <constraint firstItem="zoU-lE-nxn" firstAttribute="top" secondItem="vr4-Wh-PTu" secondAttribute="top" id="TuT-XI-KLB"/>
+                                <constraint firstItem="bSC-FT-dCN" firstAttribute="leading" secondItem="vr4-Wh-PTu" secondAttribute="leading" constant="15" id="hBt-WL-SBJ"/>
+                                <constraint firstAttribute="height" constant="59" id="jDt-eP-vT0"/>
+                                <constraint firstItem="zoU-lE-nxn" firstAttribute="leading" secondItem="s0T-K5-0WL" secondAttribute="trailing" constant="5" id="jeu-eu-bzA"/>
+                                <constraint firstItem="bSC-FT-dCN" firstAttribute="top" secondItem="VER-F2-K5H" secondAttribute="bottom" constant="18" id="mVJ-M1-zYG"/>
+                                <constraint firstItem="bSC-FT-dCN" firstAttribute="top" secondItem="3Vr-QF-h65" secondAttribute="bottom" constant="18" id="rcc-cL-7Ac"/>
+                                <constraint firstAttribute="trailing" secondItem="bSC-FT-dCN" secondAttribute="trailing" constant="15" id="ymd-Ja-ZqQ"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ouQ-52-8y9">
+                            <rect key="frame" x="0.0" y="280" width="367" height="59"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="PPT-zb-jnH">
+                                    <rect key="frame" x="15" y="58" width="337" height="1"/>
+                                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="xGT-kE-Fwf"/>
+                                    </constraints>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="性别" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rcc-Ne-E8c">
+                                    <rect key="frame" x="15" y="18" width="32.666666666666664" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="ls0-fE-pc1"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zWT-1s-DwV">
+                                    <rect key="frame" x="352" y="18" width="0.0" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="FV5-HI-A9a"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="PPT-zb-jnH" firstAttribute="top" secondItem="zWT-1s-DwV" secondAttribute="bottom" constant="18" id="6PY-nC-sD0"/>
+                                <constraint firstAttribute="bottom" secondItem="PPT-zb-jnH" secondAttribute="bottom" id="J9o-L9-RlM"/>
+                                <constraint firstAttribute="trailing" secondItem="PPT-zb-jnH" secondAttribute="trailing" constant="15" id="NGd-3c-YzS"/>
+                                <constraint firstAttribute="trailing" secondItem="zWT-1s-DwV" secondAttribute="trailing" constant="15" id="NXA-sk-uJO"/>
+                                <constraint firstAttribute="height" constant="59" id="P0Z-fI-PYY"/>
+                                <constraint firstItem="PPT-zb-jnH" firstAttribute="top" secondItem="Rcc-Ne-E8c" secondAttribute="bottom" constant="18" id="QhY-FR-vuF"/>
+                                <constraint firstItem="PPT-zb-jnH" firstAttribute="leading" secondItem="ouQ-52-8y9" secondAttribute="leading" constant="15" id="UkP-09-YTU"/>
+                                <constraint firstItem="Rcc-Ne-E8c" firstAttribute="leading" secondItem="ouQ-52-8y9" secondAttribute="leading" constant="15" id="yYw-YJ-kXf"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wWa-SI-rcD">
+                            <rect key="frame" x="0.0" y="339" width="367" height="59"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Gk-Fm-fdA">
+                                    <rect key="frame" x="15" y="58" width="337" height="1"/>
+                                    <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="mNK-XS-Y1a"/>
+                                    </constraints>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="出生日期" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O8a-ac-bBy">
+                                    <rect key="frame" x="15" y="18" width="65.333333333333329" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="Tjl-q6-bHL"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FEl-JR-ZFB">
+                                    <rect key="frame" x="352" y="18" width="0.0" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="O1v-HT-eIo"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="0.074509803920000006" green="0.078431372550000003" blue="0.08235294118" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="bottom" secondItem="8Gk-Fm-fdA" secondAttribute="bottom" id="09z-wh-yvI"/>
+                                <constraint firstAttribute="trailing" secondItem="8Gk-Fm-fdA" secondAttribute="trailing" constant="15" id="9SJ-zo-HML"/>
+                                <constraint firstItem="8Gk-Fm-fdA" firstAttribute="leading" secondItem="wWa-SI-rcD" secondAttribute="leading" constant="15" id="GiC-xU-5Sh"/>
+                                <constraint firstItem="8Gk-Fm-fdA" firstAttribute="top" secondItem="O8a-ac-bBy" secondAttribute="bottom" constant="18" id="cVA-df-4JW"/>
+                                <constraint firstAttribute="height" constant="59" id="eRn-xa-m2k"/>
+                                <constraint firstAttribute="trailing" secondItem="FEl-JR-ZFB" secondAttribute="trailing" constant="15" id="efq-ku-jDM"/>
+                                <constraint firstItem="O8a-ac-bBy" firstAttribute="leading" secondItem="wWa-SI-rcD" secondAttribute="leading" constant="15" id="og4-7j-Xrx"/>
+                                <constraint firstItem="8Gk-Fm-fdA" firstAttribute="top" secondItem="FEl-JR-ZFB" secondAttribute="bottom" constant="18" id="xNI-29-OqJ"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eVR-Ia-029">
+                            <rect key="frame" x="0.0" y="398" width="367" height="62"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="声部" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PQF-T1-zXg">
+                                    <rect key="frame" x="15" y="18" width="32.666666666666664" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="GZT-i1-3wN"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2J3-SE-0D3">
+                                    <rect key="frame" x="352" y="18" width="0.0" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" relation="lessThanOrEqual" constant="192" id="Yup-tc-wGc"/>
+                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="22" id="fJd-vY-3SE"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" red="0.074509803920000006" green="0.078431372550000003" blue="0.08235294118" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="58" id="93S-KW-mV4"/>
+                                <constraint firstAttribute="bottom" secondItem="2J3-SE-0D3" secondAttribute="bottom" constant="22" id="ShK-e9-0Mk"/>
+                                <constraint firstAttribute="trailing" secondItem="2J3-SE-0D3" secondAttribute="trailing" constant="15" id="T2v-hy-JhM"/>
+                                <constraint firstItem="2J3-SE-0D3" firstAttribute="top" secondItem="eVR-Ia-029" secondAttribute="top" constant="18" id="Ux8-Xe-Oos"/>
+                                <constraint firstItem="PQF-T1-zXg" firstAttribute="leading" secondItem="eVR-Ia-029" secondAttribute="leading" constant="15" id="eFw-B0-xhN"/>
+                                <constraint firstItem="PQF-T1-zXg" firstAttribute="top" secondItem="eVR-Ia-029" secondAttribute="top" constant="18" id="gUR-rA-i6H"/>
+                            </constraints>
+                        </view>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="NcC-Tc-Bme">
+                            <rect key="frame" x="167" y="67" width="37" height="19"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="19" id="8K9-DS-h3W"/>
+                                <constraint firstAttribute="width" constant="37" id="Amh-QS-pr0"/>
+                            </constraints>
+                        </imageView>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="lag-QX-CR4" firstAttribute="top" secondItem="IjC-Ei-YcH" secondAttribute="bottom" constant="14" id="3F9-xg-VDE"/>
+                        <constraint firstItem="vr4-Wh-PTu" firstAttribute="top" secondItem="5Aj-Zi-liT" secondAttribute="bottom" id="3GZ-I1-bFg"/>
+                        <constraint firstItem="5Aj-Zi-liT" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="5Az-GV-nik"/>
+                        <constraint firstItem="ouQ-52-8y9" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="8AZ-b2-6zV"/>
+                        <constraint firstItem="vr4-Wh-PTu" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="93x-fc-FX4"/>
+                        <constraint firstAttribute="trailing" secondItem="ouQ-52-8y9" secondAttribute="trailing" id="BE2-I8-GJP"/>
+                        <constraint firstItem="ouQ-52-8y9" firstAttribute="top" secondItem="vr4-Wh-PTu" secondAttribute="bottom" id="EGF-cc-zBY"/>
+                        <constraint firstItem="IjC-Ei-YcH" firstAttribute="centerX" secondItem="CdP-UJ-hN8" secondAttribute="centerX" constant="-20.5" id="Feb-QU-Cbz"/>
+                        <constraint firstItem="NcC-Tc-Bme" firstAttribute="leading" secondItem="IjC-Ei-YcH" secondAttribute="trailing" constant="4" id="LDn-K4-nHR"/>
+                        <constraint firstItem="IjC-Ei-YcH" firstAttribute="top" secondItem="CdP-UJ-hN8" secondAttribute="top" constant="64" id="LWm-G7-fXc"/>
+                        <constraint firstAttribute="trailing" secondItem="lag-QX-CR4" secondAttribute="trailing" id="PBe-15-ACL"/>
+                        <constraint firstAttribute="trailing" secondItem="eVR-Ia-029" secondAttribute="trailing" id="WuS-pb-lNj"/>
+                        <constraint firstItem="wWa-SI-rcD" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="XdO-8s-hkk"/>
+                        <constraint firstItem="wWa-SI-rcD" firstAttribute="top" secondItem="ouQ-52-8y9" secondAttribute="bottom" id="XvH-aa-GAm"/>
+                        <constraint firstItem="5Aj-Zi-liT" firstAttribute="top" secondItem="lag-QX-CR4" secondAttribute="bottom" id="Y6k-xH-jsk"/>
+                        <constraint firstItem="eVR-Ia-029" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="d3h-i0-XV2"/>
+                        <constraint firstAttribute="trailing" secondItem="vr4-Wh-PTu" secondAttribute="trailing" id="diL-bo-afX"/>
+                        <constraint firstAttribute="trailing" secondItem="5Aj-Zi-liT" secondAttribute="trailing" id="kAb-Qf-cHW"/>
+                        <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="NcC-Tc-Bme" secondAttribute="trailing" constant="28" id="lRT-3I-oTH"/>
+                        <constraint firstItem="lag-QX-CR4" firstAttribute="leading" secondItem="CdP-UJ-hN8" secondAttribute="leading" id="oep-og-5cu"/>
+                        <constraint firstItem="NcC-Tc-Bme" firstAttribute="centerY" secondItem="IjC-Ei-YcH" secondAttribute="centerY" id="pYA-ot-SWL"/>
+                        <constraint firstItem="eVR-Ia-029" firstAttribute="top" secondItem="wWa-SI-rcD" secondAttribute="bottom" id="pcC-b3-eSe"/>
+                        <constraint firstAttribute="bottom" secondItem="eVR-Ia-029" secondAttribute="bottom" id="tjI-BN-fb4"/>
+                        <constraint firstAttribute="trailing" secondItem="wWa-SI-rcD" secondAttribute="trailing" id="xkS-41-0e8"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="16"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="user_default_avatal" translatesAutoresizingMaskIntoConstraints="NO" id="Cdz-aI-d13">
+                    <rect key="frame" x="153.66666666666666" y="22" width="86" height="86"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="86" id="af5-LS-gKf"/>
+                        <constraint firstAttribute="height" constant="86" id="hgp-UF-GJF"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="43"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                            <real key="value" value="3"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                            <color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </imageView>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ODi-J5-4mp">
+                    <rect key="frame" x="172.66666666666666" y="97" width="48" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="22" id="34x-jp-8gJ"/>
+                        <constraint firstAttribute="width" secondItem="ODi-J5-4mp" secondAttribute="height" multiplier="48:22" id="TTY-YI-Fiy"/>
+                    </constraints>
+                </imageView>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="ODi-J5-4mp" firstAttribute="centerX" secondItem="Cdz-aI-d13" secondAttribute="centerX" id="1dA-PY-eIE"/>
+                <constraint firstItem="Cdz-aI-d13" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="ICo-dx-zb0"/>
+                <constraint firstItem="CdP-UJ-hN8" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="RZb-HN-uWc"/>
+                <constraint firstItem="CdP-UJ-hN8" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="65" id="TAv-Wr-vgL"/>
+                <constraint firstAttribute="trailing" secondItem="CdP-UJ-hN8" secondAttribute="trailing" constant="13" id="b3k-0E-OK7"/>
+                <constraint firstItem="Cdz-aI-d13" firstAttribute="centerY" secondItem="CdP-UJ-hN8" secondAttribute="top" id="rC2-LE-czP"/>
+                <constraint firstItem="ODi-J5-4mp" firstAttribute="centerY" secondItem="Cdz-aI-d13" secondAttribute="bottom" id="u5A-KG-Sr5"/>
+                <constraint firstAttribute="bottom" secondItem="CdP-UJ-hN8" secondAttribute="bottom" id="zQb-Cu-WJV"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="birthDay" destination="FEl-JR-ZFB" id="2Bm-9p-jq6"/>
+                <outlet property="birthdayHeight" destination="eRn-xa-m2k" id="Qjz-F9-L2e"/>
+                <outlet property="birthdayView" destination="wWa-SI-rcD" id="5lf-OX-gNe"/>
+                <outlet property="memberTag" destination="ODi-J5-4mp" id="Q0Q-jI-CbU"/>
+                <outlet property="roleTag" destination="NcC-Tc-Bme" id="4KR-pj-IOl"/>
+                <outlet property="sexLabel" destination="zWT-1s-DwV" id="aFx-FQ-tjc"/>
+                <outlet property="subjectLabel" destination="2J3-SE-0D3" id="yX9-6U-iYR"/>
+                <outlet property="svipDesc" destination="2tM-Mt-qiB" id="14R-rD-W6i"/>
+                <outlet property="svipTag" destination="PN9-FK-gHv" id="yV5-df-ftf"/>
+                <outlet property="userAvatar" destination="Cdz-aI-d13" id="lWb-8C-eid"/>
+                <outlet property="userIdDesc" destination="s0T-K5-0WL" id="UKc-2l-cs6"/>
+                <outlet property="userName" destination="IjC-Ei-YcH" id="zHa-eA-hmJ"/>
+                <outlet property="vipDesc" destination="fWa-wP-JA4" id="qun-6r-wbY"/>
+                <outlet property="viptag" destination="apu-uC-5iE" id="GGq-2Z-jVX"/>
+            </connections>
+            <point key="canvasLocation" x="0.76335877862595414" y="-103.16901408450705"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="mineCenter_tagSvip" width="20" height="20"/>
+        <image name="mineCenter_tagVip" width="20" height="20"/>
+        <image name="user_default_avatal" width="52" height="52"/>
+    </resources>
+</document>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.h

@@ -0,0 +1,24 @@
+//
+//  KSUserDetailBottomView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^UserDetailChatCallback)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSUserDetailBottomView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)userDetailChatAction:(UserDetailChatCallback)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 51 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.m

@@ -0,0 +1,51 @@
+//
+//  KSUserDetailBottomView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import "KSUserDetailBottomView.h"
+
+@interface KSUserDetailBottomView ()
+
+@property (nonatomic, copy) UserDetailChatCallback callback;
+
+@end
+
+@implementation KSUserDetailBottomView
+
++ (instancetype)shareInstance {
+    KSUserDetailBottomView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSUserDetailBottomView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)userDetailChatAction:(UserDetailChatCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)buttonAction:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
++ (CGFloat)getViewHeight {
+    if (IS_iPhoneX) {
+        return 44 + iPhoneXSafeBottomMargin;
+    }
+    else {
+        return 44 + 20;
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 47 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBottomView.xib

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSUserDetailBottomView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="74"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mRw-ew-I8I">
+                    <rect key="frame" x="25" y="0.0" width="343" height="44"/>
+                    <color key="backgroundColor" red="0.18565043807029724" green="0.81136220693588257" blue="0.72373294830322266" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="2VE-lk-LuG"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="发送消息"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="buttonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="KlM-hy-3Y0"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="mRw-ew-I8I" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="0Hg-Sw-y6T"/>
+                <constraint firstAttribute="trailing" secondItem="mRw-ew-I8I" secondAttribute="trailing" constant="25" id="Zkx-og-GtA"/>
+                <constraint firstItem="mRw-ew-I8I" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="bh7-mm-dSA"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="0.76335877862595414" y="-195.07042253521126"/>
+        </view>
+    </objects>
+</document>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.h

@@ -0,0 +1,24 @@
+//
+//  KSUserDetailNavView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import <UIKit/UIKit.h>
+
+
+typedef void(^UserDetailBack)(void);
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSUserDetailNavView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)navViewBack:(UserDetailBack)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 47 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.m

@@ -0,0 +1,47 @@
+//
+//  KSUserDetailNavView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2024/7/22.
+//
+
+#import "KSUserDetailNavView.h"
+
+@interface KSUserDetailNavView ()
+
+@property (nonatomic, copy) UserDetailBack callback;
+
+@end
+
+@implementation KSUserDetailNavView
+
++ (instancetype)shareInstance {
+    KSUserDetailNavView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSUserDetailNavView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)navViewBack:(UserDetailBack)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)backAction:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
++ (CGFloat)getViewHeight {
+    return kNaviBarHeight;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 59 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailNavView.xib

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSUserDetailNavView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="98"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ieF-PZ-zWF">
+                    <rect key="frame" x="0.0" y="54" width="393" height="44"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="user_detailBack" translatesAutoresizingMaskIntoConstraints="NO" id="6HM-eE-qLD">
+                            <rect key="frame" x="14" y="13" width="18" height="18"/>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dbH-Wt-E5q">
+                            <rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="44" id="DQV-yy-r7x"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="backAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Kn3-Iv-GLf"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="bottom" secondItem="dbH-Wt-E5q" secondAttribute="bottom" id="5rv-lJ-KaL"/>
+                        <constraint firstItem="6HM-eE-qLD" firstAttribute="leading" secondItem="ieF-PZ-zWF" secondAttribute="leading" constant="14" id="8se-y8-sOT"/>
+                        <constraint firstItem="6HM-eE-qLD" firstAttribute="centerY" secondItem="ieF-PZ-zWF" secondAttribute="centerY" id="HGu-35-gl0"/>
+                        <constraint firstItem="dbH-Wt-E5q" firstAttribute="top" secondItem="ieF-PZ-zWF" secondAttribute="top" id="MrG-Xy-L9S"/>
+                        <constraint firstItem="dbH-Wt-E5q" firstAttribute="leading" secondItem="ieF-PZ-zWF" secondAttribute="leading" id="qLz-mx-3fZ"/>
+                        <constraint firstAttribute="height" constant="44" id="rYZ-tg-Rvo"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="ieF-PZ-zWF" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Pxl-Rn-RjU"/>
+                <constraint firstAttribute="trailing" secondItem="ieF-PZ-zWF" secondAttribute="trailing" id="fUk-RW-zDr"/>
+                <constraint firstAttribute="bottom" secondItem="ieF-PZ-zWF" secondAttribute="bottom" id="h0s-Os-X5d"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="67.938931297709928" y="-178.16901408450704"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="user_detailBack" width="18" height="18"/>
+    </resources>
+</document>

+ 27 - 6
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m

@@ -11,6 +11,7 @@
 #import "GroupMemberListCell.h"
 #import "GroupMemberModel.h"
 #import "KSChatConversationViewController.h"
+#import "KSUserDetailViewController.h"
 
 @interface GroupMemberViewController ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -145,16 +146,36 @@
     NSArray *filterArray = self.dataArray[indexPath.section];
     GroupMemberModel *model = filterArray[indexPath.row];
     MJWeakSelf;
-    [cell configWithSource:model callback:^(NSString * _Nonnull targetId, NSString * _Nonnull name) {
-        TUIChatConversationModel *model = [[TUIChatConversationModel alloc] init];
-        model.userID = targetId;
-        KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
-        ctrl.conversation = model;
-        [weakSelf.navigationController pushViewController:ctrl animated:YES];
+    [cell configWithSource:model callback:^(NSString * _Nonnull targetId, NSString * _Nonnull name, BOOL showDetail) {
+        if (showDetail) {
+            [weakSelf showUserDetail:targetId];
+        }
+        else {
+            [weakSelf chatUser:targetId];
+        }
     }];
+    
     return cell;
 }
 
+- (void)showUserDetail:(NSString *)targetId {
+    KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
+    ctrl.imUserId = targetId;
+    ctrl.fromSingleChat = NO;
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+- (void)chatUser:(NSString *)targetId {
+    if ([NSString isEmptyString:targetId]) {
+        return;
+    }
+    TUIChatConversationModel *model = [[TUIChatConversationModel alloc] init];
+    model.userID = targetId;
+    KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
+    ctrl.conversation = model;
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 
 }

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.h

@@ -9,7 +9,7 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-typedef void(^ChatCallback)(NSString *targetId, NSString *name);
+typedef void(^ChatCallback)(NSString *targetId, NSString *name, BOOL showDetail);
 
 @interface GroupMemberListCell : UITableViewCell
 

+ 15 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.m

@@ -75,6 +75,20 @@
     }
 }
 
+- (IBAction)showUserDetail:(id)sender {
+    if (self.callback && self.sourceModel) {
+        NSString *name = @"";
+        if ([NSString isEmptyString:self.sourceModel.nickname]) {
+            name = [NSString stringWithFormat:@"用户:%@",self.sourceModel.imUserId];
+        }
+        else {
+            name = self.sourceModel.nickname;
+        }
+        self.callback(self.sourceModel.imUserId, name, YES);
+    }
+    
+}
+
 - (IBAction)chatAction:(id)sender {
     if (self.callback && self.sourceModel) {
         NSString *name = @"";
@@ -84,7 +98,7 @@
         else {
             name = self.sourceModel.nickname;
         }
-        self.callback(self.sourceModel.imUserId, name);
+        self.callback(self.sourceModel.imUserId, name, NO);
     }
 }
 

+ 13 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupMemberListCell.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -84,13 +84,22 @@
                                     <constraint firstAttribute="height" constant="20" id="lsu-FD-LuA"/>
                                 </constraints>
                             </imageView>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="roG-18-ohT">
+                                <rect key="frame" x="14" y="10" width="44" height="44"/>
+                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                <connections>
+                                    <action selector="showUserDetail:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="Due-qh-gjH"/>
+                                </connections>
+                            </button>
                         </subviews>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
+                            <constraint firstItem="GW3-Oz-aPr" firstAttribute="top" secondItem="roG-18-ohT" secondAttribute="top" id="25f-eh-aXq"/>
                             <constraint firstItem="Vhp-Wi-YsA" firstAttribute="centerY" secondItem="GW3-Oz-aPr" secondAttribute="centerY" id="4jm-Nc-ex4"/>
                             <constraint firstItem="Vhp-Wi-YsA" firstAttribute="leading" secondItem="GW3-Oz-aPr" secondAttribute="trailing" constant="11" id="CPz-Wp-UKt"/>
                             <constraint firstItem="GW3-Oz-aPr" firstAttribute="centerY" secondItem="3bd-Vo-rTM" secondAttribute="centerY" id="Mw8-KH-Nlc"/>
                             <constraint firstItem="12l-lG-OPd" firstAttribute="centerX" secondItem="GW3-Oz-aPr" secondAttribute="centerX" id="NFI-7e-knA"/>
+                            <constraint firstItem="GW3-Oz-aPr" firstAttribute="bottom" secondItem="roG-18-ohT" secondAttribute="bottom" id="Snp-oJ-rZY"/>
                             <constraint firstItem="C2d-wO-ajH" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="yFF-v3-2wd" secondAttribute="trailing" constant="12" id="V4a-Gr-ejZ"/>
                             <constraint firstItem="12l-lG-OPd" firstAttribute="bottom" secondItem="GW3-Oz-aPr" secondAttribute="bottom" constant="2" id="Ypw-XK-x59"/>
                             <constraint firstAttribute="trailing" secondItem="C2d-wO-ajH" secondAttribute="trailing" constant="14" id="a77-uB-Due"/>
@@ -98,6 +107,8 @@
                             <constraint firstItem="yFF-v3-2wd" firstAttribute="leading" secondItem="Vhp-Wi-YsA" secondAttribute="trailing" constant="3" id="dmE-hu-3Yx"/>
                             <constraint firstItem="yFF-v3-2wd" firstAttribute="centerY" secondItem="Vhp-Wi-YsA" secondAttribute="centerY" id="eej-Pb-iB4"/>
                             <constraint firstItem="GW3-Oz-aPr" firstAttribute="leading" secondItem="3bd-Vo-rTM" secondAttribute="leading" constant="14" id="g2u-Nh-Bgq"/>
+                            <constraint firstItem="GW3-Oz-aPr" firstAttribute="leading" secondItem="roG-18-ohT" secondAttribute="leading" id="gEN-ZH-BXa"/>
+                            <constraint firstItem="GW3-Oz-aPr" firstAttribute="trailing" secondItem="roG-18-ohT" secondAttribute="trailing" id="rcW-hW-qN8"/>
                         </constraints>
                         <userDefinedRuntimeAttributes>
                             <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">

+ 21 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ChatAddressBodyView.m

@@ -18,6 +18,7 @@
 #import "FriendListModel.h"
 #import "KSChatListSearchView.h"
 #import <ImSDK_Plus/V2TIMManager.h>
+#import "KSUserDetailViewController.h"
 
 @interface ChatAddressBodyView ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -371,11 +372,29 @@
         ContractListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContractListCell"];
         NSArray *filterArray = self.studentArray[indexPath.section];
         FriendListModel *model = filterArray[indexPath.row];
-        [cell configWithSource:model];
+        MJWeakSelf;
+        [cell configWithSource:model callback:^(NSString *imUserId) {
+            [weakSelf chatUserDetail:imUserId];
+        }];
         return cell;
         
     }
-    
+}
+
+- (void)chatUserDetail:(NSString *)imUserId {
+    KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
+    ctrl.imUserId = imUserId;
+    ctrl.fromSingleChat = NO;
+    [self.naviController pushViewController:ctrl animated:YES];
+    /*
+    if (_isShareImage) { // 分享
+        [self sendMessageWithTargetId:imUserId isGroup:NO];
+    }
+    else { // 聊天
+        [self chatConversationWithTargetId:imUserId targetName:@"" isGroup:NO];
+        
+    }
+     */
 }
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

+ 3 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.h

@@ -7,11 +7,13 @@
 
 #import <UIKit/UIKit.h>
 
+typedef void(^ContractUserDetailCallback)(NSString * _Nullable imUserId);
+
 NS_ASSUME_NONNULL_BEGIN
 
 @interface ContractListCell : UITableViewCell
 
-- (void)configWithSource:(id)sourceModel;
+- (void)configWithSource:(id)sourceModel callback:(ContractUserDetailCallback)callback;
 
 @end
 

+ 15 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.m

@@ -16,7 +16,11 @@
 
 @property (weak, nonatomic) IBOutlet UIImageView *roleTypeView;
 
+@property (weak, nonatomic) IBOutlet UIButton *detailButton;
 
+@property (nonatomic, strong) NSString *imUserId;
+
+@property (nonatomic, copy) ContractUserDetailCallback callback;
 @end
 
 @implementation ContractListCell
@@ -27,7 +31,10 @@
     self.selectionStyle = UITableViewCellSelectionStyleNone;
 }
 
-- (void)configWithSource:(id)sourceModel {
+- (void)configWithSource:(id)sourceModel callback:(ContractUserDetailCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
     if ([sourceModel isKindOfClass:[FriendListModel class]]) {
         FriendListModel *model = sourceModel;
         [self.friendAvatar sd_setImageWithURL:[NSURL URLWithString:[model.friendAvatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:CHAT_USER_DEFAULT_LOGO]];
@@ -45,6 +52,13 @@
         else {
             self.roleTypeView.hidden = YES;
         }
+        self.imUserId = model.imFriendId;
+    }
+}
+
+- (IBAction)detailAction:(id)sender {
+    if (self.callback) {
+        self.callback(self.imUserId);
     }
 }
 

+ 14 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ContractListCell.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -52,14 +52,25 @@
                             <constraint firstAttribute="width" constant="41" id="ZOO-Kl-p8S"/>
                         </constraints>
                     </imageView>
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MXb-8G-ALr">
+                        <rect key="frame" x="14" y="20.5" width="44" height="44"/>
+                        <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                        <connections>
+                            <action selector="detailAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="Fvq-zV-UzN"/>
+                        </connections>
+                    </button>
                 </subviews>
                 <constraints>
                     <constraint firstItem="8fl-pa-IHx" firstAttribute="centerY" secondItem="vI1-v5-uMm" secondAttribute="centerY" id="9PL-c3-9J3"/>
                     <constraint firstItem="ZD7-0R-OoK" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="72" id="DPF-fF-mtx"/>
+                    <constraint firstItem="MXb-8G-ALr" firstAttribute="trailing" secondItem="vI1-v5-uMm" secondAttribute="trailing" id="EoE-Zg-osE"/>
+                    <constraint firstItem="MXb-8G-ALr" firstAttribute="bottom" secondItem="vI1-v5-uMm" secondAttribute="bottom" id="Gg2-u4-CJM"/>
                     <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="gE4-tY-dGd" secondAttribute="trailing" constant="20" id="H6V-ug-KuF"/>
                     <constraint firstItem="gE4-tY-dGd" firstAttribute="centerY" secondItem="8fl-pa-IHx" secondAttribute="centerY" id="L3q-sA-1sR"/>
+                    <constraint firstItem="MXb-8G-ALr" firstAttribute="leading" secondItem="vI1-v5-uMm" secondAttribute="leading" id="Pmj-tI-btJ"/>
                     <constraint firstAttribute="bottom" secondItem="ZD7-0R-OoK" secondAttribute="bottom" id="Qy0-N6-dQU"/>
                     <constraint firstItem="8fl-pa-IHx" firstAttribute="leading" secondItem="vI1-v5-uMm" secondAttribute="trailing" constant="11" id="fdz-o1-pUv"/>
+                    <constraint firstItem="MXb-8G-ALr" firstAttribute="top" secondItem="vI1-v5-uMm" secondAttribute="top" id="htL-zq-vdY"/>
                     <constraint firstAttribute="trailing" secondItem="ZD7-0R-OoK" secondAttribute="trailing" id="qkd-cr-TeW"/>
                     <constraint firstItem="gE4-tY-dGd" firstAttribute="leading" secondItem="8fl-pa-IHx" secondAttribute="trailing" constant="3" id="v9q-dL-wZX"/>
                     <constraint firstItem="vI1-v5-uMm" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="vgm-ZS-Nds"/>
@@ -69,6 +80,7 @@
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
             <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <connections>
+                <outlet property="detailButton" destination="MXb-8G-ALr" id="AH6-wh-uKi"/>
                 <outlet property="friendAvatar" destination="vI1-v5-uMm" id="Nob-dw-1A8"/>
                 <outlet property="friendName" destination="8fl-pa-IHx" id="o2J-m8-ozl"/>
                 <outlet property="roleTypeView" destination="gE4-tY-dGd" id="a0F-h7-Cl5"/>

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeNavView.xib

@@ -79,10 +79,11 @@
                             <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" image="mine_nomal" translatesAutoresizingMaskIntoConstraints="NO" id="030-NP-gEA">
-                            <rect key="frame" x="72" y="13" width="34" height="18"/>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="752" translatesAutoresizingMaskIntoConstraints="NO" id="030-NP-gEA">
+                            <rect key="frame" x="72" y="13" width="43" height="18"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="18" id="8P2-Ec-bnf"/>
+                                <constraint firstAttribute="width" secondItem="030-NP-gEA" secondAttribute="height" multiplier="48:20" id="fcB-wh-8ad"/>
                             </constraints>
                         </imageView>
                     </subviews>
@@ -123,6 +124,5 @@
     <resources>
         <image name="home_message" width="24" height="24"/>
         <image name="home_scan" width="26" height="26"/>
-        <image name="mine_nomal" width="34" height="15"/>
     </resources>
 </document>

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeTenantView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -13,7 +13,7 @@
             <rect key="frame" x="0.0" y="0.0" width="393" height="30"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qPd-T2-TBH">
+                <view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qPd-T2-TBH">
                     <rect key="frame" x="0.0" y="0.0" width="393" height="30"/>
                     <subviews>
                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vDn-rU-rd6">

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/HeadView/MinePageTopView.xib

@@ -348,9 +348,10 @@
                         </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                 </imageView>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_svip" translatesAutoresizingMaskIntoConstraints="NO" id="O4w-5f-Puh">
-                    <rect key="frame" x="74" y="60" width="39" height="18"/>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="O4w-5f-Puh">
+                    <rect key="frame" x="74" y="60" width="43" height="18"/>
                     <constraints>
+                        <constraint firstAttribute="width" secondItem="O4w-5f-Puh" secondAttribute="height" multiplier="48:20" id="joZ-TS-Pci"/>
                         <constraint firstAttribute="height" constant="18" id="ogj-H9-eEZ"/>
                     </constraints>
                 </imageView>
@@ -403,7 +404,6 @@
         <image name="mineStyle_nomal" width="23" height="23"/>
         <image name="mineVideo_nomal" width="23" height="23"/>
         <image name="mine_instrument_logo" width="68" height="17"/>
-        <image name="mine_svip" width="39" height="18"/>
         <image name="qualification_icon" width="39" height="16"/>
         <image name="user_default_avatal" width="52" height="52"/>
     </resources>

+ 3 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/ShareInChat/View/ShareChooseMainView.m

@@ -300,7 +300,9 @@
         ContractListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContractListCell"];
         NSArray *filterArray = self.studentArray[indexPath.section];
         FriendListModel *model = filterArray[indexPath.row];
-        [cell configWithSource:model];
+        [cell configWithSource:model callback:^(NSString *ImUserId) {
+            
+        }];
         return cell;
     }
     else {

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/MineHeadView.xib

@@ -135,9 +135,10 @@
                                 <constraint firstAttribute="width" constant="39" id="hbp-cI-NEE"/>
                             </constraints>
                         </imageView>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_vip" translatesAutoresizingMaskIntoConstraints="NO" id="W7w-Qv-jgO">
-                            <rect key="frame" x="28.5" y="56" width="37" height="18"/>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="W7w-Qv-jgO">
+                            <rect key="frame" x="25.5" y="56" width="43" height="18"/>
                             <constraints>
+                                <constraint firstAttribute="width" secondItem="W7w-Qv-jgO" secondAttribute="height" multiplier="48:20" id="Ak0-cU-JXt"/>
                                 <constraint firstAttribute="height" constant="18" id="w9i-HB-67A"/>
                             </constraints>
                         </imageView>
@@ -208,7 +209,6 @@
         <image name="mineMusic_nomal" width="24" height="23"/>
         <image name="mineStyle_nomal" width="23" height="23"/>
         <image name="mineVideo_nomal" width="23" height="23"/>
-        <image name="mine_vip" width="37" height="18"/>
         <image name="user_default_avatal" width="52" height="52"/>
     </resources>
 </document>

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/View/TenantMineHeadView.xib

@@ -165,9 +165,10 @@
                                 <constraint firstAttribute="height" constant="16" id="WMh-DL-Rcf"/>
                             </constraints>
                         </imageView>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mine_vip" translatesAutoresizingMaskIntoConstraints="NO" id="sLr-9M-73V">
-                            <rect key="frame" x="26.666666666666671" y="52" width="37" height="18"/>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sLr-9M-73V">
+                            <rect key="frame" x="23.333333333333332" y="52" width="43.333333333333343" height="18"/>
                             <constraints>
+                                <constraint firstAttribute="width" secondItem="sLr-9M-73V" secondAttribute="height" multiplier="48:20" id="Dcp-Jv-4fE"/>
                                 <constraint firstAttribute="height" constant="18" id="Xik-sy-tnm"/>
                             </constraints>
                         </imageView>
@@ -242,7 +243,6 @@
         <image name="mineMusic_nomal" width="24" height="23"/>
         <image name="mineStyle_nomal" width="23" height="23"/>
         <image name="mineVideo_nomal" width="23" height="23"/>
-        <image name="mine_vip" width="37" height="18"/>
         <image name="user_default_avatal" width="52" height="52"/>
     </resources>
 </document>

BIN
KulexiuForTeacher/KulexiuForTeacher/ToolKit/KSToolLibrary.framework/KSToolLibrary