Steven 1 gadu atpakaļ
vecāks
revīzija
818d0db78a
25 mainītis faili ar 1524 papildinājumiem un 16 dzēšanām
  1. 74 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 28 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  3. 47 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  4. 25 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.h
  5. 83 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.m
  6. 125 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.xib
  7. 0 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h
  8. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/Controller/UserSettingViewController.m
  9. 11 10
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/DeleteAccount/Controller/AccountDeleteViewController.m
  10. 3 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/DeleteAccount/View/DeleteAccountBodyView.xib
  11. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/ForgetPasswordViewController.h
  12. 175 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/ForgetPasswordViewController.m
  13. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/NewPwdModifyViewController.h
  14. 71 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/NewPwdModifyViewController.m
  15. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/PasswordCheckViewController.h
  16. 88 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/PasswordCheckViewController.m
  17. 28 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.h
  18. 70 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.m
  19. 130 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.xib
  20. 25 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.h
  21. 99 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.m
  22. 137 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.xib
  23. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.h
  24. 97 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.m
  25. 136 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.xib

+ 74 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -863,6 +863,17 @@
 		BC81F0EA29232D01004106AF /* CoursewareListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC81F0E829232D01004106AF /* CoursewareListCell.xib */; };
 		BC81F0ED29233220004106AF /* CoursewareSearchView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC81F0EC29233220004106AF /* CoursewareSearchView.m */; };
 		BC81F0EF29233228004106AF /* CoursewareSearchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC81F0EE29233228004106AF /* CoursewareSearchView.xib */; };
+		BC84182D2AC2D82900D8F90E /* ForgetPasswordBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8418242AC2D82900D8F90E /* ForgetPasswordBodyView.xib */; };
+		BC84182E2AC2D82900D8F90E /* PasswordModifyBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8418252AC2D82900D8F90E /* PasswordModifyBodyView.xib */; };
+		BC84182F2AC2D82900D8F90E /* ForgetPasswordBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8418262AC2D82900D8F90E /* ForgetPasswordBodyView.m */; };
+		BC8418322AC2D82900D8F90E /* PasswordModifyBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC84182B2AC2D82900D8F90E /* PasswordModifyBodyView.m */; };
+		BC84183A2AC2D83700D8F90E /* NewPwdModifyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8418342AC2D83700D8F90E /* NewPwdModifyViewController.m */; };
+		BC84183B2AC2D83700D8F90E /* PasswordCheckViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8418362AC2D83700D8F90E /* PasswordCheckViewController.m */; };
+		BC84183C2AC2D83700D8F90E /* ForgetPasswordViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8418392AC2D83700D8F90E /* ForgetPasswordViewController.m */; };
+		BC8418452AC2D9FB00D8F90E /* PasswordCheckBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8418422AC2D9FB00D8F90E /* PasswordCheckBodyView.xib */; };
+		BC8418462AC2D9FB00D8F90E /* PasswordCheckBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8418442AC2D9FB00D8F90E /* PasswordCheckBodyView.m */; };
+		BC86CB172AC2E72000450EED /* KSNewConfirmAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86CB162AC2E72000450EED /* KSNewConfirmAlertView.m */; };
+		BC86CB192AC2E72500450EED /* KSNewConfirmAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC86CB182AC2E72500450EED /* KSNewConfirmAlertView.xib */; };
 		BC8831002873D26000C702A0 /* LiveVideoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8830FE2873D25F00C702A0 /* LiveVideoModel.m */; };
 		BC8831042873D67C00C702A0 /* LiveVideoCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8831022873D67C00C702A0 /* LiveVideoCollectionViewCell.m */; };
 		BC8831052873D67C00C702A0 /* LiveVideoCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC8831032873D67C00C702A0 /* LiveVideoCollectionViewCell.xib */; };
