------Cambiar contraseña + olvidar contraseña en desarrollo Java

Tabla de contenido

1. Cambiar contraseña

respuesta del cliente

 vista frontal

extremo posterior

capa controladora

Capa de implementación ServiceImpl

2. Olvidé mi contraseña

respuesta del cliente

extremo posterior

capa controladora

capa de implementación serviceImpl


Este capítulo necesita estar preparado: proyecto springcloud, dependencias, base de datos....

Base de datosSQL

 
SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for mbs_member
-- ----------------------------
DROP TABLE IF EXISTS `mbs_member`;
CREATE TABLE `mbs_member` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '会员客户ID',
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '账号',
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码',
  `pw_salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '盐值列',
  `status` int DEFAULT NULL COMMENT '账号状态(帐号启用状态:0->启用;1->禁用)',
  `id_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '(身份证,护照,军官证,台胞证,港澳台来往内地通行证)',
  `path_front` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '正面',
  `path_reverse` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '反面',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '客户名字',
  `contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人',
  `contact_phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系电话',
  `contact_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系地址',
  `license_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '驾照号',
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别',
  `phone_num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '电话',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地址',
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',
  `member_level_id` int DEFAULT NULL COMMENT '会员级别(普通,金卡,白金,钻石)',
  `Account_Balance` double DEFAULT '0' COMMENT '账户余额',
  `integration` int DEFAULT '0' COMMENT '积分',
  `growth` double DEFAULT NULL COMMENT '成长值',
  `history_integration` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '历史积分数量(只加不减)',
  `open_id` int DEFAULT NULL COMMENT '微信返回ID',
  `token` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '登录验证token',
  `id_card` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '证件编号',
  `head_pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of mbs_member
-- ----------------------------
INSERT INTO `mbs_member` VALUES ('71', 'zhanghaojie', 'f5455390512559851fdffdc9dc71e1debe7261c41509579a3cb8d8085b86bee95d3808d9345e79790a2b2a153effe2615b1b4302694018d0d369f13a4a6e5005', '8efbe27a-4', '0', '1', null, null, '小浩杰', null, null, null, '410100123457', null, '15136204889', null, '[email protected]', '1', '11240', '5610', '3760', '2260', null, null, null, 'https://wangzherongyao.oss-cn-beijing.aliyuncs.com/upload/files/1605770604552-7c5b7014-09cb-4d0a.jpg');
INSERT INTO `mbs_member` VALUES ('78', 'test111', '111591072d3b1a693158b77a16df045daf87fca20ea7fc00c32411b6ace2d2c7ac0a70777619883fac37417ca9a09593465c51e7ab56cfb2b1debc174e2ffb3a', 'fcba1cda-2ce7-4d49-9658-976ff2b5aa9d', '0', '1', null, null, 'test111', null, null, null, '511621200011011212', null, '18398591677', null, '[email protected]', '3', '94620.96000000002', '1000', '65790.4', '0', null, null, '51162******212', 'https://qy002-bookstore.oss-cn-hangzhou.aliyuncs.com/staff_headicon/9ddb6b4b-8332-47a6-84ae-d5b9234e5065bg5.jpg');
INSERT INTO `mbs_member` VALUES ('88', 'cjj', '836bac861900ae9df5bf390ede7c2a45c1287f346139d3d3576300be822e1f17746c95d622955cc292427748dc12959447a28ba46ce13eb3c41fdcab09956161', 'c5546504-f2a1-4494-a738-8297e786acee', '0', '1', null, null, '成JJ', null, null, null, null, null, '13645678922', null, null, '1', '200', '50', '10500', '500', null, null, null, 'https://qy002-bookstore.oss-cn-hangzhou.aliyuncs.com/staff_headicon/29727801-0855-484d-bf5d-c6f69e8a72ad111.jpg');

1. Cambiar contraseña

respuesta del cliente

 

 vista frontal

<template>
  <div class="surechange">
    <head_><h1>修改密码</h1></head_>

    <div class="inp">
      <label for="oldpw">旧密码</label>
      <input
        type="text"
        placeholder="请输入旧密码"
        id="oldpw"
        v-model="oldpw"
        @blur="checkpw"
      />
    </div>

    <div class="inp">
      <label for="newpwd">新密码</label>
      <input
        v-model="newpw"
        :type="flas ? tests : pass"
        placeholder="请输入新密码"
        id="newpwd"
      />
      <van-icon
        @click="eye_active"
        :class="flas ? 'eye_active' : ''"
        name="eye-o"
        size="0.36rem"
      />
    </div>

    <div class="inp">
      <label for="sure">确认</label>
      <input
        :type="flas2 ? tests : pass"
        v-model="surepw"
        placeholder="再次输入新密码"
        id="sure"
      />
      <van-icon
        @click="eye_active2"
        :class="flas2 ? 'eye_active' : ''"
        name="eye-o"
        size="0.36rem"
      />
    </div>

    <div class="submit">
      <button
        @click="submit"
        :disabled="submitdisplay"
        :class="[submitcolor == true ? 'submit_active' : '']"
      >
        确认修改
      </button>
    </div>
  </div>
