vue - 使用canvas繪制驗證碼

封裝繪制驗證碼?verify-code.vue

<template><div class="captcha"><canvas ref="canvasRef" :width="width" :height="height" @click="refreshCaptcha"></canvas></div>
</template><script lang="ts" setup>const props = defineProps({width: {type: Number,default: 120,},height: {type: Number,default: 40,},codeLength: {type: Number,default: 5,},})const captchaText = ref('')const canvasRef = ref()onMounted(() => {refreshCaptcha()})const emits = defineEmits(['getCode'])const generateRandomText = () => {const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'let result = ''for (let i = 0; i < props.codeLength; i++) {result += chars.charAt(Math.floor(Math.random() * chars.length))}return result}const refreshCaptcha = () => {captchaText.value = generateRandomText()drawCaptcha()emits('getCode', captchaText.value)}const drawCaptcha = () => {const canvas = canvasRef.valueconst ctx = canvas.getContext('2d')// 清除畫布ctx.clearRect(0, 0, canvas.width, canvas.height)// 背景色ctx.fillStyle = '#f5f5f5'ctx.fillRect(0, 0, canvas.width, canvas.height)// 繪制文字ctx.font = '20px Arial'ctx.fillStyle = '#333'ctx.textAlign = 'center'ctx.textBaseline = 'middle'// 添加干擾線for (let i = 0; i < 5; i++) {ctx.strokeStyle = getRandomColor()ctx.beginPath()ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height)ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height)ctx.stroke()}// 添加噪點for (let i = 0; i < 30; i++) {ctx.fillStyle = getRandomColor()ctx.fillRect(Math.random() * canvas.width, Math.random() * canvas.height, 2, 2)}// 繪制文字(每個字符單獨處理以增加變形)for (let i = 0; i < captchaText.value.length; i++) {ctx.save()ctx.translate(10 + i * 16, 16)ctx.rotate((Math.random() - 0.5) * 0.4)ctx.fillText(captchaText.value[i], 0, 0)ctx.restore()}}const getRandomColor = () => {const letters = '0123456789ABCDEF'let color = '#'for (let i = 0; i < 6; i++) {color += letters[Math.floor(Math.random() * 16)]}return color}defineExpose({code: captchaText,refresh: refreshCaptcha,})
</script><style>.captcha canvas {cursor: pointer;}
</style>

使用

<template><div><el-input v-model="input" placeholder="" style="width: 100px;"></el-input><VueVerifyCoderef="verifyCodeRef":width="74":height="34":code-length="4"style="margin-left: 8px;border: 1px solid var(--color-border-2);padding: 0 2px;"@get-code="getCode"/><el-button type="primary" @click="submit">登錄</el-button></div>
</template><script lang="ts" setup>
import VueVerifyCode from "@/components/verify-code.vue";
const verifyCodeRef = ref();
const input = ref(""); //輸入的驗證碼
const verifyCode = ref(""); //當前驗證碼
//獲取當前驗證碼
const getCode = (code: string) => {verifyCode.value = code;
};
const submit = ()=>{//判斷驗證碼是否相同 全部轉換為小寫if (input.value.toLocaleLowerCase() !== verifyCode.value.toLocaleLowerCase()) {alert('驗證碼錯誤!')verifyCodeRef.value.refresh()return}
}
</script><style lang="sass" scoped></style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90690.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[10月考試] F

[10月考試] F 題目描述 給定長度為 nnn 的序列 ana_nan?&#xff0c;保證 aia_iai? 為非負整數。 mmm 次詢問&#xff0c;每次給定區間 l,rl,rl,r&#xff0c;求出 al,al1,…,ara_l,a_{l1},\ldots,a_ral?,al1?,…,ar? 的 mexmexmex。 對于一個序列&#xff0c;定義其 mexm…

收集了全球55個AI寫作工具

我們即將推出一整套AI生產力工具矩陣&#xff0c;覆蓋內容創作&#xff08;AI寫作助手&#xff09;、視覺設計&#xff08;智能圖像處理&#xff09;、音視頻制作&#xff08;自動轉錄與編輯&#xff09;及智能編程等多個核心領域。這些解決方案通過先進的機器學習算法&#xf…

Elastic 勞動力的生成式 AI:ElasticGPT 的幕后解析

作者&#xff1a;來自 Elastic Jay Shah, Adhish Thite ElasticGPT — 由 Elastic 提供支持&#xff0c;專為 Elastic 打造 ElasticGPT 是我們基于檢索增強生成&#xff08;RAG&#xff09;框架構建的內部生成式 AI &#xff08;GenAI&#xff09;助手。它是使用 Elastic 自有…

CS231n-2017 Assignment1

KNN&#xff1a;這里要求我們完成一個KNN分類器&#xff0c;實現對圖片使用KNN算法進行分類標簽k_nearest_neighbor.py這里要求我們完成4個接口# X:測試集 # 使用兩個循環 def compute_distances_two_loops(self, X):num_test X.shape[0]num_train self.X_train.shape[0]dist…

[python][flask]Flask-Principal 使用詳解

Flask-Principal 是一個專為 Flask 應用設計的身份管理和權限控制擴展。它能夠幫助開發者輕松實現用戶身份驗證和權限管理&#xff0c;從而提升應用的安全性和用戶體驗。該項目最初由 Ali Afshar 開發&#xff0c;現已成為 Pallets 社區生態系統的一部分&#xff0c;由社區共同…

抖音與B站爬蟲實戰,獲取核心數據

本文將深入講解兩大主流短視頻平臺&#xff08;抖音、B站&#xff09;的爬蟲實戰技術&#xff0c;提供可直接運行的代碼解決方案&#xff0c;并分享突破反爬機制的核心技巧。一、平臺特性與爬蟲難點對比平臺數據價值主要反爬措施推薦抓取方式抖音視頻數據、用戶畫像、熱榜簽名驗…

WSL切換網絡模式

WSL切換網絡模式問題WSL從NAT改成MIRRORED找到WSL Setting修改配置重啟電腦&#xff08;注意不是重啟WSL&#xff09;運行pio run驗證IP問題 從魚香ROS買了一個小魚車&#xff0c;開始學習&#xff0c;然而裝環境都要搞死我了。 垃圾VirtualBox我新買的電腦&#xff0c;裝個Vi…

[Linux入門] Linux 遠程訪問及控制全解析:從入門到實戰

目錄 一、SSH 遠程管理&#xff1a;為什么它是遠程訪問的首選&#xff1f; 1??什么是 SSH&#xff1f; 2??SSH 為什么比傳統工具更安全&#xff1f; 3??SSH 的 “三大組成部分” 4??SSH 工作的 “五步流程” 5??常用 SSH 工具 二、實戰&#xff1a;構建 SSH 遠…

n8n AI資訊聚合與分發自動化教程:從數據獲取到微信與Notion集成

引言 n8n簡介&#xff1a;自動化工作流利器 n8n是一款功能強大的開源自動化工具&#xff0c;采用獨特的“公平代碼”&#xff08;Fair-Code&#xff09;許可模式&#xff0c;旨在幫助用戶連接各種應用程序和服務&#xff0c;從而實現工作流的自動化。它通過直觀的可視化界面&am…

遞歸查詢美國加速-技術演進與行業應用深度解析

在當今數據驅動的時代&#xff0c;遞歸查詢已成為處理層級數據的核心技術&#xff0c;尤其在美國科技領域獲得廣泛應用。本文將深入解析遞歸查詢在美國加速發展的關鍵因素&#xff0c;包括技術演進、行業應用場景以及性能優化策略&#xff0c;幫助讀者全面理解這一重要技術趨勢…

【AIGC專欄】WebUI實現圖片的縮放

圖片的縮放包含如下的各類不同的縮放模型。 Lanczos Lanczos重采樣是一種數學上精確的方法,用于圖像放大或縮小。它使用了一種稱為 sinc 函數的數學公式,可以在保留圖像細節的同時減少鋸齒效應。 Nearest 最近鄰插值是一種簡單的圖像放大方法,通過復制最近的像素值來填充新…

Libevent(4)之使用教程(3)配置

Libevent(4)之使用教程(3)配置事件 Author: Once Day Date: 2025年7月27日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 本文檔翻譯于&#xff1a;Fast portable non-bl…

若依前后端分離版學習筆記(三)——表結構介紹

前言&#xff1a; 這一節將ruoyi框架中數據庫中的表結構過一遍&#xff0c;查看都有哪些表及其表結構及關聯關系&#xff0c;為后續代碼學習做準備。 一 代碼生成表記錄代碼生成的業務表及相關字段1 代碼生成業務表 CREATE TABLE gen_table (table_id bigint(20) NOT NULL AUTO…

NFS服務安裝與使用

概述 內網需要使用NFS服務掛載到其他服務器&#xff0c;用做數據備份使用。 安裝 # Centos yum install -y nfs-utils # Ubuntu apt install nfs-common配置 # 編輯 vim /etc/exports # 輸入內容 /public/KOL-ESbackup 172.29.1.0/24 192.168.8.63 192.168.8.64 192.168.8.65(r…

使用adb 發送廣播 動態改變app內的值

前言 在開發過程中有時候我們需要做一些調試工作。可以通過adb發送廣播實現。 廣播注冊 注意最后一個參數&#xff0c;Context.RECEIVER_EXPORTED 這是Android 34以后強制要求的&#xff0c;方便外部發送這個廣播。否則會報錯val filter IntentFilter()filter.addAction("…

【Web安全】邏輯漏洞之URL跳轉漏洞:原理、場景與防御

文章目錄前言一、漏洞本質二、攻擊原理正常跳轉流程漏洞觸發流程三、抓包的關鍵時機&#xff1a;跳轉參數生成時四、風險場景1.登錄/注冊后跳轉2.退出登錄跳轉3.分享/廣告鏈接跳轉4.密碼重置鏈接跳轉五、漏洞挖掘&#xff1a;怎么找到這種漏洞&#xff1f;1.找到跳轉參數2.篡改…

新手開發 App,容易陷入哪些誤區?

新手開發 App 時&#xff0c;常因對流程和用戶需求理解不足陷入誤區&#xff0c;不僅拖慢進度&#xff0c;還可能導致產品無人問津。?功能堆砌是最常見的陷阱。不少新手總想 “一步到位”&#xff0c;在初期版本就加入十幾項功能&#xff0c;比如做社區團購 App 時&#xff0c…

Linux學習篇11——Linux軟件包管理利器:RPM與YUM詳解與實戰指南,包含如何配置失效的YUM鏡像地址

引言 本文主要梳理 Linux 系統中的軟件包的概念&#xff0c;同時介紹RPM與YUM兩大核心管理工具的常用指令、區別聯系以及實戰技巧等。本文作為作者學習Linux系統的第11篇文章&#xff0c;依舊旨在總結當前的學習內容&#xff0c;同時鞏固知識以便日后的學習復習回顧。如有說的…

Vue3+ElementPlus實現可拖拽/吸附/搜索/收起展開的浮動菜單組件

在開發后臺管理系統時&#xff0c;我們經常會用到浮動菜單來快速訪問某些功能。本篇文章將分享一個基于 Vue3 ElementPlus 實現的浮動菜單組件&#xff0c;支持拖拽移動、邊緣吸附、二級菜單展開、菜單搜索過濾、視頻彈窗等交互效果&#xff0c;極大提升了用戶操作的便捷性與美…

CSS 盒子模型學習版的理解

文章目錄一、盒子模型構建流程&#xff08;一句話抓關鍵&#xff09;二、核心邏輯提煉三、代碼驗證四、一句話總結流程通過手繪圖示&#xff0c;清晰拆解 Content&#xff08;內容&#xff09;→ Padding&#xff08;內邊距&#xff09;→ Border&#xff08;邊框&#xff09;→…