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

yizhihongxing

你好,关于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日

相关文章

  • Javascript中常见的逻辑题和解决方法

    下面是Javascript中常见的逻辑题和解决方法的完整攻略。 一、逻辑题 在Javascript中,经常会遇到一些逻辑题。这些题通常要求我们根据给定的条件,编写相应的代码实现目标功能。下面是两个常见的逻辑题示例: 1. 反转字符串 给定一个字符串,如何将其反转输出? 样例 输入:”hello world”输出:”dlrow olleh” 2. 找出数组中的…

    JavaScript 2023年6月10日
    00
  • js中的原生网络请求解读

    JS 中的原生网络请求解读 在前端开发中,经常需要与服务器进行数据交互。其中最常用的方式就是通过网络请求来完成数据的获取和传输操作。JS 中提供了原生的网络请求 API,使得我们可以直接在代码中发送网络请求。本文将对 JS 中的原生网络请求进行详细讲解。 发送网络请求的方式 在 JS 中,我们可以使用以下两种方式来发送网络请求: 使用 XMLHttpRequ…

    JavaScript 2023年6月11日
    00
  • 浅谈JS日期(Date)处理函数

    浅谈JS日期(Date)处理函数 在JavaScript中,日期(Date)处理是相当重要的一种数据类型。在我们的代码开发工作中,通常需要使用日期处理函数对日期进行操作。接下来我们将详细介绍JavaScript中日期处理函数的使用方法。 日期的基本操作 在JavaScript中,日期的基本操作包括创建日期对象、获取日期时间信息以及日期的格式化输出等。 创建日…

    JavaScript 2023年5月27日
    00
  • js正则表达式之RegExp对象属性lastIndex,lastMatch,lastParen,lastContext,rightContext属性讲解

    JS正则表达式之RegExp对象属性讲解 正则表达式是在JS中使用广泛的,通过JS中的RegExp对象可以进行正则表达式的匹配和操作。在RegExp对象中,提供了许多有用的属性来帮助获取和处理匹配结果。其中包括lastIndex,lastMatch,lastParen,lastContext和rightContext属性。 lastIndex属性 lastI…

    JavaScript 2023年6月10日
    00
  • JS数组中filter方法的使用实例

    下面我将详细讲解JS数组中filter方法的使用实例的完整攻略。 简介 在JavaScript中,数组是非常重要的数据类型之一。在操作数组时,我们常常需要对数组进行筛选。这时,我们可以使用数组的filter()方法来实现。 filter()方法返回一个新数组,其中包含符合指定条件的所有元素。该方法不会改变原始数组。 语法 filter()的语法如下: arr…

    JavaScript 2023年5月27日
    00
  • js自定义input文件上传样式

    下面是JS自定义input文件上传样式的完整攻略。我们可以通过JS代码来自定义input文件上传样式,从而提升用户体验。 创建文件上传按钮 我们可以通过HTML代码来创建文件上传按钮,如下所示: <input type="file" id="upload-file"> 隐藏默认文件上传按钮 当我们创建了文件…

    JavaScript 2023年6月10日
    00
  • javascript模拟实现ajax加载框实例

    以下是使用 JavaScript 模拟实现 ajax 加载框的完整攻略: 实现思路 创建一个遮罩层,并设置其 z-index 值为一个比较大的数字,遮罩整个页面; 在遮罩层中添加一个加载框元素,并使用 CSS 进行设置和样式定制; 使用 JavaScript 编写一个可以请求服务器数据的对象,以及在请求过程中显示遮罩层及加载框的方法; 在处理完请求后,隐藏遮…

    JavaScript 2023年6月11日
    00
  • HTML实现双11抢劵(设定时间打开抢券的页面)

    实现双11抢劵的功能,需要用到HTML语言和JavaScript脚本。 具体步骤如下: 在HTML文件中添加一个按钮,设置其id为”open-btn”,用于点击后打开抢券页面: <button id="open-btn">打开抢券页面</button> 在JavaScript文件中,为按钮绑定click事件,用于判…

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