Bootstrap实现前端登录页面带验证码功能完整示例

你好,关于Bootstrap实现前端登录页面带验证码功能完整示例的具体实现方法,以下是完整攻略:

1. 准备工作

  1. 引入相关CDN库

head 标签中引入相关CDN库:

```html






```

注意:以上只是使用的一个CDN源,你也可以使用自己的CDN源或者是本地引入库。

  1. 编写HTML布局

```html





Bootstrap登录验证码实例






我们永远不会与别人分享你的电子邮件地址。





```

2. 实现登录验证码核心脚本

  1. 实现验证码生成器

```javascript
// 字符数量
var codeLength = 4;

// 随机码范围
var randomRange = { min: 48, max: 122 };

/*
* 生成随机验证码
* @param {Number} length 字符串长度
* @param {Object} range 随机码范围
* @return {String} 随机字符串
/
function randomCodeGenerate(length, range) {
var code = '';
for (var i = 0; i < length; i++) {
code += String.fromCharCode(Math.floor(Math.random() * (range.max - range.min)) + range.min);
}
return code;
}
```

  1. 实现验证码框组件

```javascript
/*
* 验证码框组件构造方法
* @param {Object} options 配置信息
* @return {Object} 验证码框组件实例对象
/
function captchaBox(options) {

 // 如果验证码组件存在,直接返回组件对象
 if (captchaBox.singleton) {
   return captchaBox.singleton;
 }

 // 获取容器元素
 var container = $(options.container);

 // 扩展参数
 options = $.extend({
   characters: 'abcdefghijklmnopqrstuvwxyz1234567890'.split(''), // 随机字符串集合
   font_size: '30px', // 文字大小
   font_family: 'Arial', // 文字字体
   color: ['#000', '#333', '#666', '#999'], // 文字颜色
   backgroundColor: '#f2f2f2', // 背景色
   length: 4, // 字符数量
   width: 120, // 宽度
   height: 40 // 高度
 }, options);

 // 创建验证码框组件
 var captcha = $('<canvas></canvas>');
 captcha.attr('width', options.width);
 captcha.attr('height', options.height);
 captcha.appendTo(container);

 // 获取画布上下文环境
 var context = captcha[0].getContext('2d');

 // 渲染验证码
 var drawCaptcha = function () {
   // 清空画布
   context.fillStyle = options.backgroundColor;
   context.fillRect(0, 0, options.width, options.height);

   // 描绘干扰线(颜色从背景色随机)
   for (var i = 0; i < options.length; i++) {
     context.strokeStyle = options.color[Math.floor(Math.random() * options.color.length)];
     context.beginPath();
     context.moveTo(Math.floor(Math.random() * options.width), Math.floor(Math.random() * options.height));
     context.lineTo(Math.floor(Math.random() * options.width), Math.floor(Math.random() * options.height));
     context.stroke();
   }

   // 描绘验证码字符(颜色从颜色数组中随机)
   var code = randomCodeGenerate(options.length, { min: 48, max: 122 }).toLocaleUpperCase();
   for (var i = 0; i < options.length; i++) {
     context.fillStyle = options.color[Math.floor(Math.random() * options.color.length)];
     context.font = options.font_size + ' ' + options.font_family;
     context.textBaseline = 'middle';
     context.fillText(code[i], options.width / (options.length + 1) * (i + 1), options.height / 2, options.width / options.length);
   }

   return code;
 };

 // 绑定验证码框单击事件
 captcha.on('click', function () {
   $(this).fadeOut(500, function () {
     var code = drawCaptcha();
     $(this).fadeIn(500);
     $(options.result).html(code);
   });
 });

 var singleton = {
   /**
    * 显示验证码框
    */
   show: function () {
     captcha.show();
   },

   /**
    * 隐藏验证码框
    */
   hide: function () {
     captcha.hide();
   },

   /**
    * 刷新验证码框
    */
   refresh: function () {
     var code = drawCaptcha();
     $(options.result).html(code);
   }
 };

 // 初始化验证码框
 var code = drawCaptcha();
 $(options.result).html(code);

 // 缓存实例对象
 captchaBox.singleton = singleton;

 return singleton;

}
```

  1. 实现验证码按钮组件

