【vue】canvas验证码组件--数字/数字加字母
<!-- 基于canvas的数字/数字+字符验证码 -->
<!-- 调用格式
<s-identify
@func="getMsgFormSon"
:isRefreshCode="isRefreshCode"
:identifyCodes="identifyCodes" //可选传,选传写法有要求
></s-identify> -->
<template>
<div class="s-canvas">
<canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
</div>
</template>
<script>
export default {
name: "SIdentify",
props: {
isRefreshCode: {
type: Boolean,
default: false
},
identifyCodes: {
type: Array
},
identifyLen: {
type: Number,
default: 4
},
fontSizeMin: {
type: Number,
default: 16
},
fontSizeMax: {
type: Number,
default: 40
},
backgroundColorMin: {
type: Number,
default: 180
},
backgroundColorMax: {
type: Number,
default: 240
},
colorMin: {
type: Number,
default: 50
},
colorMax: {
type: Number,
default: 160
},
lineColorMin: {
type: Number,
default: 40
},
lineColorMax: {
type: Number,
default: 180
},
dotColorMin: {
type: Number,
default: 0
},
dotColorMax: {
type: Number,
default: 255
},
contentWidth: {
type: Number,
default: 112
},
contentHeight: {
type: Number,
default: 32
}
},
data() {
return {
nums: [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"0",
"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"
],
identifyText: ""
};
},
methods: {
// 生成一个随机数
randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
},
// 生成一个随机的颜色
randomColor(min, max) {
let r = this.randomNum(min, max);
let g = this.randomNum(min, max);
let b = this.randomNum(min, max);
return "rgb(" + r + "," + g + "," + b + ")";
},
// 绘制干扰线
drawLine(ctx) {
for (let i = 0; i < 6; i++) {
ctx.strokeStyle = this.randomColor(
this.lineColorMin,
this.lineColorMax
);
ctx.beginPath();
ctx.moveTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
);
ctx.lineTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
);
ctx.stroke();
}
},
// 绘制干扰点
drawDot(ctx) {
for (let i = 0; i < 50; i++) {
ctx.fillStyle = this.randomColor(0, 255);
ctx.beginPath();
ctx.arc(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight),
1,
0,
* Math.PI
);
ctx.fill();
}
},
// 生成l长度的验证码
makeCode(o, l) {
let identifyCodes = o;
this.identifyText = "";
for (let i = 0; i < l; i++) {
this.identifyText +=
identifyCodes[this.randomNum(0, identifyCodes.length)];
}
},
// 验证码文本
drawText(ctx, txt, i) {
ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax);
ctx.font =
this.randomNum(this.fontSizeMin, this.fontSizeMax) + "px SimHei";
let x = (i + 1) * (this.contentWidth / (this.identifyText.length + 1));
let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5);
var deg = this.randomNum(-45, 45);
// 修改坐标原点和旋转角度
ctx.translate(x, y);
ctx.rotate(deg * Math.PI / 180);
ctx.fillText(txt, 0, 0);
// 恢复坐标原点和旋转角度
ctx.rotate(-deg * Math.PI / 180);
ctx.translate(-x, -y);
},
// 验证码图形
drawPic() {
let identifyCodesArray = this.identifyCodes
? this.identifyCodes
: this.nums;
this.makeCode(identifyCodesArray, this.identifyLen);
let identifyCode = "";
let canvas = document.getElementById("s-canvas");
let ctx = canvas.getContext("2d");
ctx.textBaseline = "bottom";
// 绘制背景
ctx.fillStyle = this.randomColor(
this.backgroundColorMin,
this.backgroundColorMax
);
ctx.fillRect(0, 0, this.contentWidth, this.contentHeight);
console.log(this.identifyText, "huizhi");
// 绘制文字
for (let i = 0; i < this.identifyLen; i++) {
this.drawText(ctx, this.identifyText[i], i);
identifyCode += this.identifyText[i];
}
// for (let i = 0; i < this.identifyArray.length; i++) {
// this.drawText(ctx, this.identifyArray[i], i);
// }
this.drawLine(ctx);
this.drawDot(ctx);
console.log(identifyCode, "要传的值");
// 向父组件传值
this.$emit("func", identifyCode);
}
},
watch: {
if (this.isRefreshCode) {
this.drawPic();
}
},
mounted() {
this.drawPic();
}
};
</script>
<style lang="scss" scoped>
.s-canvas {
height: 32px;
canvas {
margin-top: 1px;
margin-left: 8px;
}
}
</style>
父组件调用
①默认 数字+字母验证码 形式
<template>
<div>
<el-input v-model="verificationCode" placeholder="验证码" />
<div class="identify-code" @click="refreshCode">
<!--验证码组件-->
<s-identify @func="getSidentifyCode" :isRefreshCode="isRefreshCode"></s-identify>
</div> </div>
</template>
<script>
import Vue from "vue";
import SIdentify from "./common/SIdentify"; export default {
components: { SIdentify },
data() {
return {
verificationCode: "",
identifyCode: "",
isRefreshCode: false,
};
},
created() {
// this.refreshCode();
},
mounted() {},
watch: {},
methods: {
refreshCode() {
this.identifyCode = "";
this.isRefreshCode = true; //更改状态--SIdentify组件中监听该状态
},
getSidentifyCode(data) {
this.identifyCode = data;
this.isRefreshCode = false;
console.log(this.identifyCode, "接收到的code");
}
}
};
</script>
<style lang="scss" scoped>
.identify-code {
display: inline-block;
}
}
</style>
②通过传 纯数字 为数字验证码
<template>
<div>
<el-input v-model="verificationCode" placeholder="验证码" />
<div class="identify-code" @click="refreshCode">
<!--验证码组件-->
<s-identify @func="getSidentifyCode" :isRefreshCode="isRefreshCode"></s-identify>
</div> </div>
</template>
<script>
import Vue from "vue";
import SIdentify from "./common/SIdentify"; export default {
components: { SIdentify },
data() {
return {
verificationCode: "",
identifyCodes: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
identifyCode: "",
isRefreshCode: false,
};
},
created() {
this.refreshCode();
},
mounted() {},
watch: {},
methods: {
refreshCode() {
this.identifyCode = "";
this.isRefreshCode = true; //更改状态--SIdentify组件中监听该状态
// 随机排序
if (this.identifyCodes.length) {
let tempCodesArray = this.identifyCodes.sort(function() {
return Math.random() - 0.5;
});
this.identifyCodes = tempCodesArray;
}
},
getSidentifyCode(data) {
this.identifyCode = data;
this.isRefreshCode = false;
console.log(this.identifyCode, "接收到的code");
}
}
};
</script>
<style lang="scss" scoped>
.identify-code {
display: inline-block;
}
}
</style>
当用方式②时, SIdentify.vue 组件 可以略去 isRefreshCode的监听判断,改为监听 identifyCodes
代码段为
SIdentify.vue <script>
export default {
...
watch: {
identifyCodes() {
this.drawPic();
}
//,
// isRefreshCode() {
// this.drawPic();
// }
} };
</script>
<style lang="scss" scoped>
.
.
.
</style>
【vue】canvas验证码组件--数字/数字加字母的更多相关文章
- Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
- vue 单文件组件中样式加载
在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件 ...
- vue的异步组件按需加载
当build打包后,app.js过大的时候,可以考虑用异步组件的方式. import HomeHeader from "./components/Header"; import H ...
- vue之vant组件下拉加载更多
vant地址:https://youzan.github.io/vant/#/zh-CN/intro 基础用法 List 组件通过loading和finished两个变量控制加载状态,当组件滚动到底部 ...
- Vue路由(组件)懒加载(异步)
传统的引入方式 import test from '@/components/test' { path: '/test', name: '测试页面', component:test }, 懒加载的方式 ...
- vue+element树组件 实现树懒加载
本文连接https://www.cnblogs.com/aknife/p/11709255.html 一.页面样式 二.数据库 三.前端页面代码 <template> <el-tre ...
- canvas验证码 - 随机字母数字
基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...
- Vue图片验证码-自定义组件高级版
最近项目中要用到图片验证码,网上一查有很多,基本都是千篇一律的4位纯数字验证码.首先得感谢那位一代目兄台提供的模板,由于不能满足需求,所以对其进行了改造升级. 经改造的图片验证码能满足一下情形使用:① ...
- java实现登录的验证码和猜数字游戏_图形化界面
实验任务四 1,出现设计思想 (1)先定义文本框.密码框和验证码框的组件 (2)定义面板和按钮的个数 (3)定义公有的虚构方法,通过对象实例化来调用 (4)利用Random类来实现生成0-9的随机数 ...
随机推荐
- SpringApplication及banner的配置
配置SpringApplication 如果SpringApplication无法满足要求,你可以自己创建一个局部实例,然后对其进行设置: public static void main(String ...
- 数据加密之AES
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- docker—数据卷
启动一个数据容器并挂载本地目录 docker run -itd --name=volume /opt/volume:/tmp/volume --privileged docker.io/nginx-t ...
- spark streaming 3: Receiver 到 submitJobSet
对于spark streaming来说,receiver是数据的源头.spark streaming的框架上,将receiver替换spark-core的以磁盘为数据源的做法,但是数据源(如监听某个 ...
- spark 笔记 9: Task/TaskContext
DAGScheduler最终创建了task set,并提交给了taskScheduler.那先得看看task是怎么定义和执行的. Task是execution执行的一个单元. Task: execut ...
- openssl生成秘钥对
openssl genrsa -out pri.pem openssl rsa -in pri.pem -out pub.pem -pubout 这样就生成秘钥对了,其中pri.pem是私钥,pub. ...
- tensorflow service部署
tensorflow+tensorflow-serving+docker+grpc模型上线部署(不需bazel编译,有代码)[https://blog.csdn.net/u013714645/arti ...
- 代码实现:输入3个数a,b,c,按大小顺序输出。
import java.util.Arrays; import java.util.Scanner; //输入3个数a,b,c,按大小顺序输出. public class Test34 { publi ...
- 阶段3 2.Spring_07.银行转账案例_6 测试转账并分析案例中的问题
转账回滚这里把异常打印出来.AccountServiceTest.java 把数据库的金额现在都改成1000块 运行测试方法 这里已经报错了. 刷新数据库内的数据.这样我们事物就控制成功了. 事物控制 ...
- 慕课网_Java入门第二季
第1章 类和对象 1-1 什么是类和对象 (07:36) 1-2 如何定义 Java 中的类 (07:18) 1-3 如何使用 Java 中的对象 (04:45) 1-4 练习题 1-5 Java 中 ...