【电商项目实战】修改密码(详细篇)

news2024/12/27 2:04:06

在这里插入图片描述
🍁博客主页:👉@不会压弯的小飞侠
欢迎关注:👉点赞👍收藏留言
系列专栏:👉SpringBoot电商项目实战
学习社区: 👉不会压弯的小飞侠
知足上进,不负野心。
🔥欢迎大佬指正,一起学习!一起加油!

在这里插入图片描述

目录

  • 🍁修改密码-持久层
    • 🔥接口与抽象方法
  • 🍁修改密码-业务层
    • 🔥异常
    • 🔥接口与抽象方法
    • 🔥 实现抽象方法
    • 🔥单元测试。
  • 🍁修改密码-控制层
    • 🔥处理异常
    • 🔥设计请求
    • 🔥处理请求
  • 🍁修改密码-前端页面
  • 🍁启动项目

🍁修改密码-持久层

  • 在执行修改密码之前,还应检查用户数据是否存在、并检查用户数据是否被标记为“已删除”、并检查原密码是否正确,这些检查都可以通过查询用户数据来辅助完成

🔥接口与抽象方法

  • 在UserMapper接口添加updatePasswordByUid(Integer uid,String password,String
    modifiedUser,Date modifiedTime)抽象方法。
 /**
     * 根据用户的id来修改密码
     * @param uid  用户的id
     * @param password  用户输入的新密码
     * @param modifiedUser  修改的执行者
     * @param modifiedTime   修改时间
     * @return  返回值为受影响的行数
     */
    Integer updatePasswordByUid(Integer uid, String password, String modifiedUser, Date modifiedTime);

    /**
     * 根据id查询用户的数据
     * @param id 用户的id
     * @return  如果找到返回对象
     */
    User findByUid(Integer id);
  • 在UserMapper.xml中配置updatePasswordByUid()、findByUid()抽象方法的映射。
 <!-- 根据uid更新用户的密码:
	     Integer updatePasswordByUid(
		    @Param("uid") Integer uid,
		    @Param("password") String password,
		    @Param("modifiedUser") String modifiedUser,
		    @Param("modifiedTime") Date modifiedTime) -->
    <update id="updatePasswordByUid">
        UPDATE
            t_user
        SET
            password = #{password},
            modified_user = #{modifiedUser},
            modified_time = #{modifiedTime}
        WHERE
            uid = #{uid}
    </update>

    <!-- 根据用户id查询用户数据:User findByUid(Integer uid) -->
    <select id="findByUid" resultMap="UserEntityMap">
        SELECT *  FROM  t_user  WHERE  uid = #{uid}
    </select>
  • 在UserMapperTests中编写并执行单元测试。
   @Test
    public void updatePasswordByUid(){
        userMapper.updatePasswordByUid(9,"321","jkj",new Date());
    }

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

    }
  • 测试

  • 密码修改成功

在这里插入图片描述

  • 去数据库再次查看是否修改成功

在这里插入图片描述

🍁修改密码-业务层

🔥异常

  • 1.用户在修改密码前,需要检查用户数据是否存在及是否被标记为“已删除”。如果检查不通过则应抛出UserNotFoundException异常。
  • 2.用户修改密码时,可能会因为输入的原密码错误导致修改失败,则应抛出
    PasswordNotMatchException异常。
  • 3.在执行修改密码时,如果返回的受影响行数与预期值不同,则应抛UpdateException异常。
  • 4.创建com.jkj.service.exception.UpdateException异常类,继承自ServiceException类。
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);
    }
}

🔥接口与抽象方法

  • 在IUserService中添加changePassword(Integer uid, String username, String oldPassword, StringnewPassword)抽象方法。
 /**
     * 修改密码
     * @param uid 当前登录的用户id
     * @param username 用户名
     * @param oldPassword 原密码
     * @param newPassword 新密码
     */
    public void changePassword(Integer uid, String username, String oldPassword, String newPassword);

🔥 实现抽象方法

  • 1.在UserServiceImpl类中实现changePassword()抽象方法。
