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中toString()和String()区别详解

    下面是详细的攻略: 标题 1. JS中toString()方法 在JS中,每个基本数据类型都内置了一个toString()方法。这个方法可以把当前对象转换为一个字符串形式,然后返回结果。toString()方法通常不需要传入参数,但是可以接受一个表示基数的参数,用于指定输出数字的基数。 2. String()函数 String()函数是JS中的一个函数,在没…

    JavaScript 2023年5月28日
    00
  • jscript读写二进制文件的方法

    当需要读写二进制文件时,我们可以使用JScript创建文件系统对象来处理这些操作。以下是使用JScript读写二进制文件的方法攻略: 1. 以二进制方式打开文件 在JScript中,我们可以使用FileSystemObject对象来读写文件。为了打开二进制文件,我们需要使用fsObj.OpenTextFile()方法,并将第二个参数设置为2。 var fso…

    JavaScript 2023年5月27日
    00
  • JS显示日历和天气的方法

    下面是JS显示日历和天气的方法的完整攻略。 显示日历 通过 JavaScript 可以在网页上添加一个简单的日历。可以使用 JavaScript 创建一个动态日历,该日历能够: 显示当前的日期,以便用户可以了解今天是哪一天。 显示当前月份的日历,以便用户可以在网站上浏览日历,并获得其他有关当前月份的信息。 HTML代码 为了创建一个简单的日历,我们需要至少创…

    JavaScript 2023年5月27日
    00
  • js常用的键盘事件有哪些(用法示例)_键码keyCode对照表

    下面就针对题目中提到的问题进行详细的讲解。 1. JS常用的键盘事件有哪些 在 JS 中,常用的键盘事件包括:keydown、keypress 和 keyup。它们分别表示键盘按下、按住不放和松开三个状态。其中,keydown 和 keyup 的响应速度比较快,但是无法获取到按住不放的过程;keypress 响应相对较慢,但能够获取按住不放的过程。一般情况下…

    JavaScript 2023年6月1日
    00
  • 浅谈JS原生Ajax,GET和POST

    浅谈JS原生Ajax,GET和POST 什么是Ajax? Ajax,指的是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是一种无需重新加载整个页面就能实现局部更新的技术。它是通过在后台与服务器进行少量数据交换来实现这一目标的。这意味着可以实现快速动态更改网页内容,更好的用户体验。 Ajax的优缺点…

    JavaScript 2023年6月11日
    00
  • Android 混淆代码详解及实例

    Android 混淆代码详解及实例 Android中的混淆代码(ProGuard)是一个非常有用的工具,它可以帮助开发者混淆、压缩和优化代码,使得攻击者很难对应用程序进行反向工程或者逆向破解,有效保护您的应用程序的安全性。 混淆代码的作用 混淆代码是为了保护您的应用程序的安全性。在Android系统中,所有的应用程序都是以dex格式存储。Dex是一种基于Ja…

    JavaScript 2023年6月11日
    00
  • Threejs实现滴滴官网首页地球动画功能

    当我们在研究 Three.js 实现滴滴官网首页的地球动画功能时,需要完成以下步骤: 1. 获取地球模型 我们可以获取已经制作好的地球模型,比如 Three.js 地球模型。 2. 将模型加入场景 使用 Three.js 创建场景,并将得到的地球模型加入到场景中。示例代码: var scene = new THREE.Scene(); var earth =…

    JavaScript 2023年6月11日
    00
  • js 自带的sort() 方法全面了解

    JS自带的sort()方法全面了解 在JS中,sort()方法是对数组元素进行排序的内置方法。它可以帮助我们轻松地将数组按照一定的顺序进行排序。在这里,我们将详细讲解sort()方法的使用,包括语法、参数、返回值、排序顺序等。 语法 sort()方法的基本语法如下: array.sort(compareFunction); 其中,array 表示要排序的数组…

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