百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Vue-antd实现手机号和验证码验证登录-60s禁用倒计时-案例

toyiye 2024-04-06 13:46 18 浏览 0 评论

效果

页面结构代码

<div class="Login">
	<div class="container">
	  <h1 class="title">DID管理平台</h1>
	  <a-form-model
		ref="ruleForm"
		:model="form"
		:rules="rules"
		:label-col="{ span: 0 }"
		:wrapper-col="{ span: 24 }"
	  >
		<!-- label="手机号" -->
		<a-form-model-item prop="phone">
		  <a-input v-model="form.phone" :maxLength="11" placeholder="手机号" />
		  <!-- <a-input-group compact>
			<a-select disabled style="width: 25%" default-value="+86">
			  <a-select-option value="+86"> +86 </a-select-option>
			</a-select>
			<a-input
			  style="width: 75%"
			  v-model="form.phone"
			  :maxLength="11"
			  placeholder="手机号"
			/>
		  </a-input-group> -->
		</a-form-model-item>
		<!-- <a-form-model-item prop="password">
		  <a-input
			type="password"
			v-model="form.password"
			placeholder="请输入密码"
		  />
		</a-form-model-item> -->
		<a-form-model-item prop="code" class="identify">
		  <a-input
			style="width: 62%"
			v-model="form.code"
			:maxLength="6"
			placeholder="请输入验证码"
		  />
		  <!-- @keyup.enter.native -->
		  <!-- :class="[getCodeBtnDisable ? 'disabled-style' : 'code-style']" -->
		  <a-button
			class="btnCode"
			:disabled="getCodeBtnDisable"
			@click="getCode()"
		  >
			{{ codeBtnWord }}
		  </a-button>
		</a-form-model-item>
		<a-form-model-item>
		  <a-button block type="primary" @click="onSubmit"> 登录 </a-button>
		  <!-- <router-link
			:to="{ name: 'Password' }"
			style="float: right"
			class="pointer"
		  >
			忘记密码
		  </router-link> -->
		</a-form-model-item>
	  </a-form-model>
	</div>
</div>

逻辑代码

<script>
export default {
  name: "Login",
  components: { },
  data() {
    const validateCode = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("验证码为空"));
        return false;
      } else if (value !== this.identifyCode) {
        callback(new Error("验证码不正确"));
        return false;
      } else {
        callback();
      }
    };
    //使用正则表达式验证手机号
    const checkPhone = (rule, value, callback) => {
      if (!value) {
        return callback(new Error("手机号不能为空"));
      } else {
        //获取工具类中的手机号正则表达式
        const phoneReg =
          /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
        if (phoneReg.test(value)) {
          callback();
        } else {
          //如果验证输入错误就清空
          this.form.phone = "";
          return callback(new Error("请输入正确的手机号"));
        }
      }
    };
    return {
      showLoading: false,
      identifyCode: "",
      codeBtnWord: "获取验证码", // 获取验证码按钮文字
      waitTime: 61, // 获取验证码按钮失效时间
      form: {
        phone: "",
        password: "",
        code: "",
      },
      rules: {
        phone: {
          validator: checkPhone,
          //   required: true,
          //   message: "手机号",
          trigger: "blur",
        },
        password: { required: true, message: "请输入密码", trigger: "blur" },
        code: [
          {
            // validator: validateCode,
            required: true,
            message: "请输入验证码",
            trigger: "blur",
          },
        ],
      },
    };
  },
  computed: {
    ...mapGetters(["userInfo", "isLogin"]),
    // 用于校验手机号码格式是否正确
    phoneNumberStyle() {
      let reg = /^1[3456789]\d{9}$/;
      if (!reg.test(this.form.phone)) {
        return false;
      }
      return true;
    },
    // 控制获取验证码按钮是否可点击
    getCodeBtnDisable: {
      //设置按钮61s
      get() {
        if (this.waitTime === 61) {
          if (this.form.phone && this.phoneNumberStyle) {
            return false;
          }
          return true;
        }
        return true;
      },
      // 注意:因为计算属性本身没有set方法,不支持在方法中进行修改,而下面我要进行这个操作,所以需要手动添加
      set() {},
    },
  },
  mounted() {},
  methods: {
    ...mapActions(["userInfoSync", "setisLoginSync"]),
    // 获取验证码
    getCode() {
      this.waitTime--;
      this.getCodeBtnDisable = true;
      this.codeBtnWord = `${this.waitTime}s 后获取`;
      let timer = setInterval(() => {
        if (this.waitTime > 1) {
          this.waitTime--;
          this.codeBtnWord = `${this.waitTime}s 后获取`;
        } else {
          clearInterval(timer);
          this.codeBtnWord = "获取验证码";
          this.getCodeBtnDisable = false;
          this.waitTime = 61;
        }
      }, 1000);
    },
    // 确认
    onSubmit() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          // 模拟登录
          let { phone, password, code } = this.form;
          if (phone == "13014035232" && code == "123456") {
            this.userInfoSync({ phone, code });
            this.setisLoginSync(true);
            this.$router.push("/home");
          } else {
            this.$message.error("请检查是否填写正确");
          }
        } else {
          this.$message.error("请检查是否填写完整");
          console.log("error submit!!");
          return false;
        }
      });
    },
    // 重置表单
    resetForm() {
      this.$refs.ruleForm.resetFields();
    },
    goPath() {
      this.$router.push("/home");
    },
  },
};
</script>

