修改密码
需要用户提交原始密码和新密码,再根据当前登录的用户进行信息的修改操作
文章目录
1. 修改密码-持久层
1.1 规划需要执行的sql语句
根据用户的uid修改用户的password值
update t_user set password=?,modified_user=?,modified_time=? where uid=?
根据uid查询用户的数据。
在修改密码之前,首先要保证当前用户的数据存在,检测是否被标记为已删除、检测输入的原始密码是否正确
select * from t_user where uid=?
1.2 设计接口和抽象方法
在 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 如果找到则返回用户对象,反之返回null
*/
User findByUid(Integer uid);
1.3 SQL的映射
配置到映射文件 UserMapper.xml 中
<update id="updatePasswordByUid">
update t_user set
password=#{password},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
where uid=#{uid}
</update>
<!--User findByUid(Integer uid);-->
<select id="findByUid" resultMap="UserEntityMap">
select * from t_user where uid=#{uid}
</select>
做单元测试、功能测试:
@Test
public void updatePasswordByUid(){
userMapper
.updatePasswordByUid(4,321,"管理员",new Date());
}
@Test
public void findByUid(){
User byUid = userMapper.findByUid(4);
System.out.println(byUid);
}
2. 修改密码-业务层
2.1 规划异常
-
用户的原密码错误(已经写过)
查到用户 is_delete=1、uid找不到,这些在用户没有发现的异常
-
update 在更新的时候,有可能产生未知的异常,UpdateException
UpdateException 继承ServiceException方法并重写其中的五个方法
2.2 设计接口和抽象方法
执行用户修改密码的核心方法,UserService
/**
* 用户修改密码
* @param uid 用户id
* @param username 用户名
* @param oldPassword 老密码
* @param newPassword 新密码
*/
void changePassword(Integer uid,String username,
String oldPassword,String newPassword);
在实现类中实现当前的抽象方法,UserServiceImpl
@Override
public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
User user = userMapper.findByUid(uid);
if (user == null || user.getIsDelete()==1){
throw new UserNotFoundException("用户数据不存在");
}
//原始密码和数据库中的密码进行比较
String oldMd5Password = getPasswordMD5(oldPassword,user.getSalt());
if (!user.getPassword().equals(oldMd5Password)){
throw new PasswordNotMatchException("密码错误");
}
//将新的密码设置到数据库中去,先加密再更新
String newPasswordMD5 = getPasswordMD5(newPassword, user.getSalt());
user.setPassword(newPasswordMD5);
Integer rows = userMapper.updatePasswordByUid(uid, newPasswordMD5, username, new Date());
if (rows != 1){
throw new UpdateException("更新数据时产生未知异常");
}
}
在单元测试类中 UserServiceTests 中编写测试方法:
@Test
public void changePassword(){
userService.changePassword(5,"nisi","123","321");
}
3. 修改密码-控制层
3.1 处理异常
新增的异常 UpdateException 需要配置在统一的异常处理方法中
在BaseController统一的异常处理方法中添加:
else if (e instanceof UpdateException){
result.setState(5001);
result.setMessage("更新数据时产生未知的异常");
}
3.2 设计请求
请求路径:/users/change_password
请求方法:post
请求参数:String oldPassword,String newPassword,HttpSession session //需要和表单中的name属性值保持一致
数据响应:JsonResult<void>
3.3 处理请求
@RequestMapping("/change_password")
public JsonResult<Void> updatePassword(String oldPassword,
String newPassword,
HttpSession session){
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
userService.changePassword(uid,username,oldPassword,newPassword);
return new JsonResult<>(OK);
}
4. 修改密码-前端页面
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>