Vue与Node.js实现手机短信验证登录

手机短信使用的第三方平台是联容云,注册就送8块钱体验费,足够自己用用了,注册完自己建一个应用就能拿到需要使用的配置了,如图

注册完之后1就可以使用了。

Node.js后端使用了Express框架

 "js-base64": "^3.7.2",
 "blueimp-md5": "^2.19.0",
 "moment": "^2.29.1",
 "request": "^2.88.2"

这里引入了四个依赖

获取手机段短信方法

var md5 = require("blueimp-md5");
var moment = require("moment");
var Base64 = require("js-base64").Base64;
var request = require("request");

/*
 生成指定长度的随机数
 */
function randomCode(length) {
  var chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
  var result = ""; //统一改名: alt + shift + R
  for (var i = 0; i < length; i++) {
    var index = Math.ceil(Math.random() * 9);
    result += chars[index];
  }
  return result;
}
// console.log(randomCode(6));
exports.randomCode = randomCode;

/*
向指定号码发送指定验证码
 */
function sendCode(phone, code, callback) {
  var ACCOUNT_SID = "";
  var AUTH_TOKEN = "";
  var Rest_URL = "";
  var AppID = "";
  //1. 准备请求url
  /*
     1.使用MD5加密(账户Id + 账户授权令牌 + 时间戳)。其中账户Id和账户授权令牌根据url的验证级别对应主账户。
     时间戳是当前系统时间,格式"yyyyMMddHHmmss"。时间戳有效时间为24小时,如:20140416142030
     2.SigParameter参数需要大写,如不能写成sig=abcdefg而应该写成sig=ABCDEFG
     */
  var sigParameter = "";
  var time = moment().format("YYYYMMDDHHmmss");
  sigParameter = md5(ACCOUNT_SID + AUTH_TOKEN + time);
  var url =
    Rest_URL +
    "/2013-12-26/Accounts/" +
    ACCOUNT_SID +
    "/SMS/TemplateSMS?sig=" +
    sigParameter;

  //2. 准备请求体
  var body = {
    to: phone,
    appId: AppID,
    templateId: "1",
    datas: [code, "1"],
  };
  //body = JSON.stringify(body);

  //3. 准备请求头
  /*
     1.使用Base64编码(账户Id + 冒号 + 时间戳)其中账户Id根据url的验证级别对应主账户
     2.冒号为英文冒号
     3.时间戳是当前系统时间,格式"yyyyMMddHHmmss",需与SigParameter中时间戳相同。
     */
  var authorization = ACCOUNT_SID + ":" + time;
  authorization = Base64.encode(authorization);
  var headers = {
    Accept: "application/json",
    "Content-Type": "application/json;charset=utf-8",
    "Content-Length": JSON.stringify(body).length + "",
    Authorization: authorization,
  };

  //4. 发送请求, 并得到返回的结果, 调用callback
  // callback(true);
  request(
    {
      method: "POST",
      url: url,
      headers: headers,
      body: body,
      json: true,
    },
    function (error, response, body) {
      callback(body.statusCode === "000000");
    }
  );
}
exports.sendCode = sendCode;

使用:引入上面的方法,将请求的mobile和生成的code验证码传入进行保存在sendCodeP数组中进行保存,并开启计时器在120s后进行删除。

const { randomCode, sendCode } = require("../utils/getMessage");
const { valid } = require("../utils/valid")
var sqlQuery = require("../utils/dbconfig");
const jwt = require("../utils/token");

let sendCodeP = []
//倒计时
setTime = function (mobile, code) {
    sendCodeP.push({
        mobile:mobile,
        code:code
    })
    let i = 0
    let timer = setInterval(() => {
        i += 1
        console.log(i)
        if (i == 120) {
            const index = sendCodeP.findIndex(e => {
                return e.mobile == mobile
            })
            sendCodeP.splice(index, 1)
            clearInterval(timer)
        }
    }, 1000);
}