全量代码

<template>
  <div class="Login">
    <div class="container">
      <h1 class="title">管理平台</h1>
      <a-form-model
        ref="ruleForm"
        :model="form"
        :rules="rules"
        :label-col="{ span: 0 }"
        :wrapper-col="{ span: 24 }"
      >
        <!-- label="手机号" -->
        <a-form-model-item prop="phone">
          <a-input v-model="form.phone" :maxLength="11" placeholder="手机号" />
          <!-- <a-input-group compact>
            <a-select disabled style="width: 25%" default-value="+86">
              <a-select-option value="+86"> +86 </a-select-option>
            </a-select>
            <a-input
              style="width: 75%"
              v-model="form.phone"
              :maxLength="11"
              placeholder="手机号"
            />
          </a-input-group> -->
        </a-form-model-item>
        <!-- <a-form-model-item prop="password">
          <a-input
            type="password"
            v-model="form.password"
            placeholder="请输入密码"
          />
        </a-form-model-item> -->
        <a-form-model-item prop="code" class="identify">
          <a-input
            style="width: 62%"
            v-model="form.code"
            :maxLength="6"
            placeholder="请输入验证码"
          />
          <!-- @keyup.enter.native -->
          <!-- :class="[getCodeBtnDisable ? 'disabled-style' : 'code-style']" -->
          <a-button
            class="btnCode"
            :disabled="getCodeBtnDisable"
            @click="getCode()"
          >
            {{ codeBtnWord }}
          </a-button>
        </a-form-model-item>
        <a-form-model-item>
          <a-button block type="primary" @click="onSubmit"> 登录 </a-button>
          <!-- <router-link
            :to="{ name: 'Password' }"
            style="float: right"
            class="pointer"
          >
            忘记密码
          </router-link> -->
        </a-form-model-item>
      </a-form-model>
    </div>
  </div>
</template>
 
