效果展示
1.在component中导入组件用于生成二维码
Identify.vue
<template><div class="s-canvas"><canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas></div>
</template>
<script>
export default{name: 'SIdentify',props: {identifyCode: { // 默认注册码type: String,default: '1234'},fontSizeMin: { // 字体最小值type: Number,default: 25},fontSizeMax: { // 字体最大值type: Number,default: 35},backgroundColorMin: { // 验证码图片背景色最小值type: Number,default: 200},backgroundColorMax: { // 验证码图片背景色最大值type: Number,default: 220},dotColorMin: { // 背景干扰点最小值type: Number,default: 60},dotColorMax: { // 背景干扰点最大值type: Number,default: 120},contentWidth: { // 容器宽度type: Number,default: 90},contentHeight: { // 容器高度type: Number,default: 35}},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 + ')'},drawPic () {let canvas = document.getElementById('s-canvas')let ctx = canvas.getContext('2d')ctx.textBaseline = 'bottom'// 绘制背景ctx.fillStyle = '#e6ecfd'ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)// 绘制文字for (let i = 0; i < this.identifyCode.length; i++) {this.drawText(ctx, this.identifyCode[i], i)}this.drawLine(ctx)this.drawDot(ctx)},drawText (ctx, txt, i) {ctx.fillStyle = this.randomColor(50, 160) // 随机生成字体颜色ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei' // 随机生成字体大小let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)var deg = this.randomNum(-30, 30)// 修改坐标原点和旋转角度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)},drawLine (ctx) {// 绘制干扰线for (let i = 0; i < 4; i++) {ctx.strokeStyle = this.randomColor(100, 200)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 < 30; i++) {ctx.fillStyle = this.randomColor(0, 255)ctx.beginPath()ctx.arc(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 * Math.PI)ctx.fill()}}},watch: {identifyCode () {this.drawPic()}},mounted () {this.drawPic()}
}
</script>
2.在页面中导入组件
<div class="code"><img :src="codeImg" class="login-icon"><input type="text" v-model="ruleForm.code" id="code" placeholder="验证码"><div class="code_img"><div class="login-code" @click="refreshCode"><Identify :identifyCode="identifyCode"></Identify></div></div>
</div>
import Identify from "@/components/Identify";
components: {Identify}
data() {return {//验证码图标codeImg: require('@/assets/login_images/code.png'),ruleForm: {code: ''},//用于显示什么的验证码,可以添加字母identifyCodes: '1234567890',identifyCode: '',}},
所需的验证码图片
mounted() {// 初始化验证码this.identifyCode = ''this.makeCode(this.identifyCodes, 4)},
methods: {
//刷新验证码
refreshCode() {this.ruleForm.code = ''this.identifyCode = ''this.makeCode(this.identifyCodes, 4)},
//生成验证码
makeCode(o, l) {for (let i = 0; i < l; i++) {this.identifyCode += this.identifyCodes[this.randomNum(0, this.identifyCodes.length)]}
},
//生成随机数
randomNum(min, max) {return Math.floor(Math.random() * (max - min) + min)},
}
.login-icon {width: 15px;height: 15px;}
.login>.login_main>.main_right>form>.code>input {width: 62%;}.login>.login_main>.main_right>form>.code>.code_img {width: 90px;height: 35px;float: right;margin-right: 20px;cursor: pointer;}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
本文用于记录自己对验证码的使用