• 微信小程序--绘制验证码


    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 + ")";
      }
    }
    
    1. 在需要验证码的js文件中引入
    let Mcaptcha = require("../../../utils/mcaptcha.js");
    
    1. res.data 是要传到mcaptcha.js 中的 code 值,也就是验证码,可以随意写为如:“ho55”,“a2sd” 等等。我这里是从后台传过来的数据,(前人写的代码,不好改动,只在前端加上干扰线和彩图)。
    new Mcaptcha({
        el: 'canvas',
         100,
        height: 30,
        code: res.data
    });	
    
    1. wxml 文件, bindtap="getImgYZM"new Mcaptcha 的方法名,再次点击可以换验证码图片。
    <view bindtap="getImgYZM" class="yzm">
        <canvas style="{{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;
                }
            }
        }
    }
    
  • 相关阅读:
    flex布局以及相关属性
    css 选择器
    两侧定宽,中栏自适应布局
    两列定宽,一列自适应布局
    左列定宽,右列自适应布局
    Flex接收51单片机发送过来的16进制数据转换为String
    Flex与51单片机socket通信 策略问题
    sql For XML Path
    sql多对多探讨
    JavaScript
  • 原文地址:https://www.cnblogs.com/cyapi/p/14234237.html
Copyright © 2020-2023  润新知