<script>
export default {
  name: "Login",
  components: { Loading, FooterCopyright },
  data() {
    const validateCode = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("验证码为空"));
        return false;
      } else if (value !== this.identifyCode) {
        callback(new Error("验证码不正确"));
        return false;
      } else {
        callback();
      }
    };
    //使用正则表达式验证手机号
    const checkPhone = (rule, value, callback) => {
      if (!value) {
        return callback(new Error("手机号不能为空"));
      } else {
        //获取工具类中的手机号正则表达式
        const phoneReg =
          /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
        if (phoneReg.test(value)) {
          callback();
        } else {
          //如果验证输入错误就清空
          this.form.phone = "";
          return callback(new Error("请输入正确的手机号"));
        }
      }
    };
    return {
      showLoading: false,
      identifyCode: "",
      codeBtnWord: "获取验证码", // 获取验证码按钮文字
      waitTime: 61, // 获取验证码按钮失效时间
      form: {
        phone: "",
        password: "",
        code: "",
      },
      rules: {
        phone: {
          validator: checkPhone,
          //   required: true,
          //   message: "手机号",
          trigger: "blur",
        },
        password: { required: true, message: "请输入密码", trigger: "blur" },
        code: [
          {
            // validator: validateCode,
            required: true,
            message: "请输入验证码",
            trigger: "blur",
          },
        ],
      },
    };
  },
  computed: {
    ...mapGetters(["userInfo", "isLogin"]),
    // 用于校验手机号码格式是否正确
    phoneNumberStyle() {
      let reg = /^1[3456789]\d{9}$/;
      if (!reg.test(this.form.phone)) {
        return false;
      }
      return true;
    },
    // 控制获取验证码按钮是否可点击
    getCodeBtnDisable: {
      //设置按钮61s
      get() {
        if (this.waitTime === 61) {
          if (this.form.phone && this.phoneNumberStyle) {
            return false;
          }
          return true;
        }
        return true;
      },
      // 注意:因为计算属性本身没有set方法,不支持在方法中进行修改,而下面我要进行这个操作,所以需要手动添加
      set() {},
    },
  },
  mounted() {},
  methods: {
    ...mapActions(["userInfoSync", "setisLoginSync"]),
    // 获取验证码
    getCode() {
      this.waitTime--;
      this.getCodeBtnDisable = true;
      this.codeBtnWord = `${this.waitTime}s 后获取`;
      let timer = setInterval(() => {
        if (this.waitTime > 1) {
          this.waitTime--;
          this.codeBtnWord = `${this.waitTime}s 后获取`;
        } else {
          clearInterval(timer);
          this.codeBtnWord = "获取验证码";
          this.getCodeBtnDisable = false;
          this.waitTime = 61;
        }
      }, 1000);
    },
    // 确认
    onSubmit() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          // 模拟登录
          let { phone, password, code } = this.form;
          if (phone == "13014032506" && code == "123456") {
            this.userInfoSync({ phone, code });
            this.setisLoginSync(true);
            this.$router.push("/home");
          } else {
            this.$message.error("请检查是否填写正确");
          }
        } else {
          this.$message.error("请检查是否填写完整");
          console.log("error submit!!");
          return false;
        }
      });
    },
    // 重置表单
    resetForm() {
      this.$refs.ruleForm.resetFields();
    },
    goPath() {
      this.$router.push("/home");
    },
  },
};
</script>
 
<style lang="scss" scoped>
.Login {
  width: 100%;
  height: 100%;
  background-image: url("~@/assets/images/bg_repeat_white.png");
  overflow: auto;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  .ant-form {
    width: 88%;
    .btnCode {
      min-width: 36%;
      margin-left: 4px;
    }
    /* .disabled-style {
      background-color: #eeeeee;
      color: #cccccc;
      margin-left: 16px;
      width: calc(100% - 16px);
      text-align: center;
      padding-left: 0px;
      padding-right: 0px;
      font-size: 12px;
    }
    .code-style {
      margin-left: 16px;
      width: calc(100% - 16px);
      color: #606266;
      text-align: center;
      padding-left: 0px;
      padding-right: 0px;
      font-size: 10px;
    } */
  }
 
  .footer {
    padding: 30px 0;
  }
 
  .container {
    width: 550px;
    min-height: 350px;
    border-radius: 5px;
    background: #fff;
    margin: auto;
    padding: 18px 40px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    align-items: center;
    .title {
      font-size: 35px;
      font-weight: bold;
    }
    .buns {
      height: 45px;
      padding: 0 30px;
      font-size: 20px;
    }
  }
  @media screen and (min-width: 769px) and (max-width: 1000px) {
    .title {
      font-size: 50px;
      text-align: center;
    }
    .container {
      width: 80%;
    }
  }
  @media screen and (max-width: 769px) {
    .title {
      font-size: 50px;
      text-align: center;
    }
    .container {
      width: 90%;
    }
  }
}
</style>

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码