0
点赞
收藏
分享

微信扫一扫

商城项目store 学习小结(6)——修改密码

洛茄 2022-05-02 阅读 26
java学习

修改密码

需要用户提交原始密码和新密码,再根据当前登录的用户进行信息的修改操作

文章目录

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 规划异常


  1. 用户的原密码错误(已经写过)

    查到用户 is_delete=1、uid找不到,这些在用户没有发现的异常

  2. 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>

举报

相关推荐

0 条评论