```javascript
/*
* 验证码按钮构造方法
* @param {Object} options 配置信息
* @param {Function} callback 回调函数
* @return {Object} 验证码按钮实例对象
/
function captchaBtn(options, callback) {

 // 如果验证码按钮组件存在,直接返回按钮对象
 if (captchaBtn.singleton) {
   return captchaBtn.singleton;
 }

 // 获取按钮元素
 var button = $(options.button);

 // 绑定按钮单击事件
 button.on('click', function () {
   var $this = $(this);
   if ($this.data('anime')) {
     anime({
       targets: this,
       scale: 1.2,
       rotate: '1turn',
       backgroundColor: '#5cb85c',
       complete: function (anim) {
         setTimeout(function () {
           anime({
             targets: anim.animatables[0].target,
             scale: 1,
             rotate: '0turn',
             backgroundColor: '#5bc0de'
           });
         }, 300);
       }
     });
   }
   $this.button('loading');
   callback(function () {
     $this.button('reset');
   }).catch(function () {
     $this.button('reset');
     if ($this.hasClass('shake')) {
       $this.addClass('shake-rotate');
       setTimeout(function () {
         $this.removeClass('shake-rotate');
       }, 1000);
     }
   });
 });

 var singleton = {
   /**
    * 禁用验证码按钮
    */
   disable: function () {
     button.attr('disabled', true);
   },

   /**
    * 启用验证码按钮
    */
   enable: function () {
     button.attr('disabled', false);
   }
 };

 // 缓存实例对象
 captchaBtn.singleton = singleton;

 return singleton;

}
```

  1. 实现验证码核心脚本

```javascript
/*
* 验证码工具类
* @return {Object} 工具类实例对象
/
var captchaUtil = function () {

 // 错误信息
 var errors = {
   invalidEmail: '请输入有效的电子邮件地址。',
   captchaError: '验证码错误,请重新输入。',
   captchaNotLoaded: '验证码未加载完成,请稍等片刻。',
   captchaDisabled: '验证码服务已禁用,请联系管理员。'
 };

 /**
  * 根据电子邮件地址获取验证码
  * @param {String} email 电子邮件地址
  * @return {Promise} Promise对象
  */
 var getCaptchaByEmail = function (email) {
   return new Promise(function (resolve, reject) {

     // 检查电子邮件地址是否有效
     if (!validateEmail(email)) {
       reject(errors.invalidEmail);
       return;
     }

     // 获取容器元素
     var captchaBoxContainer = $(config.captchaBox.container);
     if (captchaBoxContainer.length === 0) {
       console.error('captchaBoxContainer is not defined.');
       return;
     }

     // 获取结果元素
     var captchaResultElement = $(config.captchaBox.result);
     if (captchaResultElement.length === 0) {
       console.error('captchaResultElement is not defined.');
       return;
     }

     // 获取验证码框实例对象
     var captchaBoxInstance = captchaBox({
       container: config.captchaBox.container,
       result: config.captchaBox.result,
       length: config.captchaBox.length
     });

     // 获取验证码按钮实例对象
     var captchaBtnInstance = captchaBtn({
       button: config.captchaBtn.button,
       shake: true,
       anime: true
     }, async function (reset) {
       try {

         // 禁用验证码按钮
         captchaBtnInstance.disable();

         // 刷新验证码框
         captchaBoxInstance.refresh();

         // 获取验证码
         var captcha = await getCaptchaCode();
         captchaResultElement.html(captcha);

         // 发送验证码到用户电子邮件地址
         await sendCaptchaByEmail(email, captcha);

         // 启用验证码按钮
         captchaBtnInstance.enable();

         // 延时一段时间初始化验证码框(防止滥用)
         setTimeout(function () {
           captchaBoxInstance.refresh();
         }, 30000);

         // 执行回调函数
         reset();
         resolve();
       } catch (error) {
         reset();
         console.error(error);
         reject(error);
       }
     });
   });
 };

 /**
  * 发送验证码到电子邮件地址
  * @param {String} email 指定电子邮件地址
  * @param {String} captcha 验证码信息
  * @return {Promise} Promise对象
  */
 var sendCaptchaByEmail = function (email, captcha) {
   return new Promise(function (resolve, reject) {
     // ... TODO 发送验证码到电子邮件地址的代码 ...
     console.log(`验证码[${captcha}]已发送到指定的${email}电子邮件地址。`);
     resolve();
   });
 };

 /**
  * 获取电子邮件地址验证码
  * @return {Promise} Promise对象
  */
 var getCaptchaCode = function () {
   return new Promise(function (resolve, reject) {
     var captchaInput = $(config.captchaInputSelector);
     if (captchaInput.length === 0) {
       console.error('captchaInput is not defined.');
       return;
     }
     var captcha = captchaInput.val();
     if (captcha.length === 0) {
       reject(errors.captchaError);
     } else {
       resolve(captcha);
     }
   });
 };

 /**
  * 检查电子邮件地址是否有效
  * @param {String} email 电子邮件地址
  * @return {Boolean} 是否有效
  */
 function validateEmail(email) {
   var emailRegExp = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
   return emailRegExp.test(email);
 }

 // 配置信息
 var config = {
   captchaInputSelector: '#inputCaptcha', // 验证码输入框选择器
   captchaBtn: { // 验证码按钮配置信息
     button: '#captchaBtn' // 验证码按钮选择器
   },
   captchaBox: { // 验证码框配置信息
     container: '.captchaBox', // 验证码框容器选择器
     length: 4, // 验证码位数
     result: '.captchaResult' // 验证码框结果显示选择器
   }
 };

 // 返回工具类实例对象
 return {
   getCaptchaByEmail: getCaptchaByEmail
 };

}();
```

3. 完整测试

