ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

vue+element实现手机号验证码注册

2022-02-22 10:02:29  阅读:143  来源: 互联网

标签:vue 验证码 element font width important rem height margin


很全的PC端手机端适配!一个项目多个域名我试了代理跨域本地运行可以打包上传不行,然后就用全地址,后端哪里要设置域名白名单!直接上图和完整代码!觉得可以就点个赞吧,谢谢!

代码:

<template>
  <div>
    <div class="register_box" v-for="img in imageList" :key="img" v-lazy:background-image="img">
      <div class="icon1" onClick="window.location.href='/'">
        <img src="../assets/img/register/Rectangle 61@2x.png" alt="" />
        <span>51大师兄</span><br />
        <span class="left_bottom">企业智囊团&nbsp;&nbsp;专家大舞台</span>
      </div>
      <div class="register_box_right">
        <div class="content">
          <el-main>
            <el-form
              :model="ReginForm"
              ref="ReginForm"
              :rules="rule"
              class="regform"
              label-width="0"
            >
              <div class="content_text">新用户注册</div>
              <div class="inputs">
                <img
                  class="input_phone"
                  src="../assets/img/register/icon_phone@2x.png"
                  alt=""
                />
                <el-form-item prop="tel" class="input">
                  <el-input
                    type="text"
                    v-model.number="ReginForm.tel"
                    placeholder="手机号码"
                  >
                  </el-input>
                </el-form-item>
              </div>
              <div class="inputs input3">
                <svg
                  t="1643023451870"
                  class="icon icon2"
                  viewBox="0 0 1024 1024"
                  version="1.1"
                  xmlns="http://www.w3.org/2000/svg"
                  p-id="2576"
                >
                  <path
                    d="M225.5104 252.72832v-110.5408a30.30016 30.30016 0 0 1 30.21312-30.21312h561.98656a30.30528 30.30528 0 0 1 30.21824 30.21312v110.55104h56.3712V115.65568c0-33.23392-27.20256-60.43136-60.44672-60.43136H229.5808c-33.24416 0-60.43136 27.19744-60.43136 60.43136v137.07776h56.36096v-0.00512z m622.41792 484.21376v120.38144a30.3104 30.3104 0 0 1-30.21824 30.208H255.72352a30.30528 30.30528 0 0 1-30.21312-30.208v-120.38144H169.14944v146.91328c0 33.23392 27.19744 60.43648 60.43136 60.43648h614.272c33.23904 0 60.44672-27.19744 60.44672-60.43648v-146.91328h-56.3712zM300.47232 647.34208H243.1744V431.3344c-20.9408 19.55328-45.60896 34.02752-74.02496 43.43808V422.7584c14.9504-4.88448 31.19104-14.1824 48.73728-27.83744 17.54112-13.66528 29.568-29.60384 36.09088-47.81568h46.4896v300.2368z m319.86688-53.24288v53.25312H419.456c2.19136-20.14208 8.71424-39.20896 19.58912-57.20576 10.86464-18.0736 32.34304-41.92768 64.4352-71.7312 25.84576-24.05888 41.6512-40.38144 47.52896-48.9472 7.87456-11.81696 11.82208-23.51616 11.82208-35.08224 0-12.75904-3.44064-22.59456-10.30144-29.46048-6.8864-6.85056-16.31744-10.2912-28.43648-10.2912-11.95008 0-21.48864 3.59936-28.55936 10.78784-7.07072 7.21408-11.15648 19.17952-12.2368 35.90656L426.1888 435.6352c3.40992-31.53408 14.08-54.18496 32.01024-67.90144 17.9456-13.7472 40.38144-20.60288 67.31264-20.60288 29.50144 0 52.66944 7.936 69.5552 23.8592 16.85504 15.90272 25.28256 35.6864 25.28256 59.3408a103.40352 103.40352 0 0 1-7.25504 38.43072c-4.84352 12.17024-12.4672 24.92928-22.94784 38.25664-6.92736 8.83712-19.43552 21.53984-37.51424 38.16448-18.05824 16.55296-29.51168 27.61728-34.34496 33.01888a98.74432 98.74432 0 0 0-11.72992 15.91808h113.78176v-0.02048z m85.33504-26.09664l55.46496-6.72768c1.77664 14.14144 6.528 24.95488 14.24896 32.4096 7.77728 7.46496 17.152 11.20768 28.16 11.20768 11.83232 0 21.7856-4.50048 29.85984-13.42976 8.10496-8.99072 12.15488-21.0944 12.15488-36.31104 0-14.42304-3.88608-25.83552-11.6224-34.25792-7.75168-8.45824-17.2032-12.68224-28.34432-12.68224-7.35232 0-16.10752 1.41824-26.32192 4.28544l6.3232-46.69952c15.50336 0.40448 27.30496-2.96448 35.47648-10.09664 8.14592-7.13728 12.2368-16.60416 12.2368-28.45184 0-10.04544-2.99008-18.08896-8.93952-24.064-6.02112-5.98016-13.9776-8.96512-23.8848-8.96512-9.78432 0-18.16576 3.38432-25.09824 10.19392-6.90688 6.77888-11.11552 16.7168-12.63104 29.76256l-52.8128-8.96c3.67104-18.06336 9.22624-32.54272 16.62464-43.3664 7.424-10.78272 17.73568-19.28704 31.0016-25.46688 13.2608-6.18496 28.10368-9.27744 44.55424-9.27744 28.14464 0 50.688 8.97536 67.712 26.9312 13.9776 14.6688 20.99712 31.26272 20.99712 49.7408 0 26.24512-14.34624 47.1808-43.02848 62.81216 17.12128 3.67616 30.83264 11.91424 41.09824 24.69888 10.2656 12.77952 15.40096 28.20608 15.40096 46.27456 0 26.26048-9.59488 48.62464-28.75392 67.0976-19.16928 18.49856-43.02336 27.74528-71.58272 27.74528-27.0592 0-49.46944-7.79776-67.3024-23.33184-17.80736-15.57504-28.14464-35.94752-30.99136-61.07136z"
                    p-id="2577"
                    fill="#A1A1A1"
                  ></path>
                </svg>
                <el-form-item prop="verification" class="input1">
                  <el-input
                    type="text"
                    v-model="ReginForm.verification"
                    placeholder="输入验证码"
                    oninput="value=value.replace(/[^d]/g,'')"
                  >
                  </el-input>
                </el-form-item>
                <button
                  class="button_obtain"
                  v-show="sendAuthCode"
                  @click.prevent="getAuthCode"
                >
                  获取验证码
                </button>
                <span v-show="!sendAuthCode" class="auth_text">
                  <span class="auth_text_blue">{{ auth_time }} </span>
                  秒之后重新发送验证码</span
                >
              </div>
              <el-form-item>
                <el-button
                  type="success"
                  class="register_button"
                  round
                  @click.native.prevent="submit"
                  :loading="logining"
                >
                  注册
                </el-button>
              </el-form-item>
              <div class="permit">
                <span>注册表示阅读与同意</span
                ><a href="#/permit">《软件许可及服务协议》</a><span>与</span
                ><a href="#/privacy">《用户隐私政策》</a>
              </div>
            </el-form>
          </el-main>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import Bg from '../assets/img/register/bg@2x.png';