@Override
    public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
        // 调用userMapper的findByUid()方法,根据参数uid查询用户数据
        User result = userMapper.findByUid(uid);
        // 检查查询结果是否为null
        if (result == null) {
            // 是:抛出UserNotFoundException异常
            throw new UserNotFoundException("用户数据不存在");
        }

        // 检查查询结果中的isDelete是否为1
        if (result.getIsDelete().equals(1)) {
            // 是:抛出UserNotFoundException异常
            throw new UserNotFoundException("用户数据不存在");
        }

        // 从查询结果中取出盐值
        String salt = result.getSalt();
        // 将参数oldPassword结合盐值加密,得到oldMd5Password
        String oldMd5Password = getMd5Password(oldPassword, salt);
        // 判断查询结果中的password与oldMd5Password是否不一致
        if (!result.getPassword().contentEquals(oldMd5Password)) {
            // 是:抛出PasswordNotMatchException异常
            throw new PasswordNotMatchException("原密码错误");
        }

        // 将参数newPassword结合盐值加密,得到newMd5Password
        String newMd5Password = getMd5Password(newPassword, salt);
        // 创建当前时间对象
        Date now = new Date();
        // 调用userMapper的updatePasswordByUid()更新密码,并获取返回值
        Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, now);
        // 判断以上返回的受影响行数是否不为1
        if (rows != 1) {
            // 是:抛出UpdateException异常
            throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员");
        }

    }

🔥单元测试。

  • 在UserServiceTests中编写并执行单元测试。
@Test
    public void changePassword() {
        try {
            Integer uid =10;
            String username = "cat";
            String oldPassword = "123456";
            String newPassword = "123";
            iUserService.changePassword(uid, username, oldPassword, newPassword);
            System.out.println("密码修改成功!");
        } catch (ServiceException e) {
            System.out.println("密码修改失败!" + e.getClass().getSimpleName());
            System.out.println(e.getMessage());
        }
    }

在这里插入图片描述

🍁修改密码-控制层

🔥处理异常

  • 在用户修改密码的业务中抛出了新的UpdateException异常,需要在BaseController类中进行处理。
 /** @ExceptionHandler用于统一处理方法抛出的异常 */
    @ExceptionHandler({ServiceException.class, FileUploadException.class})
    public JsonResult<Void> handleException(Throwable e) {
        JsonResult<Void> result = new JsonResult<Void>(e);
        if (e instanceof UsernameDuplicateException) {
            result.setState(4000);
        }
        else if (e instanceof UserNotFoundException) {
            result.setState(4001);
        }
        else if (e instanceof PasswordNotMatchException) {
            result.setState(4002);
        }
        else if (e instanceof InsertException) {
            result.setState(5000);
        }
       else if (e instanceof UpdateException) {
        result.setState(5001);
       };

        return result;
    }

🔥设计请求

  • 设计用户提交的请求,并设计响应的方式。
    • 请求路径:/users/change_password
    • 请求参数:String oldPassword, String newPassword, HttpSession session
    • 请求类型:POST
    • 响应结果:JsonResult

🔥处理请求

  • 在UserController类中添加处理请求的changePassword(String oldPassword, String newPassword,HttpSession session)方法,实现UserController控制器中的修改密码方法的代码。
@RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) {
        // 调用session.getAttribute("")获取uid和username
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        // 调用业务对象执行修改密码
        userService.changePassword(uid, username, oldPassword, newPassword);
        // 返回成功
        return new JsonResult<Void>(OK);
    }

🍁修改密码-前端页面

  • 在password.html页面中body标签内部的最后,添加script标签用于编写JavaScript程序。
		<!--页脚结束-->
		<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("修改失败!" + json.message);
						}
					}
				});
			});
		</script>

🍁启动项目

  • 启动项目先登录,访问http://localhost:8080/web/login.html页面并进行修改密码。
  • 用户名:cat
  • 密码:123

在这里插入图片描述

  • 点击管理–>修改密码

