這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 使用Canvas繪製一個驗證碼組件 前言 驗證碼,這一日常伴隨我們的要素,是我們線上交互的重要安全保障。你的手機簡訊里是否被它占據半壁江山,今天我們就來聊聊如何在網頁上實現一個簡單的驗證碼組件。大家在登錄網站時為了防止被惡意攻擊或者多次點 ...
這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助
使用Canvas繪製一個驗證碼組件
前言
驗證碼,這一日常伴隨我們的要素,是我們線上交互的重要安全保障。你的手機簡訊里是否被它占據半壁江山,今天我們就來聊聊如何在網頁上實現一個簡單的驗證碼組件。大家在登錄網站時為了防止被惡意攻擊或者多次點擊操作,使用驗證碼是最常用的實現方式。在學習完Canvas後,通過Canvas實現簡單的驗證碼就比較簡單了,該組件已開源上傳npm,可以直接安裝使用,源碼已上傳Git,地址在文尾。
聊聊Canvas
1、在開始繪製Canvas時,我們需要先創建一個html節點,併為其設置寬高
<canvas id="canvas" width="200" height="150""></canvas>
2、可以使用 cnv.width 和 cnv.height 分別獲取 Canvas 的寬度和高度,可以使用 cnv.getContext("2d")來獲取 canvas 2D 上下文環境對象。
如何繪製一條直線
使用canvas的 moveTo()和 lineTo()方法,比如將畫筆moveTo(0,0),移動畫筆到極點坐標,使用lineTo(100,100),這樣執行完兩個步驟將能夠繪製一條從坐標(0,0)到坐標(100,100)的一條直線,不過此時canvas上並不會展示出一條直線,我們還需要調用stroke()方法結束繪畫,這樣就能在頁面上看到一條直線。
隨機畫一條直線:
context.moveTo(Math.random() * Canvas_DOM.width, Math.random() * Canvas_DOM.height); context.lineTo(Math.random() * Canvas_DOM.width, Math.random() * Canvas_DOM.height);
如何繪製一個點
從上面我們知道瞭如何繪製一條直線,那麼繪製一個點其實就是繪製一個長度為1的直線。
繪製一個隨機點:
var x = Math.random() * Canvas_DOM.width; var y = Math.random() * Canvas_DOM.height; context.moveTo(x, y); context.lineTo(x + 1, y + 1);
怎麼繪製文字
通過fillText(txt, 0, 0)就能在canvas里添加一個文字,其中txt為需要繪製的內容,後面兩個參數為文字在canvas中的位置,當然也可以通過rotate()和translate()來改變文字的方向和位置。
context.fillText(txt, 0, 0); context.rotate(-deg); context.translate(-x, -y);
使用fillStyle可以修改文字、線條的顏色
繪製驗證碼組件
從上面我們知道瞭如何繪製直線、點、以及文字,那麼一個驗證碼也就由這些組成,我們只需要把他們結合起來,在點擊驗證碼時,重新繪製一個隨機的canvas,就能得到一個完整的驗證碼組件:
<template> <canvas class="canvas" ref="cav" @click="Refresh"></canvas> </template> <script lang="ts" setup> import { ref, onMounted } from 'vue'; const show_num = ref<any>([]) const cav = ref<any>(null) onMounted(() => { draw(); }); const draw = () => { var Canvas_DOM = cav.value; var cav_width = Canvas_DOM.clientWidth; var cav_height = Canvas_DOM.clientHeight; var context = Canvas_DOM.getContext('2d'); Canvas_DOM.width = cav_width; Canvas_DOM.height = cav_height; var sCode = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0"; var aCode = sCode.split(','); var aLength = aCode.length; //獲取到數組的長度 for (var i = 0; i <= 3; i++) { var j = Math.floor(Math.random() * aLength); //獲取到隨機的索引值 var deg = (Math.random() * 30 * Math.PI) / 180; //產生0~30之間的隨機弧度 var txt = aCode[j]; //得到隨機的一個內容 show_num.value[i] = txt.toLowerCase(); var x = 50 + i * 20; //文字在canvas上的x坐標 var y = 20 + Math.random() * 8; //文字在canvas上的y坐標 context.font = 'bold 23px 微軟雅黑'; context.translate(x, y); context.rotate(deg); context.fillStyle = _randomColor(); context.fillText(txt, 0, 0); context.rotate(-deg); context.translate(-x, -y); } for (var i = 0; i <= 5; i++) { //驗證碼上顯示隨機線條 context.strokeStyle = _randomColor(); context.beginPath(); context.moveTo(Math.random() * Canvas_DOM.width, Math.random() * Canvas_DOM.height); context.lineTo(Math.random() * Canvas_DOM.width, Math.random() * Canvas_DOM.height); context.stroke(); } for (var i = 0; i <= 30; i++) { //驗證碼上顯示隨機小點 context.strokeStyle = _randomColor(); context.beginPath(); var x = Math.random() * Canvas_DOM.width; var y = Math.random() * Canvas_DOM.height; context.moveTo(x, y); context.lineTo(x + 1, y + 1); context.stroke(); } } const _randomColor = () => { //得到隨機的顏色值 var r = Math.floor(Math.random() * 256); var g = Math.floor(Math.random() * 256); var b = Math.floor(Math.random() * 256); return 'rgb(' + r + ',' + g + ',' + b + ')'; } const Refresh = () => { draw(); } </script> <style scoped> .canvas { width: 200px; height: 40px; display: inline-block; margin-left: 12px; cursor: pointer; } </style>
使用示例
npm install @fcli/vue-vercode --save-dev 來安裝 在項目中使用 import VerCode from '@fcli/vue-vercode'; const app=createApp(App) app.use(VerCode);示例:
<div class="content"> <ver-code ref=verCode></ver-code> </div>
獲取驗證碼組件的數據
let code = verCode.value.show_num.join('');