export default {
  data() {
    let code = (rule, value, callback) => {
      if (value === "") {
        return callback(new Error("请输入验证码"));
      } else if (value.length != 4) {
        return callback(new Error("输入正确4位验证码"));
      } else {
        return callback();
      }
    };
    let telCheck = (rule, value, callback) => {
      var reg = /^1[3-9]d{9}$/;
      if (value === "") {
        return callback(new Error("请输入手机号码"));
      } else if (!Number.isInteger(value)) {
        return callback(new Error("手机号码必须是数字"));
      } else if (value.toString().length !== 11) {
        return callback(new Error("手机号码必须是11位数字"));
      } else if (!reg.test(value)) {
        return callback(new Error("请输入有效的手机号码"));
      } else {
        callback();
      }
    };
    return {
      imageList:[Bg],
      token: String,
      ReginForm: {
        tel: "",
        verification: "",
      },
      logining: false,
      sendAuthCode: true, //显示‘获取按钮'还是'倒计时'
      auth_time: 0 /*倒计时 计数器*/,
      verification: "", //绑定输入验证码框
      rule: {
        tel: [
          {
            required: true,
            validator: telCheck, //手机号正则限制
            trigger: "blur",
          },
        ],
        verification: [
          {
            required: true,
            validator: code, //验证码限制
            trigger: "blur",
            min: 6,
            max: 6,
          },
        ],
      },
    };
  },
  created() {
    const accountParam = {
      account: "gongchangku",
      password: "gongchangku",
    };
    this.$http
      .post(
        "https://newcp.51dsx.cn/index.php/api/user/getSysToken",
        JSON.stringify(accountParam)
      )
      .then((data) => {
        this.token = data.data.data.token;
      });
  },
  methods: {
    // 点击获取验证码
    async getAuthCode() {
      if (this.ReginForm.tel === "") {
        this.$message.error("请输入手机号");
        return;
      }
      const params = {
        umobile: this.ReginForm.tel,
        token: this.token,
      };
      //获取短信验证码接口
      this.$http
        .post(
          "https://newcp.51dsx.cn/index.php/api/Sms/sendVerificationCode",
          JSON.stringify(params),
          {
            headers: {
              token: this.token,
            },
          }
        )
        .then((data) => {
          if (data.data.msg === "已被注册") {
            this.sendAuthCode = true;
          this.$message.error("已被注册");
          }
          return false;
        });
      if (this.ReginForm.tel === "") {
        this.sendAuthCode = true;
      } else {
        this.sendAuthCode = false;
      }
      //设置倒计时秒
      this.auth_time = 60;
      var auth_timetimer = setInterval(() => {
        this.auth_time--;
        if (this.auth_time <= 0) {
          this.sendAuthCode = true;
          clearInterval(auth_timetimer);
        }
      }, 1000);
    },

    // 封装注册发送请求方法
    thisAjax() {
      //  手机注册
      let params = {
        umobile: this.ReginForm.tel,
        ucode: this.ReginForm.verification,
      };

      this.$http
        .post(
          "https://newcp.51dsx.cn/index.php/api/User/userWebRegister",
          JSON.stringify(params),
          {
            headers: {
              token: this.token,
            },
          }
        )
        .then((data) => {
          if (data.data.msg === "验证码不正确") {
            this.logining = false;
            this.$message.error("验证码不正确");
          } else {
            this.$message.success("注册成功,即将跳转到首页");
            window.setTimeout(this.$router.push("/"),2)
          }
          return false;
        });
    },

    //点击注册
    submit() {
      this.$refs.ReginForm[0].validate((valid) => {
        if (valid) {
          this.logining = true; //转圈
          this.thisAjax();
        } else {
          this.$message.error("填写不完整或格式错误");
        }
      });
    },
  },
};
</script>