</template>

<script>
  //导入请求
import{changePwd,backPwd,checkPwd} from "../../request/userinfo/userinfo"
import head_ from '../jingtai_/header'
export default {
  props: {},
  data() {
    return {
      oldpw: "",
      newpw: "",
      surepw: "",
      flas: false,
      pass: "password",
      tests: "text",
      flas2: false,
      submitdisplay: true,
      submitcolor: false,
      regpw: /^[\w]{6,16}$/,
      
    };
    
  },
  methods: {
    //校验密码
    checkpw(){
      checkPwd({oldpw: this.oldpw}).then((res) => {
        if (res.code == 200) {
          if(!res.data){
              this.$toast.fail("请输入正确的密码!");
              this.oldpw='';
          }
        }else {
          this.$toast.fail("出错了!");
        }
      });
    },
    eye_active() {
      this.flas = !this.flas;
    },
    eye_active2() {
      this.flas2 = !this.flas2;
    },
    submit() {
      if (this.regpw.test(this.newpw) == false) {
        this.$toast.fail("6~16位,包含大小写字母和数字的组合");
      } else if (this.newpw != this.surepw) {
        this.$toast.fail("两次密码输入不一致");
      } else {
        changePwd({ password: this.newpw }).then((res) => {
          if (res.code == 200 && res.data) {
            this.$toast.success("修改成功");
            window.localStorage.removeItem("token");
            this.$router.push("/login");
          } else {
            this.$toast.success("修改失败");
          }
        });
        
      }
    },
  },
  updated() {
    if (this.oldpw != "" && this.newpw != "" && this.surepw != "") {
      this.submitdisplay = false;
      this.submitcolor = true;
    } else {
      this.submitcolor = false;
      this.submitdisplay = true;
    }
  },
  components: {head_},
};
</script>

<style scoped lang="less">
.surechange {
  padding: 0 0.24rem;
  .title {
    display: flex;
    align-items: center;
    height: 0.88rem;
    span {
      flex: 1;
      text-align: center;
      font-size: 0.34rem;
      font-weight: bolder;
    }
  }
  .inp {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 0.29rem;
    position: relative;
    label {
      font-size: 0.26rem;
      font-weight: bolder;
    }
    input {
      width: 5.48rem;
      height: 0.66rem;
      font-size: 0.22rem;
      padding-left: 0.19rem;
      border: 2px solid #e4e4e4;
      border-radius: 0.04rem;
      &::placeholder {
        color: #999;
      }
    }
    .van-icon-eye-o {
      position: absolute;
      top: 0.2rem;
      right: 0.19rem;
    }
    .eye_active {
      color: #2094ff;
    }
  }

  .submit {
    margin-top: 2.27rem;
    text-align: center;
    button {
      width: 5rem;
      height: 1rem;
      color: #999;
      background: #f2f2f2;
      font-size: 0.34rem;
      text-align: center;
      line-height: 1rem;
      border: none;
      outline: none;
    }
    .submit_active {
      background: #43a5ff;
      color: #fff;
    }
  }
}
</style>
// 检验密码
export function checkPwd(data){
    return req({
        url:'/member/queryByPassword?password='+data.oldpw,
        method:'get',
        data:data
    })
}

// 修改密码
export function changePwd(data){
    // console.log(data)
    return req({
        url:'/member/alterPassword?pass='+data.password,
        method:'post',
        data:data
    })
}

// 找回密码
export function backPwd(data){
    // console.log(data)
    return req({
        url:'/mbs/client/BackPwd',
        method:'post',
        data:data
    })
   
}

extremo posterior

clase de entidad

package com.fifth.entity;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * 客户信息表
 *
 * @TableName mbs_member
 */
@TableName("mbs_member")
@Data
@ApiModel("客户信息实体类")
public class Member implements Serializable {

