你好,关于Bootstrap实现前端登录页面带验证码功能完整示例的具体实现方法,以下是完整攻略:
1. 准备工作
- 引入相关CDN库
在 head
标签中引入相关CDN库:
```html
```
注意:以上只是使用的一个CDN源,你也可以使用自己的CDN源或者是本地引入库。
- 编写HTML布局
```html
```
2. 实现登录验证码核心脚本
- 实现验证码生成器
```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;
}
```
- 实现验证码框组件
```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;
}
```
- 实现验证码按钮组件
```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;
}
```
- 实现验证码核心脚本
```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技术站