1. 修改密码功能介绍
用户在修改密码时需要输入原密码和新密码,
在后台通过uid查询到该用户,并进行原密码的校验,该用户存在且原密码输入正确时,修改密码成功。
2. 持久层
1. 规划sql语句
- 按uid查找用户(判断是否存在该用户):
SELECT * FROM t_user WHERE username = ?,用于设置 - 更改密码:
UPDATE t_user SET password=?WHERE uid=?
2. 编写UserMapper接口
//根据uid修改用户密码
Integer updatePwdByUid(Integer uid, String password, String modifiedUser, Date modifiedTime);
//根据uid查找用户数据
User findByUid(Integer uid);
3. 编写sql映射语句
修改密码时同时要修改modified_user、modified_time:
<update id="updatePwdByUid">
UPDATE t_user
SET password=#{password},modified_user=#{modifiedUser},modified_time=#{modifiedTime}
WHERE uid=#{uid}
</update>
<select id="findByUid" resultMap="UserMap">
SELECT * FROM t_user WHERE uid = #{uid}
</select>
4. 单元测试
- 测试updatePwdByUid
将uid为2的用户密码修改为➡2222
@Test
public void updatePwdByUid() {
userMapper.updatePwdByUid(2,"2222", "administrator", new Date());
}
结果:
2. 测试findByUid
@Test
public void findByUid() {
System.out.println(userMapper.findByUid(2));
}
结果
3. 业务层
1. 规划异常
在更新密码时可能会产生未知的异常,自定义异常类UpdateException继承ServiceException类。
2. 编写IUserService接口的抽象方法
//根据uid修改用户密码
Integer updatePwdByUid(Integer uid, String password, String modifiedUser, Date modifiedTime);
//根据uid查找用户数据
User findByUid(Integer uid);
3. 编写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 PasswordErrorException("原密码输入错误");
}
//将新密码进行加密并设置新密码
String newMD5Password = getMD5Password(newPassword, result.getSalt());
Integer rows = userMapper.updatePwdByUid(uid, newMD5Password, username, new Date());
//判断是否设置成功
if(rows != 1) {
throw new UpdateException();
}
}
4. 单元测试
先注册一个用户,用户名为hery,密码为111;
再修改密码为1111;
使用新密码登录,看是否能够登录成功。
@Test
public void changePassword() {
userService.changePassword(9, "hery", "111", "1111");
}