最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實現(xiàn)圖形驗證碼

 更新時間:2021年04月27日 11:01:58   作者:公孫元二  
這篇文章主要為大家詳細介紹了vue實現(xiàn)圖形驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了vue實現(xiàn)圖形驗證碼的具體代碼,供大家參考,具體內(nèi)容如下

效果圖:

代碼:

驗證碼組件:

src/common/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: 18
      },
      fontSizeMax: {
        type: Number,
        default: 40
      },
      backgroundColorMin: {
        type: Number,
        default: 180
      },
      backgroundColorMax: {
        type: Number,
        default: 240
      },
      colorMin: {
        type: Number,
        default: 50
      },
      colorMax: {
        type: Number,
        default: 160
      },
      lineColorMin: {
        type: Number,
        default: 40
      },
      lineColorMax: {
        type: Number,
        default: 180
      },
      dotColorMin: {
        type: Number,
        default: 0
      },
      dotColorMax: {
        type: Number,
        default: 255
      },
      contentWidth: {
        type: Number,
        default: 111
      },
      contentHeight: {
        type: Number,
        default: 38
      }
    },
    methods: {
      // 生成一個隨機數(shù)
      randomNum(min, max) {
        return Math.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)
        var deg = this.randomNum(-30, 30) // 字符旋轉(zhuǎn)角度(不超過45度比較好)
        // 修改坐標(biāo)原點和旋轉(zhuǎn)角度
        ctx.translate(x, y)
        ctx.rotate(deg * Math.PI / 180)
        ctx.fillText(txt, 0, 0)
        // 恢復(fù)坐標(biāo)原點和旋轉(zhuǎn)角度
        ctx.rotate(-deg * Math.PI / 180)
        ctx.translate(-x, -y)
      },
      drawLine(ctx) {
        // 繪制干擾線
        for (let i = 0; i < 8; 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 < 100; 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>

父組件

<template>
  <div>
    <div>驗證碼測試</div>
    <div @click="refreshCode()" class="code" style="cursor:pointer;" title="點擊切換驗證碼">
      <s-identify :identifyCode="identifyCode"></s-identify>
    </div>
  </div>
</template>

<script>
import { defineComponent } from 'vue';
import sIdentify from "@/common/sIdentify.vue";
// import axios from 'axios'
export default defineComponent({
  name: 'WatermarkTest',
  components: { sIdentify },
  data() {
    return {
      identifyCode: "",
      identifyCodes: ['0','1','2','3','4','5','6','7','8','9','a','b','c','d'], //根據(jù)實際需求加入自己想要的字符
    }
  },
  mounted() {
    this.refreshCode()
 },
 unmounted() {

 },
  methods: {
    // 生成隨機數(shù)
    randomNum(min, max) {
      max = max + 1
      return Math.floor(Math.random() * (max - min) + min);
    },
    // 更新驗證碼
    refreshCode() {
      this.identifyCode = "";
      this.makeCode(this.identifyCodes, 4);
      console.log('當(dāng)前驗證碼:',this.identifyCode);
    },
    // 隨機生成驗證碼字符串
    makeCode(data, len) {
      console.log('data, len:', data, len)
      for (let i = 0; i < len; i++) {
        this.identifyCode += this.identifyCodes[this.randomNum(0, this.identifyCodes.length-1)]
      }
    },
  },
});
</script>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue基于iview實現(xiàn)登錄密碼的顯示與隱藏功能

    Vue基于iview實現(xiàn)登錄密碼的顯示與隱藏功能

    這篇文章主要介紹了Vue基于iview實現(xiàn)登錄密碼的顯示與隱藏功能,本文通過截圖實例代碼說明給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • vue下拉列表的兩種實現(xiàn)方式比較

    vue下拉列表的兩種實現(xiàn)方式比較

    這篇文章主要介紹了vue下拉列表的兩種實現(xiàn)方式比較,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • vue 解決在微信內(nèi)置瀏覽器中調(diào)用支付寶支付的情況

    vue 解決在微信內(nèi)置瀏覽器中調(diào)用支付寶支付的情況

    這篇文章主要介紹了vue 解決在微信內(nèi)置瀏覽器中調(diào)用支付寶支付的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue 去除路徑中的#號

    Vue 去除路徑中的#號

    大家都知道vue-router有兩種模式,hash模式和history模式,帶#的則是hash模式。接下來給大家?guī)砹薞ue 去除路徑中的#號的解決方法,感興趣的朋友一起看看吧
    2018-04-04
  • Vue項目之學(xué)生管理系統(tǒng)實例詳解

    Vue項目之學(xué)生管理系統(tǒng)實例詳解

    這篇文章主要為大家詳細介紹了Vue項目之學(xué)生管理系統(tǒng)實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • vueRouter--matcher之動態(tài)增減路由方式

    vueRouter--matcher之動態(tài)增減路由方式

    這篇文章主要介紹了vueRouter--matcher之動態(tài)增減路由方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue項目部署的實現(xiàn)(阿里云+Nginx代理+PM2)

    Vue項目部署的實現(xiàn)(阿里云+Nginx代理+PM2)

    這篇文章主要介紹了Vue項目部署的實現(xiàn)(阿里云+Nginx代理+PM2),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • vue組件和iframe頁面的相互傳參問題及解決

    vue組件和iframe頁面的相互傳參問題及解決

    這篇文章主要介紹了vue組件和iframe頁面的相互傳參問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue下拉刷新組件的開發(fā)及slot的使用詳解

    vue下拉刷新組件的開發(fā)及slot的使用詳解

    這篇文章主要介紹了vue下拉刷新組件的開發(fā)及slot的使用詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Vue中判斷語句與循環(huán)語句基礎(chǔ)用法及v-if和v-for的注意事項詳解

    Vue中判斷語句與循環(huán)語句基礎(chǔ)用法及v-if和v-for的注意事項詳解

    在Vue指令中,最經(jīng)常被用于做邏輯操作的指令,下面這篇文章主要給大家介紹了關(guān)于Vue中判斷語句與循環(huán)語句基礎(chǔ)用法及v-if和v-for注意事項的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08

最新評論

雷山县| 左云县| 淅川县| 阿拉尔市| 上犹县| 安阳市| 锡林郭勒盟| 晋宁县| 手机| 松溪县| 枣阳市| 克什克腾旗| 永仁县| 台中市| 民丰县| 扎赉特旗| 垦利县| 龙里县| 浦北县| 鹤山市| 浮梁县| 赤峰市| 正阳县| 衡南县| 朔州市| 疏附县| 汾西县| 汨罗市| 申扎县| 河西区| 沙洋县| 察雅县| 策勒县| 乌兰浩特市| 太谷县| 赣州市| 鄂州市| 江山市| 西平县| 阿尔山市| 宜黄县|