在这里插入图片描述

  • 输入原密码:123
  • 输入新密码:321
  • 确定密码:321

在这里插入图片描述

  • 点击确定,修改成功

在这里插入图片描述

  • 重新登录
  • 用户名:cat
  • 密码:321

在这里插入图片描述

  • 登录成功

在这里插入图片描述


学习视频:

【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战-哔哩哔哩】
https://b23.tv/qGh9x9L

在这里插入图片描述

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

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

相关文章

乾元通4G/5G多链路聚合设备在公共安全通信方面解决方案

政府部门对应急指挥系统提出了更高的要求&#xff0c;在特殊情况下需要能够迅速建立紧急指挥中心&#xff0c;通过应急指挥系统统一协调、统一调度相关部门协同工作&#xff0c;达到“及时了解&#xff0c;快速反应&#xff0c;准确决策&#xff0c;统一调度&#xff0c;妥善处…

面试半年,上个月成功拿到阿里offer,全靠我啃烂了学长给的这份笔记

前言 不论是校招还是社招都避免不了各种⾯试、笔试&#xff0c;如何去准备这些东⻄就显得格外重要。不论是笔试还是⾯试都是有章可循的&#xff0c;我这个“有章可循”说的意思只是说应对技术⾯试是可以提前准备&#xff0c;所谓不打无准备的仗就是这个道理。 以下为大家&…

牛血清白蛋白修饰葡萄糖 BSA-glucose,木糖/半乳糖/乳糖偶联牛血清白蛋白

产品名称&#xff1a;牛血清白蛋白修饰葡萄糖 英文名称&#xff1a; BSA-glucose 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白&…

创作纪念日 编程练习 - 斐波那契数列

文章目录我的第一次今日份练习| 斐波那契数列憧憬我的第一次 第一次浏览CSDN的时候刚开始学C的时候&#xff0c;当时的课设是《C & SQL 2008的学生管理系统》&#xff0c;C作前段界面、逻辑处理&#xff0c;SQL作为后端服务器支持的题目&#xff0c;当时不太认真学习&…

化纤企业净利润下滑,纺织企业如何利用APS排产减轻盈余压力

根据国家统计局数据&#xff0c;2022年前三季度&#xff0c;全国规模以上纺织企业工业增加值同比减少0.4%&#xff0c;营业收入同比增长3.1%&#xff0c;利润总额同比减少23.6%&#xff0c;增速均较上年同期有所放缓。 从全产业链看&#xff0c;中下游印染、长丝织造、服装等分…

Qt之读写文件

1.思路 读写文件的基本操作&#xff1a; 读文件 写文件 打开文件 打开文件 读取文件 写入文件 关闭文件 关闭文件 2.QFile实现读写文件 QFile类提供读写文件的接口。 它的构造函数如下&#xff1a; QFile(const QString & name) QFile(QObject * parent) QFile(c…

点击化学 PEG 试剂:1802907-92-1,Mtz-PEG4-NHS,甲基四嗪-四聚乙醇-活性酯

【中文名称】甲基四嗪-四聚乙醇-活性酯 【英文名称】 Methyltetrazine-PEG4-NHS ester&#xff0c;Mtz-PEG4-NHS 【结 构 式】 【CAS号】1802907-92-1 【分子式】C24H31N5O9 【分子量】533.54 【基团部分】Methyltetrazine 【纯度标准】95% 【包装规格】5g&#xff0c;10g&…

安卓有哪些耳机好用?好用的安卓蓝牙耳机推荐

市面上的蓝牙耳机五花八门&#xff0c;许多消费者在选购的时候不知道如何选择&#xff0c;除了苹果以外&#xff0c;其他的都要细心参考一下&#xff0c;由于苹果耳机市场的价格昂贵&#xff0c;不少的人选择其他品牌的替代&#xff0c;作为一位追求性价比的消费者而言&#xf…

HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Dubbo底层网络连接模型

