图形验证码(react+vue)版本

简介: 图形验证码(react+vue)版本

之前vue版本的博客里面找了一款图形验证的组件,

由于现在重新开发了react版本的博客

图型验证码 没有找到比较好的组件,

所以干脆看一下之前vue版本的图形验证码的源码

直接搬过来

先看一下效果图:

接下来直接上代码:

VUE版本:
组件源码:sidentify.vue


identifyCode: {
  type: String,
  default: "1234"
},
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: 38
}

},
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 = this.randomColor(
    this.backgroundColorMin,
    this.backgroundColorMax
  );
  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(this.colorMin, this.colorMax);
  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(-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);
}
// drawLine(ctx) {
//   // 绘制干扰线
//   for (let i = 0; i < 8; 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 < 100; 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();

}
};


复制代码
引用:

import SIdentify from "./sidentify";

  <!--验证码组件-->

// template

// v-data
identifyCodes: "1234567890",
identifyCode: "",
// v-methods

randomNum(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
},
refreshCode() {
  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)
    ];
  }
},

// v-created
created() {

this.refreshCode();

},
复制代码
下面是react版本:
import React, { Component } from "react";

let defaultDataObj = {
identifyCodes: {

type: String,
default: "1234567890",

},
identifyCode: {

type: String,
default: "1234",

},
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: 38,

},
};
class SIdentify extends Component {
constructor(props) {

super(props);
this.state = {};

}

// 生成一个随机数
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");

console.log(canvas);
console.log(ctx);
ctx.textBaseline = "bottom";
// 绘制背景

console.log(defaultDataObj.backgroundColorMin);
ctx.fillStyle = this.randomColor(
  defaultDataObj.backgroundColorMin.default,
  defaultDataObj.backgroundColorMax.default
);
ctx.fillRect(
  0,
  0,
  defaultDataObj.contentWidth.default,
  defaultDataObj.contentHeight.default
);
// 绘制文字
for (let i = 0; i < defaultDataObj.identifyCode.default.length; i++) {
  this.drawText(ctx, defaultDataObj.identifyCode.default[i], i);
}

this.drawLine(ctx);
this.drawDot(ctx);

};

drawText = (ctx, txt, i) => {

ctx.fillStyle = this.randomColor(
  defaultDataObj.colorMin.default,
  defaultDataObj.colorMax.default
);
ctx.font =
  this.randomNum(
    defaultDataObj.fontSizeMin.default,
    defaultDataObj.fontSizeMax.default
  ) + "px SimHei";
let x =
  (i + 1) *
  (defaultDataObj.contentWidth.default /
    (defaultDataObj.identifyCode.default.length + 1));
let y = this.randomNum(
  defaultDataObj.fontSizeMax.default,
  defaultDataObj.contentHeight.default - 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);

};

drawLine = (ctx) => {

// 绘制干扰线
for (let i = 0; i < 8; i++) {
  ctx.strokeStyle = this.randomColor(
    defaultDataObj.lineColorMin.default,
    defaultDataObj.lineColorMax.default
  );
  ctx.beginPath();
  ctx.moveTo(
    this.randomNum(0, defaultDataObj.contentWidth.default),
    this.randomNum(0, defaultDataObj.contentHeight.default)
  );
  ctx.lineTo(
    this.randomNum(0, defaultDataObj.contentWidth.default),
    this.randomNum(0, defaultDataObj.contentHeight.default)
  );
  ctx.stroke();
}

};

drawDot(ctx) {

// 绘制干扰点
for (let i = 0; i < 100; 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();
}

}

changeCode = () => {

this.refreshCode();

};

makeCode = (o, l) => {

for (let i = 0; i < l; i++) {
  defaultDataObj.identifyCode.default +=
    defaultDataObj.identifyCodes.default[
      this.randomNum(0, defaultDataObj.identifyCodes.default.length)
    ];
}

console.log("校验", defaultDataObj.identifyCode.default);
this.drawPic();

};

refreshCode = () => {

defaultDataObj.identifyCode.default = "";
this.makeCode(defaultDataObj.identifyCodes.default, 4);

};

render() {

return (
  <div>
    验证码:
    <canvas id="s-canvas" width="112px" height="38"></canvas>
    <button onClick={this.changeCode}>切换验证码</button>
  </div>
);

}

componentDidMount() {

this.refreshCode();

}
}

export default SIdentify;
复制代码
逻辑都一样就是写法改了一下,

有问题可以留言

作者: Bill 本文地址: http://biaoblog.cn/info?id=1643365247270

版权声明: 本文为原创文章,版权归 biaoblog 个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

相关文章
|
3月前
|
JavaScript 数据可视化
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
这篇文章介绍了如何使用vue-cli 2和3版本来创建Vue项目,并详细说明了两者之间的主要区别。
136 5
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
|
2月前
|
存储 缓存 JavaScript
如何优化React或Vue应用的性能
需要注意的是,性能优化是一个持续的过程,需要根据具体的应用场景和性能问题进行针对性的优化。同时,不同的项目和团队可能有不同的优化重点和方法,要结合实际情况灵活运用这些优化策略,以达到最佳的性能效果。
113 51
|
2月前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
43 1
|
2月前
|
JavaScript 前端开发 开发者
React和Vue有什么区别?
React 和 Vue 都有各自的优势和特点,开发者可以根据项目的需求、团队的技术背景以及个人的喜好来选择使用。无论是 React 还是 Vue,它们都在不断发展和完善,为前端开发提供了强大的支持。
117 2
|
2月前
|
JavaScript 前端开发 测试技术
React和Vue的性能对比如何?
需要注意的是,性能不仅仅取决于框架本身,还与开发者的代码质量、架构设计以及项目的优化程度等密切相关。因此,在评估性能时,应该综合考虑多个因素,而不是仅仅局限于框架之间的比较。
148 1
|
2月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
2月前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
3月前
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
165 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
2月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
2月前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略