ユーザーがパスワードを変更するときに実行する必要がある SQL ステートメントは、大まかに次のとおりです。
UPDATE t_user SET password=?, modified_user=?, modified_time=? WHERE uid=?
パスワードを変更する前に、ユーザー データが存在するかどうかも確認し、ユーザー データが次のようにマークされているかどうかも確認する必要があります。
SELECT * FROM t_user WHERE uid=?
Add updatePasswordByUid(Integer uid, UserMapper インターフェイスの文字列パスワード、文字列変更ユーザー、日付変更時刻) 抽象メソッド。
アノテーションを使用して XML 構成を簡素化する場合、 @Param アノテーションを使用してパラメータに名前を付けます。パラメータに名前を付けた後、その名前とパラメータに基づいてパラメータ値を取得できます。 SQL ステートメントに正しく渡すことができます。 @Param("パラメータ名") アノテーション内のパラメータ名は、SQL ステートメント内の #{パラメータ名} のパラメータ名と一致している必要があります。
/** * 根据uid更新用户的密码 * @param uid 用户的id * @param password 新密码 * @param modifiedUser 最后修改执行人 * @param modifiedTime 最后修改时间 * @return 受影响的行数 */ Integer updatePasswordByUid( @Param("uid") Integer uid, @Param("password") String password, @Param("modifiedUser") String modifiedUser, @Param("modifiedTime") Date modifiedTime); /** * 根据用户id查询用户数据 * @param uid 用户id * @return 匹配的用户数据,如果没有匹配的用户数据,则返回null */ User findByUid(Integer uid);
1. UserMapper.xml で updatePasswordByUid() および findByUid() 抽象メソッドのマッピングを構成します。
<!-- 根据uid更新用户的密码: Integer updatePasswordByUid( @Param("uid") Integer uid, @Param("password") String password, @Param("modifiedUser") String modifiedUser, @Param("modifiedTime") Date modifiedTime) --> <update id="updatePasswordByUid"> UPDATE t_user SET password = #{password}, modified_user = #{modifiedUser}, modified_time = #{modifiedTime} WHERE uid = #{uid} </update> <!-- 根据用户id查询用户数据:User findByUid(Integer uid) --> <select id="findByUid" resultMap="UserEntityMap"> SELECT * FROM t_user WHERE uid = #{uid} </select>
2. UserMapperTests で単体テストを作成して実行します。
@Test public void updatePasswordByUid() { Integer uid = 7; String password = "123456"; String modifiedUser = "超级管理员"; Date modifiedTime = new Date(); Integer rows = userMapper.updatePasswordByUid(uid, password, modifiedUser, modifiedTime); System.out.println("rows=" + rows); } @Test public void findByUid() { Integer uid = 7; User result = userMapper.findByUid(uid); System.out.println(result); }
パスワードを変更する前に、まずユーザー データが存在し、「」マークが付いていないかどうかを確認する必要があります。削除されました" "。チェックが失敗した場合は、UserNotFoundException がスローされる必要があります。
2. ユーザーがパスワードを変更すると、入力された元のパスワードが正しくないために変更が失敗する可能性があり、PasswordNotMatchException 例外がスローされます。
パスワード変更時に影響を受ける行数が予期した値と異なる場合は、UpdateException がスローされます。
4. ServiceException クラスを継承する com.cy.store.service.ex.UpdateException 例外クラスを作成します。
/** 更新数据的异常 */ public class UpdateException extends ServiceException { // Override Methods... }
changePassword(Integer uid, String username, String oldPassword, String newPassword) 抽象メソッドを IUserService に追加します。
/** * 修改密码 * @param uid 当前登录的用户id * @param username 用户名 * @param oldPassword 原密码 * @param newPassword 新密码 */ public void changePassword(Integer uid, String username, String oldPassword, String newPassword);
1. UserServiceImpl クラスに、changePassword() 抽象メソッドを実装します。
public void changePassword(Integer uid, String username, String oldPassword, String newPassword) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 // 检查查询结果是否为null // 是:抛出UserNotFoundException异常 // 检查查询结果中的isDelete是否为1 // 是:抛出UserNotFoundException异常 // 从查询结果中取出盐值 // 将参数oldPassword结合盐值加密,得到oldMd5Password // 判断查询结果中的password与oldMd5Password是否不一致 // 是:抛出PasswordNotMatchException异常 // 将参数newPassword结合盐值加密,得到newMd5Password // 创建当前时间对象 // 调用userMapper的updatePasswordByUid()更新密码,并获取返回值 // 判断以上返回的受影响行数是否不为1 // 是:抛了UpdateException异常 }
2.changePassword() メソッドの特定のコード。
String の equals メソッドと contentEquals メソッドを使用して、String オブジェクトの内容が同じかどうかを比較できます。
@Override public void changePassword(Integer uid, String username, String oldPassword, String newPassword) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 User result = userMapper.findByUid(uid); // 检查查询结果是否为null if (result == null) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 检查查询结果中的isDelete是否为1 if (result.getIsDelete().equals(1)) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 从查询结果中取出盐值 String salt = result.getSalt(); // 将参数oldPassword结合盐值加密,得到oldMd5Password String oldMd5Password = getMd5Password(oldPassword, salt); // 判断查询结果中的password与oldMd5Password是否不一致 if (!result.getPassword().contentEquals(oldMd5Password)) { // 是:抛出PasswordNotMatchException异常 throw new PasswordNotMatchException("原密码错误"); } // 将参数newPassword结合盐值加密,得到newMd5Password String newMd5Password = getMd5Password(newPassword, salt); // 创建当前时间对象 Date now = new Date(); // 调用userMapper的updatePasswordByUid()更新密码,并获取返回值 Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, now); // 判断以上返回的受影响行数是否不为1 if (rows != 1) { // 是:抛出UpdateException异常 throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员"); } }
3. UserServiceTests で単体テストを作成して実行します。
@Test public void changePassword() { try { Integer uid = 5; String username = "lower"; String oldPassword = "123456"; String newPassword = "888888"; userService.changePassword(uid, username, oldPassword, newPassword); System.out.println("密码修改成功!"); } catch (ServiceException e) { System.out.println("密码修改失败!" + e.getClass().getSimpleName()); System.out.println(e.getMessage()); } }
ユーザーのパスワード変更の際に、新しい UpdateException 例外がスローされます。これは BaseController に含める必要があります。処理するためのクラス。
@ExceptionHandler(ServiceException.class) public JsonResult<Void> handleException(Throwable e) { JsonResult<Void> result = new JsonResult<Void>(e); if (e instanceof UsernameDuplicateException) { result.setState(4000); } else if (e instanceof UserNotFoundException) { result.setState(4001); } else if (e instanceof PasswordNotMatchException) { result.setState(4002); } else if (e instanceof InsertException) { result.setState(5000); } else if (e instanceof UpdateException) { result.setState(5001); } return result; }
ユーザーが送信したリクエストを設計し、応答を設計します。
リクエスト パス:/users/change_password
リクエスト パラメータ: String oldPassword、String newPassword、HttpSession session
リクエスト タイプ: POST
レスポンス結果: JsonResult
1. リクエストを処理するためのchangePassword(String oldPassword, String newPassword, HttpSession session)メソッドをUserControllerクラスに追加します。
@RequestMapping("change_password") public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) { // 调用session.getAttribute("")获取uid和username // 调用业务对象执行修改密码 // 返回成功 return null; }
2. UserController コントローラーでパスワード メソッドを変更するコードを実装します。
@RequestMapping("change_password") public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) { // 调用session.getAttribute("")获取uid和username Integer uid = getUidFromSession(session); String username = getUsernameFromSession(session); // 调用业务对象执行修改密码 iUserService.changePassword(uid, username, oldPassword, newPassword); // 返回成功 return new JsonResult<Void>(OK); }
3. まずログインしてプロジェクトを開始し、次にテストのために http://localhost:8080/users/change_password?oldPassword=xx&newPassword=xx にアクセスします。
1.password.html ページの body タグの最後に、JavaScript プログラムを作成するための script タグを追加します。
<script type="text/javascript"> $("#btn-change-password").click(function() { $.ajax({ url: "/users/change_password", type: "POST", data: $("#form-change-password").serialize(), dataType: "json", success: function(json) { if (json.state == 200) { alert("修改成功!"); } else { alert("修改失败!" + json.message); } } }); }); </script>
2. まずログインしてプロジェクトを開始し、次に http://localhost:8080/web/password.html ページにアクセスしてパスワードを変更します。
質問: データがバックグラウンドに正常に転送できない場合は、システムと IDEA 開発ツールを再起動し、ログイン後にパスワードを変更できます。
3. 問題: フロントエンド ページを操作するときに、ユーザーがパスワード変更ページに入り、何も操作せずに現在のページに長時間滞在すると、ログイン情報が失われます。期限切れ。この時点で変更ボタンをクリックすると、リクエストは引き続き /users/change_password に送信され、インターセプターによってログイン ページにリダイレクトされます。 $.ajax() 関数により処理全体が非同期で処理されるため、リダイレクトも非同期タスクで完了します ページ上でパフォーマンスが無い場合、「ユーザーのログイン情報がタイムアウトした後、ボタンをクリックしても何も起こりません」という質問が出てきます。
解決策:password.html ページの $.ajax() に error 属性の設定を追加できます。この属性の値はコールバック関数です。この関数は、サーバーが 302、400、404、405、500 などの正常に応答しないステータス コードを返したときに呼び出されます。
error: function (xhr) { alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status); location.href = "login.html"; }
1。ユーザーを実行して変更する 個人データの SQL ステートメントは大まかに次のとおりです:
UPDATE t_user SET phone=?, email=?, gender=?, modified_user=?, modified_time=? WHERE uid=?
ユーザーがデータを変更するためにページを開く前に、検証を容易にするために、現在ログインしているユーザーの情報がページに表示される必要があります。データ変更操作を実行する前に。ユーザー情報は次の方法で表示できます:
SELECT * FROM t_user WHERE uid=?
説明:
1. このクエリ関数は実装されているため、再度開発する必要はありません;
在进行用户资料修改前,还需要进行检查,判断用户数据是否存在、是否被标记为“已删除”,以上查询也可以用来实现这一操作。
在UserMapper接口中添加updateInfoByUid(User user)方法。
/** * 根据uid更新用户资料 * @param user 封装了用户id和新个人资料的对象 * @return 受影响的行数 */ Integer updateInfoByUid(User user);
1.在UserMapper.xml中配置Integer updateInfoByUid(User user)抽象方法的映射。
<!-- 根据uid更新用户个人资料:Integer updateInfoByUid(User user) --> <update id="updateInfoByUid"> UPDATE t_user SET <if test="phone != null">phone = #{phone},</if> <if test="email != null">email = #{email},</if> <if test="gender != null">gender = #{gender},</if> modified_user = #{modifiedUser}, modified_time = #{modifiedTime} WHERE uid = #{uid} </update>
2.在UserMapperTests中编写并执行单元测试。
@Test public void updateInfoByUid() { User user = new User(); user.setUid(20); user.setPhone("17858802222"); user.setEmail("admin@cy.com"); user.setGender(1); user.setModifiedUser("系统管理员"); user.setModifiedTime(new Date()); Integer rows = userMapper.updateInfoByUid(user); System.out.println("rows=" + rows); }
1.关于用户修改个人资料是由两个功能组成的。
打开页面时显示当前登录的用户的信息;
点击修改按钮时更新用户的信息。
2.关于打开页面时显示当前登录的用户的信息,可能会因为用户数据不存在、用户被标记为“已删除”而无法正确的显示页面,则抛出UserNotFoundException异常。
3.关于点击修改按钮时更新用户的信息,在执行修改资料之前仍需再次检查用户数据是否存在、用户是否被标记为“已删除”,则可能抛出UserNotFoundException异常。在修改资料时,可能会发生UpdateException异常。
在IUserService接口中添加两个抽象方法,分别对应以上两个功能。
/** * 获取当前登录的用户的信息 * @param uid 当前登录的用户的id * @return 当前登录的用户的信息 */ User getByUid(Integer uid); /** * 修改用户资料 * @param uid 当前登录的用户的id * @param username 当前登录的用户名 * @param user 用户的新的数据 */ void changeInfo(Integer uid, String username, User user);
1.在UserServiceImpl实现类中实现getByUid(Integer uid)和changeInfo(Integer uid, String username, User user)以上两个抽象方法。
@Override public User getByUid(Integer uid) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 // 判断查询结果是否为null // 是:抛出UserNotFoundException异常 // 判断查询结果中的isDelete是否为1 // 是:抛出UserNotFoundException异常 // 创建新的User对象 // 将以上查询结果中的username/phone/email/gender封装到新User对象中 // 返回新的User对象 return null; } @Override public void changeInfo(Integer uid, String username, User user) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 // 判断查询结果是否为null // 是:抛出UserNotFoundException异常 // 判断查询结果中的isDelete是否为1 // 是:抛出UserNotFoundException异常 // 向参数user中补全数据:uid // 向参数user中补全数据:modifiedUser(username) // 向参数user中补全数据:modifiedTime(new Date()) // 调用userMapper的updateInfoByUid(User user)方法执行修改,并获取返回值 // 判断以上返回的受影响行数是否不为1 // 是:抛出UpdateException异常 }
2.getByUid(Integer uid)和changeInfo(Integer uid, String username, User user)方法的具体代码实现。
@Override public User getByUid(Integer uid) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 User result = userMapper.findByUid(uid); // 判断查询结果是否为null if (result == null) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 判断查询结果中的isDelete是否为1 if (result.getIsDelete().equals(1)) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 创建新的User对象 User user = new User(); // 将以上查询结果中的username/phone/email/gender封装到新User对象中 user.setUsername(result.getUsername()); user.setPhone(result.getPhone()); user.setEmail(result.getEmail()); user.setGender(result.getGender()); // 返回新的User对象 return user; } @Override public void changeInfo(Integer uid, String username, User user) { // 调用userMapper的findByUid()方法,根据参数uid查询用户数据 User result = userMapper.findByUid(uid); // 判断查询结果是否为null if (result == null) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 判断查询结果中的isDelete是否为1 if (result.getIsDelete().equals(1)) { // 是:抛出UserNotFoundException异常 throw new UserNotFoundException("用户数据不存在"); } // 向参数user中补全数据:uid user.setUid(uid); // 向参数user中补全数据:modifiedUser(username) user.setModifiedUser(username); // 向参数user中补全数据:modifiedTime(new Date()) user.setModifiedTime(new Date()); // 调用userMapper的updateInfoByUid(User user)方法执行修改,并获取返回值 Integer rows = userMapper.updateInfoByUid(user); // 判断以上返回的受影响行数是否不为1 if (rows != 1) { // 是:抛出UpdateException异常 throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员"); } }
3.在UserServiceTests类中进行单元测试。
@Test public void getByUid() { try { Integer uid = 20; User user = iUserService.getByUid(uid); System.out.println(user); } catch (ServiceException e) { System.out.println(e.getClass().getSimpleName()); System.out.println(e.getMessage()); } } @Test public void changeInfo() { try { Integer uid = 20; String username = "数据管理员"; User user = new User(); user.setPhone("15512328888"); user.setEmail("admin03@cy.cn"); user.setGender(2); iUserService.changeInfo(uid, username, user); System.out.println("OK."); } catch (ServiceException e) { System.out.println(e.getClass().getSimpleName()); System.out.println(e.getMessage()); } }
说明:无需再次开发。
1.设计用户提交显示当前登录的用户信息的请求,并设计响应的方式。
请求路径:/users/get_by_uid
请求参数:HttpSession session
请求类型:GET
响应结果:JsonResult
2.设计用户提交执行修改用户信息的请求,并设计响应的方式。
请求路径:/users/change_info
请求参数:User user, HttpSession session
请求类型:POST
响应结果:JsonResult
1.处理获取用户信息请求
1.在UserController类中添加处理请求的getByUid()方法,并导入org.springframework.web.bind.annotation.GetMapping包。
@GetMapping("get_by_uid") public JsonResult<User> getByUid(HttpSession session) { // 从HttpSession对象中获取uid // 调用业务对象执行获取数据 // 响应成功和数据 return null; }
2.getByUid(HttpSession session)方法中具体代码实现为。
@GetMapping("get_by_uid") public JsonResult<User> getByUid(HttpSession session) { // 从HttpSession对象中获取uid Integer uid = getUidFromSession(session); // 调用业务对象执行获取数据 User data = userService.getByUid(uid); // 响应成功和数据 return new JsonResult<User>(OK, data); }
3.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/users/get_by_uid请求进行测试。
2.处理修改用户个人信息请求
1.在UserController类中添加处理请求的changeInfo(User user, HttpSession session)方法。
@RequestMapping("change_info") public JsonResult<Void> changeInfo(User user, HttpSession session) { // 从HttpSession对象中获取uid和username // 调用业务对象执行修改用户资料 // 响应成功 return null; }
2.changeInfo(User user, HttpSession session)方法中具体代码实现为。
@RequestMapping("change_info") public JsonResult<Void> changeInfo(User user, HttpSession session) { // 从HttpSession对象中获取uid和username Integer uid = getUidFromSession(session); String username = getUsernameFromSession(session); // 调用业务对象执行修改用户资料 userService.changeInfo(uid, username, user); // 响应成功 return new JsonResult<Void>(OK); }
3.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/users/change_info?phone=17858800000&email=admin07@cy.com&gender=1进行测试。
1.在userdata.html页面中body标签内部的最后,添加script标签用于编写JavaScript程序。
<script type="text/javascript"> $(document).ready(function() { $.ajax({ url: "/users/get_by_uid", type: "GET", dataType: "json", success: function(json) { if (json.state == 200) { console.log("username=" + json.data.username); console.log("phone=" + json.data.phone); console.log("email=" + json.data.email); console.log("gender=" + json.data.gender); $("#username").val(json.data.username); $("#phone").val(json.data.phone); $("#email").val(json.data.email); let radio = json.data.gender == 0 ? $("#gender-female") : $("#gender-male"); radio.prop("checked", "checked"); } else { alert("获取用户信息失败!" + json.message); } } }); }); $("#btn-change-info").click(function() { $.ajax({ url: "/users/change_info", type: "POST", data: $("#form-change-info").serialize(), dataType: "json", success: function(json) { if (json.state == 200) { alert("修改成功!"); location.href = "login.html"; } else { alert("修改失败!" + json.message); } }, error: function(xhr) { alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status); location.href = "login.html"; } }); }); </script>
2.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/web/userdata.html页面并进行用户个人资料的修改测试。
以上がSpringboot ユーザーデータを変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。