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

news2025/2/7 23:12:10

      🧸安清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);
					}
				});
			});

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.攻防世界 weak_auth

题目描述提示 是一个登录界面&#xff0c;需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码&#xff1a;123456 直接得到flag 常用弱口令密码&#xff08;可复制&#xff09; 用户名 admin admin-- admin or -- admin…

『Apisix进阶篇』结合Consul作服务发现实战演练

文章目录 一、引言二、APISIX与Consul集成2.1 环境准备2.2 配置Consul服务发现2.2.1 修改APISIX配置文件2.2.2 重启APISIX 2.3 在路由中使用Consul服务发现2.3.1 创建路由2.3.2 验证路由 2.4 高级配置2.4.1 服务过滤2.4.2 多数据中心支持 三、总结 &#x1f4e3;读完这篇文章里…

家用报警器的UML 设计及其在C++和VxWorks 上的实现01

M.W.Richardson 著&#xff0c;liuweiw 译 论文描述了如何运用 UML&#xff08;统一建模语言&#xff09;设计一个简单的家用报警器&#xff0c;并实现到 VxWorks 操作系统上。本文分两个部分&#xff0c;第一部分描述了如何用 UML 设计和验证家用报警器的模型&#xff0c;以使…

BUU24 [GXYCTF2019]BabyUpload 1

开局上传文件 上传muma.php 上传.htaccess文件也被打回 再次求助互联网&#xff0c;才发现这提示给的多么明显&#xff0c;上传.htaccess文件是检查文件类型&#xff08;Contnet-Type&#xff09;&#xff0c;上传muma.php是检查后缀里头有没有ph &#xff0c;检查文件类型那…

贪心与单调栈的艺术:从三道 LeetCode 题看最小字典序问题(316/402/1081)

前言 欢迎来到我的算法探索博客&#xff0c;在这里&#xff0c;我将通过解析精选的LeetCode题目&#xff0c;与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验&#xff0c;旨在帮助每一位读者提升编程技能&#xff0c;领略算法之美。 &#x1f449;更多高频有趣Lee…

【含开题报告+文档+PPT+源码】基于SpringBoot的校园论坛系统的设计与实现

开题报告 本研究论文主要探讨并实现了一个基于SpringBoot框架构建的全方位校园论坛系统。此系统旨在为校内师生提供一个信息交流与分享的互动平台&#xff0c;核心功能涵盖了校园新闻新闻的实时浏览与更新&#xff0c;用户可自主发布各类主题帖子&#xff0c;并支持深度互动&a…

关于视频字幕

文章目录 视频字幕分类内嵌字幕内封字幕外挂字幕 字幕格式纯文本字幕特效字幕图形字幕 简易修改字幕修改时间同步PotplayerSubtitleEdit 提取蓝光原盘字幕参考资料 视频字幕分类 内嵌字幕 合成到画面的硬字幕&#xff0c;不可移除。 内封字幕 常见的如 MKV 文件&#xff0c…

【AI 语音】实时语音交互优化全解析:从 RTC 技术到双讲处理

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

数据结构(栈结构之顺序栈操作实现一)

目录 一.栈结构之顺序栈操作实现 1.项目结构以及初始代码 2.初始化栈结构 3.入栈操作并显示 4.出栈操作并显示出栈元素 5.获取栈长度 6.清空栈 7.销毁栈 8.动态扩展栈空间 一.栈结构之顺序栈操作实现 1.项目结构以及初始代码 SeqStack.h #ifndef __SEQSTACK_H__ #de…

【React】受控组件和非受控组件

目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态&#xff08;值&#xff09;由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值&#xff0c;并且每次用户输入时&#xff0c;React 通过事件处理程序来更新 …

vue2:如何动态控制el-form-item之间的行间距

需求 某页面有查看和编辑两种状态: 编辑: 查看: 可以看到,查看时,行间距太大导致页面不紧凑,所以希望缩小查看是的行间距。 行间距设置 行间距通常是通过 CSS 的 margin 或 padding 属性来控制的。在 Element UI 的样式表中,.el-form-item 的下边距(margin-bottom)…

亚博microros小车-原生ubuntu支持系列:20 ROS Robot APP建图

依赖工程 新建工程laserscan_to_point_publisher src/laserscan_to_point_publisher/laserscan_to_point_publisher/目录下新建文件laserscan_to_point_publish.py #!/usr/bin/env python3import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStam…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

k8sollama部署deepseek-R1模型,内网无坑

这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

【Elasticsearch】nested聚合

在 Elasticsearch 中&#xff0c;嵌套聚合&#xff08;nestedaggregation&#xff09;的语法形式用于对嵌套字段&#xff08;nestedfields&#xff09;进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型&#xff0c;用于存储数组中的对象&#xff0c;这些对象需要独…

spy-debugger + Charles 调试移动端/内嵌小程序H5

简介说明&#xff1a; PC端可以用F12进行console等进行调试&#xff0c;但移动端App中使用webview就无法进行实时调试&#xff0c;针对这种情况 1. 安装 全局安装 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 证书 其实spy-debugg…

【NLP 20、Encoding编码 和 Embedding嵌入】

目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码&#xff08;One-Hot Encoding&#xff09; (2) 位置编码&#xff08;Positional Encoding&#xff09; (3) 标签编码&#xff08;Label Encoding&#xff09; (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…

深度学习模型可视化小工具wandb

1 概述 Wandb&#xff08;Weights & Biases&#xff0c;网址是https://wandb.ai&#xff09;是一个用于机器学习项目实验跟踪、可视化和管理的工具&#xff0c;旨在用户更有效地监控模型训练过程、优化性能&#xff0c;并分享和复现实验结果‌‌。对于使用者而言&#xff…

数据库系统概论的第六版与第五版的区别,附pdf

我用夸克网盘分享了「数据库系统概论第五六版资源」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性&#xff0c;在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…

【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信

Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…