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日

相关文章

  • 如何用threejs实现实时多边形折射

    下面是关于如何用threejs实现实时多边形折射的攻略: 简介 实时多边形折射可以让我们在视觉上模拟水或者其他材料的折射现象,从而能够提高场景的逼真程度。该技术通常使用片元着色程序来实现,并且需要一些复杂的计算和优化。在threejs中,可以使用ShaderMaterial来实现这个效果。下面是一个完整的攻略: 实现过程 1. 创建多边形模型 首先,我们需要…

    JavaScript 2023年6月11日
    00
  • safari cookie设置中文失败的解决方法

    当我们在Safari浏览器中设置中文的cookie时,可能会出现设置失败的情况。下面是解决方法的完整攻略,包含以下步骤: 1. 清除浏览器缓存 首先,在Safari浏览器中选择“偏好设置”,然后选择“隐私”面板。在这里,可以看到“移除所有网站数据”的选项。点击这个按钮,清除浏览器缓存。 2. 检查Safaricookie设置和时间误差 如果以上步骤没有解决问…

    JavaScript 2023年6月11日
    00
  • 《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型

    《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型 原始类型 ECMAScript 中有 6 种原始类型:Undefined、Null、Boolean、Number、String 和 Symbol。这些数据类型都是通过值来标识的。原始类型的值是不可更改的。 Undefined 和 Null Undefined 和 Null …

    JavaScript 2023年5月27日
    00
  • node puppeteer(headless chrome)实现网站登录

    下面我将介绍如何使用Node.js中的Puppeteer库实现网站登录的完整攻略。在此过程中,我将提供两个示例以帮助您更好地理解。 简介 Puppeteer是由Google开发的一个Node.js库,它提供了一组API来使用Headless Chrome浏览器进行自动化测试、爬虫或屏幕截图等操作。Headless Chrome是Chrome浏览器的无界面版本…

    JavaScript 2023年6月11日
    00
  • JavaScript实现短信倒计时60s

    当需要在网页中添加短信验证码的时候,我们通常需要一个倒计时的功能,限制60秒内只允许重新获取一次验证码。下面是JavaScript实现短信倒计时60s的攻略。 1. 倒计时基础框架 我们先来搭建倒计时的基本框架,HTML代码如下: <button id="btn">获取验证码</button> 需要注意的是,这里的…

    JavaScript 2023年5月27日
    00
  • BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑

    Bootstrap是一款常用的前端开发框架,封装了很多常用的功能组件,如表单验证功能。但是在使用Bootstrap的表单验证组件时,我们可能会遭遇一些坑,其中比较典型的就是非Submit类型按钮点击时不能触发表单验证的问题。 下面是解决这个问题的攻略步骤: 步骤1:为非Submit类型按钮添加点击事件 首先,我们需要为非Submit类型按钮添加点击事件。在这…

    JavaScript 2023年6月10日
    00
  • js 对象是否存在判断

    判断 JavaScript 对象是否存在是Web开发中经常使用到的操作之一。以下是几种常见的判断 JavaScript 对象是否存在的方法。 方法一:使用typeof关键字 使用 typeof 关键字可以判断一个变量是否存在。当变量存在时,typeof 关键字返回其类型,否则将返回 “undefined”。 if (typeof myObj === &quo…

    JavaScript 2023年5月27日
    00
  • javascript的setTimeout()使用方法总结

    技术文章:JavaScript的setTimeout()使用方法总结 概述 setTimeout() 是JavaScript函数中的一个内置函数,它可以在指定时间后调用一个函数。 setTimeout() 接收两个参数:第一个参数接收一个函数作为回调函数,第二个参数接收一个以毫秒为单位的延迟时间。 语法 setTimeout(callback, delay)…

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