    /**
     * 会员客户ID
     */
    @ApiModelProperty("会员客户ID")
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 账号
     */
    @ApiModelProperty("账号")
    private String username;
    /**
     * 密码
     */
    @ApiModelProperty("密码")
    private String password;
    /**
     * 盐值列
     */
    @ApiModelProperty("盐值列")
    private String pwSalt;
    /**
     * 账号状态(帐号启用状态:0->启用;1->禁用)
     */
    @ApiModelProperty("账号状态(帐号启用状态:0->启用;1->禁用)")
    private Integer status;
    /**
     * (身份证,护照,军官证,台胞证,港澳台来往内地通行证)
     */
    @ApiModelProperty("(身份证,护照,军官证,台胞证,港澳台来往内地通行证)")
    private String idType;
    /**
     * 正面
     */
    @ApiModelProperty("正面")
    private String pathFront;
    /**
     * 反面
     */
    @ApiModelProperty("反面")
    private String pathReverse;
    /**
     * 客户名字
     */
    @ApiModelProperty("客户名字")
    private String name;
    /**
     * 联系人
     */
    @ApiModelProperty("联系人")
    private String contactName;
    /**
     * 联系电话
     */
    @ApiModelProperty("联系电话")
    private String contactPhone;
    /**
     * 联系地址
     */
    @ApiModelProperty("联系地址")
    private String contactAddress;
    /**
     * 驾照号
     */
    @ApiModelProperty("驾照号")
    private String licenseNo;
    /**
     * 性别
     */
    @ApiModelProperty("性别")
    private String sex;
    /**
     * 电话
     */
    @ApiModelProperty("电话")
    private String phoneNum;
    /**
     * 地址
     */
    @ApiModelProperty("地址")
    private String address;
    /**
     * 邮箱
     */
    @ApiModelProperty("邮箱")
    private String email;
    /**
     * 会员级别(普通,金卡,白金,钻石)
     */
    @ApiModelProperty("会员级别(普通,金卡,白金,钻石)")
    private Integer memberLevelId;
    /**
     * 账户余额
     */
    @ApiModelProperty("账户余额")
    private Double accountBalance;
    /**
     * 积分
     */
    @ApiModelProperty("积分")
    private Integer integration;
    /**
     * 成长值
     */
    @ApiModelProperty("成长值")
    private Double growth;
    /**
     * 历史积分数量(只加不减)
     */
    @ApiModelProperty("历史积分数量(只加不减)")
    private String historyIntegration;
    /**
     * 微信返回ID
     */
    @ApiModelProperty("微信返回ID")
    private Integer openId;
    /**
     * 登录验证token
     */
    @ApiModelProperty("登录验证token")
    private String token;
    /**
     * 证件编号
     */
    @ApiModelProperty("证件编号")
    private String idCard;
    /**
     * 头像
     */
    @ApiModelProperty("头像")
    private String headPic;


}

capa controladora



@RestController
@RequestMapping("member")
@Api(tags = "客户管理--会员管理")
public class MemberController {

    @Autowired
    private MemberService memberService;

    //判断修改密码中输入的旧密码
    @GetMapping("queryByPassword")
    @ApiOperation("修改密码-旧密码判断")
    public Result<Boolean> queryByPassword(@RequestParam String password,@RequestParam String token) {
        return memberService.queryByPassword(password,token);
    }

    //确认修改密码
    @PostMapping("/alterPassword")
    @ApiOperation("修改密码-确认事件")
    public Result<Boolean> alterPassword(@RequestParam String pass, @RequestParam String token) {
        return memberService.alterPassword(pass, token);
    }
}

capa de servicio


public interface MemberService {

    //修改密码-旧密码判断
    Result<Boolean> queryByPassword(String password, String token);
    //修改密码-确认事件
    Result<Boolean> alterPassword(String pass, String token);
}

Capa de implementación ServiceImpl


