图形化验证码引入到vue3项目里面
如图:
下面是图形化验证码代码. canvas.html
这个引入了jQuery.js
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>发送验证码</title>
<style>
.contain {
width: 400px;
height: 200px;
margin: 100px auto;
}
.input-val {
width: 120px;
height: 32px;
border: 1px solid #ddd;
box-sizing: border-box;
}
#canvas {
vertical-align: middle;
box-sizing: border-box;
border: 1px solid #ddd;
cursor: pointer;
}
.btn {
display: block;
margin-top: 20px;
height: 32px;
width: 100px;
font-size: 16px;
color: #fff;
background-color: #457adb;
border: none;
border-radius: 50px;
}
</style>
</head>
<body>
<div class="contain">
<div class="code">
<input type="text" value="" placeholder="请输入验证码" class="input-val">
<canvas id="canvas" width="100" height="30"></canvas>
<button class="btn">提交</button>
</div>
</div>
<script src="http://www.lanrenzhijia.com/ajaxjs/jquery.min.js"></script>
<script>
$(function(){
var show_num = [];
draw(show_num);
$("#canvas").on('click',function(){
draw(show_num);
})
$(".btn").on('click',function(){
var val = $(".input-val").val().toLowerCase();
var num = show_num.join(""); //用于把数组中的所有元素放入一个字符串。
if(val==''){
console.log(val,num);
// alert('请输入验证码!');
}else if(val == num){
console.log(val,num);
// alert('提交成功!');
$(".input-val").val('');
// draw(show_num);
}else{
// alert('验证码错误!请重新输入!');
$(".input-val").val('');
console.log(val,num);
// draw(show_num);
}
})
})
//生成并渲染出验证码图形
function draw(show_num) {
var canvas_width=$('#canvas').width();
var canvas_height=$('#canvas').height();
var canvas = document.getElementById("canvas");//获取到canvas的对象
var context = canvas.getContext("2d");//获取到canvas画图的环境
canvas.width = canvas_width;
canvas.height = canvas_height;
var sCode = "a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0";
var aCode = sCode.split(","); //把字符串分割成字符串数组。
var aLength = aCode.length;//获取到数组的长度
for (var i = 0; i < 4; i++) { //这里的for循环可以控制验证码位数(如果想显示6位数,4改成6即可)
var j = Math.floor(Math.random() * aLength);//获取到随机的索引值,random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数。
// var deg = Math.random() * 30 * Math.PI / 180;//产生0~30之间的随机弧度
var deg = Math.random() - 0.5; //产生一个随机弧度
var txt = aCode[j];//得到随机的一个内容
show_num[i] = txt.toLowerCase();
var x = 10 + i * 20;//文字在canvas上的x坐标
var y = 20 + Math.random() * 8;//文字在canvas上的y坐标
context.font = "bold 23px 微软雅黑";
context.translate(x, y);
context.rotate(deg);
context.fillStyle = randomColor();
context.fillText(txt, 0, 0);
context.rotate(-deg);
context.translate(-x, -y);
}
for (var i = 0; i <= 5; i++) { //验证码上显示线条
context.strokeStyle = randomColor();
context.beginPath();
context.moveTo(Math.random() * canvas_width, Math.random() * canvas_height);
context.lineTo(Math.random() * canvas_width, Math.random() * canvas_height);
context.stroke();
}
for (var i = 0; i <= 30; i++) { //验证码上显示小点
context.strokeStyle = randomColor();
context.beginPath();
var x = Math.random() * canvas_width;
var y = Math.random() * canvas_height;
context.moveTo(x, y);
context.lineTo(x + 1, y + 1);
context.stroke();
}
}
//得到随机的颜色值
function randomColor() {
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return "rgb(" + r + "," + g + "," + b + ")";
}
</script>
</body>
</html>
把canvas.html转为一个canvas.vue文件,进行子传父通信
可以在vue项目中安装jQuery
<template>
<div class="contain">
<div class="code">
<input type="text" value="" placeholder="请输入图形验证码" class="input-val">
<canvas id="canvas" width="120" height="50" @click="imgcode"></canvas>
</div>
</div>
</template>
<script >
//引入jQuery
import $ from 'jquery'
import { defineComponent, ref } from 'vue'
$(function(){
var show_num = [];
draw(show_num);
})
//生成并渲染出验证码图形
function draw(show_num) {
var canvas_width=$('#canvas').width();
var canvas_height=$('#canvas').height();
var canvas = document.getElementById("canvas");//获取到canvas的对象
var context = canvas.getContext("2d");//获取到canvas画图的环境
canvas.width = canvas_width;
canvas.height = canvas_height;
var sCode = "a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0";
var aCode = sCode.split(","); //把字符串分割成字符串数组。
var aLength = aCode.length;//获取到数组的长度
for (var i = 0; i < 4; i++) { //这里的for循环可以控制验证码位数(如果想显示6位数,4改成6即可)
var j = Math.floor(Math.random() * aLength);//获取到随机的索引值,random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数。
// var deg = Math.random() * 30 * Math.PI / 180;//产生0~30之间的随机弧度
var deg = Math.random() - 0.5; //产生一个随机弧度
var txt = aCode[j];//得到随机的一个内容
show_num[i] = txt.toLowerCase();
var x = 10 + i * 20;//文字在canvas上的x坐标
var y = 20 + Math.random() * 8;//文字在canvas上的y坐标
context.font = "bold 23px 微软雅黑";
context.translate(x, y);
context.rotate(deg);
context.fillStyle = randomColor();
context.fillText(txt, 0, 0);
context.rotate(-deg);
context.translate(-x, -y);
}
for (var i = 0; i <= 5; i++) { //验证码上显示线条
context.strokeStyle = randomColor();
context.beginPath();
context.moveTo(Math.random() * canvas_width, Math.random() * canvas_height);
context.lineTo(Math.random() * canvas_width, Math.random() * canvas_height);
context.stroke();
}
for (var i = 0; i <= 30; i++) { //验证码上显示小点
context.strokeStyle = randomColor();
context.beginPath();
var x = Math.random() * canvas_width;
var y = Math.random() * canvas_height;
context.moveTo(x, y);
context.lineTo(x + 1, y + 1);
context.stroke();
}
}
//得到随机的颜色值
function randomColor() {
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return "rgb(" + r + "," + g + "," + b + ")";
}
export default defineComponent({
setup (props, context) {
const imgcode=()=>{
var show_num = [];
draw(show_num);
var val = $(".input-val").val().toLowerCase();
var num = show_num.join(""); //用于把数组中的所有元素放入一个字符串。
console.log(val,num);
context.emit('code',[val,num]) //向父组件传值
}
return{
imgcode
}
}
})
</script>
<style scoped>
.contain {
width: 25rem;
height: 4rem;
}
.input-val {
display: none;
width:10.3125rem;
height: 4rem;
/* border: 1px solid #ddd; */
border: none;
border-bottom: 1px solid #F0F0F0;
box-sizing: border-box;
margin-left: -72px;
outline: none;
}
.input-val:focus{
border: 1px solid #d1e9ff;
}
.input-val:hover{
border-bottom: 1px solid #008036;
}
#canvas {
vertical-align: middle;
box-sizing: border-box;
/* border: 1px solid #ddd; */
cursor: pointer;
background-color: #fff;
}
.btn {
display: block;
margin-top: 20px;
height: 32px;
width: 100px;
font-size: 16px;
color: #fff;
background-color: #457adb;
border: none;
border-radius: 50px;
}
</style>
父组件接收子组件传过来的验证码
我使用的是ant design vue 组件,可以先安装一下
<template>
<div class="login">
<a-form :model="formState" name="normal_login" :label-col="labelCol" :wrapper-col="wrapperCol" @finish="onFinish" @finishFailed="onFinishFailed">
<a-form-item class="login-title">
登录/LOGIN
</a-form-item>
<a-form-item class="login-item" name="imag" :rules="[{ required: true, message: '请输入图形验证码!' }]">
<a-input v-model:value="formState.imag" placeholder="请输入图形验证码" :bordered="false" allow-clear>
<template #suffix class="code-img">
//图形化验证码组件
<canvases @code="code"></canvases>
</template>
</a-input>
<a-button type="primary" html-type="submit" class="login-form-button" @click="login">
登录
</a-button>
</a-form>
</div>
</template>
<script>
import { message } from 'ant-design-vue';
import { defineComponent, reactive, } from 'vue';
import canvases from '../components/canvs'
export default defineComponent({
components: {
canvases
},
setup() {
const formState = reactive({
imag: '',//图形验证码
num:'',//随机图形验证码
});
const code=(value)=>{//父接收子组件的值
formState.imag=value[0]
formState.num=value[1]
console.log(value);
// console.log(formState.imag,formState.num);
}
const login=()=>{//点击登录
// router.replace('/register')
if (formState.imag =='') {
message.info('请输入验证码!');
}else if(formState.imag==formState.num){
message.info('提交成功!');
}else {
message.info('验证码错误!请重新输入!');
}
}
return {
labelCol: { style: { width: '4.0625rem' } },
wrapperCol: { style: { width: '20.1875rem', } },
formState,
code,
login
};
},
});
</script>
好啦,就这样就成功啦!