图形验证码(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 API
阿珊比较Vue和React:两大前端框架的较量
阿珊比较Vue和React:两大前端框架的较量
|
10天前
|
JavaScript 前端开发 API
一个非常 nb 的 Vue 组件 (含Vue3版本)
一个非常 nb 的 Vue 组件 (含Vue3版本)
|
14天前
|
缓存 监控 前端开发
WEB前端三大主流框架:React、Vue与Angular
在Web前端开发中,React、Vue和Angular被誉为三大主流框架。它们各自具有独特的特点和优势,为开发者提供了丰富的工具和抽象,使得构建复杂的Web应用变得更加容易。
41 6
|
2天前
|
缓存 前端开发 JavaScript
前端框架选择指南:React vs Vue vs Angular
React、Vue与Angular是主流前端框架,各有千秋。React专注视图层,学习曲线平缓,生态丰富,适用于中大型项目;Vue简洁易学,模板直观,内置状态管理,适合中小项目及快速原型;Angular全栈框架,结构严谨,适合大型企业应用。React需手动处理状态管理,Vue提供完整CLI加速开发,Angular虽学习曲线陡峭但提供全套解决方案。性能方面,三者均利用虚拟DOM优化渲染。社区支持上,React最为庞大,Vue活跃度高,Angular有Google背书。选型应基于项目需求、团队技能及维护考量。
11 0
|
3天前
|
JavaScript
如何查看Vue使用的版本
这篇文章介绍了如何在项目中查看Vue及其相关库的版本信息,比如element-ui和element-china-area-data。要查看Vue的版本,需要查看项目中的`package.json`文件,在`dependencies`部分可以找到Vue的版本号。如果需要查询不同版本的兼容性,可以访问相应的官方文档或资源网站。
|
8天前
|
设计模式 JavaScript 前端开发
现代JavaScript框架比较:React、Vue和Angular
在现代Web开发中,JavaScript框架已成为开发高效、动态用户界面的关键工具。本文将深入比较三大主流框架:React、Vue和Angular。通过探讨它们的核心特性、优缺点和适用场景,帮助开发者根据项目需求选择最合适的框架。重点分析包括性能、学习曲线、社区支持和生态系统等方面,以便开发者能够做出明智的决策,优化开发流程并提升应用性能。
|
10天前
|
JavaScript 前端开发 API
浅谈:为啥 Vue 和 React 都选择了 Hooks?
浅谈:为啥 Vue 和 React 都选择了 Hooks?
|
1月前
|
JavaScript 前端开发 API
vue和react对比
【7月更文挑战第12天】 Vue和React是前端两大主流框架,各具特色。Vue以其简单API、双向绑定、模板语法和组件化开发吸引开发者,适合快速开发和新手。它的生态系统包括Vuex和Vue Router等。React以虚拟DOM、高性能、组件化和灵活性著称,大型项目和复杂应用常选React,且有庞大社区和丰富的第三方库。选择取决于项目需求、团队技能和未来扩展性。
33 3
|
1月前
|
前端开发 JavaScript 数据管理
前端框架对比:React、Vue与Angular
【7月更文挑战第2天】React、Vue和Angular是前端三大框架,各有特色。React以组件化和虚拟DOM著称,适合大型SPA;Vue轻量且易用,适用于快速开发;Angular是全面解决方案,适合复杂应用,但学习成本高。选择取决于项目需求和团队技能。
|
2月前
|
前端开发 JavaScript 开发者
探索现代前端框架:从React到Vue.js
【6月更文挑战第26天】在数字时代的浪潮中,前端框架如同建筑的基石,支撑着互联网界面的创新与发展。本文将带领读者穿梭于React与Vue.js这两个最受欢迎的前端框架之间,揭示它们的核心特性、设计理念以及在实际开发中的应用差异。通过比较分析,我们将理解每个框架的优势和局限,并探索如何根据项目需求作出明智的选择。加入我们,一起深入前端技术的瑰丽世界,发现构建未来网络界面的无限可能。