基于canvas的数字/数字+字符验证码   SIdentify.vue 组件
<!-- 基于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验证码组件--数字/数字加字母的更多相关文章

  1. Vue.js 子组件的异步加载及其生命周期控制

    前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...

  2. vue 单文件组件中样式加载

    在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件 ...

  3. vue的异步组件按需加载

    当build打包后,app.js过大的时候,可以考虑用异步组件的方式. import HomeHeader from "./components/Header"; import H ...

  4. vue之vant组件下拉加载更多

    vant地址:https://youzan.github.io/vant/#/zh-CN/intro 基础用法 List 组件通过loading和finished两个变量控制加载状态,当组件滚动到底部 ...

  5. Vue路由(组件)懒加载(异步)

    传统的引入方式 import test from '@/components/test' { path: '/test', name: '测试页面', component:test }, 懒加载的方式 ...

  6. vue+element树组件 实现树懒加载

    本文连接https://www.cnblogs.com/aknife/p/11709255.html 一.页面样式 二.数据库 三.前端页面代码 <template> <el-tre ...

  7. canvas验证码 - 随机字母数字

    基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...

  8. Vue图片验证码-自定义组件高级版

    最近项目中要用到图片验证码,网上一查有很多,基本都是千篇一律的4位纯数字验证码.首先得感谢那位一代目兄台提供的模板,由于不能满足需求,所以对其进行了改造升级. 经改造的图片验证码能满足一下情形使用:① ...

  9. java实现登录的验证码和猜数字游戏_图形化界面

    实验任务四 1,出现设计思想 (1)先定义文本框.密码框和验证码框的组件 (2)定义面板和按钮的个数 (3)定义公有的虚构方法,通过对象实例化来调用 (4)利用Random类来实现生成0-9的随机数 ...

随机推荐

  1. MQTT服务器特性支持详情

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  2. 第十四周课程总结 & 实验报告

    一.JDBC JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 JDBC的主要操作 ...

  3. 后盾网lavarel视频项目---lavarel用户认证实例

    后盾网lavarel视频项目---lavarel用户认证实例 一.总结 一句话总结: 主要是用的Auth认证,所以配置是配置的auth(config/auth.php),控制器中调用也是用的Auth( ...

  4. docker —宝塔面板

    下载个单独的系统镜像 [root@git opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx-tomcat ...

  5. Eclipse Setting

    下载 https://www.eclipse.org/downloads/packages/ 自动保存代码 编码设置 代码自动提示 .abcdefghijklmnopqrstuvwxyz 字体大小设置 ...

  6. erlang创建100万个进程,每一个进程花费多少时间呢?

    最近工作需要,需要先测试一下erlang启动进程的时间开销: 看了一片博客,感觉挺好的,学习erlang推荐http://www.blogjava.net/yongboy/ 于是参照他的文章里面的一个 ...

  7. @RequestHeader和@CookieValue的使用

    /** * 了解: * * @CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam */ @RequestMapping("/testCookieVal ...

  8. android中builder模式的使用

    变种的Builder模式的自动化生产实现: AS安装插件  Innerbuilde 新建User类 public class User { private final String name; //必 ...

  9. java中常见异常总汇,附解释

    Java Exception: 1.Error 2.Runtime Exception 运行时异常3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系统 ...

  10. 【10】css设置文字不换行,超过的部分用“...”代替

    设置文字不换行,超过的部分用“...”代替  overflow: hidden;  text-overflow: ellipsis;  white-space: nowrap;  width: 210 ...