使用SpringBoot+Mybatis+MySQL完成用户修改密码

本文详细描述了用户在系统中修改密码的过程,包括前端提交、后端业务逻辑验证(包括原密码校验、异常处理)、持久层SQL操作(UserMapper接口映射)以及单元测试。涉及MD5加密和HTTP请求处理。
摘要由CSDN通过智能技术生成

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

修改密码-持久层

规划需要执行的SQL语句

根据t_user表中已存在的用户uid修改用户password值。

update t_user set password?, modified_user=?, modified_time? where uid=?

根据uid查询用户的数据,在修改密码之前,首先要保证当前用户的数据存在,检测是否被标记为已经删除、检测输入的原始密码是否正确。

select * from t_user where uid = ?

设计接口和抽象方法

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 如果找到返回对象(User),反之返沪一null值
 */
User findByUid(Integer uid);

SQL的映射

配置到映射文件UserMapper.xml中

<update id="updatePasswordByUid">
    UPDATE t_user SET
        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>

单元测试

UserMapperTests.java中做单元测试功能测试。

@Test
public void updatePasswordByUid() {
    userMapper.updatePasswordByUid(9, "321","管理员", new Date());
}

@Test
public void findByUid() {
    System.out.println(userMapper.findByUid(9));
}

修改密码-业务层

规划异常

  • 用户的原密码错误,is_delete==1、uid找不到,在用户没有发现的异常
  • update异常:在更新的时候,有可能产生未知的异常。

设计接口和抽象方法

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

    void changePassword(Integer uid,
                        String username,
                        String oldPasword,
                        String newPasword);

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

 @Override
    public void changePassword(Integer uid, String username, String oldPasword, String newPasword) {
        User result = userMapper.findByUid(uid);
        if (null == result || result.getIsDelete() == 1) {
            throw new UserNotFoundException("用户数据不存在");
        }
        // 原始密码和数据库中的密码进行比较
        String oldMd5Password = getMD5Password(oldPasword, result.getSalt());
        if (!result.getPassword().equals(oldMd5Password)) {
            throw new PasswordNotMatchException("密码错误");
        }
        // 将新密码设置到数据库中,将新密码进行加密再去更新
        String newMd5Password = getMD5Password(newPasword,result.getSalt());
        Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, new Date());
        if (rows!= 1) {
            throw new UpdateException("更新时产生未知的异常");
        }
    }

单元测试

测试方法changePassword,用户和密码是其他的,专门用于测试。

    @Test
    public void changePassword() {
        userService.changePassword(14, "admin01", "123", "789");
    }

修改密码-控制层

处理异常

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

else if (e instanceof UpdateException) {
            result.setState(5003);
            result.setMessage("更新数据时产生未知的异常");
        }

设计请求

请求路径:/users/change_password
请求方式:post
请求数据:String oldpassword, String newPassword, HttpSession session // 需要和表单中的name属性保持一致
响应结果:JsonResult<void>

处理请求

    @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);
    }

修改密码-前端页面

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>

重启项目,登录页面进行验证即可。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一名语言模型AI,无法提供实际的SpringBootMyBatis、Layui、MySQL代码。但是,我可以为您提供一些实现用户登录注册以及日志提交的思路: 1. 用户登录注册 使用Spring Security实现用户登录验证和授权,同时使用MyBatis操作MySQL数据库实现用户注册。具体步骤如下: 1.1 创建用户表 在MySQL数据库中创建一个用户表,包括用户ID、用户名、密码等字段。 1.2 创建用户注册页面 使用Layui框架创建一个用户注册页面,包括用户名、密码、确认密码等输入框。 1.3 编写注册后台逻辑 在后台编写用户注册逻辑,将用户输入的信息插入到MySQL数据库中。 1.4 创建用户登录页面 使用Layui框架创建一个用户登录页面,包括用户名、密码等输入框。 1.5 编写登录后台逻辑 在后台编写用户登录逻辑,验证用户输入的用户名和密码是否在MySQL数据库中存在,如果存在则登录成功,否则登录失败。 2. 日志提交 使用MyBatis操作MySQL数据库实现日志提交功能,具体步骤如下: 2.1 创建日志表 在MySQL数据库中创建一个日志表,包括日志ID、日志内容、创建时间等字段。 2.2 创建日志提交页面 使用Layui框架创建一个日志提交页面,包括日志内容输入框和提交按钮。 2.3 编写日志提交后台逻辑 在后台编写日志提交逻辑,将用户输入的日志内容插入到MySQL数据库的日志表中。 以上是实现用户登录注册以及日志提交的基本思路,具体的实现需要根据实际情况进行修改和完善。如果您需要更详细的帮助,可以在评论区留言,我会尽快回复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值