网络编程
位置:首页>> 网络编程>> JavaScript>> 绘制微信小程序验证码功能的实例代码

绘制微信小程序验证码功能的实例代码

作者:WALL*E  发布时间:2024-04-17 10:30:28 

标签:小程序,验证码

1.在 utils 文件中新建 mcaptcha.js 文件,写入以下代码:


module.exports = class Mcaptcha {
 //画板
constructor(options) {
 this.options = options;
 this.fontSize = options.height * 3 / 4;
 this.init();
 this.refresh(this.options.code);
}
init() {
 this.ctx = wx.createCanvasContext(this.options.el);
 this.ctx.setTextBaseline("middle");
 this.ctx.setFillStyle(this.randomColor(180, 240));
 this.ctx.fillRect(0, 0, this.options.width, this.options.height);
}
 //绘制彩图
refresh(code) {
 let arr = (code + '').split('');
 let width = this.options.width;
 let height = this.options.height;
 let ctx = this.ctx;
 if (arr.length === 0) {
  arr = ['e', 'r', 'r','o','r'];
 };
 let offsetLeft = width * 0.6 / (arr.length - 1);
 let marginLeft = width * 0.2;
 arr.forEach((item, index) => {
  ctx.setFillStyle(this.randomColor(0, 180));
  let size = this.randomNum(24, this.fontSize);
  ctx.setFontSize(size);
  let dis = offsetLeft * index + marginLeft - size * 0.3;
  let deg = this.randomNum(-30, 30);
  ctx.translate(dis, height*0.5);
  ctx.rotate(deg * Math.PI / 180);
  ctx.fillText(item, 0, 0);
  ctx.rotate(-deg * Math.PI / 180);
  ctx.translate(-dis, -height * 0.5);
 })
 //绘制干扰线
 for (var i = 0; i < 2; i++) {
 ctx.strokeStyle = this.randomColor(40, 180);
 ctx.beginPath();
 ctx.moveTo(this.randomNum(0, width), this.randomNum(0, height));
 ctx.lineTo(this.randomNum(20, width), this.randomNum(2, height));
 ctx.stroke();
 }
 //绘制干扰点
 for (var i = 0; i < 30; i++) {
 ctx.fillStyle = this.randomColor(0, 255);
 ctx.beginPath();
 ctx.arc(this.randomNum(0, width), this.randomNum(0, height), 1, 0, 2 * Math.PI);
 ctx.fill();
}
 ctx.draw();
}
 //设置随机数的颜色
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 + ")";
}
}

2.在需要验证码的js文件中引入


let Mcaptcha = require("../../../utils/mcaptcha.js");

res.data 是要传到mcaptcha.js 中的 code 值,也就是验证码,可以随意写为如:“ho55”,“a2sd” 等等。我这里是从后台传过来的数据,(前人写的代码,不好改动,只在前端加上干扰线和彩图)。


new Mcaptcha({
 el: 'canvas',
 width: 100,
 height: 30,
 code: res.data
});

wxml 文件, bindtap="getImgYZM"new Mcaptcha 的方法名,再次点击可以换验证码图片。


<view bindtap="getImgYZM" class="yzm">
 <canvas style="width:{{cvs.width}};height:{{cvs.height}};" canvas-id="canvas"></canvas>
</view>

如果是在前端设置随机数,可以在data:{} 里面写


data: {
  str:"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z",
  randStr:""
}
//获取随机数
var res = "";
for(var i = 0; i < str.length ; i ++) {
 var id = Math.ceil(Math.random()*35);
 res += chars[id];
}
return res;

这一步可不看,以下是后端C#语言产生随机数返给前端的代码:


using JobClass;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace WebSite.pcode
{
 /// <summary>
 /// getcode 的摘要说明
 /// </summary>
 public class getcode : IHttpHandler, IRequiresSessionState
 {
   public void ProcessRequest(HttpContext context)
   {
     context.Response.ContentType = "text/plain";
     string str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
     string randStr = "";
     //生成随机数 Random
     Random randobj = new Random();
     string[] arr = str.Split(',');
     for (int i = 0; i < 4; i++)
     {
       randStr += arr[randobj.Next(arr.Length)];
     }
     context.Response.Write(randStr);
     return;
   }
   public bool IsReusable
   {
     get
     {
       return false;
     }
   }
 }
}

来源:https://www.cnblogs.com/cyapi/archive/2021/01/05/14234237.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com