首页 > 其他分享 >短信和注册前端

短信和注册前端

时间:2023-08-15 13:01:13浏览次数:39  
标签:code 短信 phoneErr 前端 else phone 注册 password resp

1. 注册页面   94

短信和注册前端_sed

1.1 添加路由   94

index.js

短信和注册前端_sed_02

{
    path: '/page/user/register',
    name: 'RegisterView',
    component: () => import('../views/ProductDetail.vue')
  }

1.2 添加按钮  94

Header.vue

短信和注册前端_sed_03

<div class="public-head-right">
        <a href="login.html" target="_blank">登录</a>
        <a href="javascript:void(0);" @click="goLink('/page/user/register',)">注册</a>
      </div>

1.3 安装md5  和qs 100

1.3.1 npm install js-md5 --save   100

短信和注册前端_服务器_04

要使用的文件,import md5 from 'js-md5';

短信和注册前端_验证码_05

1.3.2 安装 qs  , 项目根目录下执行:  npm i qs --save  100

短信和注册前端_服务器_06

并且定义发送请求的dopost

短信和注册前端_验证码_07

1.3 添加页面   94-101

LoginView.vue   101

登录路由

短信和注册前端_sed_08

登录界面

<template>
  <div>
    <h1>登陆页面</h1>
  </div>
</template>

<script>
export default {
  name: "LoginView"
}
</script>

<style scoped>

</style>

前端不做重点,直接赋值即可

RegisterView.vue

<template>
  <div>
    <Header></Header>
    <div class="login-content">
      <div class="login-flex">
        <div class="login-left">
          <p>万民用户知心托付    <span>{{ historyAvgRate }}%</span>历史年化收益</p>
          <p>千万级技术研发投入    亿级注册资本平台 </p>
        </div>
        <!---->
        <div class="login-box">
          <h3 class="login-title">用户注册</h3>
          <form action="" id="register_Submit">
            <div class="alert-input">
              <input type="text" class="form-border user-num" @blur="checkPhone" v-model="phone" name="mobile"
                     placeholder="请输入11位手机号">
              <div class="err">{{ phoneErr }}</div>
              <p class="prompt_num"></p>
              <input type="password" placeholder="请输入6-20位英文和数字混合密码"
                     class="form-border user-pass" autocomplete name="password" v-model="password"
                     @blur="checkPassword">
              <div class="err">{{ passwordErr }}</div>
              <p class="prompt_pass"></p>
              <div class="form-yzm form-border">
                <input class="yzm-write" type="text" name="" placeholder="输入短信验证码" v-model="code" @blur="checkCode">
                <input class="yzm-send" type="button" v-bind:value="yzmText" @click="requestSmsCode" id="yzmBtn">
              </div>
              <div class="err">{{ codeErr }}</div>

              <p class="prompt_yan"></p>
            </div>
            <div class="alert-input-agree">
              <input type="checkbox" v-model="agree">我已阅读并同意<a href="javascript:;" target="_blank">《动力金融网注册服务协议》</a>
            </div>
            <div class="alert-input-btn">
              <input type="button" class="login-submit" @click="requestUserRegister" value="注册">
            </div>
          </form>
          <div class="login-skip">
            已有账号? <a href="javascript:void(0)" @click="goLink('/page/user/login')">登录</a>
          </div>
        </div>
      </div>
    </div>
    <Footer></Footer>
  </div>
</template>

<script>
import Header from "@/components/common/Header";
import Footer from "@/components/common/Footer";
import {doGet, doPost} from "@/api/httpRequest";
import layx from "vue-layx";
import md5 from 'js-md5';  //导入MD5的库   100

