Browse Source

修改密码交互

Steven 1 year ago
parent
commit
3ec45d4e48
25 changed files with 1370 additions and 103 deletions
  1. 64 0
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 29 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h
  3. 47 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m
  4. 7 3
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSPublicAlertView.m
  5. 59 82
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSPublicAlertView.xib
  6. 0 3
      KulexiuForStudent/KulexiuForStudent/Common/Define/KSDomain.h
  7. 2 3
      KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/Controller/INSSettingViewController.m
  8. 1 1
      KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupQuitAlert.xib
  9. 16 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/ForgetPasswordViewController.h
  10. 175 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/ForgetPasswordViewController.m
  11. 16 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/NewPwdModifyViewController.h
  12. 72 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/NewPwdModifyViewController.m
  13. 16 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/PasswordCheckViewController.h
  14. 88 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/PasswordCheckViewController.m
  15. 3 3
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/UserSettingViewController.m
  16. 10 8
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/DeleteAccount/Controller/AccountDeleteViewController.m
  17. 28 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.h
  18. 87 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.m
  19. 130 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.xib
  20. 25 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.h
  21. 102 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.m
  22. 137 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.xib
  23. 22 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.h
  24. 98 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.m
  25. 136 0
      KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.xib

+ 64 - 0
KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj

@@ -370,6 +370,13 @@
 		BC0D95142AC2752400E54D3F /* UIViewController+KSExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95132AC2752400E54D3F /* UIViewController+KSExtension.m */; };
 		BC0D95182AC280CA00E54D3F /* KSWebLoadRefreshView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0D95162AC280CA00E54D3F /* KSWebLoadRefreshView.xib */; };
 		BC0D95192AC280CB00E54D3F /* KSWebLoadRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95172AC280CA00E54D3F /* KSWebLoadRefreshView.m */; };
+		BC0D95262AC2AA0900E54D3F /* NewPwdModifyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95252AC2AA0900E54D3F /* NewPwdModifyViewController.m */; };
+		BC0D952E2AC2AA6F00E54D3F /* ForgetPasswordViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D952D2AC2AA6F00E54D3F /* ForgetPasswordViewController.m */; };
+		BC0D95312AC2AA9900E54D3F /* ForgetPasswordBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95302AC2AA9900E54D3F /* ForgetPasswordBodyView.m */; };
+		BC0D95332AC2AAA400E54D3F /* ForgetPasswordBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0D95322AC2AAA400E54D3F /* ForgetPasswordBodyView.xib */; };
+		BC0D95362AC2AAEC00E54D3F /* PasswordCheckViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95352AC2AAEC00E54D3F /* PasswordCheckViewController.m */; };
+		BC0D95392AC2AB0D00E54D3F /* PasswordModifyBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0D95382AC2AB0D00E54D3F /* PasswordModifyBodyView.m */; };
+		BC0D953B2AC2AB1500E54D3F /* PasswordModifyBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0D953A2AC2AB1500E54D3F /* PasswordModifyBodyView.xib */; };
 		BC106BC52A9336F8000759A9 /* TXLiveRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC106BC42A9336F8000759A9 /* TXLiveRoomViewController.m */; };
 		BC106BFE2A933829000759A9 /* TXMicStatusSync.m in Sources */ = {isa = PBXBuildFile; fileRef = BC106BC62A93381C000759A9 /* TXMicStatusSync.m */; };
 		BC106BFF2A933829000759A9 /* TXLiveMessageCardMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC106BC92A93381D000759A9 /* TXLiveMessageCardMessage.m */; };
@@ -690,6 +697,8 @@
 		BC802DBA28BC8C810079E350 /* HomeHotVideoCourseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC802DB928BC8C810079E350 /* HomeHotVideoCourseView.xib */; };
 		BC802DBD28BC8E2C0079E350 /* HomeHotLiveCourseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC802DBC28BC8E2C0079E350 /* HomeHotLiveCourseView.m */; };
 		BC802DBF28BC8E350079E350 /* HomeHotLiveCourseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC802DBE28BC8E350079E350 /* HomeHotLiveCourseView.xib */; };
+		BC84183F2AC2D96600D8F90E /* PasswordCheckBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC84183E2AC2D96600D8F90E /* PasswordCheckBodyView.m */; };
+		BC8418412AC2D96C00D8F90E /* PasswordCheckBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8418402AC2D96C00D8F90E /* PasswordCheckBodyView.xib */; };
 		BC89AC092AB0840E00B077AF /* TenantRecommendMusicView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC89AC082AB0840E00B077AF /* TenantRecommendMusicView.m */; };
 		BC89AC0B2AB0841400B077AF /* TenantRecommendMusicView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC89AC0A2AB0841400B077AF /* TenantRecommendMusicView.xib */; };
 		BC89AC0E2AB0842B00B077AF /* TenantNewMusicView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC89AC0D2AB0842B00B077AF /* TenantNewMusicView.m */; };
