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

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

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

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

效果圖:

點擊圖案可以切換字符

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:{
? ? // 生成一個隨機數(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)
? ? ? let deg = this.randomNum(-30, 30)
? ? ? // 修改坐標原點和旋轉(zhuǎn)角度
? ? ? ctx.translate(x, y)
? ? ? ctx.rotate(deg * Math.PI / 270)
? ? ? ctx.fillText(txt, 0, 0)
? ? ? // 恢復(fù)坐標原點和旋轉(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) {
? ? ? // 繪制干擾點
? ? ? 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注冊使用

<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: '',
? ? ? // 驗證碼規(guī)則
? ? ? identifyCodes: '123456789ABCDEFGHGKMNPQRSTUVWXYZ',
?? ?}?
? },
? methods:{
?? ?// 切換驗證碼
? ? refreshCode() {
? ? ? this.identifyCode = ''
? ? ? this.makeCode(this.identifyCodes, 4)
? ? ? console.log(this.identifyCode)
? ? },
? ? // 生成隨機驗證碼
? ? 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>

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

相關(guān)文章

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

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

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

    vue項目中路由跳轉(zhuǎn)頁面不變問題及解決

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

    Vue中如何點擊獲取當前元素下標

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

    vue+element開發(fā)一個谷歌插件的全過程

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

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

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

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

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

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

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

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

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

    vue 中的 v-model詳解

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

    使用imba.io框架得到比 vue 快50倍的性能基準

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

最新評論

四子王旗| 红安县| 徐水县| 达州市| 德兴市| 灵石县| 隆尧县| 石嘴山市| 闻喜县| 东光县| 福建省| 沾化县| 武宣县| 怀宁县| 菏泽市| 青海省| 巧家县| 蒲城县| 桃园市| 衡阳县| 阿荣旗| 汝城县| 松阳县| 固镇县| 新兴县| 琼结县| 肇州县| 肥乡县| 红河县| 白河县| 赤壁市| 洛浦县| 江山市| 栾城县| 林周县| 蛟河市| 博湖县| 于田县| 大洼县| 九江市| 甘洛县|