sendMobileCode = (req, res) => {
    const { mobile } = req.query
    console.log(mobile)
    if (!valid.mobileFormatting.test(mobile)) {
        res.send({
            msg: "手机号格式错误",
            status: 402,
        });
    } else {
        const index=sendCodeP.findIndex(e=>{
            return e.mobile===mobile
        })
        if (index!=-1) {
            res.send({
                status: 402,
                msg: "已经发送过",
            });
        }
        else {
            let code = randomCode(6);
            sendCode(mobile, code, function (success) {
                if (success) {
                    setTime(mobile, code)
                    res.send({
                        status: 0,
                        msg: '短信验证码已发送'
                    });
                } else {
                    res.send({
                        status: 402,
                        msg: "短信验证码发送失败"
                    });

                }
            });
        }
    }
}

login = async function (mobile) {
    var sql = `select * from cms_user where mobile='${mobile}'`;
    let arr = []
    let data = await sqlQuery(sql, arr)
    return data
}

//验证码登陆
codePhoneLogin = async (req, res) => {
    let { mobile, Verification } = req.query;
    console.log(sendCodeP, mobile)
    //验证手机号是否发送过验证码
    const index=sendCodeP.findIndex(e=>{
        return e.mobile===mobile
    })
    console.log(index)
    if (index!=-1) {
        //验证验证码与手机号是否匹配
        
        if (Verification==sendCodeP[index].code) {
            const loginData = await login(mobile)
            if (loginData && loginData.length != 0) {
                delete loginData[0]["password"];
                const tokenstr = jwt.encrypt({ gadID: loginData[0].id }, "2h");
                res.send({
                    data: loginData[0],
                    token: tokenstr,
                    msg: `登录成功`,
                    status: 0,
                });
            } else {
                res.send({
                    msg: `无账号信息`,
                    status: 402,
                });
            }

        } else {
            res.send({
                status: 402,
                msg: "验证码错误",
            });
        }
    } else {
        res.send({
            status: 402,
            msg: "请先获取验证码",
        });
    }
};
module.exports = {
    sendMobileCode,
    codePhoneLogin
}

Vue调用接口即可实现手机短信验证

附上前端短信登录代码 

<template>
  <div>
    <el-form
      :model="ruleForm"
      status-icon
      :rules="rules_register"
      ref="ruleForm"
      label-width="60px"
      class="demo-ruleForm"
    >
      <el-form-item label="手机号" prop="mobile">
        <el-input type="text" v-model="ruleForm.mobile" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="验证码" prop="Verification">
        <el-input style="width: 150px" v-model="ruleForm.Verification"></el-input>
        <el-button
          type="primary"
          style="margin-left: 20px"
          @click="getCode"
          :disabled="Boolean(timer)"
        >{{btnName}}</el-button>
      </el-form-item>
    </el-form>
    <div style="text-align: center">
      <el-button>重置</el-button>
      <el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    var validateMobile = (rule, value, callback) => {
      if (!value) {
        callback(new Error("请输入手机号"));
      } else {
        if (!this.$valid.mobileFormatting.test(value)) {
          callback(new Error("请输入正确的手机号"));
        }
        callback();
      }
    };

    var validateVerification = (rule, value, callback) => {
      if (!value) {
        callback(new Error("请输入验证码"));
      } else {
        if (!this.$valid.VerificationFormatting.test(value)) {
          callback(new Error("请输入6位验证码"));
        }
        callback();
      }
    };
    return {
      ruleForm: {},
      timer: null,
      i: 0,
      btnName: "获取验证码",
      rules_register: {
        mobile: [{ validator: validateMobile, trigger: "blur" }],
        Verification: [{ validator: validateVerification, trigger: "blur" }]
      }
    };
  },
  methods: {
    getCode() {
      if (!this.ruleForm.mobile || this.ruleForm.mobile == "") {
        this.$message.error("请先输入手机号");
        return;
      } else if (!this.$valid.mobileFormatting.test(this.ruleForm.mobile)) {
        this.$message.error("手机号格式错误");
        return;
      } else {
        this.$getRequest("/sendCode", { mobile: this.ruleForm.mobile }).then(
          res => {
            if (res.status === 0) {
              this.$message.success(res.msg);
              this.timer = setInterval(() => {
                this.i += 1;
                this.btnName = `已发送(${60 - this.i})`;
                if (this.i === 60) {
                  this.btnName = "重新获取";
                  clearInterval(this.timer);
                }
              }, 1000);
            }
          }
        );
      }
    },
    submitForm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          this.$getRequest("/codePhoneLogin", this.ruleForm).then(res => {
            if (res.status == 0) {
              //  this.$message.success(`登录成功,欢迎你 ${res.data[0].name}`);
              let time = new Date().getHours();
              console.log(time);
              let title;
              if (time < 12) {
                title = "早上好";
              } else if (12 <= time && time < 18) {
                console.log(time);
                title = "下午好";
              } else {
                title = "晚上好";
              }
              this.$notify({
                title: "登录成功",
                message: title + "  " + res.data.name,
                type: "success"
              });
              this.$router.replace("/main");
            }
          });
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    }
  }
};
</script>

