IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 动手吧,vue图形验证码组件 -> 正文阅读

[JavaScript知识库]动手吧,vue图形验证码组件

组件内容

<template>
	<canvas
		id="canvas"
		ref="canvas"
		:width="width"
		:height="height"
		@click="updateCanvas"
	></canvas>
</template>
<script>
export default {
	data() {
		return {
			ctx: null,
			computedWidth: 0,
			computedHeight: 0,
		};
	},
	props: {
		value: {
			type: String,
			default: "",
		},
		nums: {
			type: Number,
			default: 4,
		},
		width: {
			type: Number,
			default: 300,
		},
		height: {
			type: Number,
			default: 80,
		},
		color: String,
		fillStyle: {
			type: String,
			default: "#fff",
		},
		randomLine: {
			type: Boolean,
			default: false,
		},
		clickUpdate: {
			type: Boolean,
			default: true,
		},
	},
	mounted() {
		const ramdomStr = this.getRandomStr();
		this.initCanvas();
		this.setCanvas(ramdomStr);
	},
	methods: {
		initCanvas() {
			const canvas = this.$refs.canvas;

			const ctx = canvas.getContext("2d");

			const computedStyle = getComputedStyle(canvas);

			this.ctx = ctx;

			this.computedWidth = parseFloat(computedStyle.width);

			this.computedHeight = parseFloat(computedStyle.height);

			ctx.fillStyle = this.fillStyle;

			ctx.fillRect(0, 0, this.computedWidth, this.computedHeight);

			this.randomLine && this.setRandomLine(ctx);
		},

		getRandomStr() {
			const _str =
				"abcdefghijkmlnopQrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

			let randomStr = "";
			if (!this.value) {
				for (var i = 0; i < this.nums; i++) {
					randomStr += _str[Math.floor(Math.random() * _str.length)];
				}
			} else {
				randomStr = this.value;
			}

			this.$emit("getImgCode", randomStr);

			return randomStr;
		},

		setRandomLine(ctx) {
			const computedWidth = this.computedWidth;
			const computedHeight = this.computedHeight;
			const nums = this.nums;
			const lineNums = Math.floor(computedWidth / nums);

			for (let i = 0; i < lineNums; i++) {
				ctx.save();

				ctx.beginPath();

				ctx.strokeStyle = this.getRandomRgb();

				ctx.translate(
					10 + i * (computedWidth / lineNums),
					Math.random() * computedHeight
				);

				ctx.rotate(this.getRandomDeg());

				ctx.moveTo(0, 0);

				ctx.lineTo(0, Math.random() * computedHeight);

				ctx.stroke();

				ctx.restore();
			}
		},

		setCanvas(str) {
			const len = str.length;
			const ctx = this.ctx;
			const fontsize = this.setFont();
			const computedHeight = this.computedHeight;
			const computedWidth = this.computedWidth;

			ctx.font = `${fontsize}px sans-serif`;

			ctx.save();

			for (let i = 0; i < len; i++) {
				const scaleBase = Math.random() > 0.5 ? 1.1 : 0.9;

				const randomRgb = this.getRandomRgb();

				ctx.fillStyle = this.color ?? randomRgb;

				ctx.translate(
					(computedWidth - fontsize * 4) / len + fontsize * i,
					parseFloat(computedHeight) / 2
				);

				ctx.rotate(this.getRandomDeg());

				ctx.scale(scaleBase, scaleBase);

				ctx.textBaseline = "middle";

				ctx.fillText(str[i], 0, 0);

				ctx.restore();

				ctx.save();
			}
		},

		updateCanvas() {
			if (!this.clickUpdate) return;

			const ctx = this.ctx;

			const ramdomStr = this.getRandomStr();

			ctx.clearRect(0, 0, this.computedWidth, this.computedHeight);

			this.initCanvas();

			this.setCanvas(ramdomStr);
		},

		getRandomDeg() {
			return (Math.PI / 180) * (-45 + Math.random() * 90);
		},

		getRandomRgb() {
			return `rgb(${Math.floor(Math.random() * 255)},${Math.floor(
				Math.random() * 255
			)},${Math.floor(Math.random() * 255)})`;
		},

		setFont() {
			let fontsize = this.computedWidth / (this.nums * 1.1);

			if (fontsize >= this.computedHeight) {
				fontsize = this.computedHeight * 0.8;
			}

			return fontsize;
		},
	},
};
</script>

组件参数

## 属性

value:图形验证码内容(由后端提供时填写)

nums: 验证码长度(number),默认:4

width: 图形验证码宽度(number)

height: 图形验证码高度(number)

color: 图形验证码内容颜色(string)

fillStyle:图形验证码填充颜色(string)

randomLine:是否开启随机干扰线条(boolean)

clickUpdate:是否开启点击更新图形验证码(boolean)

## 事件

getImgCode: 获取图形验证码内容

效果

?

?

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:23:29  更:2022-05-12 16:23:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:34:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码