@@ -2695,6 +2706,24 @@
 		BC81F0EB29233220004106AF /* CoursewareSearchView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursewareSearchView.h; sourceTree = "<group>"; };
 		BC81F0EC29233220004106AF /* CoursewareSearchView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursewareSearchView.m; sourceTree = "<group>"; };
 		BC81F0EE29233228004106AF /* CoursewareSearchView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CoursewareSearchView.xib; sourceTree = "<group>"; };
+		BC8418242AC2D82900D8F90E /* ForgetPasswordBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ForgetPasswordBodyView.xib; sourceTree = "<group>"; };
+		BC8418252AC2D82900D8F90E /* PasswordModifyBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordModifyBodyView.xib; sourceTree = "<group>"; };
+		BC8418262AC2D82900D8F90E /* ForgetPasswordBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForgetPasswordBodyView.m; sourceTree = "<group>"; };
+		BC8418272AC2D82900D8F90E /* PasswordModifyBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PasswordModifyBodyView.h; sourceTree = "<group>"; };
+		BC84182B2AC2D82900D8F90E /* PasswordModifyBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PasswordModifyBodyView.m; sourceTree = "<group>"; };
+		BC84182C2AC2D82900D8F90E /* ForgetPasswordBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForgetPasswordBodyView.h; sourceTree = "<group>"; };
+		BC8418342AC2D83700D8F90E /* NewPwdModifyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewPwdModifyViewController.m; sourceTree = "<group>"; };
+		BC8418352AC2D83700D8F90E /* ForgetPasswordViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForgetPasswordViewController.h; sourceTree = "<group>"; };
+		BC8418362AC2D83700D8F90E /* PasswordCheckViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PasswordCheckViewController.m; sourceTree = "<group>"; };
+		BC8418372AC2D83700D8F90E /* NewPwdModifyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewPwdModifyViewController.h; sourceTree = "<group>"; };
+		BC8418382AC2D83700D8F90E /* PasswordCheckViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PasswordCheckViewController.h; sourceTree = "<group>"; };
+		BC8418392AC2D83700D8F90E /* ForgetPasswordViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForgetPasswordViewController.m; sourceTree = "<group>"; };
+		BC8418422AC2D9FB00D8F90E /* PasswordCheckBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCheckBodyView.xib; sourceTree = "<group>"; };
+		BC8418432AC2D9FB00D8F90E /* PasswordCheckBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PasswordCheckBodyView.h; sourceTree = "<group>"; };
+		BC8418442AC2D9FB00D8F90E /* PasswordCheckBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PasswordCheckBodyView.m; sourceTree = "<group>"; };
+		BC86CB152AC2E72000450EED /* KSNewConfirmAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSNewConfirmAlertView.h; sourceTree = "<group>"; };
+		BC86CB162AC2E72000450EED /* KSNewConfirmAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSNewConfirmAlertView.m; sourceTree = "<group>"; };
+		BC86CB182AC2E72500450EED /* KSNewConfirmAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSNewConfirmAlertView.xib; sourceTree = "<group>"; };
 		BC8830FE2873D25F00C702A0 /* LiveVideoModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveVideoModel.m; sourceTree = "<group>"; };
 		BC8830FF2873D25F00C702A0 /* LiveVideoModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveVideoModel.h; sourceTree = "<group>"; };
 		BC8831012873D67B00C702A0 /* LiveVideoCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveVideoCollectionViewCell.h; sourceTree = "<group>"; };
@@ -3690,6 +3719,9 @@
 				BC32E10A286AB31C001434DD /* KSPublicAlertView.h */,
 				BC32E10B286AB31C001434DD /* KSPublicAlertView.m */,
 				BC32E10D286AB326001434DD /* KSPublicAlertView.xib */,
+				BC86CB152AC2E72000450EED /* KSNewConfirmAlertView.h */,
+				BC86CB162AC2E72000450EED /* KSNewConfirmAlertView.m */,
+				BC86CB182AC2E72500450EED /* KSNewConfirmAlertView.xib */,
 			);
 			path = Base;
 			sourceTree = "<group>";