export default {
  name: "RegisterView",
  components: {
    // eslint-disable-next-line vue/no-unused-components
    Header,
    // eslint-disable-next-line vue/no-unused-components
    Footer
  },
  data() {
    return {
      historyAvgRate: 0.0,
      phone: '13812345699',
      phoneErr: '',
      password: '111aaa',
      passwordErr: '',
      code: '',
      codeErr: '',
      yzmText: '获取验证码',
      isSend: false,
      agree: false
    }
  },
  mounted() {
    //向服务器发起请求,获取数据,更新页面
    doGet('/v1/plat/info').then(resp => {
      if (resp) {
        this.historyAvgRate = resp.data.data.historyAvgRate;
      }
    })
  },
  methods: {
    goLink(url,params){
      //使用router做页面跳转, vue中的对象
      this.$router.push({
        path: url,
        query: params
      })
    },
    checkPhone() { //95
      if (this.phone == '' || this.phone == undefined) {
        this.phoneErr = '请输入手机号';
      } else if (this.phone.length != 11) {
        this.phoneErr = '手机号长度不足11位';
      } else if (!/^1[1-9]\d{9}$/.test(this.phone)) {
        this.phoneErr = '手机号格式不正确'
      } else {
        this.phoneErr = '';
        //向服务器发起请求,验证手机号是否可以注册
        doGet('/v1/user/phone/exists', {phone: this.phone})
            .then(resp => {
              if (resp && resp.data.code == 1000) {
                //手机号可以注册
                console.log("手机号可以注册")
              } else {
                this.phoneErr = resp.data.msg;
              }
            })
      }
    },
    checkPassword() {//96
      if (this.password == '' || this.password == undefined) {
        this.passwordErr = '请输入密码';
      } else if (this.password.length < 6 || this.password.length > 20) {
        this.passwordErr = '密码长度是6-20位';
      } else if (!/^[0-9a-zA-Z]+$/.test(this.password)) {
        this.passwordErr = '密码只能使用数字和字母';
      } else if (!/^(([a-zA-Z]+[0-9]+)|([0-9]+[a-zA-Z]+))[a-zA-Z0-9]*/.test(this.password)) {
        this.passwordErr = '密码是数字和字母的混合';
      } else {
        this.passwordErr = '';
      }
    },
    checkCode() {//97
      if (this.code == '' || this.code == undefined) {
        this.codeErr = '必须输入验证码';
      } else if (this.code.length != 4) {
        this.codeErr = '验证码是4位的';
      } else {
        this.codeErr = '';
      }
    },
    requestSmsCode() {  //97
      //isSend:true, 发送验证码, 倒计时正在执行中。  false可以重新发送验证码  98

      if (this.isSend == false) {
        this.checkPhone();
        if (this.phoneErr == '') {
          this.isSend = true;
          let btn = document.getElementById("yzmBtn");
          btn.style.color = 'red';
          //处理倒计时   97
          let second = 5; //倒计时时间,默认是60秒
          setInterval(() => {
            if (second <= 1) {   //98
              btn.style.color = '#688EF9';
              this.yzmText = "获取验证码";
              this.isSend = false;
            } else {
              second = second - 1;
              this.yzmText = second + "秒后重新获取";
            }
          }, 1000)
          //发起请求,给手机号发送验证码   99
          doGet('/v1/sms/code/register', {phone: this.phone}).then(resp => {
            if (resp && (resp.data.code == 1000 || resp.data.code == 1006)) {
              layx.msg('短信已经发送了', {dialogIcon: 'success', position: 'ct'});
            }
          })

        }
      }
    },
    requestUserRegister() {  //注册  100-101
      this.checkPhone();
      this.checkPassword();
      this.checkCode();
      if (this.phoneErr == '' && this.passwordErr == '' && this.codeErr == '') {
        if (this.agree) {
          //数据正确,提交注册请求
          //前端密码的md5()
          let newPassword = md5(this.password);
          doPost('/v1/user/register', {
            phone: this.phone,
            pword: newPassword,
            scode: this.code
          }).then(resp => {
            if (resp && resp.data.code == 1000) {
              //跳转登录页面
              this.$router.push({
                path: "/page/user/login"
              })
            }
          })
        } else {
          layx.msg("请阅读注册协议",{dialogIcon:'warn',position:'ct'});
        }


      }
    }
  }
}
</script>

<style scoped>
.err {
  color: red;
  font-size: 18px;
}
</style>

测试  101

启动前后端

输入参数,点击获取验证码

短信和注册前端_sed_09