在Dubbo中&#xff0c;有两个参数⽤来配置服务消费者和服务提供者直接的socket连接个数&#xff1a; shareconnections&#xff1a;表示可共享的socket连接个数connections&#xff1a;表示不共享的socket连接个数 服务A的shareconnections为2时&#xff0c;服务A的消费者会向…

CANoe-vTESTstudio之Waveform编辑器

1. 什么是Waveform编辑器 Waveform Editor,波形编辑器,可以创建曲线(随时间变化值变化的模式)来刺激信号和系统变量。在刺激过程中可以使用checkpoints(检查点)来测试被测系统的行为 简单来说,就是在一个坐标轴上,x轴是时间,y轴是刺激的信号或系统变量值。在指定的时…

算法设计与分析期末复习不挂科

算法的基本概念 算法概念 通俗讲:算法是解决问题的一种方法或一个过程 严格讲:算法是解某一特定问题的一组有穷规则的集合 且满足以下性质: 有限性:算法在执行有限步之后必须终止确定性:算法的每一个步骤都有精确的定义,要执行的每一个动作都是清晰的,无歧义的输入:一个算法有…

关于nodejs调用c/c++代码的一些感悟

帮客户解决问题&#xff0c;他们做的业务涉及到硬件&#xff0c;但是桌面端程序员离职&#xff0c;临时接手的人员&#xff0c;只会node&#xff0c;于是希望通过node调用c 基本套路&#xff0c;使用ffi和ref插件&#xff0c;打开设备正常&#xff0c;但就是无法读取数据。 接…

【Python游戏】用Python实现一个测试你智商的小游戏——24点,过不了三关的都是细狗 | 附带源码

前言 好咯&#xff0c;包子们下午好 今天小编主要是过来测试一下大家的智商&#xff0c;没别的意思&#xff0c;不是看不起大家&#xff0c;我感觉今天实现的小游戏&#xff0c;可能大家真的过不了三关&#xff01; 哈哈哈&#xff0c;废话不多说吧 直接开始我们的游戏实现功能…

五、【React-Router6】路由表 useRoutes() + Outlet

文章目录1、useRoutes() 介绍2、简单 CODING2.1、项目结构2.2、routes.js2.3、App.js2.4、Result3、嵌套 Outlet CODING3.1、项目结构3.2、routes.js3.3、Home.js3.4、App.js3.5、Result1、useRoutes() 介绍 原来写的路由管理如下 <Routes><Route path/about elemen…

codeforces:C. Almost All Multiples【构造 + 贪心】

目录题目截图题目分析ac code总结题目截图 题目分析 现在p1 x, pn 1如果我们一开始按1234…这样放字典序是最小的所以根据这个思路&#xff0c;我们还是按这个构造&#xff1a;那么我们的n被挤出来了&#xff0c;只能放到px上所以如果一开始x不能整除n的话&#xff0c;就直接…

Linux安装MySQL【Ubuntu20.04】

操作系统&#xff1a;Ubuntu20.04 使用工具&#xff1a;xshell7、xftp7 MySQL版本&#xff1a;5.7 一、删除Linux系统下自带的mariadb &#xff08;因为centos自带一个老版Mariadb 与MySQL冲突&#xff09; 如果没有找到Mariadb直接跳过 #查找Mariadb rpm -qa | grep maria…

面试总结2

用时&#xff1a;40min 自我介绍hashset存储对象怎么进行判断是否重复 Synchronized底层实现原理 Synchronized锁的升级过程 讲讲开发中常用到的spring注解spring事务&#xff0c;传播机制&#xff0c;隔离级别说一说你常用的git命令说一说你对IOC、AOP的理解1、hashset存储对…

[Linux打怪升级之路]-秒懂进程地址空间

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、C/C下…

【GIT】常用操作总结

一、在本地仓库及远程仓库创建分支&#xff0c;并建立关联关系。 1、创建本地分支&#xff0c;如图&#xff1a; 2、填写分支名称&#xff0c;勾选Checkout branch&#xff1a; 3、提交本地分支到远程分支&#xff1a; 右键选择Git -- Repository -- push&#xff1a; push的时…