springboot电脑商城项目 4.用户修改资料

4.用户修改资料

修改密码

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

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语句上

/**
     * 根据用户id修改用户密码
     * @param uid 用户id
     * @param password 用户输入的新密码
     * @param modifiedUser 表示修改的执行者
     * @param modifiedTime 表示修改数据的时间
     * @return 返回值为受影响的行数
     */
Integer updatePasswordById(Integer uid,
                           String password,
                           String modifiedUser,
                           Date modifiedTime);

/**
     * 根据用户的uid查询用户的数据
     * @param uid 用户的uid
     * @return 如果找到则返回对象,反之返回null
     */
User findUserById(Integer uid);
1.3 SQL的映射

配置到映射文件,UserMapper.xml中。

<update id="updatePasswordById">
    UPDATE t_user set
    	password = #{password},
    	modified_user = #{modifiedUser} ,
    	modified_time = #{modifiedTime}
    where
    	uid = #{uid}
</update>

<select id="findUserById" resultMap="UserEntityMap">
    select
    	<include refid="User_field"></include>
    from
    	t_user
    where
    	uid = #{uid}
</select>

单元测试

@Test
public void UpdatePasswordById(){
    Integer result = userMapper.updatePasswordById(24, "321", "管理员", new Date());
    System.out.println(result);
}

@Test
public void findUserById(){
    User userById = userMapper.findUserById(24);
    System.err.println(userById.getModifiedTime());
    System.err.println(userById);
}

2.修改密码-业务层

2.1 规划异常

1.用户的原密码错误(PasswordNotMatchExecption),is_delete == 1、uid找不到,该用户找不到异常(UserNotFoundException)。

2.update在更新的时候,有可能产生未知的异常,UpdateException。

2.2 设计接口和抽象方法

执行用户修改密码的核心方法

void changePassword(Integer uid,
                    String username,
                    String oldPassword,
                    String newPassword);

在实现类中实现当前的抽象方法

/**
     *用户修改密码方法
     * @param uid 用户uid
     * @param username 用户名
     * @param oldPassword 当前用户旧密码
     * @param newPassword 当前用户新密码
     */
@Override
public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
    User result = userMapper.findUserById(uid);
    if (result == null || result.getIsDelete() == 1){
        throw new UserNotFoundException("用户数据不存在");
    }
    //原始密码和数据库中密码进行比较
    String salt = result.getSalt();
    String oldMd5Password = getMD5Password(oldPassword, salt);
    if (!oldMd5Password.equals(result.getPassword())){
        throw new PasswordNotMatchExecption("新密码与原来密码不同");
    }

    String newMd5Password = getMD5Password(newPassword, salt);
    //将新密码设置到数据库中,将新密码进行加密后再去更新
    Integer rows = userMapper.updatePasswordById(uid, newMd5Password, username, new Date());
    if (rows != 1){
        throw new UpdateException("更新数据时发生未知异常");
    }
}

在单元测试类中编写测试方法

3.修改密码-控制层

3.1 处理异常

UpdateException需要配置在统一的异常处理方法中。

else if (e instanceof UpdateException){
    result.setState(5001);
    result.setMessage("更新数据时产生未知异常");
}
3.2 设计请求
/users/change_password
post
String oldPassword,String newPassword//需要和表单中name属性保持一致
JsonResult<void>
3.3 处理请求
@RequestMapping("change_password")
public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session){
    Integer uid = getUidFromSession(session);
    String username = getUsernameFormSession(session);
    iUserService.changePassword(uid,username,oldPassword,newPassword);
    return new JsonResult<>(OK);
}

4.修改密码-前端页面

<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>
posted @   贾博文  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示