<style>
</style>

 手机短信验证登录就是这么简单,看过就能自己实现一个了。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用VueNode.js实现个人博客系统,可以让开发者快速搭建一个高效、灵活、易于维护的博客系统。Vue作为前端框架,可以提供良好的用户体验和交互效果,而Node.js则可以提供高效的后端支持,使得博客系统具有更好的性能和可扩展性。此外,VueNode.js都有着丰富的社区资源和插件库,可以帮助开发者快速解决问题和实现功能。 ### 回答2: 使用VueNode.js实现个人博客系统有以下几个原因: 1. 前后端分离:Vue是一款流行的前端框架,它提供了一种简单、高效的方式来构建用户界面。通过使用Vue,可以实现前后端分离,将前端和后端的开发过程分离,提高了开发效率。 2. Vue的组件化开发:Vue采用了组件化开发的思想,使得代码的复用性更高,开发更加模块化。通过将博客系统的各个功能模块拆分成独立的组件,可以方便地进行管理和维护。 3. Node.js的高效性能:Node.js是一种基于事件驱动、非阻塞I/O模型的服务器端JavaScript运行环境。相比传统的后端开发语言,Node.js具有更高的性能和并发能力,能够处理大量的并发请求,适合实现高负载的博客系统。 4. 可扩展性:VueNode.js都具有良好的可扩展性,可以根据博客系统的需求进行定制开发。Vue提供了丰富的插件和组件库,可以方便地进行功能扩展;而Node.js通过使用npm包管理器,可以引入各种第三方模块,快速构建博客系统。 5. 生态系统完善:VueNode.js都拥有庞大的开发者社区和活跃的生态系统。这意味着许多优秀的第三方库和工具已经被开发出来,并得到了长期维护和更新。这为博客系统的开发提供了更多的选择和支持。 综上所述,使用VueNode.js实现个人博客系统,既可以提高开发效率,又能够实现更高的性能和可扩展性,同时还能够借助强大的开发者社区和生态系统,为博客的开发提供更多的资源和支持。 ### 回答3: 使用VueNode.js实现个人博客系统有以下几个原因: 首先,Vue是一款轻量级的JavaScript框架,具有良好的响应式性能和组件化开发思想。Vue的虚拟DOM机制可以提高页面渲染性能,而且Vue的组件化开发可以使得代码更加模块化,便于维护和扩展。在个人博客系统中,我们可以将不同的功能模块封装成Vue组件,使得代码结构清晰,更易于开发和维护。 其次,Node.js是一个基于JavaScript的运行时环境,具有事件驱动和非阻塞I/O的特性。Node.js的高性能使得它非常适合处理实时性要求较高的应用,比如个人博客系统。在个人博客系统中,用户可以实时发布、编辑、删除文章,Node.js的事件驱动和非阻塞I/O特性使得这些操作可以高效地处理并及时地更新到页面上。 另外,VueNode.js都具有活跃的社区和丰富的生态系统。Vue社区有大量的插件和组件可供使用,可以方便地实现各种功能需求,比如路由管理、表单验证、数据可视化等。而Node.js的包管理工具npm也提供了大量的模块可供使用,可以加速开发过程,提高开发效率。 最后,VueNode.js都具有良好的文档和学习资源。Vue官方提供了详细的文档和教程,社区中也有很多优秀的博客和视频教程可供学习。而Node.js的官方文档和npm的官方网站也提供了很多的学习资源和示例代码,便于开发者快速上手和解决问题。 综上所述,使用VueNode.js实现个人博客系统能够方便地开发、维护和扩展系统,同时享受到活跃的社区和丰富的学习资源,提高开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值