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

vue實(shí)現(xiàn)登錄時(shí)圖形驗(yàn)證碼

 更新時(shí)間:2022年03月04日 16:19:59   作者:別搞花里胡哨的  
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)登錄時(shí)圖形驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

效果圖:

點(diǎn)擊圖案可以切換字符

1.新建 Identify.vue 組件

<template>
? <div>
? <canvas
? ? ? id="s-canvas"
? ? ? :width="contentWidth"
? ? ? :height="contentHeight"></canvas>
? </div>
</template>

<script>
export default {
? name: "identify",
? props: {
? ? identifyCode: {
? ? ? type: String,
? ? ? default: ''
? ? },
? ? fontSizeMin: {
? ? ? type: Number,
? ? ? default: 28
? ? },
? ? 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: 130
? ? },
? ? contentHeight: {
? ? ? type: Number,
? ? ? default: 40
? ? }
? },
? methods:{
? ? // 生成一個(gè)隨機(jī)數(shù)
? ? randomNum (min, max) {
? ? ? return Math.floor(Math.random() * (max - min) + min)
? ? },
? ? // 生成一個(gè)隨機(jī)的顏色
? ? 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)
? ? ? let deg = this.randomNum(-30, 30)
? ? ? // 修改坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度
? ? ? ctx.translate(x, y)
? ? ? ctx.rotate(deg * Math.PI / 270)
? ? ? ctx.fillText(txt, 0, 0)
? ? ? // 恢復(fù)坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度
? ? ? ctx.rotate(-deg * Math.PI / 270)
? ? ? ctx.translate(-x, -y)
? ? },
? ? drawLine (ctx) {
? ? ? // 繪制干擾線
? ? ? for (let i = 0; i < 2; 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) {
? ? ? // 繪制干擾點(diǎn)
? ? ? for (let i = 0; i < 20; 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 lang="scss" scoped>
#s-canvas {
? height: 38px;
}
</style>

2.在父組件 index.vue注冊(cè)使用

<template>
?? ?<div @click="refreshCode" style="cursor: pointer;">
? ? ? ? <Identify :identifyCode="identifyCode" ></Identify>
? ? </div>
</template>

<script>
import Identify from '@/components/test/identify'
export default {
? name: "index",
? components:{
? ?Identify?
? },
? data(){
? ?? ?return {
?? ??? ? identifyCode: '',
? ? ? // 驗(yàn)證碼規(guī)則
? ? ? identifyCodes: '123456789ABCDEFGHGKMNPQRSTUVWXYZ',
?? ?}?
? },
? methods:{
?? ?// 切換驗(yàn)證碼
? ? refreshCode() {
? ? ? this.identifyCode = ''
? ? ? this.makeCode(this.identifyCodes, 4)
? ? ? console.log(this.identifyCode)
? ? },
? ? // 生成隨機(jī)驗(yàn)證碼
? ? makeCode(o, l) {
? ? ? for (let i = 0; i<l; i++) {
? ? ? ? this.identifyCode += this.identifyCodes[
? ? ? ? ? ? Math.floor(Math.random() * (this.identifyCodes.length - 0) + 0)
? ? ? ? ? ? ]
? ? ? }
?? ?},
?? ?mounted() {
? ? ?? ?this.refreshCode()
? }
}
</script>

<style scoped>

</style>

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

相關(guān)文章

  • vue實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能詳解

    vue實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能詳解

    這篇文章主要介紹了vue實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能詳解的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • vue項(xiàng)目中路由跳轉(zhuǎn)頁(yè)面不變問(wèn)題及解決

    vue項(xiàng)目中路由跳轉(zhuǎn)頁(yè)面不變問(wèn)題及解決

    這篇文章主要介紹了vue項(xiàng)目中路由跳轉(zhuǎn)頁(yè)面不變問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    這篇文章主要介紹了Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue+element開(kāi)發(fā)一個(gè)谷歌插件的全過(guò)程

    vue+element開(kāi)發(fā)一個(gè)谷歌插件的全過(guò)程

    這篇文章主要給大家介紹了關(guān)于vue+element開(kāi)發(fā)一個(gè)谷歌插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Vant彈出列表多選輸入框下拉選擇代碼(可直接復(fù)制使用)

    Vant彈出列表多選輸入框下拉選擇代碼(可直接復(fù)制使用)

    vue項(xiàng)目無(wú)論是用element中的Select選擇器,還是使用公司維護(hù)的組件,都可以輕松實(shí)現(xiàn)單選和多選的需求,這篇文章主要給大家介紹了關(guān)于Vant彈出列表多選輸入框下拉選擇的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Vue elementUI 自定義表單模板組件功能實(shí)現(xiàn)

    Vue elementUI 自定義表單模板組件功能實(shí)現(xiàn)

    在項(xiàng)目開(kāi)發(fā)中,我們會(huì)遇到這種需求,在管理后臺(tái)添加自定義表單,在指定的頁(yè)面使用定義好的表單,這篇文章主要介紹了Vue elementUI 自定義表單模板組件,需要的朋友可以參考下
    2022-12-12
  • vue組件和iframe頁(yè)面的相互傳參問(wèn)題及解決

    vue組件和iframe頁(yè)面的相互傳參問(wèn)題及解決

    這篇文章主要介紹了vue組件和iframe頁(yè)面的相互傳參問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 詳解為element-ui的Select和Cascader添加彈層底部操作按鈕

    詳解為element-ui的Select和Cascader添加彈層底部操作按鈕

    這篇文章主要介紹了詳解為element-ui的Select和Cascader添加彈層底部操作按鈕,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • vue 中的 v-model詳解

    vue 中的 v-model詳解

    文章介紹了Vue中的v-model實(shí)現(xiàn)原理,包括數(shù)據(jù)監(jiān)聽(tīng)和UI通知,通過(guò)綁定props.modelValue和使用update:modelValue,子組件可以實(shí)現(xiàn)數(shù)據(jù)變更通知父組件,Vue3提供了defineModel來(lái)簡(jiǎn)化v-model的定義,并支持自定義v-model變量名,感興趣的朋友一起看看吧
    2025-01-01
  • 使用imba.io框架得到比 vue 快50倍的性能基準(zhǔn)

    使用imba.io框架得到比 vue 快50倍的性能基準(zhǔn)

    imba 是一種新的編程語(yǔ)言,可以編譯為高性能的 JavaScript??梢灾苯佑糜?Web 編程(服務(wù)端與客戶端)開(kāi)發(fā)。這篇文章主要介紹了使用imba.io框架,得到比 vue 快50倍的性能基準(zhǔn),需要的朋友可以參考下
    2019-06-06

最新評(píng)論

大石桥市| 静海县| 永康市| 乃东县| 东乡县| 太保市| 高陵县| 博白县| 达日县| 涿鹿县| 大姚县| 高雄市| 赤城县| 荥经县| 安义县| 吴忠市| 筠连县| 惠水县| 邢台县| 板桥市| 颍上县| 永平县| 怀来县| 荔浦县| 舞钢市| 安福县| 九龙城区| 卢龙县| 宣武区| 台北市| 诸城市| 吴旗县| 桂东县| 阳曲县| 福建省| 梅州市| 满洲里市| 栾川县| 石棉县| 龙陵县| 黔西县|