BootstrapValidator實(shí)現(xiàn)注冊(cè)校驗(yàn)和登錄錯(cuò)誤提示效果
使用BootstrapValidator進(jìn)行注冊(cè)校驗(yàn)和登錄錯(cuò)誤提示,具體內(nèi)容如下
1、介紹
在AdminEAP框架中,使用了BootstrapValidator校驗(yàn)框架,本文以注冊(cè)校驗(yàn)的用戶名、登錄名、密碼、確認(rèn)密碼的校驗(yàn)(后面還有時(shí)間區(qū)間、服務(wù)器校驗(yàn))為例,講述BootstrapValidator的使用。同時(shí)以登錄錯(cuò)誤提示為例,說明如何在動(dòng)態(tài)改變組件的錯(cuò)誤提示信息。
先看下面的注冊(cè)與登錄的校驗(yàn)效果圖:
注冊(cè)校驗(yàn):

登錄錯(cuò)誤提示:根據(jù)不同的錯(cuò)誤類型,動(dòng)態(tài)改變組件的樣式和錯(cuò)誤提示內(nèi)容


2、注冊(cè)校驗(yàn)
1、頭部引入bootstrap-validator.css
${basePath}為系統(tǒng)的路徑變量
2、form組件
<form action="${basePath}/oauth/register" method="post" id="register-form">
<input type="hidden" name="oAuthId" value="${oAuthInfo.oAuthId?default('-1')}">
<input type="hidden" name="oAuthType" value="${oAuthInfo.oAuthType?default('-1')}">
<div class="form-group has-feedback">
<input type="text" class="form-control" name="userName" id="userName" placeholder="請(qǐng)輸入用戶名" required>
<span class="glyphicon glyphicon-user form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="text" class="form-control" name="loginName" id="loginName" placeholder="請(qǐng)輸入登錄郵箱/登錄名">
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" name="password" id="password" placeholder="請(qǐng)輸入密碼">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" name="repassword" id="repassword" placeholder="再次確認(rèn)密碼">
<span class="glyphicon glyphicon-log-in form-control-feedback"></span>
</div>
<div class="row">
<div class="col-xs-12">
<div class="checkbox icheck">
<label>
<input type="checkbox" name="rememberMe" required> 同意遵循<a href="#" rel="external nofollow" >AdminEAP協(xié)議</a>
</label>
</div>
</div>
<!-- /.col -->
</div>
<div class="row">
<div class="col-xs-12">
<button type="submit" class="btn btn-danger btn-block btn-flat">注 冊(cè)</button>
</div>
</div>
</form>
3、引入bootstrap-validator.js
<script src="${basePath}/resources/adminlte/bootstrap/js/bootstrap.min.js"></script>
4、校驗(yàn)的核心js代碼
<script>
$(function () {
//將checkbox渲染為icheck樣式
$('input').iCheck({
checkboxClass: 'icheckbox_square-red',
radioClass: 'iradio_square-red',
increaseArea: '20%' // optional
});
//此處為校驗(yàn)的核心代碼
$("#register-form").bootstrapValidator({
submitHandler: function (valiadtor, loginForm, submitButton) {
valiadtor.defaultSubmit();
},
fields: {
userName: {
validators: {
notEmpty: {
message: '用戶名不能為空'
},
stringLength: {
/*長(zhǎng)度提示*/
min: 4,
max: 30,
message: '用戶名長(zhǎng)度必須在4到30之間'
}
}
},
loginName: {
validators: {
notEmpty: {
message: '登錄郵箱名或用戶名不能為空'
},
stringLength: {
/*長(zhǎng)度提示*/
min: 4,
max: 30,
message: '用戶名長(zhǎng)度必須在4到30之間'
},
threshold: 4,//只有4個(gè)字符以上才發(fā)送ajax請(qǐng)求
remote: {
url: "${basePath}/oauth/checkUnique",
data: function (validator) {
return {
loginName: $("#loginName").val(),
userId: null
};
},
message: '該登錄名已被使用,請(qǐng)使用其他登錄名',
delay:2000
}
}
},
password: {
validators: {
notEmpty: {
message: '密碼不能為空'
},
stringLength: {
/*長(zhǎng)度提示*/
min: 6,
max: 30,
message: '密碼長(zhǎng)度必須在6到30之間'
},
different: {//不能和用戶名相同
field: 'loginName',//需要進(jìn)行比較的input name值
message: '不能和用戶名相同'
},
regexp: {
regexp: /^[a-zA-Z0-9_\.]+$/,
message: '密碼由數(shù)字字母下劃線和.組成'
}
}
},
repassword: {
message: '密碼無效',
validators: {
notEmpty: {
message: '密碼不能為空'
},
stringLength: {
min: 6,
max: 30,
message: '用戶名長(zhǎng)度必須在6到30之間'
},
identical: {//相同
field: 'password',
message: '兩次密碼不一致'
},
different: {//不能和用戶名相同
field: 'loginName',
message: '不能和用戶名相同'
},
regexp: {//匹配規(guī)則
regexp: /^[a-zA-Z0-9_\.]+$/,
message: '密碼由數(shù)字字母下劃線和.組成'
}
}
}
}
});
});
5、登錄名唯一性校驗(yàn)的后臺(tái)代碼
/**
* 校驗(yàn)當(dāng)前登錄名/郵箱的唯一性
* @param loginName 登錄名
* @param userId 用戶ID(用戶已經(jīng)存在,即又改回原來的名字還是唯一的)
* @return
*/
@RequestMapping(value = "/oauth/checkUnique", method = RequestMethod.POST)
@ResponseBody
public Map checkExist(String loginName, String userId) {
Map<String, Boolean> map = new HashMap<String, Boolean>();
User user = userService.getUserByLoginName(loginName);
//用戶不存在,校驗(yàn)有效
if (user == null) {
map.put("valid", true);
} else {
//用戶存在(存在的用戶是當(dāng)前用戶,登錄名一致,校驗(yàn)通過,否則校驗(yàn)不通過)
if(!StrUtil.isEmpty(userId)&&userId.equals(user.getLoginName())){
map.put("valid",true);
}else {
map.put("valid", false);
}
}
return map;
}
以上的配置完成了注冊(cè)文本框的各種校驗(yàn),更多的校驗(yàn)內(nèi)容,可以查看相關(guān)的bootstrap-validator的API文檔。
3、登錄錯(cuò)誤動(dòng)態(tài)提示
1、在后臺(tái)登錄時(shí),會(huì)拋出各種登錄不成功的提示,需要?jiǎng)討B(tài)改變前端組件的錯(cuò)誤提示信息。不同類型的錯(cuò)誤信息編碼,要控制不同的組件樣式和提示內(nèi)容。以下是后臺(tái)拋出的錯(cuò)誤類型和錯(cuò)誤信息(使用shiro認(rèn)證)。
try {
subject.login(token);
//通過認(rèn)證
if (subject.isAuthenticated()) {
Set<String> roles = roleService.getRoleCodeSet(userName);
if (!roles.isEmpty()) {
subject.getSession().setAttribute("isAuthorized", true);
return MAIN_PAGE;
} else {//沒有授權(quán)
msg = "您沒有得到相應(yīng)的授權(quán)!";
model.addAttribute("message", new ResultCode("1", msg));
subject.getSession().setAttribute("isAuthorized", false);
LOGGER.error(msg);
return LOGIN_PAGE;
}
} else {
return LOGIN_PAGE;
}
//0 未授權(quán) 1 賬號(hào)問題 2 密碼錯(cuò)誤 3 賬號(hào)密碼錯(cuò)誤
} catch (IncorrectCredentialsException e) {
msg = "登錄密碼錯(cuò)誤. Password for account " + token.getPrincipal() + " was incorrect";
model.addAttribute("message", new ResultCode("2", msg));
LOGGER.error(msg);
} catch (ExcessiveAttemptsException e) {
msg = "登錄失敗次數(shù)過多";
model.addAttribute("message", new ResultCode("3", msg));
LOGGER.error(msg);
} catch (LockedAccountException e) {
msg = "帳號(hào)已被鎖定. The account for username " + token.getPrincipal() + " was locked.";
model.addAttribute("message", new ResultCode("1", msg));
LOGGER.error(msg);
} catch (DisabledAccountException e) {
msg = "帳號(hào)已被禁用. The account for username " + token.getPrincipal() + " was disabled.";
model.addAttribute("message", new ResultCode("1", msg));
LOGGER.error(msg);
} catch (ExpiredCredentialsException e) {
msg = "帳號(hào)已過期. the account for username " + token.getPrincipal() + " was expired.";
model.addAttribute("message", new ResultCode("1", msg));
LOGGER.error(msg);
} catch (UnknownAccountException e) {
msg = "帳號(hào)不存在. There is no user with username of " + token.getPrincipal();
model.addAttribute("message", new ResultCode("1", msg));
LOGGER.error(msg);
} catch (UnauthorizedException e) {
msg = "您沒有得到相應(yīng)的授權(quán)!" + e.getMessage();
model.addAttribute("message", new ResultCode("1", msg));
LOGGER.error(msg);
}
2、前端核心JS代碼
<script>
$(function () {
$('input').iCheck({
checkboxClass: 'icheckbox_square-red',
radioClass: 'iradio_square-red',
increaseArea: '20%' // optional
});
fillbackLoginForm();
$("#login-form").bootstrapValidator({
message:'請(qǐng)輸入用戶名/密碼',
submitHandler:function (valiadtor,loginForm,submitButton) {
rememberMe($("input[name='rememberMe']").is(":checked"));
valiadtor.defaultSubmit();
},
fields:{
userName:{
validators:{
notEmpty:{
message:'登錄郵箱名或用戶名不能為空'
}
}
},
password:{
validators:{
notEmpty:{
message:'密碼不能為空'
}
}
}
}
});
<!--freemark語法,查看是否從后臺(tái)傳送過來錯(cuò)誤信息,并初始化錯(cuò)誤提示組件LoginValidator-->
<#if message??>
new LoginValidator({
code:"${message.code?default('-1')}",
message:"${message.message?default('')}",
userName:'userName',
password:'password'
});
</#if>
});
//使用本地緩存記住用戶名密碼
function rememberMe(rm_flag){
//remember me
if(rm_flag){
localStorage.userName=$("input[name='userName']").val();
localStorage.password=$("input[name='password']").val();
localStorage.rememberMe=1;
}
//delete remember msg
else{
localStorage.userName=null;
localStorage.password=null;
localStorage.rememberMe=0;
}
}
//記住回填
function fillbackLoginForm(){
if(localStorage.rememberMe&&localStorage.rememberMe=="1"){
$("input[name='userName']").val(localStorage.userName);
$("input[name='password']").val(localStorage.password);
$("input[name='rememberMe']").iCheck('check');
$("input[name='rememberMe']").iCheck('update');
}
}
</script>
3、LoginValidator組件的代碼 login.js
/**
* Created by billJiang on 2017/1/12.
* 登錄異常信息顯示
*/
function LoginValidator(config) {
this.code = config.code;
this.message = config.message;
this.userName = config.userName;
this.password = config.password;
this.initValidator();
}
//0 未授權(quán) 1 賬號(hào)問題 2 密碼錯(cuò)誤 3 賬號(hào)密碼錯(cuò)誤
LoginValidator.prototype.initValidator = function () {
if (!this.code)
return;
if(this.code==0){
this.addPasswordErrorMsg();
}else if(this.code==1){
this.addUserNameErrorStyle();
this.addUserNameErrorMsg();
}else if(this.code==2){
this.addPasswordErrorStyle();
this.addPasswordErrorMsg();
}else if(this.code==3){
this.addUserNameErrorStyle();
this.addPasswordErrorStyle();
this.addPasswordErrorMsg();
}
return;
}
LoginValidator.prototype.addUserNameErrorStyle = function () {
this.addErrorStyle(this.userName);
}
LoginValidator.prototype.addPasswordErrorStyle = function () {
this.addErrorStyle(this.password);
}
LoginValidator.prototype.addUserNameErrorMsg = function () {
this.addErrorMsg(this.userName);
}
LoginValidator.prototype.addPasswordErrorMsg = function () {
this.addErrorMsg(this.password);
}
LoginValidator.prototype.addErrorMsg=function(field){
$("input[name='"+field+"']").parent().append('<small data-bv-validator="notEmpty" data-bv-validator-for="'+field+'" class="help-block">' + this.message + '</small>');
}
LoginValidator.prototype.addErrorStyle=function(field){
$("input[name='" + field + "']").parent().addClass("has-error");
}
以上把錯(cuò)誤提示封裝成了一個(gè)LoginValidator組件,方便前端調(diào)用,增強(qiáng)代碼的可維護(hù)性,因?yàn)闆]有找到Bootstrap-validator改變錯(cuò)誤提示的接口,所以查看了源碼之后做了封裝。
4、補(bǔ)充
1、時(shí)間區(qū)間校驗(yàn)
"startTime":{
validators:{
date:{
format:'YYYY-MM-DD HH:mm',
message:'日期格式不正確'
},
callback:{
callback:function(value,validator){
var startTime=value;
var endTime=$("#endTime").val();
if(startTime&&endTime){
return DateDiff(endTime,startTime)>0;
}else{
return true;
}
},
message:'結(jié)束時(shí)間不能小于開始時(shí)間'
}
}
},
"endTime":{
validators:{
date:{
format:'YYYY-MM-DD HH:mm',
message:'日期格式不正確'
},
callback:{
callback:function(value,validator){
var startTime=$("#startTime").val();
var endTime=value;
if(startTime&&endTime){
return DateDiff(endTime,startTime)>0;
}else{
return true;
}
},
message:'結(jié)束時(shí)間不能小于開始時(shí)間'
}
}
},
2、服務(wù)器校驗(yàn)
"jobClass": {
validators: {
notEmpty: {message: '執(zhí)行類名不能為空'},
remote:{
url:basePath+"/job/checkJobClass",
data: function(validator) {
return {
jobClass:$('#jobClass').val(),
};
},
message:'該執(zhí)行類不存在'
}
}
}
后臺(tái)代碼
@RequestMapping(value="/checkJobClass",method = RequestMethod.POST)
@ResponseBody
public Map checkJobClass(String jobClass){
Map map=new HashMap<>();
try {
Class<?> objClass = Class.forName(jobClass);
if(objClass!=null)
map.put("valid", true);
return map;
} catch (Exception ex) {
logger.error(ex.getMessage().toString());
map.put("valid", false);
return map;
}
}
Github: https://github.com/bill1012
AdminEAP:http://www.admineap.com
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- bootstrapValidator.min.js表單驗(yàn)證插件
- bootstrapValidator表單驗(yàn)證插件學(xué)習(xí)
- Bootstrap中的表單驗(yàn)證插件bootstrapValidator使用方法整理(推薦)
- 實(shí)用又漂亮的BootstrapValidator表單驗(yàn)證插件
- BootstrapValidator超詳細(xì)教程(推薦)
- jquery插件bootstrapValidator數(shù)據(jù)驗(yàn)證詳解
- bootstrapValidator bootstrap-select驗(yàn)證不可用的解決辦法
- Bootstrapvalidator校驗(yàn)、校驗(yàn)清除重置的實(shí)現(xiàn)代碼(推薦)
- 基于jQuery 實(shí)現(xiàn)bootstrapValidator下的全局驗(yàn)證
- Bootstrap簡(jiǎn)單實(shí)用的表單驗(yàn)證插件BootstrapValidator用法實(shí)例詳解
相關(guān)文章
JavaScript頁面倒計(jì)時(shí)功能完整示例
這篇文章主要介紹了JavaScript頁面倒計(jì)時(shí)功能,結(jié)合完整實(shí)例形式分析了javascript計(jì)時(shí)器、時(shí)間運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
js獲取form表單所有數(shù)據(jù)的簡(jiǎn)單方法
下面小編就為大家?guī)硪黄猨s獲取form表單所有數(shù)據(jù)的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
JavaScript中保留小數(shù)點(diǎn)后N位方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了JavaScript中保留小數(shù)點(diǎn)后N位的幾個(gè)常用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06
javascript實(shí)現(xiàn)tabs選項(xiàng)卡切換效果(擴(kuò)展版)
常用的頁面效果有彈出層效果,無縫滾動(dòng)效果,選項(xiàng)卡切換效果,接下來與大家分享一款自己用原生javascript寫的選項(xiàng)卡切換效果在原有的基礎(chǔ)上進(jìn)行了擴(kuò)展,加入了自動(dòng)輪播,這樣就變成了類似圖片輪播的效果2013-03-03
JavaScript 驗(yàn)證瀏覽器是否支持javascript的方法小結(jié)
一些網(wǎng)站只有客戶端js的驗(yàn)證,這樣就給一些hacher一些可趁之機(jī)了,不信大家測(cè)試一些網(wǎng)站的注冊(cè)功能看看,有部分網(wǎng)站只有客戶端驗(yàn)證,我為了達(dá)到客戶端驗(yàn)證,先是判斷瀏覽器是否支持js,如果不支持,提示信息,然后屏蔽掉發(fā)送按鈕2009-05-05
使用bat打開多個(gè)cmd窗口執(zhí)行g(shù)ulp、node
本文主要介紹了使用bat打開多個(gè)cmd窗口執(zhí)行g(shù)ulp、node的方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02
自己封裝的javascript事件隊(duì)列函數(shù)版
這篇文章主要介紹了自己封裝的javascript事件隊(duì)列函數(shù)版,兼容了大部份瀏覽器,需要的朋友可以參考下2014-06-06

