用户-修改密码-持久层
1.1 规划需要执行的SQL语句
用户修改密码时需要执行的SQL语句大致是:
update t_user set password =?,modified_user=?,modified_time=? where uid=?
在执行修改密码之前,还应检查用户数据是否存在、并检查用户数据是否被标记为“已删除”、并检查原密码是否正确,这些检查都可以通过查询用户数据来辅助完成:
SELECT * FROM t_user WHERE uid=?
1.2 接口与抽象方法
在UserMapper接口添加updatePasswordByUid(Integer uid,String password,String
modifiedUser,Date modifiedTime)抽象方法。
/*** 根据id修改用户密码* @param uid 用户id* @param password 新密码* @param modifiedUser 修改的执行者* @param modifiedTime 修改时间* @return 返回值受影响的行数*/Integer updatePasswordByUid(@Param("uid") Integer uid,@Param("password") String password,@Param("modifiedUser") String modifiedUser,@Param("modifiedTime") Date modifiedTime);/*** * 根据用户id查询用户的数据* @param uid 用户id* @return 如果找到则返回对象,反之返回null*/User findByUid(Integer uid);
1.3 配置SQL映射
在UserMapper.xml中配置updatePasswordByUid()、findByUid()抽象方法的映射。
<update id="updatePasswordByUid">update store.t_user set password =#{password},modified_user=#{modified_user},modified_time=#{modified_time} where uid=${uid}</update><select id="findByUid" resultMap="UserEntityMap">SELECT * FROM store.t_user WHERE uid=#{uid}</select>
1.3 单元测试
@Testpublic void updatePasswordByUid() {usermapper.updatePasswordByUid(9, "31","管理员", new Date());
}@Testpublic void findByUid(){System.out.println(usermapper.findByUid(9));}
用户-修改密码-业务层
1 、规划异常
1.1 原密码错误,is_delete == 1,uid找不到
1.2 updata更新时可能会产生异常
创建com.cy.store.service.ex.UpdateException异常类,继承自ServiceException类。
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);}
}
2、 接口与抽象方法
在IUserService中添加changePassword(Integer uid, String username, String oldPassword, String newPassword)抽象方法
void changePassword(Integer uid, String username, String oldPassword, String newPassword);
3、实现抽象方法
1.在UserServiceImpl类中实现changePassword()抽象方法。
@Overridepublic 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 newMd5Passwprd = getMD5Password(newPassword, result.getSalt());Integer rows = usermapper.updatePasswordByUid(uid, newMd5Passwprd, username, new Date());if (rows!=1){throw new UpdateException("更新数据时产生未知异常");}}
4、在UserServiceTests中编写并执行单元测试。
@Testpublic void changePassword(){userService.changePassword(8,"杨波","123", "321");}
用户-修改密码-控制层
1、处理异常
在用户修改密码的业务中抛出了新的UpdateException异常,需要在BaseController类中进行处理。
else if(e instanceof UpdateException) {result.setState(5001);result.setMessage("更新数据时产生未知的异常");}
2、设计请求
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);}
用户-修改密码-前端页面
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("密码修改成功")//跳转到系统主页index.html//相对路径来确定跳转的页面location.href="index.html";}else alert("密码修改失败");},error:function (xhr) {alert("密码修改时产生未知异常"+xhr.message);}});});</script>