【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

🧸安清h:个人主页****

🎥个人专栏:【Spring篇】** 【计算机网络】 【Mybatis篇】**

**🚦作者简介:**一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。


目录

[🎃1.修改密码 -持久层](#🎃1.修改密码 -持久层)

✨1.1规划需要执行的SQL语句

✨1.2设计接口和抽象方法

✨1.3SQL的映射

✨1.4单元测试

🎃2.修改密码-业务层

✨2.1规划异常

✨2.2设计接口和抽象方法

🎃3.修改密码-控制层

✨3.1处理异常

✨3.2设计请求

✨3.3处理请求

🎃4.修改密码-前端页面

🚀1.个人资料-持久层

✨1.1规划需要执行的SQL语句

✨1.2接口与抽象方法的设计

✨1.3抽象方法的映射

[✨1.4 完成功能测试](#✨1.4 完成功能测试)

🚀2.个人资料-业务层

✨2.1规划异常

✨2.2接口和抽象方法

✨2.3实现抽象方法

✨2.4在测试类中测试

🚀3.个人资料-控制层

✨3.1处理异常

✨3.2设计请求

✨3.3处理请求

🚀4.个人资料-前端页面


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

🎃1.修改密码 -持久层

✨1.1规划需要执行的SQL语句

1.根据用户的uid修改用户password值

sql 复制代码
update t_user set password=?,modified_user=?,modified_time=? where uid=?
  1. 根据uid查询用户的数据。在修改密码之前,首先要保证当前用户的数据存在,检测是否被标记为已经删除、检测输入的原始密码是否正确。
sql 复制代码
select * from t_user where uid=?

✨1.2设计接口和抽象方法

UserMapper接口,将以上的两个方法的抽象定义出来。将来映射到SQL语句上。

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

    //    根据用户的uid来查询用户的数据
//    @param uid 用户的id
//    @return 如果找到则返回对象,反之则返回null值
     User findByUid(Integer uid);

✨1.3SQL的映射

配置到映射文件中 UserMapper.xml文件中:

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>

✨1.4单元测试

java 复制代码
    @Test
    public void updatePasswordByUid(){
        userMapper.updatePasswordByUid(2,"123456","管理员",new Date());
    }

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

🎃2.修改密码-业务层

✨2.1规划异常

1.用户的源密码错误,is_delete=1,uid找不到,在用户没有发现的异常。

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

java 复制代码
//用户在更新数据时产生的未知的异常
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.2设计接口和抽象方法

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

java 复制代码
    void changePassword(Integer uid,
                        String username,
                        String oldPassword,
                        String newPassword);

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

java 复制代码
     @Override
    public 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 newMd5Password = getMD5Password(newPassword, result.getSalt());
        Integer rows = userMapper.updatePasswordByUid(uid,newMd5Password,username,new Date());
        if(rows != 1){
            throw new UpdateException("更新时数据产生未知的异常");
        }
    }
  1. 在单元测试类中编写测试方法
java 复制代码
    @Test
    public void changePassword(){
        userService.changePassword(7,"timi","123","321");
    }

🎃3.修改密码-控制层

✨3.1处理异常

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

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

✨3.2设计请求

请求路径:/users/change_password

请求参数:String oldPassword,String newPassword(需要和表单中的name属性值保持一致)

请求类型:POST

响应结果:JsonResult<void>

✨3.3处理请求

java 复制代码
    @RequestMapping("change_password")
    public JsonResult<Void> change_password(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请求的处理,不在手动编写ajax结构,直接复制,然后微调修改参数。

javascript 复制代码
		<script>
			$("#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>

🚀1.个人资料-持久层

✨1.1规划需要执行的SQL语句

1.更新用户信息的SQL语句:

sql 复制代码
update t_user set phone=?,email=?,gender=?,modified_user=?,modified_time=? where uid=?

2.根据用户名来查询用户的数据:

sql 复制代码
select * from t_user where uid=?

查询用户的数据不需要重复开发

✨1.2接口与抽象方法的设计

更新用户的信息方法的定义。

java 复制代码
//    更新用户的数据信息
//    @param user
//    @return 返回值为收影响的行数
     Integer updateInfoByUid(User user);

✨1.3抽象方法的映射

在UserMapper.xml文件中进行映射编写。

XML 复制代码
       <update id="updateInfoByUid">
        update t_user set
--       if表示条件判断标签,test接收的是一个返回值为boolean类型的条件,如果test条件的结果为true则执行if标签内部的语句
        <if test="phone!=null">phone=#{phone},</if>
        <if test="email!=null">email=#{email},</if>
        <if test="gender!=null">gender=#{gender},</if>
        modified_user=#{modifiedUser},
        modified_time=#{modifiedTime}
        where uid=#{uid}
    </update>

✨1.4 完成功能测试

java 复制代码
    @Test
    public void updateInfoByUid(){
        User user = new User();
        user.setUid(7);
        user.setPhone("12345678");
        user.setEmail("test003@qq.com");
        user.setGender(1);
        userMapper.updateInfoByUid(user);
    }

🚀2.个人资料-业务层

✨2.1规划异常

1.设计两个功能:

  • 当打开页面获取用户的信息并且填充到对应的文本框中。
  • 检测用户是否点击了修改按钮,如果检测到则执行修改用户信息的操作。

2.打开页面可能找不到用户的数据,点击删除按钮之前需要再次的去检测用户的数据是否存在。

✨2.2接口和抽象方法

在service包下的IUService编写以下代码:

java 复制代码
    //    根据用户的id查询用户的数据
//    @param uid 用户id
//    @return 用户的数据
    User getByUid(Integer uid);

//    更新用户的数据操作
//      @param uid 用户的id
//     @param username 用户名
//    @param user 用户对象的数据
    void changeInfo(Integer uid,String username,User user);

✨2.3实现抽象方法

在UserServiceImpl类中添加两个抽象方法的具体实现。

java 复制代码
    @Override
    public User getByUid(Integer uid) {
        User result = userMapper.findByUid(uid);
        if(result == null || result.getIsDelete() == 1){
            throw new UserNotFoundException("用户数据不存在");
        }
        User user = new User();
        user.setUsername(result.getUsername());
        user.setPhone(result.getPhone());
        user.setEmail(result.getEmail());
        user.setGender(result.getGender());
        return user;
    }

//    user对象中的数据phone/email/gender,手动再将uid/username封装到user对象中
    @Override
    public void changeInfo(Integer uid, String username, User user) {
        User result = userMapper.findByUid(uid);
        if(result == null || result.getIsDelete() == 1){
            throw new UserNotFoundException("用户数据不存在");
        }
        user.setUid(uid);
        user.setModifiedUser(username);
        user.setModifiedTime(new Date());
        
        Integer rows = userMapper.updateInfoByUid(user);
        if(rows != 1){
            throw new UpdateException("更新时数据产生未知的异常");
        }
    }

✨2.4在测试类中测试

java 复制代码
    @Test
    public void getByUid(){
        System.out.println(userService.getByUid(7));
    }

    @Test
    public void changeInfo(){
        User user=new User();
        user.setPhone("87654321");
        user.setEmail("666333@qq.com");
        user.setGender(0);
        userService.changeInfo(7,"timi",user);
    }

🚀3.个人资料-控制层

✨3.1处理异常

暂无。

✨3.2设计请求

1.设置-打开页面就发送当前用户数据的查询。即在打开页面的时候,页面就显示username,phone,email等信息。

请求路径:/users/get_by_uid

请求参数:HttpSession session

请求类型:GET

响应结果:JsonResult<User>

2.点击修改按钮发送用户的数据修改操作请求的设计。

请求路径:/users/change_info

请求参数:User user,HttpSession session

请求类型:POST

响应结果:JsonResult<Void>

✨3.3处理请求

java 复制代码
    @RequestMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session){
        User data = userService.getByUid(getuidFromSession(session));
        return new JsonResult<>(OK,data);
    }

    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user,HttpSession session){
//        user对象有四部分数据:username,phone,email,gender
//        uid数据需要再次封装到user对象中
        Integer uid = getuidFromSession(session);
        String username = getUsernameFromSession(session);
        userService.changeInfo(uid,username,user);
        return new JsonResult<>(OK);
    }
}

