vue 验证码

摘要:
一、概述效果图二、代码实现新建test目录,放2个vue文件。
一、概述

效果图

vue 验证码第1张

二、代码实现

新建test目录,放2个vue文件。

vue 验证码第2张

sidentify.vue组件代码:

<template>
  <div class="s-canvas">
    <canvas id="s-canvas":width="contentWidth":height="contentHeight"></canvas>
  </div>
</template>
<script>export default{
    name: 'SIdentify',
    props: {
      identifyCode: {
        type: String,
        default: '1234'},
      fontSizeMin: {
        type: Number,
        default: 25},
      fontSizeMax: {
        type: Number,
        default: 30},
      backgroundColorMin: {
        type: Number,
        default: 255},
      backgroundColorMax: {
        type: Number,
        default: 255},
      colorMin: {
        type: Number,
        default: 0},
      colorMax: {
        type: Number,
        default: 160},
      lineColorMin: {
        type: Number,
        default: 100},
      lineColorMax: {
        type: Number,
        default: 255},
      dotColorMin: {
        type: Number,
        default: 0},
      dotColorMax: {
        type: Number,
        default: 255},
      contentWidth: {
        type: Number,
        default: 112},
      contentHeight: {
        type: Number,
        default: 31}
    },
    methods: {
      //生成一个随机数
randomNum(min, max) {
        returnMath.floor(Math.random() *(max -min) +min)
      },
      //生成一个随机的颜色
randomColor(min, max) {
        let r = this.randomNum(min, max)
        let g = this.randomNum(min, max)
        let b = this.randomNum(min, max)
        return 'rgb(' +r + ',' +g + ',' +b + ')'},
      drawPic() {
        let canvas =document.getElementById('s-canvas')
        let ctx =canvas.getContext('2d')
        ctx.textBaseline = 'bottom'
        //绘制背景
ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)
        ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)
        //绘制文字
        for(let i = 0; i < this.identifyCode.length; i++) {
          this.drawText(ctx, this.identifyCode[i], i)
        }
        this.drawLine(ctx)
        this.drawDot(ctx)
      },
      drawText(ctx, txt, i) {
        ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)
        ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei'let x =(i + 1) *(this.contentWidth /(this.identifyCode.length + 1))
        let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)
        vardeg = this.randomNum(-45, 45)
        //修改坐标原点和旋转角度
ctx.translate(x, y)
        ctx.rotate(deg *Math.PI / 180)
        ctx.fillText(txt, 0, 0)
        //恢复坐标原点和旋转角度
ctx.rotate(-deg *Math.PI / 180)
        ctx.translate(-x, -y)
      },
      drawLine(ctx) {
        //绘制干扰线
        for(let i = 0; i < 5; i++) {
          ctx.strokeStyle = this.randomColor(this.lineColorMin, this.lineColorMax)
          ctx.beginPath()
          ctx.moveTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))
          ctx.lineTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))
          ctx.stroke()
        }
      },
      drawDot(ctx) {
        //绘制干扰点
        for(let i = 0; i < 80; i++) {
          ctx.fillStyle = this.randomColor(0, 255)
          ctx.beginPath()
          ctx.arc(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 *Math.PI)
          ctx.fill()
        }
      }
    },
    watch: {
      identifyCode() {
        this.drawPic()
      }
    },
    mounted() {
      this.drawPic()
    }
  }
</script>
<style scoped>.s-canvas {height:38px;

  }.s-canvas canvas{margin-top:1px;margin-left:8px;
  }
</style>
View Code

说明

vue 验证码第3张

test.vue

<template>
  <div class="form-group"style="display: flex;">
    <div>
      <span>验证码:</span>
      <input type="text"id="code"v-model="code"class="code"placeholder="请输入验证码"/>
    </div>
    <div class="login-code"@click="refreshCode">
      <!--验证码组件-->
      <s-identify :identifyCode="identifyCode"></s-identify>
    </div>
    <div>
      <button @click="checkCaptcha">验证</button>
    </div>
  </div>

