一、需求分析

   当点击修改密码时,弹出修改密码框,向数据库中查询原密码,正确时才允许修改,修改完,点击确定时,更新密码。

二、创建修改密码模板

1.在头部组件里:

<!-- 修改密码弹出框 -->
    <el-dialog title="修改密码" :visible.sync="dialogFormVisible">
      <el-form :model="form" ref="pwdForm" :rules="rules">
        <el-form-item label="原密码" prop="password">
          <el-input v-model="form.password" autocomplete="off"></el-input>
        </el-form-item>

        <el-form-item label="新密码" prop="newPassword">
          <el-input v-model="form.newPassword" autocomplete="off"></el-input>
        </el-form-item>

        <el-form-item label="确认密码" prop="checkPassword">
          <el-input v-model="form.checkPassword" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="onSubmit('pwdForm')">确 定</el-button>
      </div>
    </el-dialog>

2.在script标签里创建相应方法及数据:

 在data里:

  return {
      rules: {
        password: [
          { required: true, message: "请输入原密码", trigger: "blur" },
          { validator: validatePass, message: "原密码不正确", trigger: "blur" },
        ],
        newPassword: [
          { required: true, message: "请输入新密码", trigger: "blur" },
        ],
        checkPassword: [
          { required: true, message: "不能为空", trigger: "blur" },
          { validator: checkpass, trigger: "blur" },
        ],
      },
      dialogFormVisible: false,
      form: {
        password: "",
        newPassword: "",
        checkPassword: "",
      },
    };

在handleCommand里:

 if (command == "a") {
        this.dialogFormVisible = true;
      } 

 3.添加 submitForm 方法, 提交修改密码表单

 onSubmit(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          alert("验证通过");
        
        } else {
          alert("验证不通过");
          return false;
        }
      });
    },

现在完成:当点击修改密码时,弹出修改密码框,确认时弹出通过不通过。

三、 添加接口

1.添加原密码校验接口 :

输入原密码,失去焦点后异步发送请求校验是否正确, 给服务接口传入用户id和密码:

// 校验原密码
router.post("/user/pwd", (req, res) => {
    // console.log(req.body)
    let data = req.body
    User.findOne({
        _id: data.id,
        password: data.pwd
    }).then((data, err) => {
        if (err) {
            return res.status(500).json({
                code: 3000,
                flag: false,
                message: "服务器后台错误"
            })
        }

        if (!data) {
            return res.status(200).json({
                "code": 4000,
                "flag": false,
                "message": "密码不正确"
            })
        }

        return res.status(200).json({
            "code": 2000,
            "flag": true,
            "message": "密码正确"
        })
    })
})

四、调用接口

1.新建 api\pwd.js 文件, 调用服务接口实现如下:

import request from "@/utils/request.js"
export default {
    getPass(msg) { //校验原密码
        return request({
            url: "/user/pwd",
            method: "post",
            data: msg
        })
    },
}

2.引入:

import pwd from "@/api/pwd.js";

3.在data里return上,写自定义校验规则,在失去焦点时,再去检查密码是否正确:

 // 校验原密码
    let validatePass = (rule, value, callback) => {
      let userdata = JSON.parse(localStorage.getItem("sms-user"));
      userdata.pwd = this.form.password;
      pwd.getPass(userdata).then((res) => {
        if (res.data.flag) {
          callback();
        } else {
          callback(new Error(res.data.message));
        }
      });
    };

五、检测新密码和确认密码一致性

1.在校验原密码下写:

 // 检测新密码和确认密码一致性
    let checkpass = (rule, value, callback) => {
      if (value == this.form.newPassword) {
        callback();
      } else {
        callback(new Error("密码不一致"));
      }
    };

六、点击确定时,更新密码。

1. 添加修改密码接口,点击确认, 将用户id和新密码提交给后台接口

// 修改密码(更新密码)
router.put("/user/pwd", function(req, res) {
    let data = req.body
    User.findOne({
        _id: data.id,
    }).then((data, err) => {
        if (err) {
            return res.status(500).json({
                code: 3000,
                flag: false,
                message: "服务器后台错误"
            })
        }
        if (!data) {
            return res.status(200).json({
                "code": 4000,
                "flag": false,
                "message": "密码错误"
            })
        }

        data.password = req.body.pwd //修改密码
        User.findByIdAndUpdate(req.body.id, data).then((data, err) => {
            if (err) {
                return res.status(500).json({
                    code: 3000,
                    flag: false,
                    message: "服务器后台错误"
                })
            }
            return res.status(200).json({
                "code": 2000,
                "flag": true,
                "message": "修改密码成功"
            })
        })
    })
});

2. Api 调用接口:

  update(msg) { //校验确认密码和新密码
        return request({
            url: "/user/pwd",
            method: "put",
            data: msg
        })
    }

3.在方法里:

 methods: {
    handleCommand(command) {
      if (command == "a") {
        this.dialogFormVisible = true;
      } else if (command == "b") {
        this.out()
      }
    },
    out() {//退出登录
      logout(localStorage.getItem("sms-token"))
        .then((res) => {
          let resArr = res.data;
          if (resArr.flag) {
            // 清除本地数据
            localStorage.removeItem("sms-token");
            localStorage.removeItem("sms-user");
            this.$message({
              showClose: true,
              message: resArr.message,
              type: "error",
            });
            this.$router.push("/login"); //退出登录,让它回到登录页面
          } else {
            this.$message({
              showClose: true,
              message: resArr.message,
              type: "error",
            });
          }
        })
        .catch((err) => {
          console.log("err", err);
        });
    },
    onSubmit(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          alert("验证通过");
          let userdata = JSON.parse(localStorage.getItem("sms-user"));
          userdata.pwd = this.form.newPassword;
          pwd.update(userdata).then((res) => {
            if (res.data.flag) {
              this.dialogFormVisible = false;
              this.out();
            }
          });
        } else {
          alert("验证不通过");
          return false;
        }
      });
    },
  },

修改密码全部完成。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