修改密码
需要用户提交原始密码和新密码,再根据当前登录的用户进行信息的修改操作
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);
/**
* 根据用户的eid查询用户的数据
* @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>
<select id="findByUid" resultMap="UserEntityMap">
SELECT * FROM t_user WHERE uid = #{uid}
</select>
UserMapper–修改密码
测试
做单元测试功能测试。
UserMapperTests
@Test
public void updatePasswordByUid(){
Integer rows = userMapper.updatePasswordByUid(7, "321", "管理员", new Date());
System.out.println(rows);
}
@Test
public void findByUid(){
User user = userMapper.findByUid(7);
System.out.println(user);
}
UserMapperTests–修改密码
修改了findByUid的驼峰
2.修改密码-业务层
2.1 规划异常
1.用户的源密码错误,is_delete==1、uid找不到,在用户没有发现的异常。
2.update在更新的时候,有可能产生未知的异常,UpdateException。
UpdateException
package com.cy.store.service.ex;
/** 用户在更新的时产生未知的异常*/
public class UpdateException extends ServiceException{
public UpdateException() {
super();
}
public UpdateException(String message) {
super(message);
}
public UpdateException(String message, Throwable cause) {
super(message, cause);
}
public UpdateException(Throwable cause) {
super(cause);
}
protected UpdateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
UpdateException
2.2 设计接口和抽象方法
执行用户修改密码的核心方法
IUserService
void changePassword(Integer uid,
String username,
String oldPassword,
String newPassword);
UserServiceImpl
@Override
public void changePassword(Integer uid,
String username,
String oldPassword,
String newPassword) {
User result = userMapper.findByUid(uid);
if (result==null||result.getIsDelete()==1){
throw new UserNotFoundException("用户数据不存在");
}
//原始密码和数据库中密码进行比较
String oldMd5Password = getMd5Password(oldPassword, result.getSalt());
if (!result.getPassword().equals(oldMd5Password)){
throw new PasswordNotMatchException("密码错误");
}
//将新的密码设置到数据库中,将新的密码进行加密再去更新
String newMd5Password = getMd5Password(newPassword, result.getSalt());
Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, new Date());
if (rows!=1){
throw new UpdateException("更新数据时产生未知的异常");
}
}
/**
* 定义一个md5算法加密处理
*/
private String getMd5Password(String password,String salt){
//md5 加密算法方法的调用(进行三次加密)
for(int i=0;i<3;i++){
password= DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
}
//返回加密之后的密码
return password;
}
IUserService–changePassword
测试
在单元测试类中编写单元测试方法
@Test
public void changePassword(){
userService.changePassword(8,"test02","123","321");
}
UserServiceTests–changePassword
3.修改密码-控制层
3.1 处理异常
UpdateException需要配置在统一的异常处理方法中。
else if (e instanceof UpdateException){
result.setState(5003);
result.setMessage("更新数据时产生未知的异常");
}
3.2 设计请求
/users.change_password
post
//需要和表单中的name属性值保持一致
String oldPassword,String newPassword,HttpSession session
JSONResult<Void>
3.3 处理请求
@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);
}
测试
http://localhost:8080/users/change_password?oldPassword=321&newPassword=123
4.修改密码-前端页面
password.html中添加ajax请求的处理,不在手动去编写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("密码修改失败!" + json.message);
}
},
error: function (xhr) {
alert("修改密码时产生未知的异常" + xhr.status);
location.href = "login.html";
}
});
});
</script>
README–修改密码