<style lang="scss" scoped>
.icon2 {
  width: 0.75rem !important;
  height: 0.8rem !important;
  padding: 0 !important;
  margin: 0 4px 17px -4px;
  color: rgb(182, 179, 179) !important;
}
.verification {
  width: 25px !important;
  margin-right: 5px;
}
.input_phone {
  margin: 0 8px 0 2px;
}
@media (max-width: 414px) {
  .icon2 {
    width: 15% !important;
    padding: 0 !important;
    margin: 0 4px 17px 0px;
    color: rgb(182, 179, 179) !important;
  }
  .auth_text {
    font-size: 12px !important;
  }
  .button_obtain {
    margin: -22px 0 0 6px !important;
  }
  .el-main {
    padding: 0 !important;
  }
  .permit {
    height: 80px !important;
  }
  .register_button {
    height: 37px !important;
  }
  .button_obtain {
    width: 20%;
  }
  .input_phone {
    width: 5%;
    margin-left: 4px;
    margin-right: 8px;
  }
  .verification {
    width: 16px !important;
    margin: 0 6px 0 2px;
  }
  .icon1 {
    display: none !important;
  }
  .register_box_right {
    border-radius: 0 !important;
    width: 100% !important;
    height: 100% !important;
  }
  .content {
    border-radius: 25px;
    box-shadow: 0 0 10px #c1cadd;
    background: #fff;
    padding: 0.5rem 0.3rem 0.3rem 0.3rem;
    margin: 1.555556rem auto !important;
  }
  .input1 {
    font-size: 0.296296rem !important;
  }
  .button_obtain {
    width: 58% !important;
    font-size: 0.222222rem !important;
  }
  .input1 {
    width: 55.5% !important;
  }
  .register_box_right {
    background: none !important;
  }
  .register_box .register_box_right .content .input button {
    top: -7px !important;
  }
}
@media (max-width: 900px) {
  .content {
    width: 7.5rem !important;
  }
}
@media (min-width: 1400px) {
  .register_box .icon1 img {
    width: 2rem !important;
  }
  .register_box .icon1 {
    width: 5rem !important;
  }
  .register_box .icon1 span {
    font-size: 0.444444rem !important;
  }
}
.el-main {
  padding: 0 !important;
}
.register_box {
  position: relative;
  width: 100%;
  height: 100vh;
  .icon1 {
    display: inline-block;
    width: 4rem;
    margin: 0.444444rem;
    padding: 0.444444rem 0;
    img {
      width: 1rem;
    }
    span {
      margin-left: 0.222222rem;
      font-size: 24px;
      font-weight: 400;
      color: #ffffff;
      line-height: 16px;
    }
    .left_bottom {
      position: absolute;
      bottom: 0.8rem;
    }
  }
  .register_box_right {
    position: absolute;
    top: 0;
    right: 0;
    width: 60%;
    height: 100%;
    background: #ffffff;
    border-radius: 0.555556rem 0px 0px 0.555556rem;
    opacity: 1;
    .content {
      width: 8.592593rem;
      height: 70%;
      margin: 30vh auto;
      .inputs {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: space-between;
        img {
          margin-bottom: 21px;
        }
      }
      .auth_text {
        margin: -22px 0 0 10px;
      }
      .el-form-item {
        width: 100% !important;
      }
      .content_text {
        font-size: 0.518519rem;
        font-weight: 600;
        color: #525252;
        line-height: 0.611111rem;
        margin-bottom: 0.8rem;
      }
      .button_obtain {
        margin: -22px 0 0 5px;
      }
      button {
        height: 37px;
        width: 25%;
        border: none;
        color: #ffffff;
        background: linear-gradient(223deg, #8f99ed 0%, #b8ceef 100%);
        border-radius: 0.074074rem 0.074074rem 0.074074rem 0.074074rem;
        opacity: 1;
      }

      .register_button {
        width: 100%;
        height: 0.740741rem;
        border-radius: 0.111111rem 0.111111rem 0.111111rem 0.111111rem;
        opacity: 1;
        button {
          background: linear-gradient(223deg, #8f99ed 0%, #b8ceef 100%);
          width: 100%;
          height: 100%;
          border: none;
          font-size: 0.296296rem;
          font-weight: 500;
          color: #ffffff;
          line-height: 0.351852rem;
        }
      }
    }
    .permit {
      width: 100%;
      height: 0.740741rem;
      text-align: center;
      margin-top: 0.3rem;
      span {
        font-size: 0.26rem;
        font-weight: 500;
        color: #a1a1a1;
        line-height: 0.351852rem;
      }
      a {
        font-size: 13.5px;
        font-weight: 400;
        color: #007aff;
        line-height: 0.296296rem;
      }
    }
  }
}
</style>

《一线大厂前端面试题+开发学习笔记+最新架构讲解视频+事站项目讲义》
【https://docs.qq.com/doc/DQVJzbnRIWWNtcVR4】完整内容开源分享

标签:vue,验证码,element,font,width,important,rem,height,margin
来源: https://blog.csdn.net/rgrgrwfe/article/details/123061584

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有