@@ -1808,6 +1817,18 @@
 		BC0D95152AC280CA00E54D3F /* KSWebLoadRefreshView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSWebLoadRefreshView.h; sourceTree = "<group>"; };
 		BC0D95162AC280CA00E54D3F /* KSWebLoadRefreshView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSWebLoadRefreshView.xib; sourceTree = "<group>"; };
 		BC0D95172AC280CA00E54D3F /* KSWebLoadRefreshView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSWebLoadRefreshView.m; sourceTree = "<group>"; };
+		BC0D95242AC2AA0900E54D3F /* NewPwdModifyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewPwdModifyViewController.h; sourceTree = "<group>"; };
+		BC0D95252AC2AA0900E54D3F /* NewPwdModifyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NewPwdModifyViewController.m; sourceTree = "<group>"; };
+		BC0D952C2AC2AA6F00E54D3F /* ForgetPasswordViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ForgetPasswordViewController.h; sourceTree = "<group>"; };
+		BC0D952D2AC2AA6F00E54D3F /* ForgetPasswordViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ForgetPasswordViewController.m; sourceTree = "<group>"; };
+		BC0D952F2AC2AA9900E54D3F /* ForgetPasswordBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ForgetPasswordBodyView.h; sourceTree = "<group>"; };
+		BC0D95302AC2AA9900E54D3F /* ForgetPasswordBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ForgetPasswordBodyView.m; sourceTree = "<group>"; };
+		BC0D95322AC2AAA400E54D3F /* ForgetPasswordBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ForgetPasswordBodyView.xib; sourceTree = "<group>"; };
+		BC0D95342AC2AAEC00E54D3F /* PasswordCheckViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PasswordCheckViewController.h; sourceTree = "<group>"; };
+		BC0D95352AC2AAEC00E54D3F /* PasswordCheckViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PasswordCheckViewController.m; sourceTree = "<group>"; };
+		BC0D95372AC2AB0D00E54D3F /* PasswordModifyBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PasswordModifyBodyView.h; sourceTree = "<group>"; };
+		BC0D95382AC2AB0D00E54D3F /* PasswordModifyBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PasswordModifyBodyView.m; sourceTree = "<group>"; };
+		BC0D953A2AC2AB1500E54D3F /* PasswordModifyBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordModifyBodyView.xib; sourceTree = "<group>"; };
 		BC106BC32A9336F8000759A9 /* TXLiveRoomViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXLiveRoomViewController.h; sourceTree = "<group>"; };
 		BC106BC42A9336F8000759A9 /* TXLiveRoomViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXLiveRoomViewController.m; sourceTree = "<group>"; };
 		BC106BC62A93381C000759A9 /* TXMicStatusSync.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXMicStatusSync.m; sourceTree = "<group>"; };
@@ -2308,6 +2329,9 @@
 		BC802DBB28BC8E2C0079E350 /* HomeHotLiveCourseView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeHotLiveCourseView.h; sourceTree = "<group>"; };
 		BC802DBC28BC8E2C0079E350 /* HomeHotLiveCourseView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeHotLiveCourseView.m; sourceTree = "<group>"; };
 		BC802DBE28BC8E350079E350 /* HomeHotLiveCourseView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeHotLiveCourseView.xib; sourceTree = "<group>"; };
+		BC84183D2AC2D96600D8F90E /* PasswordCheckBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PasswordCheckBodyView.h; sourceTree = "<group>"; };
+		BC84183E2AC2D96600D8F90E /* PasswordCheckBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PasswordCheckBodyView.m; sourceTree = "<group>"; };
+		BC8418402AC2D96C00D8F90E /* PasswordCheckBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordCheckBodyView.xib; sourceTree = "<group>"; };
 		BC89AC072AB0840E00B077AF /* TenantRecommendMusicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TenantRecommendMusicView.h; sourceTree = "<group>"; };
 		BC89AC082AB0840E00B077AF /* TenantRecommendMusicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TenantRecommendMusicView.m; sourceTree = "<group>"; };
 		BC89AC0A2AB0841400B077AF /* TenantRecommendMusicView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TenantRecommendMusicView.xib; sourceTree = "<group>"; };
@@ -4551,6 +4575,7 @@
 		27F9032427E87C2E00C08A19 /* Controller */ = {
 			isa = PBXGroup;
 			children = (
+				BC0D95222AC2A9D400E54D3F /* PasswordModify */,
 				27F9032527E87C2E00C08A19 /* SettingViewController.h */,
 				27F9032627E87C2E00C08A19 /* SettingViewController.m */,
 				2723B67427F15D3600E0B90B /* AboutUsViewController.h */,
@@ -4576,6 +4601,7 @@
 		27F9032827E87C2E00C08A19 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC0D95232AC2A9EE00E54D3F /* PasswordModify */,
 				2723B65027F15CF900E0B90B /* AboutUsBodyView.h */,
 				2723B65327F15CF900E0B90B /* AboutUsBodyView.m */,
 				2723B66027F15CFB00E0B90B /* AboutUsBodyView.xib */,
@@ -4639,6 +4665,35 @@
 			path = AnimationView;
 			sourceTree = "<group>";
 		};
+		BC0D95222AC2A9D400E54D3F /* PasswordModify */ = {
+			isa = PBXGroup;
+			children = (
+				BC0D95342AC2AAEC00E54D3F /* PasswordCheckViewController.h */,
+				BC0D95352AC2AAEC00E54D3F /* PasswordCheckViewController.m */,
+				BC0D95242AC2AA0900E54D3F /* NewPwdModifyViewController.h */,
+				BC0D95252AC2AA0900E54D3F /* NewPwdModifyViewController.m */,
+				BC0D952C2AC2AA6F00E54D3F /* ForgetPasswordViewController.h */,
+				BC0D952D2AC2AA6F00E54D3F /* ForgetPasswordViewController.m */,
+			);
+			path = PasswordModify;
+			sourceTree = "<group>";
+		};
+		BC0D95232AC2A9EE00E54D3F /* PasswordModify */ = {
+			isa = PBXGroup;
+			children = (
+				BC0D952F2AC2AA9900E54D3F /* ForgetPasswordBodyView.h */,
+				BC0D95302AC2AA9900E54D3F /* ForgetPasswordBodyView.m */,
+				BC0D95322AC2AAA400E54D3F /* ForgetPasswordBodyView.xib */,
+				BC0D95372AC2AB0D00E54D3F /* PasswordModifyBodyView.h */,
+				BC0D95382AC2AB0D00E54D3F /* PasswordModifyBodyView.m */,
+				BC0D953A2AC2AB1500E54D3F /* PasswordModifyBodyView.xib */,
+				BC84183D2AC2D96600D8F90E /* PasswordCheckBodyView.h */,
+				BC84183E2AC2D96600D8F90E /* PasswordCheckBodyView.m */,
+				BC8418402AC2D96C00D8F90E /* PasswordCheckBodyView.xib */,
+			);
+			path = PasswordModify;
+			sourceTree = "<group>";
+		};
 		BC106BBE2A933688000759A9 /* TXLive */ = {
 			isa = PBXGroup;
 			children = (
@@ -7246,6 +7301,7 @@
 				2723B66A27F15CFC00E0B90B /* PhoneChangeBodyView.xib in Resources */,
 				BCC0F6662A8CD8F500C4EFA4 /* TXDanChatCell.xib in Resources */,
 				BCFDA65728BCA2000022B497 /* musicRoom_animation.json in Resources */,
+				BC8418412AC2D96C00D8F90E /* PasswordCheckBodyView.xib in Resources */,
 				BCC0F6622A8CD8F500C4EFA4 /* MainDisplayView.xib in Resources */,
 				BC71D278288804CD0010F14B /* img_20.png in Resources */,
 				BC71D247288804CD0010F14B /* img_0.png in Resources */,
@@ -7255,6 +7311,7 @@
 				BCED1596293D941200266AEB /* banzou.mp3 in Resources */,
 				BC736A93288036E8004A9B0A /* MyVideoSearchView.xib in Resources */,
 				BCC583C528A9EC6400BAB4CF /* cloud_animation_17.png in Resources */,
+				BC0D953B2AC2AB1500E54D3F /* PasswordModifyBodyView.xib in Resources */,
 				BCC583CE28A9EC6400BAB4CF /* cloud_animation_0.png in Resources */,
 				BCFE53ED2812897600AD6786 /* HomeLiveCouseCell.xib in Resources */,
 				BC71D256288804CD0010F14B /* img_14.png in Resources */,
@@ -7282,6 +7339,7 @@
 				27F9032E27E87C2E00C08A19 /* DeviceCheckView.xib in Resources */,
 				275FA23727E7356B00CFEA2E /* LoginBodyView.xib in Resources */,
 				BCFDA65428BCA2000022B497 /* accomapny_animation_2.png in Resources */,
+				BC0D95332AC2AAA400E54D3F /* ForgetPasswordBodyView.xib in Resources */,
 				BC0D95182AC280CA00E54D3F /* KSWebLoadRefreshView.xib in Resources */,
 				BC71D273288804CD0010F14B /* img_33.png in Resources */,
 				BCC583C628A9EC6400BAB4CF /* cloud_animation_13.png in Resources */,
@@ -7691,6 +7749,7 @@
 				2779358D27E324A80010E277 /* DZNSegmentedControl.m in Sources */,
 				2779352027E324A60010E277 /* CALayer+Color.m in Sources */,
 				BC106C102A933829000759A9 /* TXLiveMessageUnBlockUser.m in Sources */,
+				BC84183F2AC2D96600D8F90E /* PasswordCheckBodyView.m in Sources */,
 				BCD457A1286313D70010B493 /* NotiferNavView.m in Sources */,
 				2723B62C27F157D500E0B90B /* ApplyBottomView.m in Sources */,
 				BC8A4595283DC33400094BBB /* GCDTimer.m in Sources */,
@@ -7731,6 +7790,7 @@
 				BCFEED7328F7F17C0078A2B7 /* TuningNavView.m in Sources */,
 				2723B62727F157D500E0B90B /* GroupMemberViewController.m in Sources */,
 				BC119216280ED6A900A716F7 /* MyLiveCourseCell.m in Sources */,
+				BC0D95392AC2AB0D00E54D3F /* PasswordModifyBodyView.m in Sources */,
 				2779353727E324A60010E277 /* UIImage+Color.m in Sources */,
 				2779353127E324A60010E277 /* NSString+Extension.m in Sources */,
 				2779353F27E324A60010E277 /* UIView+KSLayer.m in Sources */,
@@ -7751,6 +7811,7 @@
 				BC106C092A933829000759A9 /* TXLiveMessageUserQuit.m in Sources */,
 				BCC0F66D2A8CD8F500C4EFA4 /* ClassRoomTitleButton.m in Sources */,
 				2779354227E324A60010E277 /* UIImage+ResizeImage.m in Sources */,
+				BC0D95362AC2AAEC00E54D3F /* PasswordCheckViewController.m in Sources */,
 				277935B327E324A90010E277 /* FSCalendarCollectionView.m in Sources */,
 				2779352727E324A60010E277 /* NSArray+zh_SafeAccess.m in Sources */,
 				BCB9FA46286EDCD7005D766B /* KSTipsAlert.m in Sources */,
@@ -8105,6 +8166,7 @@
 				BCC0F6062A8CD86C00C4EFA4 /* TXClassroomDisplayMsg.m in Sources */,
 				BC2888752A8101C80064B773 /* KSSearchResultListController.m in Sources */,
 				2723B66D27F15CFC00E0B90B /* ModifyNameBodyView.m in Sources */,
+				BC0D95262AC2AA0900E54D3F /* NewPwdModifyViewController.m in Sources */,
 				BC8A459D283DC33400094BBB /* KSParseMessageModel.m in Sources */,
 				BC9AA0BA2ABC288000CD954D /* ChatComplainBottomView.m in Sources */,
 				275FA23327E7356B00CFEA2E /* VefiCodeLoginController.m in Sources */,
@@ -8156,6 +8218,7 @@
 				BC5557CA2AA826C700BA4CAD /* UIButton+KSDelayAction.m in Sources */,
 				BC28885C2A80F9880064B773 /* AppDelegate+AppService.m in Sources */,
 				2779357C27E324A70010E277 /* NSString+MD5.m in Sources */,
+				BC0D952E2AC2AA6F00E54D3F /* ForgetPasswordViewController.m in Sources */,
 				BC106C112A933829000759A9 /* TXConstMessage.m in Sources */,
 				2779355D27E324A70010E277 /* KSHoldButton.m in Sources */,
 				2723B62027F157D500E0B90B /* GroupNoticeCell.m in Sources */,
@@ -8167,6 +8230,7 @@
 				2779353D27E324A60010E277 /* UIScrollView+KSTouch.m in Sources */,
 				275FA23927E7356B00CFEA2E /* FirstSettingBodyView.m in Sources */,
 				BCB5B3092ABC1341005BF25D /* KSImageDisplayView.m in Sources */,
+				BC0D95312AC2AA9900E54D3F /* ForgetPasswordBodyView.m in Sources */,
 				BCC0F6712A8CD8F500C4EFA4 /* TXMainToolView.m in Sources */,
 				BC7663172827E49900C91A1D /* NotiferMessageCell.m in Sources */,
 				BC8A45A7283DC33400094BBB /* CloudControlButton.m in Sources */,

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

@@ -928,6 +928,35 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param success 成功
 /// @param faliure 失败
 + (void)queryConfigRequest:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+
+#pragma mark ---- 修改密码新交互
+// /aip-auth/user/checkPassword
+
+/// 校验密码
+/// @param post psot
+/// @param password password
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkPasswordRequest:(NSString *)post password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// user/checkVerityCode
+
+/// 校验验证码
+/// @param post post
+/// @param code code
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkVerityCodeRequest:(NSString *)post code:(NSString *)code success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// user/setPassword
+
+/// 设置用户密码
+/// @param post post
+/// @param password password
+/// @param success 成功
+/// @param faliure 失败
++ (void)setPasswordRequest:(NSString *)post password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 @end
 
 NS_ASSUME_NONNULL_END

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

@@ -1797,4 +1797,51 @@
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
+
+#pragma mark ---- 修改密码新交互
+// /aip-auth/user/checkPassword
+
+/// 校验密码
+/// @param post psot
+/// @param password password
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkPasswordRequest:(NSString *)post password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-auth/user/checkPassword"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:password forKey:@"password"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// user/checkVerityCode
+
+/// 校验验证码
+/// @param post post
+/// @param code code
+/// @param success 成功
+/// @param faliure 失败
++ (void)checkVerityCodeRequest:(NSString *)post code:(NSString *)code success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-auth/user/checkVerityCode"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:code forKey:@"code"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// user/setPassword
+
+/// 设置用户密码
+/// @param post post
+/// @param password password
+/// @param success 成功
+/// @param faliure 失败
++ (void)setPasswordRequest:(NSString *)post password:(NSString *)password success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodForm];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:password forKey:@"password"];
+    [parm setValue:UserDefault(UIDKey) forKey:@"id"];
+    NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-auth/user/setPassword"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
 @end

+ 7 - 3
KulexiuForStudent/KulexiuForStudent/Common/Base/KSPublicAlertView.m

@@ -23,7 +23,6 @@
 
 @property (nonatomic, copy) AlertCallback sureCallback;
 
-@property (weak, nonatomic) IBOutlet UIView *leftView;
 
 @end
 
@@ -32,7 +31,6 @@
 
 - (void)awakeFromNib {
     [super awakeFromNib];
-    [self.leftView setBackgroundColor:CLIENT_THEMECOLOR];
     [self.cancleButton setTitleColor:CLIENT_THEMECOLOR forState:UIControlStateNormal];
     self.cancleButton.layer.borderColor = CLIENT_THEMECOLOR.CGColor;
     [self.sureButton setBackgroundColor:CLIENT_THEMECOLOR];
@@ -41,7 +39,13 @@
 + (instancetype)shareInstanceWithTitle:(NSString *)title descMessage:(NSString *)descMsg leftTitle:(NSString *)leftTitle rightTitle:(NSString *)rightTitle cancelAction:(AlertCallback)cancelCallback sureAction:(AlertCallback)sureCallback {
     KSPublicAlertView *alertView = [[[NSBundle mainBundle] loadNibNamed:@"KSPublicAlertView" owner:nil options:nil] firstObject];
     alertView.topTitle.text = title;
-    alertView.descLabel.text = descMsg;
+    
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:4];//调整行间距
+    paragraphStyle.alignment = NSTextAlignmentCenter;
+    NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:descMsg attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16.0f],NSForegroundColorAttributeName:HexRGB(0x666666)}];
+    alertView.descLabel.attributedText = attrs;
+    
     [alertView.cancleButton setTitle:leftTitle forState:UIControlStateNormal];
     [alertView.sureButton setTitle:rightTitle forState:UIControlStateNormal];
     if (cancelCallback) {

+ 59 - 82
KulexiuForStudent/KulexiuForStudent/Common/Base/KSPublicAlertView.xib

@@ -4,6 +4,7 @@
     <dependencies>
         <deployment identifier="iOS"/>
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -13,137 +14,113 @@
             <rect key="frame" x="0.0" y="0.0" width="414" height="831"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3b9-KX-1f0">
-                    <rect key="frame" x="47" y="322.5" width="320" height="186.5"/>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Fg5-bn-fT1">
+                    <rect key="frame" x="54.5" y="328.5" width="305" height="174"/>
                     <subviews>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="提示" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dY9-ag-CwK">
-                            <rect key="frame" x="27" y="18" width="273" height="30"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="退出群聊" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oCO-5k-TnW">
+                            <rect key="frame" x="115.5" y="20" width="74" height="25"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="30" id="TAa-cN-fF8"/>
+                                <constraint firstAttribute="height" constant="25" id="Q7Y-R4-2QS"/>
                             </constraints>
                             <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
-                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L4C-eG-exs">
-                            <rect key="frame" x="162.5" y="125.5" width="144.5" height="44"/>
-                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
-                            <state key="normal" title="确定">
-                                <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-                            </state>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QSh-LQ-cke">
+                            <rect key="frame" x="160" y="114" width="130" height="40"/>
+                            <color key="backgroundColor" red="0.99607843139999996" green="0.14117647059999999" blue="0.31764705879999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="X0w-ur-Yqs"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                            <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"/>
+                                    <real key="value" value="20"/>
                                 </userDefinedRuntimeAttribute>
                             </userDefinedRuntimeAttributes>
                             <connections>
-                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Pgy-t6-4Ry"/>
+                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="3w8-Pd-pIm"/>
                             </connections>
                         </button>
-                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yAc-6f-XSy">
-                            <rect key="frame" x="13" y="125.5" width="144.5" height="44"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请确认是否要退出群聊?" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7bP-Cp-6CU">
+                            <rect key="frame" x="20" y="65" width="265" height="24"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dzF-LZ-qD0">
+                            <rect key="frame" x="15" y="114" width="130" height="40"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="44" id="5K1-u8-Aw6"/>
+                                <constraint firstAttribute="height" constant="40" id="DXa-tp-ucL"/>
                             </constraints>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                             <state key="normal" title="取消">
-                                <color key="titleColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                                <color key="titleColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             </state>
                             <userDefinedRuntimeAttributes>
                                 <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                    <real key="value" value="22"/>
+                                    <real key="value" value="20"/>
                                 </userDefinedRuntimeAttribute>
                                 <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
                                     <real key="value" value="1"/>
                                 </userDefinedRuntimeAttribute>
                                 <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
-                                    <color key="value" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                    <color key="value" red="0.85882352939999995" green="0.85882352939999995" blue="0.85882352939999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 </userDefinedRuntimeAttribute>
                             </userDefinedRuntimeAttributes>
                             <connections>
-                                <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="lY7-O5-Xqp"/>
+                                <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Tmp-lB-roy"/>
                             </connections>
                         </button>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="75G-K8-Mgg">
-                            <rect key="frame" x="19" y="68" width="287" height="33.5"/>
-                            <string key="text">聊天功能已断开,是否重新连接?
-</string>
-                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                            <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hVM-RC-bSr">
-                            <rect key="frame" x="18" y="24" width="4" height="18"/>
-                            <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
-                            <constraints>
-                                <constraint firstAttribute="height" constant="18" id="xpH-rm-A2j"/>
-                                <constraint firstAttribute="width" constant="4" id="z6W-x6-koW"/>
-                            </constraints>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                    <real key="value" value="2"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                        </view>
                     </subviews>
-                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
-                        <constraint firstItem="yAc-6f-XSy" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="13" id="A7x-aI-IyD"/>
-                        <constraint firstItem="L4C-eG-exs" firstAttribute="leading" secondItem="yAc-6f-XSy" secondAttribute="trailing" constant="5" id="Bh6-PY-p4S"/>
-                        <constraint firstItem="L4C-eG-exs" firstAttribute="height" secondItem="yAc-6f-XSy" secondAttribute="height" id="BnZ-2L-eok"/>
-                        <constraint firstAttribute="trailing" secondItem="dY9-ag-CwK" secondAttribute="trailing" constant="20" id="Ip9-L6-2Nn"/>
-                        <constraint firstAttribute="trailing" secondItem="75G-K8-Mgg" secondAttribute="trailing" constant="14" id="Ipw-PS-rsG"/>
-                        <constraint firstAttribute="bottom" secondItem="yAc-6f-XSy" secondAttribute="bottom" constant="17" id="UiJ-kA-PXC"/>
-                        <constraint firstItem="dY9-ag-CwK" firstAttribute="top" secondItem="3b9-KX-1f0" secondAttribute="top" constant="18" id="YCe-mx-ufc"/>
-                        <constraint firstItem="75G-K8-Mgg" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="19" id="Zgf-bs-adf"/>
-                        <constraint firstItem="75G-K8-Mgg" firstAttribute="top" secondItem="dY9-ag-CwK" secondAttribute="bottom" constant="20" id="aTo-Dm-iuu"/>
-                        <constraint firstItem="dY9-ag-CwK" firstAttribute="leading" secondItem="hVM-RC-bSr" secondAttribute="trailing" constant="5" id="d4n-7h-4Cm"/>
-                        <constraint firstItem="hVM-RC-bSr" firstAttribute="leading" secondItem="3b9-KX-1f0" secondAttribute="leading" constant="18" id="fUG-ke-LAn"/>
-                        <constraint firstItem="dY9-ag-CwK" firstAttribute="centerY" secondItem="hVM-RC-bSr" secondAttribute="centerY" id="iW4-rB-oPc"/>
-                        <constraint firstAttribute="trailing" secondItem="L4C-eG-exs" secondAttribute="trailing" constant="13" id="phn-RV-9gH"/>
-                        <constraint firstAttribute="width" constant="320" id="q4k-AQ-LaT"/>
-                        <constraint firstItem="L4C-eG-exs" firstAttribute="bottom" secondItem="yAc-6f-XSy" secondAttribute="bottom" id="vyg-TN-SBp"/>
-                        <constraint firstItem="L4C-eG-exs" firstAttribute="width" secondItem="yAc-6f-XSy" secondAttribute="width" id="y46-NI-6sF"/>
-                        <constraint firstItem="L4C-eG-exs" firstAttribute="top" secondItem="75G-K8-Mgg" secondAttribute="bottom" constant="24" id="zGT-pp-1AG"/>
-                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="140" id="zrQ-iS-sC6"/>
+                        <constraint firstAttribute="trailing" secondItem="7bP-Cp-6CU" secondAttribute="trailing" constant="20" id="0RI-05-Qqa"/>
+                        <constraint firstAttribute="trailing" secondItem="QSh-LQ-cke" secondAttribute="trailing" constant="15" id="6RF-4M-h7L"/>
+                        <constraint firstItem="7bP-Cp-6CU" firstAttribute="leading" secondItem="Fg5-bn-fT1" secondAttribute="leading" constant="20" id="Dj1-zc-BMN"/>
+                        <constraint firstAttribute="bottom" secondItem="QSh-LQ-cke" secondAttribute="bottom" constant="20" id="MZK-IY-tET"/>
+                        <constraint firstItem="dzF-LZ-qD0" firstAttribute="leading" secondItem="Fg5-bn-fT1" secondAttribute="leading" constant="15" id="N86-Zk-lmc"/>
+                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="174" id="RhU-8m-zfY"/>
+                        <constraint firstItem="oCO-5k-TnW" firstAttribute="centerX" secondItem="Fg5-bn-fT1" secondAttribute="centerX" id="Szp-Ut-vlp"/>
+                        <constraint firstItem="dzF-LZ-qD0" firstAttribute="top" secondItem="7bP-Cp-6CU" secondAttribute="bottom" constant="25" id="brd-o4-f8E"/>
+                        <constraint firstItem="QSh-LQ-cke" firstAttribute="leading" secondItem="dzF-LZ-qD0" secondAttribute="trailing" constant="15" id="cYf-Bl-V6G"/>
+                        <constraint firstItem="7bP-Cp-6CU" firstAttribute="top" secondItem="oCO-5k-TnW" secondAttribute="bottom" constant="20" id="eGJ-Ps-7pG"/>
+                        <constraint firstItem="dzF-LZ-qD0" firstAttribute="width" secondItem="QSh-LQ-cke" secondAttribute="width" id="hJ4-f6-sy8"/>
+                        <constraint firstItem="oCO-5k-TnW" firstAttribute="top" secondItem="Fg5-bn-fT1" secondAttribute="top" constant="20" id="m3h-3G-Pyb"/>
+                        <constraint firstAttribute="width" constant="305" id="stx-fL-lyc"/>
+                        <constraint firstItem="oCO-5k-TnW" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Fg5-bn-fT1" secondAttribute="leading" constant="20" id="ufQ-Gn-doC"/>
+                        <constraint firstAttribute="bottom" secondItem="dzF-LZ-qD0" secondAttribute="bottom" constant="20" id="ufq-na-dm9"/>
                     </constraints>
                     <userDefinedRuntimeAttributes>
-                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
-                            <size key="value" width="0.0" height="24"/>
-                        </userDefinedRuntimeAttribute>
-                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
-                            <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.22" colorSpace="calibratedRGB"/>
-                        </userDefinedRuntimeAttribute>
-                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
-                            <real key="value" value="1"/>
-                        </userDefinedRuntimeAttribute>
-                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
-                            <real key="value" value="24"/>
-                        </userDefinedRuntimeAttribute>
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                            <real key="value" value="6"/>
+                            <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
-                        <userDefinedRuntimeAttribute type="boolean" keyPath="maskToBounces" value="NO"/>
                     </userDefinedRuntimeAttributes>
                 </view>
             </subviews>
             <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="calibratedRGB"/>
             <constraints>
-                <constraint firstItem="3b9-KX-1f0" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="84x-BF-hZR"/>
-                <constraint firstItem="3b9-KX-1f0" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="8s3-O0-UPX"/>
+                <constraint firstItem="Fg5-bn-fT1" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Igb-tv-W5Y"/>
+                <constraint firstItem="Fg5-bn-fT1" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="PEn-11-IG0"/>
             </constraints>
             <nil key="simulatedTopBarMetrics"/>
             <nil key="simulatedBottomBarMetrics"/>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
-                <outlet property="cancleButton" destination="yAc-6f-XSy" id="gft-OU-gCQ"/>
-                <outlet property="descLabel" destination="75G-K8-Mgg" id="KFH-sk-nhd"/>
-                <outlet property="leftView" destination="hVM-RC-bSr" id="Xqw-TL-bou"/>
-                <outlet property="sureButton" destination="L4C-eG-exs" id="tY3-Sd-5cK"/>
-                <outlet property="topTitle" destination="dY9-ag-CwK" id="XN4-1j-Rmz"/>
+                <outlet property="cancleButton" destination="dzF-LZ-qD0" id="msn-9u-2hg"/>
+                <outlet property="descLabel" destination="7bP-Cp-6CU" id="3fn-wL-CMF"/>
+                <outlet property="sureButton" destination="QSh-LQ-cke" id="r10-ix-eWr"/>
+                <outlet property="topTitle" destination="oCO-5k-TnW" id="vG3-Xb-eE0"/>
             </connections>
             <point key="canvasLocation" x="131.8840579710145" y="132.25446428571428"/>
         </view>
     </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
 </document>

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

@@ -22,9 +22,6 @@
 #define SEALCLASSHOST (@"https://dev.colexiu.com/api-classroom")
 #define WEBHOST (@"https://dev.colexiu.com/student")
 #define TENANT_WEBHOST (@"https://dev.colexiu.com/tenant")
-//#define WEBHOST (@"http://192.168.3.220:5000")
-//#define TENANT_WEBHOST (@"http://192.168.3.220:5000/tenant.html")
-
 #define SOCKET_URL (@"wss://dev.colexiu.com/audioAnalysis")
 #define JSPUSH_ENVIRONMENT (NO)
 #define RCIM_KEY (@"0vnjpoad0jbdz")

+ 2 - 3
KulexiuForStudent/KulexiuForStudent/InstitutionModule/Mine/Controller/INSSettingViewController.m

@@ -14,7 +14,7 @@
 #import "KSMediaManager.h"
 #import "AccountDeleteViewController.h"
 #import "ModifyPhoneCheckController.h"
-#import "ModifyViewController.h"
+#import "PasswordCheckViewController.h"
 #import "InstrumentChooseViewController.h"
 #import "UserAuthViewController.h"
 #import "UserInfoManager.h"
@@ -91,7 +91,6 @@
         case INSETTINGTYPE_AVATAR:
         {
             [self chooseImage];
-
         }
             break;
         case INSETTINGTYPE_NAME:
@@ -131,7 +130,7 @@
             break;
         case INSETTINGTYPE_PWD:
         {
-            ModifyViewController *modifyVC = [[ModifyViewController alloc] init];
+            PasswordCheckViewController *modifyVC = [[PasswordCheckViewController alloc] init];
             [self.navigationController pushViewController:modifyVC animated:YES];
         }
             break;

+ 1 - 1
KulexiuForStudent/KulexiuForStudent/Module/Chat/Group/View/GroupQuitAlert.xib

@@ -69,7 +69,7 @@
                                 <action selector="cancleAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="X70-w8-RRw"/>
                             </connections>
                         </button>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请确认是否要退出群聊?" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vlp-Cw-bmi">
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请确认是否要退出群聊?" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vlp-Cw-bmi">
                             <rect key="frame" x="20" y="65" width="265" height="24"/>
                             <fontDescription key="fontDescription" type="system" pointSize="16"/>
                             <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

+ 16 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/ForgetPasswordViewController.h

@@ -0,0 +1,16 @@
+//
+//  ForgetPasswordViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ForgetPasswordViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 175 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/ForgetPasswordViewController.m

@@ -0,0 +1,175 @@
+//
+//  ForgetPasswordViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "ForgetPasswordViewController.h"
+#import "ForgetPasswordBodyView.h"
+#import "VeriCheckView.h"
+#import "NewPwdModifyViewController.h"
+
+@interface ForgetPasswordViewController ()
+{
+    NSTimer *_time;
+    int _count;
+}
+@property (nonatomic, strong) ForgetPasswordBodyView *bodyView;
+
+@end
+
+@implementation ForgetPasswordViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"忘记密码"];
+    [self configUI];
+}
+
+- (void)configUI {
+    self.bodyView = [ForgetPasswordBodyView shareInstance];
+    [self.view addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    MJWeakSelf;
+    [self.bodyView forgetPwdCheckCallback:^(FORGETPASSWORD type, NSString * _Nullable code) {
+        [weakSelf forgetPwdCheckAction:type code:code];
+    }];
+}
+
+- (void)forgetPwdCheckAction:(FORGETPASSWORD)type code:(NSString *)code {
+    switch (type) {
+        case FORGETPASSWORD_CODE:  // 发送验证码
+        {
+            // 图形化验证
+            [self veriCodeSendCheck];
+        }
+            break;
+        case FORGETPASSWORD_SURE: // 校验验证码
+        {
+            [self checkCode:code];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+- (void)checkCode:(NSString *)code {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager checkVerityCodeRequest:KS_POST code:code success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [self modifyPasswordAction];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+        
+    }];
+}
+
+- (void)modifyPasswordAction {
+    NewPwdModifyViewController *ctrl = [[NewPwdModifyViewController alloc] init];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+#pragma mark --- 验证码
+- (void)veriCodeSendCheck {
+    NSString *phoneNo = UserDefault(PHONEKEY);
+    // 图形化验证
+    VeriCheckView *view = [VeriCheckView shareInstanceShowInView:self.view];
+    __weak typeof(view) weakView = view;
+    [view showViewCallback:^(NSDictionary * _Nonnull parm) {
+        [self veriImageCodeWithParm:parm checkView:weakView];
+    }];
+    [view disPlayImageWithPhone:phoneNo];
+}
+
+- (void)veriImageCodeWithParm:(NSDictionary *)parm checkView:(VeriCheckView *)checkView {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager verifyLoginImageRequest:KS_POST phone:[parm ks_stringValueForKey:@"phone"] code:[parm ks_stringValueForKey:@"code"] success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [checkView hiddView];
+            [self sendSMSRequestWithParm:parm];
+        }
+        else {
+            [LOADING_MANAGER removeHUD];
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+// 发送短信
+- (void)sendSMSRequestWithParm:(NSDictionary *)parm {
+    [KSNetworkingManager sendSmsRequest:KS_POST mobile:[parm ks_stringValueForKey:@"phone"] type:@"PASSWD" success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:@"验证码已发送"];
+            [self codeButtonCountDown];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+- (void)codeButtonCountDown {
+    _bodyView.codeButton.userInteractionEnabled = NO;
+    [_bodyView.codeButton setTitleColor:HexRGB(0xe5e5e5) forState:UIControlStateNormal];
+    __weak typeof(self) weakSelf = self;
+    _time = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(buttonChangeAction) userInfo:nil repeats:YES];
+    _count = 59;
+}
+
+- (void)clearButtonState {
+    [_time invalidate];
+    _time = nil;
+    _count = 0;
+    [_bodyView.codeButton setTitle:@"获取验证码" forState:UIControlStateNormal];
+    [_bodyView.codeButton setTitleColor:CLIENT_THEMECOLOR forState:UIControlStateNormal];
+    _bodyView.codeButton.userInteractionEnabled = YES;
+}
+
+#pragma mark  ---- 验证码按钮状态
+- (void)buttonChangeAction {
+    _bodyView.codeButton.userInteractionEnabled = NO;
+    NSString *title = [NSString stringWithFormat:@"%ds",_count];
+    [_bodyView.codeButton setTitle:title forState:UIControlStateNormal];
+    _count--;
+    if(_count == -1){
+        [_time invalidate];
+        _time = nil;
+        [_bodyView.codeButton setTitle:@"获取验证码" forState:UIControlStateNormal];
+        [_bodyView.codeButton setTitleColor:CLIENT_THEMECOLOR forState:UIControlStateNormal];
+        _bodyView.codeButton.userInteractionEnabled = YES;
+    }
+}
+
+- (void)dealloc {
+    [_time invalidate];
+    _time = nil;
+}
+
+/*
+#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

+ 16 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/NewPwdModifyViewController.h

@@ -0,0 +1,16 @@
+//
+//  NewPwdModifyViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NewPwdModifyViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 72 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/NewPwdModifyViewController.m

@@ -0,0 +1,72 @@
+//
+//  NewPwdModifyViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "NewPwdModifyViewController.h"
+#import "PasswordModifyBodyView.h"
+
+@interface NewPwdModifyViewController ()
+
+@property (nonatomic, strong) PasswordModifyBodyView *bodyView;
+
+@end
+
+@implementation NewPwdModifyViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"修改密码"];
+    [self configUI];
+}
+
+- (void)configUI {
+    self.bodyView = [PasswordModifyBodyView shareInstance];
+    [self.view addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    
+    MJWeakSelf;
+    [self.bodyView modifyPasswordCallback:^(NSString *password) {
+        [weakSelf updatePassword:password];
+        
+    }];
+}
+
+
+- (void)updatePassword:(NSString *)password {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager setPasswordRequest:KS_POST password:password success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER KSShowMsg:@"修改成功" promptCompletion:^{
+                [self toLoginView];
+            }];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+        
+    }];
+}
+// 重新登录
+- (void)toLoginView {
+    [APPLOGIN_MANAGER logoutAction];
+}
+/*
+#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

+ 16 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/PasswordCheckViewController.h

@@ -0,0 +1,16 @@
+//
+//  PasswordCheckViewController.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PasswordCheckViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 88 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/PasswordModify/PasswordCheckViewController.m

@@ -0,0 +1,88 @@
+//
+//  PasswordCheckViewController.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "PasswordCheckViewController.h"
+#import "PasswordCheckBodyView.h"
+#import "ForgetPasswordViewController.h"
+#import "NewPwdModifyViewController.h"
+
+@interface PasswordCheckViewController ()
+
+@property (nonatomic, strong) PasswordCheckBodyView *bodyView;
+
+@end
+
+@implementation PasswordCheckViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"修改密码"];
+    [self configUI];
+}
+
+- (void)configUI {
+    self.bodyView = [PasswordCheckBodyView shareInstance];
+    [self.view addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    MJWeakSelf;
+    [self.bodyView modifyCheckCallback:^(MODIFYCHECKACTION type, NSString * _Nonnull password) {
+        [weakSelf passwordCheckAction:type password:password];
+    }];
+}
+
+- (void)passwordCheckAction:(MODIFYCHECKACTION)type password:(NSString *)password {
+    switch (type) {
+        case MODIFYCHECKACTION_SURE:
+        {
+            [self passwordCheck:password];
+        }
+            break;
+        case MODIFYCHECKACTION_FORGET:
+        {
+            ForgetPasswordViewController *ctrl = [[ForgetPasswordViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (void)passwordCheck:(NSString *)password {
+    [LOADING_MANAGER showHUD];
+    
+    [KSNetworkingManager checkPasswordRequest:KS_POST password:password success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [self modifyPasswordAction];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
+- (void)modifyPasswordAction {
+    NewPwdModifyViewController *ctrl = [[NewPwdModifyViewController alloc] init];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+/*
+#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

+ 3 - 3
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/Controller/UserSettingViewController.m

@@ -12,7 +12,7 @@
 #import "JPUSHService.h"
 #import "KSBaseWKWebViewController.h"
 #import "ModifyNameViewController.h"
-#import "ModifyViewController.h"
+#import "PasswordCheckViewController.h"
 #import "ModifyPhoneCheckController.h"
 #import "KSChoosePicker.h"
 #import "KSMediaManager.h"
@@ -178,7 +178,7 @@
             break;
         case USERSETTING_PWD:
         {
-            ModifyViewController *modifyVC = [[ModifyViewController alloc] init];
+            PasswordCheckViewController *modifyVC = [[PasswordCheckViewController alloc] init];
             [self.navigationController pushViewController:modifyVC animated:YES];
         }
             break;
@@ -237,7 +237,7 @@
         }
     }
     MJWeakSelf;
-    KSFullDatePicker *datePicker = [[KSFullDatePicker alloc] initWithTitle:@"" date:[NSDate date] pickMode:KSDATEPICKER_MODE_DAY selectDateBlock:^(NSString *date) {
+    KSFullDatePicker *datePicker = [[KSFullDatePicker alloc] initWithTitle:@"" date:data pickMode:KSDATEPICKER_MODE_DAY selectDateBlock:^(NSString *date) {
         [weakSelf.bodyView.birthdayLabel setText:date];
         weakSelf.birthday = date;
         [weakSelf modifyUserMessage:nil gender:self.userSex birthday:date];

+ 10 - 8
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/DeleteAccount/Controller/AccountDeleteViewController.m

@@ -14,8 +14,8 @@
 #import "JPUSHService.h"
 #import "RCConnectionManager.h"
 #import "NSString+phone.h"
-#import "KSPublicAlertView.h"
 #import "UserInfoManager.h"
+#import "GroupQuitAlert.h"
 
 @interface AccountDeleteViewController ()
 {
@@ -24,7 +24,7 @@
 }
 @property (nonatomic, strong) DeleteAccountBodyView *bodyView;
 
-@property (nonatomic, strong) KSPublicAlertView *alertView;
+@property (nonatomic, strong) GroupQuitAlert *alertView;
 
 
 @end
@@ -39,6 +39,7 @@
 }
 
 - (void)configUI {
+    
     self.bodyView = [DeleteAccountBodyView shareInstance];
     [self.scrollView addSubview:_bodyView];
     [_bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -65,12 +66,13 @@
     else if (action == DELETEACCOUNT_SURE) {
         
         MJWeakSelf;
-        self.alertView = [KSPublicAlertView shareInstanceWithTitle:@"提示" descMessage:@"注销账号后您所有的留存信息将被清空且无法恢复,请谨慎操作" leftTitle:@"取消" rightTitle:@"确定" cancelAction:^{
-            
-        } sureAction:^{
-            [weakSelf deleteAccount:[parm ks_stringValueForKey:@"code"]];
+        self.alertView = [GroupQuitAlert shareInstance];
+        [self.alertView configTitle:@"提示" desc:@"注销账号后您所有的留存信息将被清空且无法恢复,请谨慎操作" callback:^(BOOL isSure) {
+            if (isSure) {
+                [weakSelf deleteAccount:[parm ks_stringValueForKey:@"code"]];
+            }
         }];
-        
+        [self.alertView showAlert];
     }
 }
 
@@ -101,7 +103,7 @@
 - (void)veriCheckWithParm:(NSDictionary *)parm {
     NSString *phoneNo = [parm ks_stringValueForKey:@"phone"];
     // 图形化验证
-    VeriCheckView *view = [VeriCheckView shareInstanceShowInView:self.view];
+    VeriCheckView *view = [VeriCheckView shareInstanceShowInView:self.scrollView];
     __weak typeof(view) weakView = view;
     [view showViewCallback:^(NSDictionary * _Nonnull parm) {
         [self veriImageCodeWithParm:parm checkView:weakView];

+ 28 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.h

@@ -0,0 +1,28 @@
+//
+//  ForgetPasswordBodyView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, FORGETPASSWORD) {
+    FORGETPASSWORD_CODE,   // 获取验证码
+    FORGETPASSWORD_SURE,   // 确定
+};
+typedef void(^ForgetPwdCheckCallback)(FORGETPASSWORD type, NSString * _Nullable code);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ForgetPasswordBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UIButton *codeButton;
+
++ (instancetype)shareInstance;
+
+- (void)forgetPwdCheckCallback:(ForgetPwdCheckCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 87 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.m

@@ -0,0 +1,87 @@
+//
+//  ForgetPasswordBodyView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "ForgetPasswordBodyView.h"
+
+@interface ForgetPasswordBodyView ()<UITextFieldDelegate>
+
+@property (weak, nonatomic) IBOutlet UILabel *phoneLabel;
+
+@property (weak, nonatomic) IBOutlet UITextField *codeField;
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@property (nonatomic, copy) ForgetPwdCheckCallback callback;
+
+@end
+
+@implementation ForgetPasswordBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.codeField.delegate = self;
+    NSString *phoneStr = UserDefault(PHONEKEY);
+    self.phoneLabel.text = [phoneStr stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"];
+    [self.sureButton setBackgroundColor:CLIENT_THEMECOLOR];
+    [self.codeButton setTitleColor:CLIENT_THEMECOLOR forState:UIControlStateNormal];
+}
+
++ (instancetype)shareInstance {
+    ForgetPasswordBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"ForgetPasswordBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)forgetPwdCheckCallback:(ForgetPwdCheckCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sendCode:(id)sender {
+    [self endEditing:YES];
+
+    if (self.callback) {
+        self.callback(FORGETPASSWORD_CODE, nil);
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    [self endEditing:YES];
+
+    if ([NSString isEmptyString:self.codeField.text]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入验证码"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(FORGETPASSWORD_SURE, self.codeField.text);
+    }
+}
+
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@" "]) {
+        return NO;
+    }
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    // 输入控制
+    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
+    if (newString.length > 6) {
+        return NO;
+    }
+    return YES;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 130 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.xib

@@ -0,0 +1,130 @@
+<?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">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <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="ForgetPasswordBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gNL-TN-1kq">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="68"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="186****8274" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pUi-nK-aBT">
+                            <rect key="frame" x="18.000000000000007" y="20" width="116.66666666666669" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="7gC-MO-488"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="20"/>
+                            <nil key="textColor"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="pUi-nK-aBT" firstAttribute="centerY" secondItem="gNL-TN-1kq" secondAttribute="centerY" id="cHc-kS-heG"/>
+                        <constraint firstAttribute="height" constant="68" id="dip-kx-JDI"/>
+                        <constraint firstItem="pUi-nK-aBT" firstAttribute="leading" secondItem="gNL-TN-1kq" secondAttribute="leading" constant="18" id="hP5-7F-idK"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yJI-No-aZW">
+                    <rect key="frame" x="13" y="68" width="367" height="58"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5zY-sv-ibG">
+                            <rect key="frame" x="0.0" y="0.0" width="367" height="58"/>
+                            <subviews>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入验证码" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="TZC-xI-xMd">
+                                    <rect key="frame" x="12" y="0.0" width="253" height="58"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" keyboardType="numberPad" enablesReturnKeyAutomatically="YES"/>
+                                </textField>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vCe-bb-bja">
+                                    <rect key="frame" x="275" y="14" width="80" height="30"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="80" id="jAx-Lp-5ZX"/>
+                                        <constraint firstAttribute="height" constant="30" id="lSy-T5-5pj"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <state key="normal" title="获取验证码">
+                                        <color key="titleColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                    </state>
+                                    <connections>
+                                        <action selector="sendCode:" destination="iN0-l3-epB" eventType="touchUpInside" id="Cjf-9F-SBg"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="TZC-xI-xMd" firstAttribute="leading" secondItem="5zY-sv-ibG" secondAttribute="leading" constant="12" id="6OG-1H-CXz"/>
+                                <constraint firstAttribute="bottom" secondItem="TZC-xI-xMd" secondAttribute="bottom" id="Cjq-nG-Avv"/>
+                                <constraint firstAttribute="trailing" secondItem="vCe-bb-bja" secondAttribute="trailing" constant="12" id="Eic-Pj-bR7"/>
+                                <constraint firstItem="TZC-xI-xMd" firstAttribute="top" secondItem="5zY-sv-ibG" secondAttribute="top" id="ZTh-4n-P1I"/>
+                                <constraint firstItem="vCe-bb-bja" firstAttribute="centerY" secondItem="5zY-sv-ibG" secondAttribute="centerY" id="lxa-mZ-r9n"/>
+                                <constraint firstAttribute="height" constant="58" id="pPO-X0-fo3"/>
+                                <constraint firstItem="vCe-bb-bja" firstAttribute="leading" secondItem="TZC-xI-xMd" secondAttribute="trailing" constant="10" id="rAH-0Z-AlR"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="5zY-sv-ibG" secondAttribute="trailing" id="1YQ-xZ-gh5"/>
+                        <constraint firstAttribute="bottom" secondItem="5zY-sv-ibG" secondAttribute="bottom" id="Sa8-Ad-i7e"/>
+                        <constraint firstItem="5zY-sv-ibG" firstAttribute="leading" secondItem="yJI-No-aZW" secondAttribute="leading" id="TnD-Ig-qzH"/>
+                        <constraint firstItem="5zY-sv-ibG" firstAttribute="top" secondItem="yJI-No-aZW" secondAttribute="top" id="qJQ-J8-d3e"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qa5-4S-lgl">
+                    <rect key="frame" x="25" y="156" width="343" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="K8o-JV-Sdw"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <state key="normal" title="确定"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Jx1-Fp-w1x"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="gNL-TN-1kq" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="1FI-LB-orl"/>
+                <constraint firstAttribute="trailing" secondItem="qa5-4S-lgl" secondAttribute="trailing" constant="25" id="35o-1Q-KOE"/>
+                <constraint firstAttribute="trailing" secondItem="gNL-TN-1kq" secondAttribute="trailing" id="4Lm-hD-SJ9"/>
+                <constraint firstItem="yJI-No-aZW" firstAttribute="top" secondItem="gNL-TN-1kq" secondAttribute="bottom" id="7pC-ZJ-La3"/>
+                <constraint firstItem="gNL-TN-1kq" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Fpd-CB-64y"/>
+                <constraint firstItem="qa5-4S-lgl" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="IHE-yP-OpM"/>
+                <constraint firstAttribute="trailing" secondItem="yJI-No-aZW" secondAttribute="trailing" constant="13" id="hNu-mk-JjB"/>
+                <constraint firstItem="yJI-No-aZW" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="ha1-kV-nyq"/>
+                <constraint firstItem="qa5-4S-lgl" firstAttribute="top" secondItem="yJI-No-aZW" secondAttribute="bottom" constant="30" id="nIu-VY-1ya"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="codeButton" destination="vCe-bb-bja" id="vq9-EJ-Rxu"/>
+                <outlet property="codeField" destination="TZC-xI-xMd" id="UHJ-GA-RGD"/>
+                <outlet property="phoneLabel" destination="pUi-nK-aBT" id="mCM-gR-n91"/>
+                <outlet property="sureButton" destination="qa5-4S-lgl" id="54e-dV-UL0"/>
+            </connections>
+            <point key="canvasLocation" x="67" y="-11"/>
+        </view>
+    </objects>
+</document>

+ 25 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.h

@@ -0,0 +1,25 @@
+//
+//  PasswordCheckBodyView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, MODIFYCHECKACTION) {
+    MODIFYCHECKACTION_FORGET,   // 忘记密码
+    MODIFYCHECKACTION_SURE,   // 修改
+};
+typedef void(^ModifyPwdCheckCallback)(MODIFYCHECKACTION type,NSString * _Nonnull password);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PasswordCheckBodyView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)modifyCheckCallback:(ModifyPwdCheckCallback)callback;
+@end
+
+NS_ASSUME_NONNULL_END

+ 102 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.m

@@ -0,0 +1,102 @@
+//
+//  PasswordCheckBodyView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "PasswordCheckBodyView.h"
+
+@interface PasswordCheckBodyView ()<UITextFieldDelegate>
+
+@property (weak, nonatomic) IBOutlet UILabel *phoneLabel;
+
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@property (weak, nonatomic) IBOutlet UITextField *pwdField;
+
+@property (nonatomic, copy) ModifyPwdCheckCallback callback;
+
+@end
+
+@implementation PasswordCheckBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    if (@available(iOS 10.0, *)) {
+        _pwdField.textContentType = UITextContentTypeName;
+    }
+    if (@available(iOS 12.0, *)) {
+        _pwdField.textContentType = UITextContentTypeOneTimeCode;
+    }
+    self.pwdField.delegate = self;
+    NSString *phoneStr = UserDefault(PHONEKEY);
+    self.phoneLabel.text = [phoneStr stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"];
+    [self.sureButton setBackgroundColor:CLIENT_THEMECOLOR];
+
+}
+
++ (instancetype)shareInstance {
+    PasswordCheckBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"PasswordCheckBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)modifyCheckCallback:(ModifyPwdCheckCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    [self endEditing:YES];
+    if ([NSString isEmptyString:self.pwdField.text]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入账号原密码"];
+        return;
+    }
+    if (self.pwdField.text.length < 6) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入6-20位字母或数字的密码"];
+        return;
+    }
+    
+    if (self.callback) {
+        self.callback(MODIFYCHECKACTION_SURE, self.pwdField.text);
+    }
+    
+}
+
+- (IBAction)forgetPassword:(id)sender {
+    if (self.callback) {
+        self.callback(MODIFYCHECKACTION_FORGET, self.pwdField.text);
+    }
+}
+
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@" "]) {
+        return NO;
+    }
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    // 输入控制
+    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
+    if (textField == self.pwdField) {
+        if (newString.length > 20) {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入6-20位字母或数字的密码"];
+            return NO;
+        }
+    }
+    return YES;
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 137 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.xib

@@ -0,0 +1,137 @@
+<?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">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <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="PasswordCheckBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jw6-7v-P7C">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="68"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="186****8274" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="v4F-G4-0Rd">
+                            <rect key="frame" x="18.000000000000007" y="20" width="116.66666666666669" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="Zcd-pI-qqP"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="20"/>
+                            <nil key="textColor"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="v4F-G4-0Rd" firstAttribute="leading" secondItem="jw6-7v-P7C" secondAttribute="leading" constant="18" id="3gW-9Z-dZN"/>
+                        <constraint firstAttribute="height" constant="68" id="9ku-O3-ZDM"/>
+                        <constraint firstItem="v4F-G4-0Rd" firstAttribute="centerY" secondItem="jw6-7v-P7C" secondAttribute="centerY" id="Xnp-s5-Af9"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JNu-Go-ThU">
+                    <rect key="frame" x="13" y="68" width="367" height="58"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WRJ-Ri-1dO">
+                            <rect key="frame" x="0.0" y="0.0" width="367" height="58"/>
+                            <subviews>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入账号原密码" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="kFs-PX-hGe">
+                                    <rect key="frame" x="12" y="0.0" width="343" height="58"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" returnKeyType="done" enablesReturnKeyAutomatically="YES" secureTextEntry="YES"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="bottom" secondItem="kFs-PX-hGe" secondAttribute="bottom" id="5cv-tj-GxR"/>
+                                <constraint firstItem="kFs-PX-hGe" firstAttribute="top" secondItem="WRJ-Ri-1dO" secondAttribute="top" id="Bvi-Xo-AB6"/>
+                                <constraint firstAttribute="height" constant="58" id="CpD-eo-2fM"/>
+                                <constraint firstItem="kFs-PX-hGe" firstAttribute="leading" secondItem="WRJ-Ri-1dO" secondAttribute="leading" constant="12" id="EDW-yD-m0D"/>
+                                <constraint firstAttribute="trailing" secondItem="kFs-PX-hGe" secondAttribute="trailing" constant="12" id="bBb-bF-OE9"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="WRJ-Ri-1dO" firstAttribute="top" secondItem="JNu-Go-ThU" secondAttribute="top" id="0Fc-dA-dIC"/>
+                        <constraint firstAttribute="bottom" secondItem="WRJ-Ri-1dO" secondAttribute="bottom" id="cEZ-jD-6uv"/>
+                        <constraint firstItem="WRJ-Ri-1dO" firstAttribute="leading" secondItem="JNu-Go-ThU" secondAttribute="leading" id="t5F-Td-1kg"/>
+                        <constraint firstAttribute="trailing" secondItem="WRJ-Ri-1dO" secondAttribute="trailing" id="yXH-eI-PF9"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aIa-CR-xNy">
+                    <rect key="frame" x="25" y="156" width="343" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="kpj-5W-7dX"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <state key="normal" title="确定"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="3YJ-pt-zpJ"/>
+                    </connections>
+                </button>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="忘记密码" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BAH-rI-mcL">
+                    <rect key="frame" x="167.66666666666666" y="216" width="58" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="LpG-8a-Wq5"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mXJ-Zw-KSk">
+                    <rect key="frame" x="146.66666666666666" y="211" width="100" height="35"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="35" id="Mkq-IR-OR1"/>
+                        <constraint firstAttribute="width" constant="100" id="n5J-LB-Qb9"/>
+                    </constraints>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <connections>
+                        <action selector="forgetPassword:" destination="iN0-l3-epB" eventType="touchUpInside" id="Rg2-9L-Tpq"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="BAH-rI-mcL" firstAttribute="top" secondItem="aIa-CR-xNy" secondAttribute="bottom" constant="16" id="185-nd-wzr"/>
+                <constraint firstItem="jw6-7v-P7C" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="1R5-8A-j6F"/>
+                <constraint firstItem="mXJ-Zw-KSk" firstAttribute="centerX" secondItem="aIa-CR-xNy" secondAttribute="centerX" id="2VG-xj-0MK"/>
+                <constraint firstAttribute="trailing" secondItem="aIa-CR-xNy" secondAttribute="trailing" constant="25" id="Awh-SR-ZwB"/>
+                <constraint firstItem="aIa-CR-xNy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="Axo-TP-jU6"/>
+                <constraint firstItem="JNu-Go-ThU" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="FzD-jR-hxL"/>
+                <constraint firstItem="BAH-rI-mcL" firstAttribute="centerX" secondItem="mXJ-Zw-KSk" secondAttribute="centerX" id="cDD-V8-82s"/>
+                <constraint firstAttribute="trailing" secondItem="jw6-7v-P7C" secondAttribute="trailing" id="fdC-6V-ia3"/>
+                <constraint firstAttribute="trailing" secondItem="JNu-Go-ThU" secondAttribute="trailing" constant="13" id="iyu-34-wQs"/>
+                <constraint firstItem="aIa-CR-xNy" firstAttribute="top" secondItem="JNu-Go-ThU" secondAttribute="bottom" constant="30" id="ppL-3J-u1z"/>
+                <constraint firstItem="BAH-rI-mcL" firstAttribute="top" secondItem="mXJ-Zw-KSk" secondAttribute="top" constant="5" id="qGC-kh-3FF"/>
+                <constraint firstItem="jw6-7v-P7C" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="rqh-j9-l5G"/>
+                <constraint firstItem="JNu-Go-ThU" firstAttribute="top" secondItem="jw6-7v-P7C" secondAttribute="bottom" id="tgk-tY-fcW"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="phoneLabel" destination="v4F-G4-0Rd" id="TW6-Ex-xAh"/>
+                <outlet property="pwdField" destination="kFs-PX-hGe" id="PAa-9H-7cY"/>
+                <outlet property="sureButton" destination="aIa-CR-xNy" id="pIq-DO-NCW"/>
+            </connections>
+            <point key="canvasLocation" x="54" y="-11"/>
+        </view>
+    </objects>
+</document>

+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.h

@@ -0,0 +1,22 @@
+//
+//  PasswordModifyBodyView.h
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^ModifyPwdCallback)(NSString *password);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PasswordModifyBodyView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)modifyPasswordCallback:(ModifyPwdCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 98 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.m

@@ -0,0 +1,98 @@
+//
+//  PasswordModifyBodyView.m
+//  KulexiuForStudent
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "PasswordModifyBodyView.h"
+
+@interface PasswordModifyBodyView ()<UITextFieldDelegate>
+
+@property (weak, nonatomic) IBOutlet UILabel *phoneLabel;
+
+@property (weak, nonatomic) IBOutlet UITextField *firstField;
+
+@property (weak, nonatomic) IBOutlet UITextField *secondField;
+
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@property (nonatomic, copy) ModifyPwdCallback callback;
+
+@end
+
+@implementation PasswordModifyBodyView
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    
+    self.firstField.delegate = self;
+    self.secondField.delegate = self;
+    if (@available(iOS 10.0, *)) {
+        self.firstField.textContentType = UITextContentTypeName;
+        self.secondField.textContentType = UITextContentTypeName;
+    }
+    if (@available(iOS 12.0, *)) {
+        self.firstField.textContentType = UITextContentTypeOneTimeCode;
+        self.secondField.textContentType = UITextContentTypeOneTimeCode;
+    }
+    NSString *phoneStr = UserDefault(PHONEKEY);
+    self.phoneLabel.text = [phoneStr stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"];
+    [self.sureButton setBackgroundColor:CLIENT_THEMESORTCOLOR];
+}
+
++ (instancetype)shareInstance {
+    PasswordModifyBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"PasswordModifyBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)modifyPasswordCallback:(ModifyPwdCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    [self endEditing:YES];
+    
+    if ([NSString isEmptyString:self.firstField.text]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请输入6-20位新密码"];
+        return;
+    }
+    if (self.firstField.text.length < 6 || self.firstField.text.length > 20) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"密码为6-20位数字/字母"];
+        return;
+    }
+    if (![self.firstField.text isEqualToString:self.secondField.text]) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"两次输入密码不一致"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(self.firstField.text);
+    }
+    
+}
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@" "]) {
+        return NO;
+    }
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
+    if (newString.length > 20) {
+        return NO;
+    }
+    return YES;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 136 - 0
KulexiuForStudent/KulexiuForStudent/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.xib

@@ -0,0 +1,136 @@
+<?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">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <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="PasswordModifyBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ERA-Oi-5zj">
+                    <rect key="frame" x="13" y="68" width="367" height="116"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YLP-IF-9d1">
+                            <rect key="frame" x="0.0" y="0.0" width="367" height="58"/>
+                            <subviews>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入6-20位新密码" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="TBJ-No-0fV">
+                                    <rect key="frame" x="12" y="0.0" width="343" height="58"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" returnKeyType="done" enablesReturnKeyAutomatically="YES" secureTextEntry="YES"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="TBJ-No-0fV" firstAttribute="top" secondItem="YLP-IF-9d1" secondAttribute="top" id="2k2-bF-2k8"/>
+                                <constraint firstAttribute="height" constant="58" id="Av0-Jl-szD"/>
+                                <constraint firstAttribute="trailing" secondItem="TBJ-No-0fV" secondAttribute="trailing" constant="12" id="BBv-6v-KRU"/>
+                                <constraint firstAttribute="bottom" secondItem="TBJ-No-0fV" secondAttribute="bottom" id="Dey-tc-zNj"/>
+                                <constraint firstItem="TBJ-No-0fV" firstAttribute="leading" secondItem="YLP-IF-9d1" secondAttribute="leading" constant="12" id="eHQ-R7-DLM"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Dnp-Yn-EXW">
+                            <rect key="frame" x="0.0" y="58" width="367" height="58"/>
+                            <subviews>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请再次输入新密码" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="TeQ-fb-lcH">
+                                    <rect key="frame" x="12" y="0.0" width="343" height="58"/>
+                                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" returnKeyType="done" enablesReturnKeyAutomatically="YES" secureTextEntry="YES"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="TeQ-fb-lcH" secondAttribute="trailing" constant="12" id="PFN-Yc-L5r"/>
+                                <constraint firstAttribute="height" constant="58" id="VqI-8g-579"/>
+                                <constraint firstAttribute="bottom" secondItem="TeQ-fb-lcH" secondAttribute="bottom" id="a8j-2b-KK7"/>
+                                <constraint firstItem="TeQ-fb-lcH" firstAttribute="leading" secondItem="Dnp-Yn-EXW" secondAttribute="leading" constant="12" id="kji-pL-oZ8"/>
+                                <constraint firstItem="TeQ-fb-lcH" firstAttribute="top" secondItem="Dnp-Yn-EXW" secondAttribute="top" id="qAF-z8-9FT"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="YLP-IF-9d1" firstAttribute="leading" secondItem="ERA-Oi-5zj" secondAttribute="leading" id="7vv-8l-wgJ"/>
+                        <constraint firstItem="Dnp-Yn-EXW" firstAttribute="leading" secondItem="ERA-Oi-5zj" secondAttribute="leading" id="Nup-vq-Cy1"/>
+                        <constraint firstAttribute="bottom" secondItem="Dnp-Yn-EXW" secondAttribute="bottom" id="Trg-w5-OGV"/>
+                        <constraint firstItem="Dnp-Yn-EXW" firstAttribute="top" secondItem="YLP-IF-9d1" secondAttribute="bottom" id="gPo-i8-vlC"/>
+                        <constraint firstAttribute="trailing" secondItem="YLP-IF-9d1" secondAttribute="trailing" id="ghd-eP-rrg"/>
+                        <constraint firstItem="YLP-IF-9d1" firstAttribute="top" secondItem="ERA-Oi-5zj" secondAttribute="top" id="ogb-Xu-eOs"/>
+                        <constraint firstAttribute="trailing" secondItem="Dnp-Yn-EXW" secondAttribute="trailing" id="xo0-aN-9PH"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hOB-bX-JKq">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="68"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="186****8274" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="T0L-Jg-T8V">
+                            <rect key="frame" x="18.000000000000007" y="20" width="116.66666666666669" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="2d8-Uk-Ggp"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="20"/>
+                            <nil key="textColor"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="T0L-Jg-T8V" firstAttribute="centerY" secondItem="hOB-bX-JKq" secondAttribute="centerY" id="LTQ-vk-QWd"/>
+                        <constraint firstAttribute="height" constant="68" id="TVu-Sf-Zb1"/>
+                        <constraint firstItem="T0L-Jg-T8V" firstAttribute="leading" secondItem="hOB-bX-JKq" secondAttribute="leading" constant="18" id="xpj-rI-jVM"/>
+                    </constraints>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Xt4-BL-cN2">
+                    <rect key="frame" x="25" y="214" width="343" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="seA-iz-3zL"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <state key="normal" title="确定"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="X8j-rB-nmq"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="ERA-Oi-5zj" secondAttribute="trailing" constant="13" id="548-XV-QtA"/>
+                <constraint firstItem="hOB-bX-JKq" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="901-cg-LPg"/>
+                <constraint firstItem="Xt4-BL-cN2" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="ECZ-oU-C9j"/>
+                <constraint firstAttribute="trailing" secondItem="hOB-bX-JKq" secondAttribute="trailing" id="LzA-Wr-5bE"/>
+                <constraint firstItem="Xt4-BL-cN2" firstAttribute="top" secondItem="ERA-Oi-5zj" secondAttribute="bottom" constant="30" id="XBU-8h-N3o"/>
+                <constraint firstAttribute="trailing" secondItem="Xt4-BL-cN2" secondAttribute="trailing" constant="25" id="XlK-nm-JkO"/>
+                <constraint firstItem="hOB-bX-JKq" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="eAc-Ur-6Rk"/>
+                <constraint firstItem="ERA-Oi-5zj" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="oeY-qE-1V4"/>
+                <constraint firstItem="ERA-Oi-5zj" firstAttribute="top" secondItem="hOB-bX-JKq" secondAttribute="bottom" id="w5S-nH-dNI"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="firstField" destination="TBJ-No-0fV" id="rjc-SC-X50"/>
+                <outlet property="phoneLabel" destination="T0L-Jg-T8V" id="OMB-Vq-OaZ"/>
+                <outlet property="secondField" destination="TeQ-fb-lcH" id="GAD-n5-Lop"/>
+                <outlet property="sureButton" destination="Xt4-BL-cN2" id="Lc4-Vz-gFm"/>
+            </connections>
+            <point key="canvasLocation" x="70.992366412213741" y="-11.267605633802818"/>
+        </view>
+    </objects>
+</document>