用户修改密码时需要用户提交原始密码和新密码,再根据当前登录的用户进行信息的修改操作。
修改密码-持久层
规划需要执行的SQL语句
根据t_user表中已存在的用户uid修改用户password值。
update t_user set password?, modified_user=?, modified_time? where uid=?
根据uid查询用户的数据,在修改密码之前,首先要保证当前用户的数据存在,检测是否被标记为已经删除、检测输入的原始密码是否正确。
select * from t_user where uid = ?
设计接口和抽象方法
UserMapper接口,将以上的两个方法的抽象定义出来,将来映射到SQL语句上。
/**
* 根据用户的uid来修改用户密码
* @param uid 用户的id
* @param password 用户输入的新密码
* @param modifiedUser 修改的执行者
* @param modifiedTime 修改数据的时间
* @return 返回值为受影响的行数
*/
Integer updatePasswordByUid(Integer uid,
String password,
String modifiedUser,
Date modifiedTime);
/**
* 根据用户id查询用户数据
* @param uid 用户的id
* @return 如果找到返回对象(User),反之返沪一null值
*/
User findByUid(Integer uid);
SQL的映射
配置到映射文件UserMapper.xml中
<update id="updatePasswordByUid">
UPDATE t_user SET
password=#{password},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
WHERE uid=#{uid}
</update>
<select id="findByUid" resultMap="UserEntityMap">
SELECT * FROM t_user WHERE uid = #{uid}
</select>
单元测试
UserMapperTests.java中做单元测试功能测试。
@Test
public void updatePasswordByUid() {
userMapper.updatePasswordByUid(9, "321","管理员", new Date());
}
@Test
public void findByUid() {
System.out.println(userMapper.findByUid(9));
}
修改密码-业务层
规划异常
- 用户的原密码错误,is_delete==1、uid找不到,在用户没有发现的异常
- update异常:在更新的时候,有可能产生未知的异常。
设计接口和抽象方法
执行用户修改密码的核心方法的设计
void changePassword(Integer uid,
String username,
String oldPasword,
String newPasword);
在实现类中实现当前的抽象方法
@Override
public void changePassword(Integer uid, String username, String oldPasword, String newPasword) {
User result = userMapper.findByUid(uid);
if (null == result || result.getIsDelete() == 1) {
throw new UserNotFoundException("用户数据不存在");
}
// 原始密码和数据库中的密码进行比较
String oldMd5Password = getMD5Password(oldPasword, result.getSalt());
if (!result.getPassword().equals(oldMd5Password)) {
throw new PasswordNotMatchException("密码错误");
}
// 将新密码设置到数据库中,将新密码进行加密再去更新
String newMd5Password = getMD5Password(newPasword,result.getSalt());
Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, new Date());
if (rows!= 1) {
throw new UpdateException("更新时产生未知的异常");
}
}
单元测试
测试方法changePassword,用户和密码是其他的,专门用于测试。
@Test
public void changePassword() {
userService.changePassword(14, "admin01", "123", "789");
}
修改密码-控制层
处理异常
UpdateException需要配置在统一的异常处理方法中。
else if (e instanceof UpdateException) {
result.setState(5003);
result.setMessage("更新数据时产生未知的异常");
}
设计请求
请求路径:/users/change_password
请求方式:post
请求数据:String oldpassword, String newPassword, HttpSession session // 需要和表单中的name属性保持一致
响应结果:JsonResult<void>
处理请求
@RequestMapping("change_password")
public JsonResult<Void> changePassword(String oldPassword,
String newPassword,
HttpSession session) {
Integer uid = getuidFromSession(session);
String username = getUsernameFromSession(session);
userService.changePassword(uid, username, oldPassword, newPassword);
return new JsonResult<>(OK);
}
修改密码-前端页面
password.html中添加ajax请求的处理。
<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("密码修改失败");
}
},
error: function (xhr) {
alert("修改密码时产生未知的异常" + xhr.message);
}
});
});
</script>
重启项目,登录页面进行验证即可。