亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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項(xiàng)目保存代碼之后頁(yè)面自動(dòng)更新問(wèn)題

    Vue項(xiàng)目保存代碼之后頁(yè)面自動(dòng)更新問(wèn)題

    這篇文章主要介紹了Vue項(xiàng)目保存代碼之后頁(yè)面自動(dòng)更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    這篇文章主要為大家學(xué)習(xí)介紹了如何基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解一下
    2023-07-07
  • vue移動(dòng)端判斷手指在屏幕滑動(dòng)方向

    vue移動(dòng)端判斷手指在屏幕滑動(dòng)方向

    這篇文章主要為大家詳細(xì)介紹了vue移動(dòng)端判斷手指在屏幕滑動(dòng)方向,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vue父組件通過(guò)props如何向子組件傳遞方法詳解

    vue父組件通過(guò)props如何向子組件傳遞方法詳解

    在Vue 中,可以使用 props 向子組件傳遞數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于vue父組件通過(guò)props如何向子組件傳遞方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • VUE使用draggable實(shí)現(xiàn)組件拖拽

    VUE使用draggable實(shí)現(xiàn)組件拖拽

    這篇文章主要為大家詳細(xì)介紹了VUE使用draggable實(shí)現(xiàn)組件拖拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue?@scroll監(jiān)聽(tīng)滾動(dòng)條事件方式

    vue?@scroll監(jiān)聽(tīng)滾動(dòng)條事件方式

    這篇文章主要介紹了vue?@scroll監(jiān)聽(tīng)滾動(dòng)條事件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • vue自定義翻頁(yè)組件的方法

    vue自定義翻頁(yè)組件的方法

    這篇文章主要為大家詳細(xì)介紹了vue自定義翻頁(yè)組件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Vue3實(shí)現(xiàn)下拉選擇框多選功能的方法詳解

    Vue3實(shí)現(xiàn)下拉選擇框多選功能的方法詳解

    在vue的實(shí)際開(kāi)發(fā)過(guò)程中,我們?nèi)绾螌⒁赃x中的值直接渲染到頁(yè)面中,下面這篇文章主要給大家介紹了關(guān)于Vue3實(shí)現(xiàn)下拉選擇框多選功能的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Vue列表渲染v-for的使用案例詳解

    Vue列表渲染v-for的使用案例詳解

    這篇文章主要介紹了Vue列表渲染(v-for的使用),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 一文帶你簡(jiǎn)單理解Vue的data為何只能是函數(shù)

    一文帶你簡(jiǎn)單理解Vue的data為何只能是函數(shù)

    如果data是一個(gè)函數(shù)的話,這樣每復(fù)用一次組件,就會(huì)返回一份新的data,下面這篇文章主要給大家介紹了關(guān)于簡(jiǎn)單理解Vue的data為啥只能是函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論