Vue简单自定义Canvas验证码组件。
在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码需求。
在线演示地址: 原文可查看演示
一,创建一个Captcha验证码组件。
<template>
<canvas id="captchaCanvas" @click="generateCaptcha" :style="{width,height}"></canvas>
</template>
<script setup>
// 原文:https://zhangpingguo.com/articleDetails/1717723762620
import {watch, onMounted, toRefs} from "vue";
const emit=defineEmits(['getValue'])
const props = defineProps({
// 宽度
width: {
type: String,
default: '100%'
},
// 高度
height: {
type: String,
default: '100%'
},
//验证码数量
number: {
type: Number,
default: 4,
}, //验证码数量
night: {
type: Boolean,
default: false,
},
});
watch(()=>props.night,()=>{
generateCaptcha()
})
const generateCaptcha=()=> {
const canvas = document.getElementById('captchaCanvas');
const ctx = canvas.getContext('2d');
// 清除旧内容
canvas.width = canvas.width;
// 字符集
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let captchaText = '';
// 设置背景颜色和一些基本样式
ctx.fillStyle = props.night?'#2d2c2c':'#f9f9f9';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 绘制噪点
for (let i = 0; i < 200; i++) {
ctx.fillStyle = getRandomColor(0, 300);
ctx.fillRect(Math.random() * canvas.width, Math.random() * canvas.height, 1, 1);
}
// 绘制干扰线
for (let i = 0; i < 9; i++) {
ctx.strokeStyle = getRandomColor(150, 255);
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 < props.number; i++) {
const randomIndex = Math.floor(Math.random() * chars.length);
const char = chars[randomIndex];
captchaText += char;
drawChar(char, 1 + i * canvas.width/props.number, (canvas.height/2)+20, 70, getRandomColor(10, 50));
}
//返回给父组件
emit('getValue',captchaText)
}
const drawChar=(char, x, y, fontSize, fillStyle)=> {
const ctx = document.getElementById('captchaCanvas').getContext('2d');
ctx.font = fontSize + 'px Arial';
ctx.fillStyle = fillStyle;
ctx.fillText(char, x, y);
}
const getRandomColor=(min, max)=> {
var r = Math.floor(Math.random() * 256); // 0-255
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return `rgb(${r},${g},${b})`;
}
//暴露给父组件调用
defineExpose({generateCaptcha})
onMounted(()=>{
generateCaptcha();
})
</script>
<style scoped>
#captchaCanvas {
margin-bottom: 10px;
display: block;
user-select: none;
}
</style>
二,页面中引入该组件。
<template>
<div style="width: 200px;height: 80px">
<Captcha ref="captchaRef" @getValue="getValue" ></Captcha>
<a href="https://zhangpingguo.com/articleDetails/1717723762620" target="_blank">原文地址</a>
</div>
</template>
<script setup>
import Captcha from '../components/Captcha.vue';
const getValue=(val)=>{
console.log('验证码值=',val)
}
</script>
<style >
body{
display: flex;
justify-content: center;
}
</style>
三,效果图。

四,其他
| 属性名称 | 说明 |
|---|---|
| width | 宽度(String),默认100%跟随父级宽度 |
| height | 高度(String),默认100%跟随父级高度 |
| number | 验证码个数(Number),默认4 |
| night | 黑夜模式(Boolean),默认false |
| 方法名称 | 说明 |
|---|---|
| getValue | (string)=>{},返回验证码值 |
Vue简单自定义Canvas验证码组件。的更多相关文章
- 【vue】canvas验证码组件--数字/数字加字母
基于canvas的数字/数字+字符验证码 SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...
- Vue简单基础 + 实例 及 组件通信
vue的双向绑定原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...
- Vue.use自定义自己的全局组件
通常我们在vue里面使用别人开发的组件,第一步就是install,第二步在main.js里面引入,第三步Vue.use这个组件.今天我简单的也来use一个自己的组件. 这里我用的webpack-sim ...
- Vue基础-自定义事件的表单输入组件、自定义组件的 v-model
Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...
- Vue - 简单实现一个命令式弹窗组件
前言 在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件 涉及知识点:extend.$mount.$el 使用方式: this.$Confirm({ titl ...
- Vue组件之自定义表单组件
今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...
- vue中自定义组件(插件)
vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...
- vue 简单实现父组件向子组件传值,简单来说就是子组件肆意妄为的调用父组件里后台返回的值
首先在于父子组件传值的方法很多,本人在这里只是简单描述一下一个组件里面引用了子组件,那么子组件如何才能获取父组件中后台返回的值呢? 首先调用组件相信大家都应该明白了(不明白的自己撸撸文档), < ...
- vue的自定义组件和组件传值
<div id="app"> <div>{{pmessage}}</div> //父组件 <child :message="pm ...
- Vue directive自定义指令+canvas实现H5图片压缩上传-Base64格式
前言 最近优化项目-手机拍照图片太大,回显速度比较慢,使用了vue的自定义指令实现H5压缩上传base64格式的图片 canvas自定义指令 Vue.directive("canvas&qu ...
随机推荐
- vue中 如何实现一个单文件组件
前端开发人员只要了解过vue.js框架可能都知道单文件组件.vue.js中的单文件组件允许在一个文件中定义一个组件的所有内容.这是一个非常有用的解决方案,在浏览器网页中已经开始提倡这种机制.但是不幸的 ...
- 「开源人说」|AI普惠,阿里灵杰开源历程与思考
简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...
- Istio 从懵圈到熟练:二分之一活的微服务
作者 | 声东 阿里云售后技术专家 <关注阿里巴巴云原生公众号,回复 排查 即可下载电子书> <深入浅出 Kubernetes>一书共汇集 12 篇技术文章,帮助你一次搞懂 ...
- 简单、有效、全面的Kubernetes监控方案
简介:近年来,Kubernetes作为众多公司云原生改造的首选容器化编排平台,越来越多的开发和运维工作都围绕Kubernetes展开,保证Kubernetes的稳定性和可用性是最基础的需求,而这其中 ...
- [FAQ] FinalCutPro 事件如何支持多个时间线
左侧是建立的事件,右侧是默认的项目(也就是时间线上的剪辑项目). 如果需要这个事件里再弄一个时间线(比如剪辑另一个版本),左侧的事件上右击新建项目: 另一个项目,在这上面可以继续时间线的创作,等于是选 ...
- [Nova] KeyValue Field 设置默认 key 的方式
1. 使用 withMeta: KeyValue::make('options') ->withMeta([ 'value' => $this->options ?? [ 'A' = ...
- dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本
本文告诉大家在拿到任意时区的 DateTimeOffset 对象,将 DateTimeOffset 转换为使用中国的 +8 时区表示的时间 在开始之前,需要说明的是,采用 DateTimeOffset ...
- frp内网穿透器安装与介绍
1.NAT访问 2.FRP介绍 中文官方文档:https://gofrp.org/docs/ github:https://github.com/fatedier/frp/releases frp 采 ...
- CMDB开发(一)
一.CMDB前戏 # 项目开发流程 1.需求分析 产品经理 开发人员 客户等三方会议 2.架构设计 框架的选择 语言选择 数据库选择 3.分组开发 小组成员各自开发各自的功能(可能也会有交集) 4. ...
- Docker 必知必会----初识
什么是Docker?Docker 是一个开源的容器管理引擎.开发者可以通过Docker直接管理应用程序所需要的容器.它的logo如下: 为什么需要Docker使用Docker主要有两个原因,1.屏蔽不 ...