</template>

<script>import SIdentify from '../login/sidentify'
  export default{
    components: { SIdentify },
    data() {
      return{
        identifyCodes: '1234567890',
        identifyCode: '',
        code: '',//text框输入的验证码
tableData: []
      }
    },
    mounted: function() {
      this.identifyCode = ''
      //初始化验证码
      this.makeCode(this.identifyCodes, 4)
    },
    methods: {
      //验证码
randomNum(min, max) {
        returnMath.floor(Math.random() *(max -min) +min)
      },

      refreshCode() {
        this.identifyCode = ''
        this.makeCode(this.identifyCodes, 4)
      },
      makeCode(o, l) {
        for(let i = 0; i <l; i++) {
          this.identifyCode += this.identifyCodes[
            this.randomNum(0, this.identifyCodes.length)
            ]
        }
        console.log("验证码",this.identifyCode)
      },
      //检查验证码是否正确
checkCaptcha(){
        if(this.code == ""){
          alert("请输入验证码")
          return false}
        if(this.identifyCode != this.code){
          this.code = ''
          this.refreshCode()
          alert("请输入正确的验证码")
          return false}
        console.log("验证码正确")
      }
    }
  }
</script>

<style>
  /*验证码样式*/.code {width:124px;height:31px;border:1px solid rgba(186, 186, 186, 1);
  }
  .login-code {cursor:pointer;
  }
</style>
View Code

访问页面,输入正确的验证码,会有提示。

vue 验证码第4张

注意:我在console中,输出了正确的验证码,照着填写即可。

这个样式,可能不太美观。如果需要用到项目中,可以自行调整样式。

本文参考链接:

https://www.cnblogs.com/web-aqin/p/10796326.html

免责声明:文章转载自《vue 验证码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webpack4.x最详细使用讲解一hackinglab CTF题 基础关下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue-创建组件的5种方法

Vue组件分为全局组件和局部组件以及Vue 构造器创建组件,统计为5种创建组件的方式 一、效果截图 创建的h1-h5五个组件 组件名称和结构 二、具体的写法如下: 1、全局-直接创建 Vue.component('first', { template: '<h1>第一种创建组件的方法</h1>' }) 2、全局-定义再...

vue项目搜索历史功能的实现

播放器项目中歌曲搜素页面的 首先需要在state定义搜索历史,在其中保存搜索历史 state.js:// 搜索历史: searchHistory: []  mutations中新增改变搜索历史的方法 mutations.js:SET_SEARCH_HISTORY(state, history) { state.searchHistory = hi...

vue初级学习--使用 vue-resource 请求数据

一、导语   我发现好像我最近几次写文,都是在7号,很恰巧啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二、正文   最近用vue做一个订单管理混合开发APP,但是遇到个问题,使用了vueResource的post请求,后端做了跨域解决方...

vue——样式穿透/deep/ &amp;gt;&amp;gt;&amp;gt; ::v-deep 三者的区别

在项目中为了避免页面间样式污染常用scoped组件私有化,如果要改变element-ui的样式时需要用样式穿透才可复写样式。 1./deep/ 在vue3.0之前可使用,例如(复写样式前加/deep/),vue3.0及后使用就会报错 /deep/ .el-input { 60px; } 2.::v-deep 在vue3.0及后使用,替代/deep...

Vue国际化三【在下拉框中使用】

select 内容国际化 <myForm :form-config="formConfig" :filters="filters" @handleChage="handleSearch" @handleSearch="handleSearch" /> computed: {...

le5le-topology开发纪要

组态开源库  国内的有些新一点的开源项目,都会有部分公开,有部分设置为企业版.开源要生存,自然会采用这种方式.这个开源项目来说 当前通过几天的读资料之后发现,公开的部分svg文件都是基础的那几个, 物联网行业之类的不在开源之中. 继续看看,能否加入自定义的方式使用这个库  关于企业版与公用版: 个人总结:说明文档中企业版是0.2以上版本,从更新的压缩包版本...