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

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

    @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。

//用户在更新数据时产生的未知的异常
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.在实现类中实现当前的抽象方法

     @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("更新时数据产生未知的异常");
        }
    }

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

    @Test
    public 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 完成功能测试

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…

oracle 基础语法复习记录

Oracle SQL基础 因工作需要sql能力&#xff0c;需要重新把sql这块知识重新盘活&#xff0c;特此记录学习过程。 希望有新的发现。加油&#xff01;20250205 学习范围 学习SQL基础语法 掌握SELECT、INSERT、UPDATE、DELETE等基本操作。 熟悉WHERE、GROUP BY、ORDER BY、HAVIN…

【Day32 LeetCode】动态规划DP Ⅴ 完全背包

一、动态规划DP Ⅴ 完全背包 1、完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和…

数字人|通过语音和图片来创建高质量的视频

简介 arXiv上的计算机视觉领域论文&#xff1a; AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait&#xff1a;照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…

Leetcode—922. 按奇偶排序数组 II【简单】

2025每日刷题&#xff08;207&#xff09; Leetcode—922. 按奇偶排序数组 II 实现代码 class Solution { public:vector<int> sortArrayByParityII(vector<int>& nums) {for(int i 0, j 1; i < nums.size() - 1; i 2) {// 前奇后偶if(nums[i] % 2) {w…

Redis单线程架构

⭐️前言⭐️ 本小节主要围绕Redis的单线程模型展开 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHub &#x1f4…

NacosRce到docker逃逸实战

NacosRce到docker逃逸实战 1、Nacos Derby Rce打入内存马 这个漏洞的原理大家应该都知道&#xff0c; 2.3.2 < Nacos < 2.4.0版本默认derby接口未授权访问&#xff0c;攻击者可利用未授权访问执行SQL语句加载构造恶意的JAR包导致出现远程代码执行漏洞。 在日常的漏洞挖…

求解大规模单仓库多旅行商问题(LS-SDMTSP)的成长优化算法(Growth Optimizer,GO),MATLAB代码

一、问题定义 大规模单仓库多旅行商问题&#xff08;Large-Scale Single-Depot Multi-Traveling Salesman Problem&#xff0c;简称 LS-SDMTSP&#xff09;是组合优化领域中极具挑战性的经典问题。假设存在一个单一仓库&#xff0c;它既是所有旅行商的出发地&#xff0c;也是最…

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章&#xff0c;计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

使用Pygame制作“Flappy Bird”游戏

1. 前言 Flappy Bird 是一款“点击上浮、松手下落”的横向卷轴游戏&#xff1a; 场景中持续出现上下成对的管道&#xff0c;玩家需要让小鸟在管道之间穿行&#xff1b;每穿过一对管道记 1 分&#xff1b;若小鸟碰到管道或掉到地面&#xff0c;则游戏结束&#xff1b;一旦上手…

BUUCTF_XSS-Lab

xss XSS&#xff08;Cross - Site Scripting&#xff09;即跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻击者通过在目标网站注入恶意脚本&#xff08;通常是 JavaScript&#xff09;&#xff0c;当其他用户访问该网站时&#xff0c;这些恶意脚本会在用户的浏览器中执…

【Windows 开发NVIDIA相关组件】CUDA、cuDNN、TensorRT

目录 1. 安装 CUDA Toolkit 2. 安装 cuDNN 3. 安装 Zlib 4. 安装 TensorRT 5. 安装 TensorRT Python 包[c++项目不需要] 6. 安装 ONNX GraphSurgeon 包[c++项目不需要] 1. 安装 CUDA Toolkit 从 CUDA ToolkitArchive 下载对应版本的离线安装包,以 11.7 版本为例。 打开安…

红包雨项目前端部分

创建项目 pnpm i -g vue/cli vue create red_pakage pnpm i sass sass-locader -D pnpm i --save normalize.css pnpm i --save-dev postcss-px-to-viewportpnpm i vantlatest-v2 -S pnpm i babel-plugin-import -Dhttps://vant.pro/vant/v2/#/zh-CN/<van-button click&…

源路由 | 源路由网桥 / 生成树网桥

注&#xff1a;本文为 “源路由” 相关文章合辑。 未整理去重。 什么是源路由&#xff08;source routing&#xff09;&#xff1f; yzx99 于 2021-02-23 09:45:51 发布 考虑到一个网络节点 A 从路由器 R1 出发&#xff0c;可以经过两台路由器 R2、R3&#xff0c;到达相同的…

【React】合成事件语法

React 合成事件是 React 为了处理浏览器之间的事件差异而提供的一种跨浏览器的事件系统。它封装了原生的 DOM 事件&#xff0c;提供了一致的事件处理机制。 合成事件与原生事件的区别&#xff1a; 合成事件是 React 自己实现的&#xff0c;封装了原生事件。合成事件依然可以通…

一文解释nn、nn.Module与nn.functional的用法与区别

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …

TongSearch3.0.4.0安装和使用指引(by lqw)

文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书&#xff08;之后配置内置密码和ssl要用到&#xff09;配置内置用户密码配置ssl&#xff08;先配置内置用户密码再配ssl&#xff09;配置控制台…

2025年Android NDK超全版本下载地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

CSS outline详解:轮廓属性的详细介绍

什么是outline&#xff1f; outline&#xff08;轮廓&#xff09;是CSS中一个有趣的属性&#xff0c;它在元素边框&#xff08;border&#xff09;的外围绘制一条线。与border不同的是&#xff0c;outline不占用空间&#xff0c;不会影响元素的尺寸和位置。这个特性使它在某些…