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 ...
随机推荐
- 技术解读:英特尔 x86 平台上,AI 能力是如何进行演进的?(附PPT)
简介:AI 生态系统是怎样的?其中又有哪些关键技术? AI 计算力的指数增长意味着,为了解决越来越复杂的用例,即使是 1000 倍的计算性能增长也很容易被消耗.因此,需要通过软件生态系统的助力,才能 ...
- 代理网关设计与实现(基于NETTY)
简介:本文重点在代理网关本身的设计与实现,而非代理资源的管理与维护. 作者 | 新然 来源 | 阿里技术公众号 一 问题背景 平台端购置一批裸代理,来做广告异地展现审核.从外部购置的代理,使用方 ...
- OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力
简介: 阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 m ...
- 2018-2-13-win10-uwp-从StorageFile获取文件大小
title author date CreateTime categories win10 uwp 从StorageFile获取文件大小 lindexi 2018-2-13 17:23:3 +0800 ...
- C语言程序设计-笔记04-函数
C语言程序设计-笔记04-函数 例5-1 计算圆柱体的体积.输入圆柱的高和半径,求圆柱体积volume=πxr^2xh.要求定义和调用函数cylinder(r,h)计算圆柱体的体积. #includ ...
- vue-苟曰的老板不发工资230行原创js代码写个扫雷小游戏
上gif: 1.开局提示动画 2.游戏中状态提示 3.开挂模式提示 4.计时器 5.游戏模式扫雷成功,蓝色进度条表示当次扫雷的完成度 6.若当次时间小于最佳记录,则更新最佳记录,如果最佳记录小于设置的 ...
- 七、Doris Colocation Join
Colocation Join 是在 Doris 0.9 版本中引入的新功能.旨在为某些 Join 查询提供本地性优化,来减少数据在节点间的传输耗时,加速查询. 1.基本理论 Join 的常见连接类型 ...
- 02 Xpath Helper介绍
目录 参考文档 下载地址 安装 使用 参考文档 xpath helper https://www.cnblogs.com/ChevisZhang/p/12869582.html http://c.bi ...
- uniapp去除button的边框
button { border: none !important; } button::after { border: none !important; }
- Pageoffice6 实现后台批量转PDF文档
在实际项目开发中如果遇到批量动态生成PDF文档的需求,只需参考后台批量生成PDF文档,目前网上也有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案 ...