修改密码【项目 商城】

简介: 修改密码【项目 商城】

修改密码


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

1.修改密码-持久层

1.1规划需要执行的SQL语句

根据用户的uid修改用户password值。

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

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

select* from t_user where uid=?

1.2 设计接口和抽象方法

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

/**
     * 根据用户的uid来修改用户密码
     * @param uid 用户的id
     * @param password 用户输入的新密码
     * @param modifiedUser 表示修改的执行者
     * @param modifiedTime 表示修改数据的时间
     * @return 返回值为受影响的行数
     *
     */
    Integer updatePasswordByUid(Integer uid,
                                String password,
                                String modifiedUser,
                                Date modifiedTime);
    /**
     * 根据用户的eid查询用户的数据
     * @param uid 用户的id
     * @return 如果找到了则返回对象,反之返回null值
     */
    User findByUid(Integer uid);

1.3 SQL的映射

配置到映射文件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>

UserMapper–修改密码

测试

单元测试功能测试。

UserMapperTests

  @Test
    public void updatePasswordByUid(){
        Integer rows = userMapper.updatePasswordByUid(7, "321", "管理员", new Date());
        System.out.println(rows);
    }
    @Test
    public void findByUid(){
        User user = userMapper.findByUid(7);
        System.out.println(user);
    }



UserMapperTests–修改密码

修改了findByUid的驼峰


2.修改密码-业务层

2.1 规划异常

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

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

UpdateException

package com.cy.store.service.ex;
/** 用户在更新的时产生未知的异常*/
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);
    }
}

UpdateException


2.2 设计接口和抽象方法

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

IUserService

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

UserServiceImpl

    @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("更新数据时产生未知的异常");
        }
    }
    /**
     *  定义一个md5算法加密处理
     */
    private String getMd5Password(String password,String salt){
        //md5 加密算法方法的调用(进行三次加密)
        for(int i=0;i<3;i++){
             password= DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
        }
        //返回加密之后的密码
        return password;
    }

IUserService–changePassword

测试

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

  @Test
    public void changePassword(){
        userService.changePassword(8,"test02","123","321");
    }

UserServiceTests–changePassword


3.修改密码-控制层

3.1 处理异常

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

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

3.2 设计请求

/users.change_password
post
//需要和表单中的name属性值保持一致
String oldPassword,String newPassword,HttpSession session
JSONResult<Void>

3.3 处理请求

@RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword,
                                           String newPassword,
                                           HttpSession session){
        Integer uid=getuidFromSession(session);
        String username=getUsernameFromSession(session);
        userService.changePassword(uid,username,oldPassword,newPassword);
        return new JsonResult<>(OK);
    }

测试

http://localhost:8080/users/change_password?oldPassword=321&newPassword=123


4.修改密码-前端页面

password.html中添加ajax请求的处理,不在手动去编写ajax结构,直接复制,然后在微调修改参数即可。

  <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);
            }
          },
          error: function (xhr) {
            alert("修改密码时产生未知的异常" + xhr.status);
            location.href = "login.html";
          }
        });
      });
    </script>

README–修改密码


测试

相关文章
|
存储 缓存 数据库
群控代理IP搭建教程
群控代理IP搭建教程
521 13
|
9月前
|
XML Java 数据库连接
优雅的参数校验,告别冗余if-else
本文介绍了在 Java Spring Boot 开发中如何使用 JSR 303 和 Hibernate Validator 进行参数校验,以避免冗余的if-else判断。文章涵盖了基本注解的使用、全局异常处理、分组校验、嵌套对象校验、快速失败配置以及自定义校验规则等实用技巧。
322 10
优雅的参数校验,告别冗余if-else
|
10月前
|
数据采集 监控 大数据
大数据项目管理:从规划到执行的全景指南
大数据项目管理:从规划到执行的全景指南
173 4
|
11月前
|
安全 应用服务中间件 API
Ascend+FastAPI+ Uvicorn 实现推理
FastAPI 是一个高性能的 Python Web 框架,专为构建 RESTful API 设计,支持异步编程和数据验证。Uvicorn 是基于 ASGI 的轻量级异步服务器,与 FastAPI 结合使用可提供高效、高并发的服务。在生产环境中,二者配合 Nginx 可实现稳定安全的部署。示例代码展示了如何通过 FastAPI 和 Uvicorn 启动服务,并在 Ascend 平台上运行推理模型,处理自然语言任务。 简介字数:239
|
12月前
|
存储 人工智能 安全
《数据主权:人工智能时代的核心基石与挑战》
在数字化时代,人工智能成为社会变革的强大力量,深刻改变着我们的生活方式。数据主权作为其核心基石,涉及国家、企业和个人的数据管辖与控制权。国家层面,数据主权关乎国家安全与经济竞争力;企业层面,合规利用数据可提升竞争力,但也面临法律风险;个人层面,隐私保护至关重要。国际社会正通过法规和技术手段(如GDPR和区块链)应对这些挑战,以确保数据安全与隐私,推动人工智能健康发展。
319 18
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的音乐推荐管理系统
基于Java+Springboot+Vue开发的音乐推荐管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的音乐推荐管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
289 8
基于Java+Springboot+Vue开发的音乐推荐管理系统
|
敏捷开发 数据挖掘 项目管理
如何让团队高效运转?协同工具在项目管理中的妙用
本文探讨了如何通过协同工具提升团队效率,介绍了团队高效运转的关键因素,包括清晰的目标设定、有效的沟通机制、合理的任务分配、实时的进度跟踪、激励机制与反馈,以及工具的正确选择。文章还推荐了几款实用的办公协同工具,如板栗看板、Jira、Confluence 和 Slack,帮助团队在项目管理中实现高效协作。
404 0
|
机器学习/深度学习 人工智能 TensorFlow
探索AI在图像识别中的应用
【8月更文挑战第31天】本文将深入探讨人工智能在图像识别领域的应用,包括其原理、技术实现以及实际应用案例。我们将通过Python代码示例,展示如何使用深度学习库TensorFlow进行图像分类任务。无论你是AI初学者还是有一定基础的开发者,都能从中获得启发和学习。
|
Rust 安全 JavaScript
探索Rust在系统编程领域的前景:虚拟机和编译器开发的新篇章
【8月更文挑战第31天】在系统编程领域,性能与安全性至关重要。Rust作为一种新兴语言,凭借其独特的内存安全和并发特性,正逐渐成为虚拟机和编译器开发的首选。本文通过案例分析,探讨Rust在这些领域的应用,例如Facebook的Compiler VM (CVM)项目和实验性的JavaScript JIT编译器Mithril。Rust的静态类型系统和所有权模型确保了高性能和安全性,而其强大的包管理和库生态则简化了虚拟机的开发。随着Rust社区的不断成熟,预计未来将有更多基于Rust的创新项目涌现,推动系统编程的发展。对于追求高性能和安全性的开发者而言,掌握Rust将成为一个重要战略方向。
380 1
|
Unix Java C++
ROS快速入门使用
ROS快速入门使用
409 0
ROS快速入门使用