@@ -4833,6 +4865,7 @@
 		27F902EB27E8613D00C08A19 /* Setting */ = {
 			isa = PBXGroup;
 			children = (
+				BC8418332AC2D83700D8F90E /* PasswordModify */,
 				BC60E3B7287D293600B05441 /* DeleteAccount */,
 				27F902EC27E8613D00C08A19 /* Controller */,
 				27F902ED27E8613D00C08A19 /* Model */,
@@ -4880,6 +4913,7 @@
 		27F902EE27E8613D00C08A19 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BC8418232AC2D82900D8F90E /* PasswordModify */,
 				BC14E4772AB2E887000C4983 /* UnbindView */,
 				273C759C27E9680C00F7C26F /* SettingBodyView.h */,
 				273C759D27E9680C00F7C26F /* SettingBodyView.m */,
@@ -6738,6 +6772,35 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC8418232AC2D82900D8F90E /* PasswordModify */ = {
+			isa = PBXGroup;
+			children = (
+				BC8418432AC2D9FB00D8F90E /* PasswordCheckBodyView.h */,
+				BC8418442AC2D9FB00D8F90E /* PasswordCheckBodyView.m */,
+				BC8418422AC2D9FB00D8F90E /* PasswordCheckBodyView.xib */,
+				BC84182C2AC2D82900D8F90E /* ForgetPasswordBodyView.h */,
+				BC8418262AC2D82900D8F90E /* ForgetPasswordBodyView.m */,
+				BC8418242AC2D82900D8F90E /* ForgetPasswordBodyView.xib */,
+				BC8418272AC2D82900D8F90E /* PasswordModifyBodyView.h */,
+				BC84182B2AC2D82900D8F90E /* PasswordModifyBodyView.m */,
+				BC8418252AC2D82900D8F90E /* PasswordModifyBodyView.xib */,
+			);
+			path = PasswordModify;
+			sourceTree = "<group>";
+		};
+		BC8418332AC2D83700D8F90E /* PasswordModify */ = {
+			isa = PBXGroup;
+			children = (
+				BC8418352AC2D83700D8F90E /* ForgetPasswordViewController.h */,
+				BC8418392AC2D83700D8F90E /* ForgetPasswordViewController.m */,
+				BC8418372AC2D83700D8F90E /* NewPwdModifyViewController.h */,
+				BC8418342AC2D83700D8F90E /* NewPwdModifyViewController.m */,
+				BC8418382AC2D83700D8F90E /* PasswordCheckViewController.h */,
+				BC8418362AC2D83700D8F90E /* PasswordCheckViewController.m */,
+			);
+			path = PasswordModify;
+			sourceTree = "<group>";
+		};
 		BC8B641828F3E8D800A08D16 /* AwardAlert */ = {
 			isa = PBXGroup;
 			children = (
@@ -7858,6 +7921,7 @@
 				275E8A7727E18F2800DD3F6E /* LaunchScreen.storyboard in Resources */,
 				277932B427E30FFE0010E277 /* SDQWMaskCustomView.xib in Resources */,
 				BCC5840C28A9FA8100BAB4CF /* cloud_animation_5.png in Resources */,
+				BC8418452AC2D9FB00D8F90E /* PasswordCheckBodyView.xib in Resources */,
 				BCE6A09127F823BE00C97704 /* LiveCourseCell.xib in Resources */,
 				BC3673D828A606A500059721 /* accomapny_animation_1.png in Resources */,
 				275B172B27EB269F0081FDEF /* ChatAddressHeaderView.xib in Resources */,
@@ -8053,6 +8117,7 @@
 				BC9070A428C7159F00237958 /* MyStyleNavView.xib in Resources */,
 				BC106BB62A8F6E94000759A9 /* ShareMusicCellContentView.xib in Resources */,
 				2779362E27E33C360010E277 /* LoginBodyView.xib in Resources */,
+				BC84182D2AC2D82900D8F90E /* ForgetPasswordBodyView.xib in Resources */,
 				BC8B6E6E285836B600866917 /* low_staff.png in Resources */,
 				BCB399BD27F9831D00AFF376 /* CourseForLiveCell.xib in Resources */,
 				2723B68927F1643B00E0B90B /* HomeBodyView.xib in Resources */,
@@ -8139,6 +8204,7 @@
 				27A54CFE27E9BDC5007309A3 /* AboutUsBodyView.xib in Resources */,
 				BCA724052806AFF100DA0D0D /* AccompanyCourseInfoCell.xib in Resources */,
 				BC2456EF286BEFC600D1F7C0 /* MineEmptyIntroduceCell.xib in Resources */,
+				BC86CB192AC2E72500450EED /* KSNewConfirmAlertView.xib in Resources */,
 				BC3673DF28A606A500059721 /* musicRoom_animation_2.png in Resources */,
 				BC9070A928C71C8E00237958 /* MyCreateGroupHeadView.xib in Resources */,
 				BCC583F828A9FA8100BAB4CF /* cloud_animation_23.png in Resources */,
@@ -8191,6 +8257,7 @@
 				BC71D1F52887FDD40010F14B /* img_17.png in Resources */,
 				BCA9CE5127FD954800D558C6 /* AccompanyRemarkCell.xib in Resources */,
 				BC5E4B26291E5E26001BBCD2 /* TunerSettingView.xib in Resources */,
+				BC84182E2AC2D82900D8F90E /* PasswordModifyBodyView.xib in Resources */,
 				BCB9FA682872C8F0005D766B /* FinishedLiveCell.xib in Resources */,
 				BC513E7C28A4D868003F58C4 /* musicRoom_animation.json in Resources */,
 				BCC03F89280460C000461B7C /* InstrumentHeaderView.xib in Resources */,
@@ -8497,6 +8564,7 @@
 				BCA1134828A22A66007FAFB9 /* HomeHotMusicCollectionCell.m in Sources */,
 				275E3DC227F45F3F0010EC30 /* KSLiveChatroomWelcome.m in Sources */,
 				BCDF820E2A8A2955005F8B82 /* MemberSettingMicAlert.m in Sources */,
+				BC84182F2AC2D82900D8F90E /* ForgetPasswordBodyView.m in Sources */,
 				BC8831002873D26000C702A0 /* LiveVideoModel.m in Sources */,
 				BC1365C8280D476500EB03E2 /* NotiferMessageCell.m in Sources */,
 				27F9030E27E875DD00C08A19 /* AudioPlayManager.m in Sources */,
@@ -8533,6 +8601,7 @@
 				BCDB09402805C0EF00D0BDAD /* NewClassPopView.m in Sources */,
 				BC4058922863028200111BC5 /* NotiferNavView.m in Sources */,
 				BCC5841728A9FA9D00BAB4CF /* AccompanyLoadingView.m in Sources */,
+				BC84183C2AC2D83700D8F90E /* ForgetPasswordViewController.m in Sources */,
 				27F9CAF627EC1A16003E0FE4 /* SCIndexView.m in Sources */,
 				BCD457BB2865652C0010B493 /* LiveAnimationView.m in Sources */,
 				2779320E27E30FC30010E277 /* UIColor+Hex.m in Sources */,
@@ -8598,6 +8667,7 @@
 				BC106BA72A8F45AA000759A9 /* TXLiveSeatActionView.m in Sources */,
 				BC106B722A8F4586000759A9 /* TXLiveMessageShopRush.m in Sources */,
 				2779323E27E30FC30010E277 /* VoCacheManager.m in Sources */,
+				BC86CB172AC2E72000450EED /* KSNewConfirmAlertView.m in Sources */,
 				277931DE27E30FC20010E277 /* NSObject+AssociatedObject.m in Sources */,
 				27D83F4927F3EBC400062476 /* CreateLiveViewController.m in Sources */,
 				277D431D27E9999400107DB7 /* ModifyBodyView.m in Sources */,
@@ -8655,6 +8725,7 @@
 				2779321E27E30FC30010E277 /* LifeButton.m in Sources */,
 				277931E427E30FC20010E277 /* CALayer+Color.m in Sources */,
 				2779360C27E32BE50010E277 /* LoginViewController.m in Sources */,
+				BC84183A2AC2D83700D8F90E /* NewPwdModifyViewController.m in Sources */,
 				27F9CB0E27EC5DF5003E0FE4 /* KSRCloudMediaManager.m in Sources */,
 				BC221FB928C8687300F99802 /* MusicSortView.m in Sources */,
 				BC4BCE7D2823B66000522C8B /* AddressDetailBodyView.m in Sources */,
@@ -8867,6 +8938,7 @@
 				27F9CB1127EC60D0003E0FE4 /* GroupListModel.m in Sources */,
 				27FC2F5F27F1930400FCC239 /* KSStarView.m in Sources */,
 				BC106B802A8F4586000759A9 /* TXLiveCourseTimeChange.m in Sources */,
+				BC8418322AC2D82900D8F90E /* PasswordModifyBodyView.m in Sources */,
 				BC24570D286C436E00D1F7C0 /* KSCloudBeatView.m in Sources */,
 				BC81F0ED29233220004106AF /* CoursewareSearchView.m in Sources */,
 				2779320A27E30FC30010E277 /* HomeButton.m in Sources */,
@@ -8970,6 +9042,7 @@
 				BC41104528066EF200800BD9 /* EvaluateCourseBodyView.m in Sources */,
 				2779328E27E30FEB0010E277 /* MSSBrowseLoadingImageView.m in Sources */,
 				BC221FB428C82F0500F99802 /* MinePageSortView.m in Sources */,
+				BC84183B2AC2D83700D8F90E /* PasswordCheckViewController.m in Sources */,
 				BC71DF2B2A8A0432003F165E /* KSWhiteboardRefreshView.m in Sources */,
 				2779335827E316DD0010E277 /* FastForwardView.m in Sources */,
 				277935DC27E326650010E277 /* RecordCheckManager.m in Sources */,
@@ -9004,6 +9077,7 @@
 				BC71DEF52A89F470003F165E /* TxClassroomChatOtherCell.m in Sources */,
 				BC14E4912AB30F8F000C4983 /* TenantCreateGroupViewController.m in Sources */,
 				2779331127E310960010E277 /* NSObject+ReadDocument.m in Sources */,
+				BC8418462AC2D9FB00D8F90E /* PasswordCheckBodyView.m in Sources */,
 				BC3DE082280D88670027DC0E /* EvaluateListModel.m in Sources */,
 				BCDF821A2A8A2BEF005F8B82 /* CREmojiCollectionCell.m in Sources */,
 				BC36A50E2AB42B46002FEFB1 /* GroupOwnerTagView.m in Sources */,

+ 28 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -1392,5 +1392,33 @@ 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
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -2558,4 +2558,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

+ 25 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.h

@@ -0,0 +1,25 @@
+//
+//  KSNewConfirmAlertView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^KSConfirmAlertCallback)(BOOL isSure);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSNewConfirmAlertView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)configTitle:(NSString *)title desc:(NSString *)desc callback:(KSConfirmAlertCallback)callback;
+
+- (void)showAlert;
+
+- (void)hiddenAction;
+@end
+
+NS_ASSUME_NONNULL_END

+ 83 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.m

@@ -0,0 +1,83 @@
+//
+//  KSNewConfirmAlertView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2023/9/26.
+//
+
+#import "KSNewConfirmAlertView.h"
+#import "UIView+Animation.h"
+
+@interface KSNewConfirmAlertView ()
+
+@property (nonatomic, copy) KSConfirmAlertCallback callback;
+
+@property (weak, nonatomic) IBOutlet UILabel *headTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *descLabel;
+
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@end
+
+@implementation KSNewConfirmAlertView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self.sureButton setBackgroundColor:THEMECOLOR];
+}
+
++ (instancetype)shareInstance {
+    KSNewConfirmAlertView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSNewConfirmAlertView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configTitle:(NSString *)title desc:(NSString *)desc callback:(KSConfirmAlertCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    [self.headTitle setText:title];
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:4];//调整行间距
+    [paragraphStyle setAlignment:NSTextAlignmentCenter];
+    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:[NSString returnNoNullStringWithString:desc] attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16.0f],NSForegroundColorAttributeName:HexRGB(0x666666)}];
+    self.descLabel.attributedText = attrStr;
+}
+
+- (void)showAlert {
+    UIWindow *window = [NSObject getKeyWindow];
+    [window addSubview:self];
+    [self mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(window);
+    }];
+    
+    [self setPopAnimation];
+}
+
+- (void)hiddenAction {
+    [self removeFromSuperview];
+}
+
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        self.callback(YES);
+    }
+    [self hiddenAction];
+}
+
+- (IBAction)cancleAction:(id)sender {
+    if (self.callback) {
+        self.callback(NO);
+    }
+    [self hiddenAction];
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 125 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNewConfirmAlertView.xib

@@ -0,0 +1,125 @@
+<?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="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSNewConfirmAlertView">
+            <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="O2A-CB-64x">
+                    <rect key="frame" x="44" y="339" width="305" height="174"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="退出群聊" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4wk-gS-5i2">
+                            <rect key="frame" x="115.66666666666666" y="20" width="73.666666666666657" height="25"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="25" id="Um6-0N-Ymz"/>
+                            </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="EYC-n9-zx6">
+                            <rect key="frame" x="15" y="114" width="130" height="40"/>
+                            <color key="backgroundColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="8Hm-bZ-RbQ"/>
+                            </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="20"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="E9z-n4-Mjr"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JVt-Be-Ony">
+                            <rect key="frame" x="160" y="114" width="130" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="J4B-79-Gmx"/>
+                            </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.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            </state>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <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.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="bpo-Wg-5ge"/>
+                            </connections>
+                        </button>
+                        <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="3dZ-LX-qj9">
+                            <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>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="174" id="4ag-Q8-pGO"/>
+                        <constraint firstItem="4wk-gS-5i2" firstAttribute="centerX" secondItem="O2A-CB-64x" secondAttribute="centerX" id="5wB-ee-IFa"/>
+                        <constraint firstAttribute="bottom" secondItem="EYC-n9-zx6" secondAttribute="bottom" constant="20" id="FLS-ok-WxP"/>
+                        <constraint firstItem="EYC-n9-zx6" firstAttribute="leading" secondItem="O2A-CB-64x" secondAttribute="leading" constant="15" id="GEn-tB-2jx"/>
+                        <constraint firstItem="3dZ-LX-qj9" firstAttribute="top" secondItem="4wk-gS-5i2" secondAttribute="bottom" constant="20" id="LZZ-IO-C7q"/>
+                        <constraint firstItem="JVt-Be-Ony" firstAttribute="leading" secondItem="EYC-n9-zx6" secondAttribute="trailing" constant="15" id="Uz7-e8-PVu"/>
+                        <constraint firstItem="4wk-gS-5i2" firstAttribute="top" secondItem="O2A-CB-64x" secondAttribute="top" constant="20" id="VfV-Aj-tSk"/>
+                        <constraint firstItem="JVt-Be-Ony" firstAttribute="width" secondItem="EYC-n9-zx6" secondAttribute="width" id="blj-fu-es0"/>
+                        <constraint firstAttribute="trailing" secondItem="3dZ-LX-qj9" secondAttribute="trailing" constant="20" id="cMx-Id-Twk"/>
+                        <constraint firstAttribute="width" constant="305" id="cfn-le-fRW"/>
+                        <constraint firstAttribute="bottom" secondItem="JVt-Be-Ony" secondAttribute="bottom" constant="20" id="dXK-PC-FRo"/>
+                        <constraint firstItem="3dZ-LX-qj9" firstAttribute="leading" secondItem="O2A-CB-64x" secondAttribute="leading" constant="20" id="hw3-q9-8Et"/>
+                        <constraint firstItem="JVt-Be-Ony" firstAttribute="top" secondItem="3dZ-LX-qj9" secondAttribute="bottom" constant="25" id="k6a-lk-ZR6"/>
+                        <constraint firstAttribute="trailing" secondItem="JVt-Be-Ony" secondAttribute="trailing" constant="15" id="mqk-xP-cMG"/>
+                        <constraint firstItem="4wk-gS-5i2" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="O2A-CB-64x" secondAttribute="leading" constant="20" id="oZe-OX-8Wl"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="O2A-CB-64x" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="1om-HF-bbA"/>
+                <constraint firstItem="O2A-CB-64x" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="GFF-na-bLT"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="descLabel" destination="3dZ-LX-qj9" id="FF1-Kh-8DN"/>
+                <outlet property="headTitle" destination="4wk-gS-5i2" id="s6z-9R-5d2"/>
+                <outlet property="sureButton" destination="EYC-n9-zx6" id="hfP-BR-2tj"/>
+            </connections>
+            <point key="canvasLocation" x="61" y="-11"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 0 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h

@@ -15,7 +15,6 @@
 #define hostURL (@"https://dev.colexiu.com")
 #define SEALCLASSHOST (@"https://dev.colexiu.com/api-classroom")
 #define WEBHOST (@"https://dev.colexiu.com/teacher")
-//#define WEBHOST (@"http://192.168.3.220:5000/teacher.html")
 #define SOCKET_URL (@"wss://dev.colexiu.com/audioAnalysis")
 #define JSPUSH_ENVIRONMENT (NO)
 #define RCIM_KEY (@"0vnjpoad0jbdz")

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/Controller/UserSettingViewController.m

@@ -14,7 +14,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"
@@ -138,7 +138,7 @@
             break;
         case USERSETTING_PWD:
         {
-            ModifyViewController *modifyVC = [[ModifyViewController alloc] init];
+            PasswordCheckViewController *modifyVC = [[PasswordCheckViewController alloc] init];
             [self.navigationController pushViewController:modifyVC animated:YES];
         }
             break;

+ 11 - 10
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/DeleteAccount/Controller/AccountDeleteViewController.m

@@ -14,7 +14,7 @@
 #import "JPUSHService.h"
 #import "RCConnectionManager.h"
 #import "NSString+phone.h"
-#import "KSPublicAlertView.h"
+#import "KSNewConfirmAlertView.h"
 
 @interface AccountDeleteViewController ()
 {
@@ -23,7 +23,7 @@
 }
 @property (nonatomic, strong) DeleteAccountBodyView *bodyView;
 
-@property (nonatomic, strong) KSPublicAlertView *alertView;
+@property (nonatomic, strong) KSNewConfirmAlertView *alertView;
 
 
 @end
@@ -62,13 +62,13 @@
     else if (action == DELETEACCOUNT_SURE) {
         
         MJWeakSelf;
-        self.alertView = [KSPublicAlertView shareInstanceWithTitle:@"提示" descMessage:@"注销账号后您所有的留存信息将被清空且无法恢复,请谨慎操作" leftTitle:@"取消" rightTitle:@"确定" cancelAction:^{
-            
-        } sureAction:^{
-            [weakSelf deleteAccount:[parm ks_stringValueForKey:@"code"]];
+        self.alertView = [KSNewConfirmAlertView shareInstance];
+        [self.alertView configTitle:@"提示" desc:@"注销账号后您所有的留存信息将被清空且无法恢复,请谨慎操作" callback:^(BOOL isSure) {
+            if (isSure) {
+                [weakSelf deleteAccount:[parm ks_stringValueForKey:@"code"]];
+            }
         }];
-        
-        
+        [self.alertView showAlert];
     }
 }
 
@@ -99,7 +99,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];
@@ -168,7 +168,8 @@
         _time = nil;
         [_bodyView.codeButton setTitle:@"获取验证码" forState:UIControlStateNormal];
         [_bodyView.codeButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
-        _bodyView.codeButton.userInteractionEnabled = YES;    }
+        _bodyView.codeButton.userInteractionEnabled = YES;
+    }
 }
 
 - (void)dealloc {

+ 3 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/DeleteAccount/View/DeleteAccountBodyView.xib

@@ -18,7 +18,7 @@
                     <rect key="frame" x="13" y="12" width="388" height="929"/>
                     <subviews>
                         <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" bouncesZoom="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DMY-bn-wxE">
-                            <rect key="frame" x="0.0" y="0.0" width="388" height="774"/>
+                            <rect key="frame" x="0.0" y="0.0" width="388" height="767"/>
                             <subviews>
                                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TEx-cD-ZR6">
                                     <rect key="frame" x="0.0" y="0.0" width="388" height="525"/>
@@ -437,7 +437,7 @@
                             </connections>
                         </button>
                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mMv-gk-ABM">
-                            <rect key="frame" x="16" y="794" width="356" height="48"/>
+                            <rect key="frame" x="16" y="787" width="356" height="48"/>
                             <subviews>
                                 <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入短信验证码" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="byh-5B-J1p">
                                     <rect key="frame" x="12" y="0.0" width="240" height="48"/>
@@ -502,7 +502,7 @@
                         <constraint firstAttribute="trailing" secondItem="mMv-gk-ABM" secondAttribute="trailing" constant="16" id="MR7-ts-wGR"/>
                         <constraint firstItem="DMY-bn-wxE" firstAttribute="leading" secondItem="gTc-LK-g9D" secondAttribute="leading" id="V5r-o8-Nw4"/>
                         <constraint firstItem="Qi7-Np-SbU" firstAttribute="leading" secondItem="gTc-LK-g9D" secondAttribute="leading" constant="12" id="a8l-QS-a5p"/>
-                        <constraint firstItem="Qi7-Np-SbU" firstAttribute="top" secondItem="mMv-gk-ABM" secondAttribute="bottom" constant="23" id="iny-PA-ces"/>
+                        <constraint firstItem="Qi7-Np-SbU" firstAttribute="top" secondItem="mMv-gk-ABM" secondAttribute="bottom" constant="30" id="iny-PA-ces"/>
                         <constraint firstAttribute="bottom" secondItem="Qi7-Np-SbU" secondAttribute="bottom" constant="20" id="oUt-0s-bus"/>
                         <constraint firstItem="mMv-gk-ABM" firstAttribute="leading" secondItem="gTc-LK-g9D" secondAttribute="leading" constant="16" id="oXI-Yc-4s2"/>
                     </constraints>

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/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
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/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: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: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
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/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

+ 71 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/PasswordModify/NewPwdModifyViewController.m

@@ -0,0 +1,71 @@
+//
+//  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:@"修改密码"];
+}
+
+- (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
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/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
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/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

+ 28 - 0
KulexiuForTeacher/KulexiuForTeacher/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

+ 70 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/ForgetPasswordBodyView.m

@@ -0,0 +1,70 @@
+//
+//  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 (nonatomic, copy) ForgetPwdCheckCallback callback;
+@property (weak, nonatomic) IBOutlet UIButton *sureButton;
+
+@end
+
+@implementation ForgetPasswordBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.codeField.delegate = self;
+    NSString *phoneStr = UserDefault(PHONEKEY);
+    self.phoneLabel.text = [phoneStr stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"];
+}
+
++ (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) {
+        NSString *phoneStr = UserDefault(PHONEKEY);
+        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);
+    }
+}
+
+/*
+// 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
KulexiuForTeacher/KulexiuForTeacher/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="pNh-cD-OdH"/>
+            </connections>
+            <point key="canvasLocation" x="67" y="-11"/>
+        </view>
+    </objects>
+</document>

+ 25 - 0
KulexiuForTeacher/KulexiuForTeacher/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

+ 99 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordCheckBodyView.m

@@ -0,0 +1,99 @@
+//
+//  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:@"****"];
+
+}
+
++ (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
KulexiuForTeacher/KulexiuForTeacher/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="C1x-RW-jtK"/>
+                    </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="F2D-Cp-LRT"/>
+                    </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="5eA-LI-KeL"/>
+                <outlet property="pwdField" destination="kFs-PX-hGe" id="AET-w9-7Tw"/>
+                <outlet property="sureButton" destination="aIa-CR-xNy" id="hMM-FR-1Rl"/>
+            </connections>
+            <point key="canvasLocation" x="54" y="-11"/>
+        </view>
+    </objects>
+</document>

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/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

+ 97 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Setting/View/PasswordModify/PasswordModifyBodyView.m

@@ -0,0 +1,97 @@
+//
+//  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:@"****"];
+}
+
++ (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
KulexiuForTeacher/KulexiuForTeacher/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>