我的 (登录页面:短信验证码)登录 前后端一起搞

2,922 阅读3分钟

思路: 前端:

  1. 点击获取短信验证码按钮

    1.1 前端校验 手机号是否正确

    1.2 点击的按钮文案更换成 倒计时按钮,倒计时完成后,回复原来的模样

    1.3 向后端发送请求:传递手机号,操作后端去发送验证码 返回给前端

    1.4 前端获取到验证码后,点击登录的时候进行验证码校验,同时校验手机号

    1.5 校验通过后,继续向后端发送请求:把手机号注册到用户表中

    1.6 后端先查一下这个手机号 如果没有注册,就注册到用户表中,如果已经存在就不做处理

后端:

  1. 接收前端传递过来的手机号

  2. 根据短信sdk 发送短信验证码 :github.com/qcloudsms/q…

  3. 随机4位短信验证码: let params = [Math.floor(Math.random() * 9000 + 1000) + ""];

    3.1 这里要注意:res 会有多个导致冲突,自己修改 成 ress 避免冲突,不然排查很久

  4. 前端手机号校验通过后,后端对手机号进行注册操作

    4.1 后端先查一下这个手机号 如果没有注册,就注册到用户表中,新insert语句,紧接着又执行查询语句(尤为重要),确保插入的手机号能查询到,说明已经正确插入,然后后端返回数据给前端处理

一 前端: 获取短信验证码 前端处理 Login.vue

  // 获取短信验证码
    async getCode() {
      //前端 校验手机号
      if (!this.validate("tel")) return;
      // 向后端发送请求
      let res = await http.$axios({
        url: "/api/code",
        method: "POST",
        data: {
          tel: this.tel,
        },
      });
      console.log(res);
      this.sendCode = res.data;
      console.log(this.sendCode);
      // 开启定时器
      let time = setInterval(() => {
        // 校验通过后:让按钮不可继续点击
        this.disableds = true;
        this.btnTime--;
        this.btnText = `重新发送(${this.btnTime})`;
        if (this.btnTime <= 0) {
          clearInterval(time);
          this.btnTime = 6;
          this.btnText = "获取短信验证码";
          this.disableds = false;
        }
      }, 1000);
    },

一 后端: 发送短信验证码 接口 server文件夹下的 index.js

注意事项:callback回掉函数 默认res 会有多个导致冲突,自己修改 成 ress 避免冲突,不然排查很久

// 发送短信验证码接口(只是发送一个验证码给前端校验)
router.post('/api/code', function (req, res, next) {

  // 短信应用SDK AppID
  var appid = 1400187558; // SDK AppID是1400开头

  // 短信应用SDK AppKey
  var appkey = "dc9dc3391896235ddc2325685047edc7";

  // 需要发送短信的手机号码  ==》 接收前端过来的数据
  var phoneNumbers = [req.body.tel];

  // 短信模板ID,需要在短信应用中申请
  var templateId = 285590; // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请

  // 签名
  var smsSign = "三人行慕课网"; // NOTE: 这里的签名只是示例,请使用真实的已申请的签名, 签名参数使用的是`签名内容`,而不是`签名ID`

  // 实例化QcloudSms
  var qcloudsms = QcloudSms(appid, appkey);

  // 设置请求回调处理, 这里只是演示,用户需要自定义相应处理回调
  function callback(err, ress, resData) {
    if (err) {
      console.log("err: ", err);
    } else {
      res.send({
        code: 200,
        data: {
          success: true,
          data: ress.req.body.params[0]
        }
      })
      // console.log("request data: ", ress);
    }
  }
  // 指定模板ID单发短信 params 就是往手机上发送的短信验证码
  var ssender = qcloudsms.SmsSingleSender();
  let params = [Math.floor(Math.random() * 9000 + 1000) + ""];
  ssender.sendWithParam(86, phoneNumbers[0], templateId,
    params, smsSign, "", "", callback); // 签名参数不能为空串
});

二 前端: 获取到短信验证码后 点击登录按钮,前端登录发送请求 Login.vue

 //   判断如果输入的短信验证码 和 后端返回的 短信验证码一致 点击登录按钮 进行登录跳转
    async goLogin() {
      console.log(this.code.length);
      if (this.validate("tel")) {
        if (this.code.length > 0 && this.code == this.sendCode) {
          // 发送登录请求
          let res = await http.$axios({
            url: "/api/logins",
            method: "POST",
            data: {
              tel: this.tel,
            },
          });
          console.log(res.data);
          Toast("登录成功");
        } else {
          Toast("请输入正确验证码");
        }
      }
    },

    validate(key) {
      let bool = true;
      if (!this.rules[key].rule.test(this[key])) {
        Toast(this.rules[key].msg);
        bool = false;
        return false;
      }
      return bool;
    },
  },
};

二 后端:短信验证码登录接口 /api/logins 获取到短信验证码后 点击登录 校验手机号是否已存在数据库,如果存在就查询一下,如果不存在就插入到数据库中,插入完成紧接着要执行查询语句。 server文件夹下的 index.js

注意事项:后端先查一下这个手机号 如果没有注册,就注册到用户表中,
            用insert语句,紧接着又执行查询语句(尤为重要),确保插入的手机号能查询到,
            最后,后端返回数据给前端处理

// 短信验证码登录接口  /api/logins
router.post('/api/logins', function (req, res, next) {
  // 前端传递过来的手机号
  let params = {
    tel: req.body.tel
  }
  // 先查询前端传递过来的手机号是否已经存在,如果存在就不做插入,如果不存在就插入到表中
  connection.query(user.queuryTel(params), function (e, r) {
    console.log(r);
    if (e) throw e
    // 手机号已存在 直接返回数据
    if (r.length > 0) {
      res.send({
        code: 200,
        data: {
          success: true,
          msg: "登录成功",
          data: r[0]
        }
      })
    } else {
      // 手机号不存在 就插入手机号
      connection.query(user.insertTel(params), function (e, r) {
        // 再查一次 插入的手机号
        connection.query(user.queuryTel(params), function (e, r) {
          console.log(r, '插入手机号查询成功');
          if (e) throw e
          res.send({
            code: 200,
            data: {
              success: true,
              msg: "登录成功",
              data: r[0]
            }
          })
        })
      })
    }
  })
})