@Service
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberDao memberDao;

    @Autowired
    private StringRedisTemplate redisTemplate;


    //修改密码-旧密码判断
    /**
     * 根据密码和用户令牌查询用户信息
     * @param password 用户输入的旧密码
     * @param token 用户令牌,用于从Redis中获取用户信息
     * @return 返回Result对象,包含查询结果和消息
     */
    @Override
    public Result<Boolean> queryByPassword(String password, String token) {
        // 从Redis中根据用户令牌获取用户信息
        String userInfoJson = redisTemplate.opsForValue().get("sso:member:" + token);

        if (userInfoJson == null) {
            // 未找到该令牌对应的用户信息
            return new Result<>(500, "令牌不存在", null);
        }

        // 将用户信息JSON转换成Member对象
        Member member = JSON.parseObject(userInfoJson, Member.class);

        if (member == null || member.getId() == null) {
            // Redis中存储的用户信息无效
            return new Result<>(500, "用户信息无效", null);
        }

        // 查询数据库该用户的真实密码
        Member member1 = memberDao.selectById(member.getId());

        if (member1 == null || member1.getPassword() == null || member1.getPwSalt() == null) {
            // 数据库中用户信息无效
            return new Result<>(500, "用户信息无效", null);
        }

        // 加密后的密码
        Md5Hash md5Hash = new Md5Hash(password, member1.getPwSalt());

        // 检查用户输入的旧密码是否与数据库中的密码匹配
        if (member1.getPassword().equals(md5Hash.toString())) {
            // 密码正确,返回结果为成功
            return new Result<>(200, "密码正确", true);
        } else {
            // 密码不正确,返回结果为失败
            return new Result<>(500, "旧密码错误", false);
        }
    }


    //修改密码-确认事件
    @Override
    public Result<Boolean> alterPassword(String pass, String token) {
        //1.获取当前登录用户的缓存信息
        String s = redisTemplate.opsForValue().get("sso:member:" + token);
        Member member = JSON.parseObject(s,Member.class);


        //2.修改用户密码,进行加密并更新到数据库
        String newPassword = new Md5Hash(pass, member.getPwSalt()).toString();
        member.setPassword(newPassword);
        int i = memberDao.updateById(member);

        if (i > 0) {
            return new Result<>(200, "修改成功", true);
        }
        return new Result<>(500, "修改密码未知错误", false);
    }

}

capa dao

@Mapper
public interface MemberDao extends BaseMapper<Member> {
  
}

Cambio de contraseña completado

2. Olvidé mi contraseña

respuesta del cliente

 Vista frontal... (en la vista frontal "cambiar contraseña" anterior)

extremo posterior

 MiembroRegisterVo.java

@Data
@ApiModel("会员短信注册信息接收")
public class MemberRegisterVo {
    private String confirmPassword;
    private String password;
    private String phoneNum;

    //验证码
    private String verifyCode;

}

capa controladora



@RestController
@RequestMapping("member")
@Api(tags = "客户管理--会员管理")
public class MemberController {

    @Autowired
    private MemberService memberService;


    @GetMapping("/queryByUserName")
    @ApiOperation("根据会员电话(相当于用户名)查询会员")
    public Result<Boolean> queryByUserName(@RequestParam String userName) {
        return memberService.queryByUserName(userName);
    }

    @PostMapping("/backPassword")
    @ApiOperation("密码找回")
    public Result<String> backPassword(@RequestBody MemberRegisterVo memberRegisterVo, @RequestParam String token) {
        return memberService.backPassword(memberRegisterVo,token);
    }


}

capa de servicio

public interface MemberService {

    //根据会员电话查询会员信息
    Member getByPhoneNum(String num);

    //密码找回
    Result<String> backPassword(MemberRegisterVo memberRegisterVo,String token);


}

capa de implementación serviceImpl


@Service
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberDao memberDao;

    @Autowired
    private StringRedisTemplate redisTemplate;


    //根据会员电话查询信息
    @Override
    public Result<Boolean> queryByUserName(String userName) {
        QueryWrapper<Member> wrapper = new QueryWrapper<>();
        //会员手机号
        wrapper.eq("phone_num", userName);
        Member member = memberDao.selectOne(wrapper);
        if (member != null) {
            return new Result<>(200,"成功",true);
        }
        return new Result<>(200,"成功",false);
    }

    //密码找回
    @Override
    public Result<String> backPassword(MemberRegisterVo memberRegisterVo,String token) {
        //1.获取当前登录用户的缓存信息
        String s = redisTemplate.opsForValue().get("sso:member:" + token);
        Member member = JSON.parseObject(s,Member.class);

        //1.校验验证码输入是否正确
        String verifyCode = memberRegisterVo.getVerifyCode();
        //获取redis中的验证码
        String code = redisTemplate.opsForValue().get("code");

        if (!code.equals(verifyCode)) {
            return new Result<>(200, "验证码错误", "1");
        }

        //用户密码加密
        String password = memberRegisterVo.getPassword();

        Md5Hash md5password = new Md5Hash(password, member.getPwSalt());
        member.setPassword(md5password.toString());


        int i = memberDao.updateById(member);
        if (i > 0) {
            //清除验证码
            redisTemplate.delete("code");
            return new Result<>(200, "成功", "0");
        }
        return new Result<>(200, "失败", null);
    }

}

capa dao


@Mapper
public interface MemberDao extends BaseMapper<Member> {

}

Supongo que te gusta

Origin blog.csdn.net/WQGuang/article/details/132043283
Recomendado
Clasificación