该系列博客主要记录笔者的开发过程,参考B站系列视频:【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战_哔哩哔哩_bilibili
所用的一些版本信息:
IDEA开发、JDK1.8版本以上、maven3.61版本以上,springboot,DataGrip管理数据库
修改密码页面如下:
1. 修改密码-持久层
1.1 规划执行的SQL语句
语句1:根据用户UID修改用户password的值。
语句2:根据用户UID查询数据。(在修改密码前,首先保证当前用户数据存在,检测是否标记为逻辑删除,检测输入的原始密码是否正确)。
1.2 编写UserMapper接口
在store\src\main\java\com\cy\store\mapper\UserMapper.java中添加如下方法:
/**
* 根据用户uid修改用户密码
* @param uid
* @return 受到影响的行数
* @param password 修改的密码
* @param modifiedUser 修改的执行者
* @param modifiedTime 修改数据的时间
* @return 返回受到影响的行数
*/
Integer updatePasswordByUid(Integer uid,
String password,
String modifiedUser,
String modifiedTime);
/**
* 根据用户id查询用户的数据
* @param uid
* @return 返回User对象,否则返回null
*/
User findByUid(Integer uid);
1.3 SQL的映射
在store\src\main\java\com\cy\store\mapper\UserMapper.java中添加如下映射
<update id="updatePasswordByUid">
UPDATE SET t_user
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>
1.4 单元测试
在 store\src\test\java\com\cy\store\mapper\UserMapperTests.java 下进行测试
@Test
public void updatePasswordByUid(){
userMapper.updatePasswordByUid(1, "666", "管理员", new Date());
}
@Test
public void findByUid(){
System.out.println(userMapper.findByUid(1));
}
2. 修改密码-业务层
2.1 规划异常
1.用户源密码错误,is_delete字段为1,当前用户(uid)找不到
2.在更新时有可能产生未知异常
2.2 设计接口和抽象方法
store\src\main\java\com\cy\store\service\IUserService.java 添加接口如下:
/**
* 修改密码
* @param uid
* @param username
* @param oldPassword
* @param newPasaword
*/
void changePssword(Integer uid,
String username,
String oldPassword,
String newPasaword);
store\src\main\java\com\cy\store\service\impl\UserServiceImpl.java添加实现方法如下:
@Override
public void changePssword(Integer uid, String username, String oldPassword, String newPasaword) {
//查询uid数据是否存在
User result = userMapper.findByUid(uid);
if(result==null || result.getIsDelete() == 1){
throw new UsernameNotFoundException("用户数据不存在");
}
//旧密码比较
String oldMD5Password = getMD5Password(oldPassword,result.getSalt());
if(!result.getPassword().equals(oldMD5Password)){
throw new PasswordNotMatchException("密码错误");
}
//将新的密码设置到数据库中
String newMD5Password = getMD5Password(newPasaword, result.getSalt());
Integer rows = userMapper.updatePasswordByUid(uid, newMD5Password, username, new Date());
if(rows!=1){
throw new UpdateException("更新数据时产生未知异常");
}
}
2.3 单元测试
在store\src\test\java\com\cy\store\service\UserServiceTests.java 进行单元测试
@Test
public void changePssword(){
userService.changePssword(30, "管理员", "123", "321");
}
3. 修改密码-控制层
3.1 处理异常
UpdateException进行配置
store\src\main\java\com\cy\store\controller\BaseController.java 中添加如下异常
3.2 设计请求
url:users/change_password
请求方式:post
请求参数:oldPassword, newPassword, HttpSession
数据响应:JsonResult<Void>
3.3 处理请求
在 store\src\main\java\com\cy\store\controller\UserController.java 编写以下处理请求的代码:
@RequestMapping("change_password")
public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session){
Integer uid = getuidFromSession(session);
String username=getusernameFromSession(session);
userService.changePssword(uid, username, oldPassword, newPassword);
return new JsonResult<Void>(OK);
}
4. 修改密码-前端页面
在password中添加ajax请求的处理
在 store\src\main\resources\static\web\password.html 中修改密码
<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){
console.log(json)
if(json.state == 200){
alert("修改密码成功");
}else{
alert("修改密码失败" + json.message);
}
},
error: function(xhr){
alert("修改密码时产生未知异常" + xhr.message)
}
});
});
</script>