最后,添加以下代码来测试整个程序:

// 测试
($(function () {

  // 获取提交按钮
  var submitBtn = $('button[type="submit"]');

  // 绑定表单提交事件
  $('form').on('submit', function (event) {
    event.preventDefault();

    var email = $('#inputEmail').val();
    var password = $('#inputPassword').val();

    // TODO 验证电子邮件地址和密码的有效性

    // 获取与电子邮件地址匹配的验证码
    captchaUtil.getCaptchaByEmail(email).then(function () {
      // 向服务器请求进行身份验证
      console.log('向服务器请求进行身份验证...');
      setTimeout(function () {
        submitBtn.attr('disabled', false);
        console.log('身份验证成功!');
        alert('身份验证成功!');
      }, 3000);
    }).catch(function (error) {
      alert(error);
      console.error(error);
    });
  });

}));

大功告成!现在你就成功实现了Bootstrap前端登录页面带验证码功能的完整示例。

注:以上示例仅供参考,实际使用时需要根据需要进行修改和进一步测试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Bootstrap实现前端登录页面带验证码功能完整示例 - Python技术站

(1)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js实现带有介绍的Select列表菜单实例

    实现带有介绍的Select列表菜单需要用到HTML、CSS和JavaScript技术。 HTML结构 首先,在HTML文件中创建一个Select元素以及对应的option选项,如下所示: <label for="menu">请选择菜单:</label> <select id="menu"&…

    JavaScript 2023年6月11日
    00
  • JS数学函数Exp使用说明

    JS数学函数Exp使用说明 简介 Exp()函数是JavaScript中的一个数学函数,也称为指数函数或自然对数函数。它的主要作用是计算以自然常数e为底数的指数函数。 在数学上,自然常数e是一个重要的常数,它的值是约等于2.71828的无限不循环小数。指数函数y=e^x是一个与其它常见数学函数如幂函数、指数函数和对数函数等同样重要的函数。 语法 Math.e…

    JavaScript 2023年5月28日
    00
  • JavaScript 对象模型 执行模型

    我来讲解一下 JavaScript 对象模型和执行模型。 JavaScript 对象模型 JavaScript 对象模型(Document Object Model,简称 DOM)是一种表现 HTML 或 XML 文档的方式,它将文档作为节点树表示。每个节点都是一个对象,由此可得到 DOM 中体现的是一种父子关系。在 JavaScript 中,可以通过访问 …

    JavaScript 2023年5月27日
    00
  • JS实现遍历不规则多维数组的方法

    实现遍历不规则多维数组的方法,需要使用递归函数。递归函数是指在函数内部调用自身的函数,通过递归可以遍历多维数组中的每一个元素。下面是实现该方法的完整攻略。 步骤一:定义递归函数 首先需要定义一个递归函数,该函数可以遍历多维数组的每一项,并且判断该项是否为数组类型。如果该项是数组类型,则继续递归调用该函数。 function traverseArray(arr…

    JavaScript 2023年5月27日
    00
  • JavaScript 图像动画的小demo

    让我来详细讲解一下“JavaScript 图像动画的小demo”的完整攻略。 1. 设计思路 通过 Canvas 创建动画效果,可以将图形动态地展示到网页上。这个小demo的设计思路就是以一只小乌龟为例,讲解如何使用 Canvas 创建动画效果。主要有以下几个步骤: 创建 Canvas 元素 获取 Canvas 画布的上下文 加载乌龟图片资源 设置画布宽高和…

    JavaScript 2023年6月10日
    00
  • JavaScript 中的单例内置对象Global 与 Math

    JavaScript 中的单例内置对象 Global 是指在整个 JavaScript 运行时期内始终存在的对象,它是所有全局变量和函数的宿主。它提供了很多通用的功能和属性,如全局变量、内存管理、计时器、调试工具等,可以被任何代码访问和使用。下面我们来讲解 Global 对象和 Math 对象的详细内容。 Global 对象 Global 对象是每一个 Ja…

    JavaScript 2023年6月10日
    00
  • JS的函数调用栈stack size的计算方法

    当JS代码执行过程中,函数的调用将会依次进入函数调用栈,函数执行结束后,结果将会被推出函数调用栈。函数调用栈有容量的限制,如果超出会导致“堆栈溢出”,因此需要了解JS函数调用栈stack size的计算方法。 JS函数调用栈的stack size计算方法如下: 找到当前正在调用的函数有多少个参数(包括默认参数和剩余参数) 每个参数占用一个内存空间,计算所有参…

    JavaScript 2023年6月11日
    00
  • 基于vue-cli 打包时抽离项目相关配置文件详解

    “基于vue-cli 打包时抽离项目相关配置文件”的攻略分为以下几个步骤: 创建一个 .env.[mode] 文件 在根目录中创建一个名为 .env.[mode] 的文件,其中 [mode] 表示你的应用程序的模式,比如开发模式可以是 .env.development,生产模式可以是 .env.production。 在这个文件中,可以定义一些环境变量,比如…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部