短信和注册前端_服务器_10

redis中的验证码

短信和注册前端_sed_11

看看数据库数据添加成功

短信和注册前端_服务器_12

短信和注册前端_验证码_13

注册成功,跳转登陆界面

短信和注册前端_sed_14


标签:code,短信,phoneErr,前端,else,phone,注册,password,resp
From: https://blog.51cto.com/u_15784725/7087357

相关文章

  • 什么是服务注册与发现?
    谈到SpringCloud框架时,一个重要而深奥的概念就是服务注册与发现(ServiceRegistrationandDiscovery)。在本篇博客中,我们将深入分析服务注册与发现的原理、意义以及在SpringCloud中的应用。服务注册与发现是微服务架构中的关键概念之一。它允许不同的微服务实例能够自动注册到......
  • 创新的前端框架: Hybrid技术的不断发展
    HybridApp混合应用开发原理HybridApp,即混合应用是指同时使用前端技术与原生技术开发的App。通常由前端负责大部分界面开发和业务逻辑,原生负责封装原生功能供前端调用,二者以WebView作为媒介建立通信,从而既拥有Web开发的速度优势,又能拥有强大的原生能力。从前端开发者的角度......
  • spring spring.core IOC xml 注册
    publicclassSpringUtils{staticIApplicationContextcontext;publicstaticTGetObject<T>(stringname)whereT:class{if(context==null){context=newXmlApplicatio......
  • 前端进化笔记-JavaScript(四)
    生活想要将我活埋,怎料我是一颗种子基本引用类型对象是引用类型的实例:new后面跟一个构造函数就创建了一个新对象,例如letnow=newDate();,这样就创建了一个Date对象.Date类型方法Date.parse():根据传入的参数返回毫秒数。参数为有固定格式的表示日期的字符串。Date.UTC():......
  • 前端 Java Python等资源合集大放送
    如果需要学习视频,欢迎关注【JAVA乐园】微信公众号,回复【领取资源】菜单一键领取以下所有200G干货资源,获取更多有用技术干货、文档资料。所有文档会持续更新,欢迎关注一起成长!1、vue全套Vue.js是一套构建用户界面的渐进式框架。只关注视图层,采用自底向上增量开发的设计。通过尽......
  • 什么是前端开发领域中的屏幕像素密度 Pixel Density
    当谈论到前端开发中的像素密度(PixelDensity),实际上是在讨论设备屏幕的像素密度,也称为像素密度或PPI(PixelsPerInch)。像素密度是指屏幕上每英寸(2.54厘米)所包含的像素数量。它是一个重要的概念,因为不同的设备在相同尺寸的屏幕上可能拥有不同的像素密度,从而影响显示效果和图像质量。......
  • 关于前端开发中 img 元素的 srcset 属性
    img标签的srcset属性是一种用于响应式网页设计的属性,它允许开发者为图像提供不同大小和分辨率的版本,以便根据设备的屏幕大小和像素密度自动选择最合适的图像进行显示。通过使用srcset属性,可以在不同设备上提供最佳的视觉体验,避免了不必要的图像变形和加载大尺寸图像的性能问......
  • Luckysheet:一个纯前端的excel在线表格
    最近因为项目要求,需要在页面上添加一个在线编辑excel的功能,因此只能在网上找有没有直接用的插件,最后很幸运的是幸好找到了一个----luckysheet.   这个是从luckysheet官网上找的图片,先看下能用插件做那些效果。  这个是中文官网地址:https://mengshukeji.gitee......
  • 前端周刊第66期:TypeScript教程、ESM、React泡沫、htmx、测试文章
    周刊同步发表于微信公众号“写代码的宝哥”,欢迎各位小伙伴前来关注......
  • Nacos源码 (3) 注册中心
    本文将从一个服务注册示例入手,通过阅读客户端、服务端源码,分析服务注册、服务发现原理。使用的2.0.2的版本。客户端创建NacosNamingService对象NacosNamingServicenacosNamingService=newNacosNamingService(NACOS_HOST);NacosNamingService提供两个构造方法:publicNac......