基于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. Netflix的Ribbon主要负载均衡策略

    1.简单轮询负载均衡 2.加权响应时间负载均衡 3.随机负载均衡 4.区域感知轮询负载均衡

  2. docker-compose常用命令(持续更新...)

    build 构建或重建服务 help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm ...

  3. Charles 功能介绍说明和使用教程

    https://juejin.im/post/5b8350b96fb9a019d9246c4c http://blog.devtang.com/2015/11/14/charles-introduct ...

  4. WPF 使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  5. 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例

    编写测试方法. TestMehtod 生成测试方法 只需要改个名字叫做testFindAll 然后就复制这个方法,多复制几次改改名字 findAll方法 编写查询所有的代码 选中和这个方法,run 根 ...

  6. vue中关于checkbox数据绑定v-model指令的个人理解

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'>     <input type=&qu ...

  7. 将训练好的tensorflow模型移植到android应用中

    具体步骤如下: 1.  TFLiteConverter保存模型 修改网络模型代码,将模型通过TFLiteConverter转化成为 TensorFlow Lite FlatBuffer即为.tflit ...

  8. RTX数据表分析

    /******************************************* * UserName 做主键 **************************************** ...

  9. Tensorflow 对上一节神经网络模型的优化

    本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...

  10. Multi-Object-Edit With Django FormSets

    I had to write a multi-object edit table the other day for a Django project and as such I dove into ...