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

embedded/2025/2/7 19:28:02/

      🧸安清h:个人主页 

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

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


目录

🎃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 完成功能测试

🚀2.个人资料-业务层

✨2.1规划异常

✨2.2接口和抽象方法

✨2.3实现抽象方法

✨2.4在测试类中测试 

🚀3.个人资料-控制层

✨3.1处理异常

✨3.2设计请求

✨3.3处理请求 

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


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

🎃1.修改密码 -持久层

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

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

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

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

select * from t_user where uid=?

✨1.2设计接口和抽象方法 

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

 //    根据用户的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文件中:

    <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单元测试

    @Testpublic void updatePasswordByUid(){userMapper.updatePasswordByUid(2,"123456","管理员",new Date());}@Testpublic void findByUid(){System.out.println(userMapper.findByUid(6));}

🎃2.修改密码-业务层

✨2.1规划异常

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

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

//用户在更新数据时产生的未知的异常
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.执行用户修改密码的核心方法。

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

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

     @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 newMd5Password = getMD5Password(newPassword, result.getSalt());Integer rows = userMapper.updatePasswordByUid(uid,newMd5Password,username,new Date());if(rows != 1){throw new UpdateException("更新时数据产生未知的异常");}}

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

    @Testpublic void changePassword(){userService.changePassword(7,"timi","123","321");}

🎃3.修改密码-控制层

✨3.1处理异常

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

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处理请求

    @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结构,直接复制,然后微调修改参数。

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

update t_user set phone=?,email=?,gender=?,modified_user=?,modified_time=? where uid=?

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

select * from t_user where uid=?

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

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

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

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

✨1.3抽象方法的映射 

在UserMapper.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 完成功能测试

    @Testpublic 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编写以下代码:

    //    根据用户的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类中添加两个抽象方法的具体实现。

    @Overridepublic 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对象中@Overridepublic 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在测试类中测试 

    @Testpublic void getByUid(){System.out.println(userService.getByUid(7));}@Testpublic 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处理请求 

    @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),查询到的数据填充到页面上。

<!--			一旦检测到当前的页面被加载就会触发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)。

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


http://www.ppmy.cn/embedded/160365.html

相关文章

python监测教务网成绩变化,发送邮箱,定时启动

背景&#xff1a; 期末考试已经结束好几天了&#xff0c;一些科目的成绩也陆续出来了。本人也是时不时地刷新教务网查看成绩是否有变化&#xff0c;这带给我些许焦虑。出于这个目的&#xff0c;我写程序实现了以下需求&#xff1a; 每隔30分钟启动&#xff0c;监测教务处成绩变…

【springboot】拦截器和过滤器的区别

【springboot】拦截器和过滤器的区别 【一】区别【二】适用场景【1】过滤器【2】拦截器 【三】使用案例【1】过滤器使用案例【2】拦截器使用案例 在 Spring Boot 中&#xff0c;拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;都是用于对请求…

Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群

Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群 简介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系统安装部署 Kubernetes v1.29.13 集群 1 环境准备1.1 集群IP规划1.2 初始化步骤&#xff08;各个节点都需执行&#xff09;1.2.1 主机名与IP地址解析1.…

Vim配置AI Copilot提升编码效率

市面上已经有成熟的AI编码助手&#xff0c;先有Github的Copilot&#xff0c;后有国内各个厂家提供的助手&#xff0c;以及现在能力更强大的cursor等。只是目前市面的编码助手&#xff0c;只支持VSCode和JetBrains&#xff0c;对一些Vim高度依赖的开发者很不友好。正好找到了一款…

低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用

DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始&#xff0c;百度智能云又传来新动作 。 2月3日百度智能云宣布&#xff0c; DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架&#xff0c;同步推出超低价格方案&#xff0c;并…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

硬盘接入电脑提示格式化?是什么原因?怎么解决?

有时候&#xff0c;当你将硬盘接入电脑时&#xff0c;看到系统弹出“使用驱动器中的光盘之前需要将其格式化”的提示&#xff0c;肯定会感到十分困惑和焦虑。这种情况不仅让人担心数据丢失&#xff0c;也可能影响正常使用。为什么硬盘会突然要求格式化&#xff1f;是硬盘出了问…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…