사용자가 비밀번호를 변경할 때 실행해야 하는 SQL 문은 대략 다음과 같습니다.
UPDATE t_user SET password=?, modified_user=?, modified_time=? WHERE uid=?
비밀번호 변경을 실행하기 전에 사용자 데이터가 존재하는지, 사용자 데이터가 "삭제됨"으로 표시되어 있는지 확인하고, 원래 비밀번호가 올바른지 확인해야 합니다. 이러한 확인은 사용자 데이터를 쿼리하여 도움을 받을 수 있습니다.
1.2 인터페이스 및 추상 메서드 는 UserMapper 인터페이스에 updatePasswordByUid(Integer uid, String Password, String ModifiedUser, Date ModifiedTime) 추상 메서드를 추가합니다.주석을 사용하여 XML 구성을 단순화하는 경우 @Param 주석을 사용하여 매개변수 이름을 지정한 후 이름을 기반으로 매개변수 값을 얻을 수 있으며 매개변수는 매개변수에 올바르게 전달될 수 있습니다. SQL 문. @Param("매개변수 이름") 주석의 매개변수 이름은 sql 문의 #{매개변수 이름} 매개변수 이름과 일치해야 합니다.1.3 SQL 매핑 구성1 UserMapper.xml에서 updatePasswordByUid() 및 findByUid() 추상 메서드의 매핑을 구성합니다.SELECT * FROM t_user WHERE uid=?
/** * 根据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);2. UserMapperTests에서 단위 테스트를 작성하고 실행합니다.
<!-- 根据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 사용자-비밀번호 변경-비즈니스 레이어2.1 계획 예외비밀번호를 변경하기 전에 먼저 사용자 데이터가 존재하는지, "삭제됨"으로 표시되지 않았는지 확인해야 합니다. 검사가 실패하면 UserNotFoundException이 발생해야 합니다. 2. 사용자가 비밀번호를 변경하면 입력한 원래 비밀번호가 올바르지 않아 수정이 실패할 수 있으며 PasswordNotMatchException이 발생해야 합니다. 암호 변경 시 영향을 받는 행 수가 예상 값과 다른 경우 UpdateException이 발생해야 합니다. 4. ServiceException 클래스에서 상속되는 com.cy.store.service.ex.UpdateException 예외 클래스를 만듭니다.
@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); }2.2 인터페이스 및 추상 메서드IUserService에 ChangePassword(Integer uid, String username, String oldPassword, String newPassword) 추상 메서드를 추가합니다.
/** 更新数据的异常 */ public class UpdateException extends ServiceException { // Override Methods... }2.3 추상 메서드 구현1. UserServiceImpl 클래스에 ChangePassword() 추상 메서드를 구현합니다.
/** * 修改密码 * @param uid 当前登录的用户id * @param username 用户名 * @param oldPassword 原密码 * @param newPassword 新密码 */ public void changePassword(Integer uid, String username, String oldPassword, String newPassword);2.changePassword() 메소드의 특정 코드입니다.
String의 equals 및 contentEquals 메소드를 사용하면 String 객체의 내용이 동일한지 비교할 수 있습니다.3. UserServiceTests에서 단위 테스트를 작성하고 실행합니다.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异常 }
@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 User-Change Password-Controller3.1 예외 처리사용자가 비밀번호를 변경하는 비즈니스에서 새로운 UpdateException 예외가 발생했으며, 이는 BaseController 클래스에서 처리되어야 합니다.
@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()); } }3.2 디자인 요청사용자가 제출한 요청을 디자인하고 응답 방법을 디자인하세요.
요청 경로:/users/change_password3.3 요청 처리1. 요청을 처리하는 ChangePassword(String oldPassword, String newPassword, HttpSession session) 메서드.요청 매개변수: String oldPassword, String newPassword, HttpSession session
요청 유형: POST
응답 결과: JsonResult903bf37051cf83cbd9686768ac0189ae
@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; }2. UserController 컨트롤러에서 비밀번호 방법을 변경하는 코드를 구현합니다.
@RequestMapping("change_password") public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) { // 调用session.getAttribute("")获取uid和username // 调用业务对象执行修改密码 // 返回成功 return null; }3 먼저 로그인하여 프로젝트를 시작한 다음 http://localhost:8080/users/change_password?oldPassword=xx&newPassword=xx를 방문하여 테스트하세요. 4 사용자-비밀번호 변경-프런트엔드 페이지1.password.html 페이지의 body 태그 끝에 JavaScript 프로그램 작성을 위한 script 태그를 추가합니다.
@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); }2. 먼저 로그인하여 프로젝트를 시작한 후 http://localhost:8080/web/password.html 페이지에 접속하여 비밀번호를 변경하세요.
질문: 데이터가 백그라운드로 정상적으로 전송되지 않는 경우 시스템 및 IDEA 개발 도구를 다시 시작한 후 로그인 후 비밀번호를 변경할 수 있습니다.3. 문제: 프런트엔드 페이지를 운영할 때 사용자가 비밀번호 변경 페이지에 들어가서 아무런 작업도 수행하지 않고 오랫동안 현재 페이지에 머물러 있어 로그인 정보가 만료됩니다. 이때 수정 버튼을 클릭하면 요청은 여전히 /users/change_password로 전송되고 인터셉터에 의해 로그인 페이지로 리디렉션됩니다. $.ajax() 함수에 의해 전체 프로세스가 비동기적으로 처리되므로 리디렉션도 비동기 작업에 의해 완료됩니다. 페이지에 성능이 없으면 "사용자의 로그인 정보 시간이 초과된 후 버튼을 클릭해도 아무 일도 일어나지 않습니다." 질문이 나타납니다.
해결 방법: Password.html 페이지의 $.ajax()에 오류 속성 구성을 추가할 수 있습니다. 이 속성의 값은 콜백 함수입니다. 이 함수는 서버가 302, 400, 404, 405, 500 등과 같이 정상적으로 응답하지 않는 상태 코드를 반환할 때 호출됩니다.Personal Data1 User-Personal Data-Persistence Layer1.1 실행해야 할 SQL 문을 계획합니다1 SQL 문을 실행하여 사용자의 개인 데이터를 대략 수정합니다.<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>
error: function (xhr) { alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status); location.href = "login.html"; }페이지 열기 사용자가 데이터를 수정하는 곳 기존에는 데이터 수정 작업을 수행하기 전에 현재 로그인된 사용자의 정보를 페이지에 표시하여 확인해야 했습니다. 사용자 정보는 다음을 통해 표시될 수 있습니다:
UPDATE t_user SET phone=?, email=?, gender=?, modified_user=?, modified_time=? 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
响应结果:JsonResult4c8e0c17c3bd7e0081bb17cc795e1984
2.设计用户提交执行修改用户信息的请求,并设计响应的方式。
请求路径:/users/change_info
请求参数:User user, HttpSession session
请求类型:POST
响应结果:JsonResult903bf37051cf83cbd9686768ac0189ae
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!