🚀4.个人资料-前端页面

1.在打开userdata.html页面自动发送ajax请求(get_by_uid),查询到的数据填充到页面上。

javascript 复制代码
<!--			一旦检测到当前的页面被加载就会触发ready方法-->
			// $(document).ready(function (){
			//
			// })
			$(document).ready(function (){
				$.ajax({
					url:"/users/get_by_uid",
					type:"GET",
					data:$("#form-change-info").serialize(),
					dataType:"JSON",
					success:function (json){
						if(json.state==200){
						// 	将查询的数据重新设置到控件中
							$("#username").val(json.data.username)
							$("#phone").val(json.data.phone)
							$("#email").val(json.data.email)
							let radio = json.data.gender == 0 ? $("#gender-female") : $("#gender-male");
							// prop()表示给某个元素添加属性及属性的值
							radio.prop("checked","checked")
						}else{
							alert("用户的数据不存在");
						}
					},
					error:function (xhr){
						alert("查询用户时产生未知的异常"+xhr.message);
					}
				});
			})

2.在检测到用户点击了修改按钮之后也需要发送一个ajax请求(change_info)。

javascript 复制代码
<script>
			$("#btn-change-info").click(function (){
				$.ajax({
					url:"/users/change_info",
					type:"POST",
					data:$("#form-change-info").serialize(),
					dataType:"JSON",
					success:function (json){
						if(json.state==200){
							alert("用户信息修改成功");
						// 	修改成功后重新加载当前的页面
							location.href="userdata.html"
						}else{
							alert("用户信息修改失败");
						}
					},
					error:function (xhr){
						alert("用户信息修改时产生未知的异常"+xhr.message);
					}
				});
			});
相关推荐
&Sinnt&8 分钟前
Git 版本控制完全指南:从入门到精通
git·后端
陈随易37 分钟前
MoonBit助力前端开发,加密&性能两不误,斐波那契测试提高3-4倍
前端·后端·程序员
wfsm38 分钟前
spring事件使用
java·后端·spring
老纪的技术唠嗑局1 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
微风粼粼1 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
阿里云大数据AI技术1 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
rebel1 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
极客悟道2 小时前
颠覆传统虚拟化:在Docker容器中运行Windows系统的开源黑科技
前端·后端
调试人生的显微镜2 小时前
WebView 中 Cookie 丢失怎么办?跨域状态不同步的调试与修复经验
后端
weixin_437398212 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang