新增手机号短信验证码登录 user.loginByValidCode=true;调整

sysLogin、sysIndex、menuTree、forgetPwd、registerUser 的目录,方便覆写和理解;增加 自定义主题视图
的 readme.txt 帮助文件。
This commit is contained in:
thinkgem
2020-09-20 18:24:41 +08:00
parent bbb37722d6
commit faeb49ee98
23 changed files with 396 additions and 248 deletions

View File

@@ -131,6 +131,9 @@ user:
# 登录账号是否租户内唯一,否则全局唯一
loginCodeCorpUnique: false
# 是否启用验证码登录(手机、邮箱)
loginByValidCode: true
# 用户类型配置信息employee员工member会员btype往来单位persion个人expert专家...JSON 格式说明如下:
# {"用户类型":{"beanName":"Service或Dao的Bean名称","loginView":"登录页面视图","indexView":"主框架页面视图,支持 redirect: 前缀"}}

View File

@@ -69,6 +69,10 @@
登录=Login
欢迎回来=Welcome
账号登录=Login
手机登录=Mobile
没有账号=No account
点击注册=Register
请填写登录账号.=Please enter login account.
登录账号=Login account
@@ -77,6 +81,11 @@
请填写登录密码.=Please enter login password.
登录密码=Login password
登录租户=Login tenant
请填写手机验证码.=Please enter mobile valid code
手机验证码=Mobile valid code
获取手机验证码=Get valid code
公共场所慎用,下次不需要再填写帐号=Use caution in public places.
记住账号=Remember account
公共场所慎用,下次不需要再填写帐号和密码=Use caution in public places.

View File

@@ -70,6 +70,10 @@
登录=ログイン
欢迎回来=おかえり
账号登录=ログイン
手机登录=電話登録
没有账号=アカウントなし
点击注册=きにゅう
请填写登录账号.=ログインIDを入力してください.
登录账号=ログインアカウント
@@ -78,6 +82,11 @@
请填写登录密码.=パスワードを入力してください.
登录密码=パスワード
登录租户=テナント登録
请填写手机验证码.=携帯電話の検証コード
手机验证码=電話の検証コード
获取手机验证码=コードを取得
公共场所慎用,下次不需要再填写帐号=次回からログインIDの入力が不要にします.
记住账号=ログインID記憶
公共场所慎用,下次不需要再填写帐号和密码=次回からパスワードの入力が不要にします.
@@ -90,6 +99,9 @@
注册账号=アカウント作成
忘记密码=パスワードを忘れた
注册账号=アカウントを登録する
忘记密码=パスワードを忘れる
# =========== 主框架页 ===========
仪表盘=計器盤

View File

@@ -0,0 +1,95 @@
/*!
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*
* @author ThinkGem
* @version 2019-1-6
*/
$(function(){
$('#fp_validType').change(function(){
var val = $(this).val(), action = '';
$('.fp-element').addClass('hide').removeClass('block');
$('.fp-'+val).addClass('block').removeClass('hide');
setTimeout(function(){
$('#fp_loginCode').focus();
}, 100);
if (val == 'mobile' || val == 'email'){
var txt = (val == 'mobile' ? '手机' : '邮箱')
$('#fpValidCode').attr('placeholder', txt+'验证码')
.attr('data-msg-required', '请填写'+txt+'验证码.');
$('#sendFpValidCode').val('获取'+txt+'验证码');
action = ctxPath + '/account/savePwdByValidCode';
}else if(val == 'question'){
action = ctxPath + '/account/savePwdByPwdQuestion';
}
$('#forgetForm').attr('action', action);
}).change();
var waitTime = 60;
function sendTime(o) {
if (waitTime == 0) {
o.removeAttribute("disabled");
o.value = "获取验证码";
waitTime = 60;
} else {
o.setAttribute("disabled", true);
o.value = "重新发送(" + waitTime + ")";
waitTime--;
setTimeout(function() {
sendTime(o)
}, 1000);
}
}
$('#sendFpValidCode').click(function() {
var $this = this;
js.ajaxSubmit(ctxPath + '/account/getFpValidCode', {
validType: $('#fp_validType').val(),
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
sendTime($this);
$('#fpValidCode').focus();
}else{
$('#fp_validCodeImg').click();
}
});
});
$('#fp_getQuestion').click(function() {
js.ajaxSubmit(ctxPath + '/account/getPwdQuestion', {
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
$('#fp_q1').text(data.pwdQuestion);
$('#fp_q2').text(data.pwdQuestion2);
$('#fp_q3').text(data.pwdQuestion3);
}
});
});
$('#forgetForm').validate({
ignore: ":hidden",
submitHandler: function(form) {
js.ajaxSubmitForm($(form), function(data){
if (data.result == "true"){
alert(data.message);
location = ctx + '/login';
}else{
js.showMessage(data.message);
$('#forgetForm').reset();
}
});
}
});
$('#btnReset').click(function(){
location = ctx + '/login';
});
});

View File

@@ -0,0 +1,87 @@
/*!
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*
* @author ThinkGem
* @version 2019-1-6
*/
$(function(){
$('#reg_validType').change(function(){
var val = $(this).val(), action = '';
$('.reg-element').addClass('hide').removeClass('block');
$('.reg-'+val).addClass('block').removeClass('hide');
setTimeout(function(){
$('#reg_loginCode').focus();
}, 100);
if (val == 'mobile' || val == 'email'){
var txt = (val == 'mobile' ? '手机' : '邮箱')
$('#regValidCode').attr('placeholder', txt+'验证码')
.attr('data-msg-required', '请填写'+txt+'验证码.');
$('#sendRegValidCode').val('获取'+txt+'验证码');
action = ctxPath + '/account/saveRegByValidCode';
}else if(val == 'question'){
action = ctxPath + '/account/savePwdByPwdQuestion';
}
$('#registerForm').attr('action', action);
}).change();
var waitTime = 60;
function sendTime(o) {
if (waitTime == 0) {
o.removeAttribute("disabled");
o.value = "获取验证码";
waitTime = 60;
} else {
o.setAttribute("disabled", true);
o.value = "重新发送(" + waitTime + ")";
waitTime--;
setTimeout(function() {
sendTime(o)
}, 1000);
}
}
$('#sendRegValidCode').click(function() {
var $this = this;
js.ajaxSubmit(ctxPath + '/account/getRegValidCode', {
validType: $('#reg_validType').val(),
corpCode_ : $('#reg_corpCode').val(),
corpName_ : $('#reg_corpName').val(),
loginCode : $('#reg_loginCode').val(),
userName : $('#reg_userName').val(),
email : $('#reg_email').val(),
mobile : $('#reg_mobile').val(),
userType: $('#reg_userType').val(),
validCode : $('#reg_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
sendTime($this);
$('#regValidCode').focus();
}else{
$('#reg_validCodeImg').click();
}
});
});
$('#registerForm').validate({
ignore: ":hidden",
submitHandler: function(form) {
js.ajaxSubmitForm($(form), function(data){
if (data.result == "true"){
alert(data.message);
location = ctx + '/login';
}else{
js.showMessage(data.message);
$('#registerForm').reset();
}
});
}
});
$('#btnReset').click(function(){
location = ctx + '/login';
});
});

View File

@@ -16,28 +16,6 @@
<option value="email">使用电子邮箱找回您的密码</option>
<option value="question">使用保密问题找回您的密码</option>
</select>
<script type="text/javascript">
$(document).ready(function(){
$('#fp_validType').change(function(){
var val = $(this).val(), action = '';
$('.fp-element').addClass('hide').removeClass('block');
$('.fp-'+val).addClass('block').removeClass('hide');
setTimeout(function(){
$('#fp_loginCode').focus();
}, 100);
if (val == 'mobile' || val == 'email'){
var txt = (val == 'mobile' ? '手机' : '邮箱')
$('#fpValidCode').attr('placeholder', txt+'验证码')
.attr('data-msg-required', '请填写'+txt+'验证码.');
$('#sendFpValidCode').val('获取'+txt+'验证码');
action = '${ctxPath}/account/savePwdByValidCode';
}else if(val == 'question'){
action = '${ctxPath}/account/savePwdByPwdQuestion';
}
$('#forgetForm').attr('action', action);
}).change();
});
</script>
</div>
<div class="form-group has-feedback">
<span class="fa fa-user form-control-feedback"></span>
@@ -54,54 +32,9 @@
<input type="button" id="sendFpValidCode" value="获取手机验证码" class="btn btn-flat"/>
</span>
</div>
<script type="text/javascript">
var waitTime = 60;
function sendTime(o) {
if (waitTime == 0) {
o.removeAttribute("disabled");
o.value = "获取验证码";
waitTime = 60;
} else {
o.setAttribute("disabled", true);
o.value = "重新发送(" + waitTime + ")";
waitTime--;
setTimeout(function() {
sendTime(o)
}, 1000);
}
}
$('#sendFpValidCode').click(function() {
var $this = this;
js.ajaxSubmit('${ctxPath}/account/getFpValidCode', {
validType: $('#fp_validType').val(),
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
sendTime($this);
}
});
});
</script>
</div>
<div class="form-group has-feedback fp-element fp-question clearfix">
<input type="button" id="fp_getQuestion" value="获取保密问题" class="btn btn-default btn-block btn-flat"/>
<script type="text/javascript">
$('#fp_getQuestion').click(function() {
js.ajaxSubmit('${ctxPath}/account/getPwdQuestion', {
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
$('#fp_q1').text(data.pwdQuestion);
$('#fp_q2').text(data.pwdQuestion2);
$('#fp_q3').text(data.pwdQuestion3);
}
});
});
</script>
</div>
<div class="form-group has-feedback fp-element fp-question">
问题1<span id="fp_q1"></span>
@@ -167,22 +100,4 @@
<script>var secretKey = '${@Global.getConfig("shiro.loginSubmit.secretKey")}';</script>
<script src="${ctxStatic}/jquery-toastr/2.1/toastr.min.js?${_version}"></script>
<script src="${ctxStatic}/common/des.js?${_version}"></script>
<script>
$('#forgetForm').validate({
ignore: ":hidden",
submitHandler: function(form) {
js.ajaxSubmitForm($(form), function(data){
if (data.result == "true"){
alert(data.message);
location = "${ctx}/login";
}else{
js.showMessage(data.message);
$('#forgetForm').reset();
}
});
}
});
$('#btnReset').click(function(){
location = '${ctx}/login';
});
</script>
<script src="${ctxStatic}/modules/sys/forgetPwd.js?${_version}"></script>

View File

@@ -15,28 +15,6 @@
<option value="email">使用电子邮箱注册账号</option>
<option value="mobile">使用手机号码注册账号</option>
</select>
<script type="text/javascript">
$(document).ready(function(){
$('#reg_validType').change(function(){
var val = $(this).val(), action = '';
$('.reg-element').addClass('hide').removeClass('block');
$('.reg-'+val).addClass('block').removeClass('hide');
setTimeout(function(){
$('#reg_loginCode').focus();
}, 100);
if (val == 'mobile' || val == 'email'){
var txt = (val == 'mobile' ? '手机' : '邮箱')
$('#regValidCode').attr('placeholder', txt+'验证码')
.attr('data-msg-required', '请填写'+txt+'验证码.');
$('#sendRegValidCode').val('获取'+txt+'验证码');
action = '${ctxPath}/account/saveRegByValidCode';
}else if(val == 'question'){
action = '${ctxPath}/account/savePwdByPwdQuestion';
}
$('#registerForm').attr('action', action);
}).change();
});
</script>
</div>
<% if(@Global.isUseCorpModel()){ %>
<div class="form-group has-feedback">
@@ -75,42 +53,6 @@
<input type="button" id="sendRegValidCode" value="获取手机验证码" class="btn btn-flat"/>
</span>
</div>
<script type="text/javascript">
var waitTime = 60;
function sendTime(o) {
if (waitTime == 0) {
o.removeAttribute("disabled");
o.value = "获取验证码";
waitTime = 60;
} else {
o.setAttribute("disabled", true);
o.value = "重新发送(" + waitTime + ")";
waitTime--;
setTimeout(function() {
sendTime(o)
}, 1000);
}
}
$('#sendRegValidCode').click(function() {
var $this = this;
js.ajaxSubmit('${ctxPath}/account/getRegValidCode', {
validType: $('#reg_validType').val(),
corpCode_ : $('#reg_corpCode').val(),
corpName_ : $('#reg_corpName').val(),
loginCode : $('#reg_loginCode').val(),
userName : $('#reg_userName').val(),
email : $('#reg_email').val(),
mobile : $('#reg_mobile').val(),
userType: $('#reg_userType').val(),
validCode : $('#reg_validCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
sendTime($this);
}
});
});
</script>
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
@@ -152,22 +94,4 @@
</div>
<% } %>
<script src="${ctxStatic}/jquery-toastr/2.1/toastr.min.js?${_version}"></script>
<script>
$('#registerForm').validate({
ignore: ":hidden",
submitHandler: function(form) {
js.ajaxSubmitForm($(form), function(data){
if (data.result == "true"){
alert(data.message);
location = "${ctx}/login";
}else{
js.showMessage(data.message);
$('#registerForm').reset();
}
});
}
});
$('#btnReset').click(function(){
location = '${ctx}/login';
});
</script>
<script src="${ctxStatic}/modules/sys/registerUser.js?${_version}"></script>

View File

@@ -9,10 +9,10 @@ var bodyClass = 'fixed noscroll2 sidebar-mini ' + sidebarCollapse;
<link rel="stylesheet" href="${ctxStatic}/jquery-toastr/2.1/toastr.min.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/modules/sys/sysIndex.css?${_version}">
<header class="main-header">
<% include('sysIndex/topMenu.html'){} %>
<% include('/include/sysIndex/topMenu.html'){} %>
</header>
<aside class="main-sidebar">
<% include('sysIndex/leftMenu.html'){} %>
<% include('/include/sysIndex/leftMenu.html'){} %>
</aside>
<div class="content-wrapper">
<div id="tabpanel"></div>

View File

@@ -9,27 +9,23 @@
<small>${@Global.getConfig('productVersion')}</small></a>
</div>
<div class="login-box-body">
<#form:form id="loginForm" model="${user!}" action="${ctx}/login" method="post">
<h4 class="login-box-msg">${isNotBlank(message!)?message:text('欢迎回来')+''}</h4>
<!-- <ul class="nav nav-tabs mb20">
<li class="active"><a href="#tab-1" data-toggle="tab">账号登录</a></li>
<li><a href="#tab-2" data-toggle="tab">邮箱登录</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tab-1"></div>
<div class="tab-pane" id="tab-2"></div>
</div> -->
<ul id="loginTab" class="nav nav-tabs ${@Global.getConfigToBoolean('user.loginByValidCode','true')?'':'hide'}">
<li class="active"><a href="#tab-1" data-toggle="tab" action="${ctx}/login">${text('账号登录')}</a></li>
<li><a href="#tab-2" data-toggle="tab" action="${ctxPath}/account/loginByValidCode">${text('手机登录')}</a></li>
</ul>
<#form:form id="loginForm" model="${user!}" action="${ctx}/login" method="post" class="tab-content">
<% if(isNotBlank(message!)){ %>
<h5 class="login-box-msg text-red">${message}</h5>
<% } %>
<div class="form-group has-feedback">
<span class="icon-user form-control-feedback" title="${text('登录账号')}"></span>
<#form:input type="text" name="username" class="form-control required"
data-msg-required="${text('请填写登录账号.')}" placeholder="${text('登录账号')}"
value="${cookie('rememberUserCode')}"/>
</div>
<div class="form-group has-feedback">
<span class="icon-lock form-control-feedback"
title="${text('登录密码,鼠标按下显示密码')}"
onmousedown="$('#password').attr('type','text')"
onmouseup="$('#password').attr('type','password')"
<div class="form-group has-feedback tab-pane tab-1 active">
<span class="icon-lock form-control-feedback" title="${text('登录密码,鼠标按下显示密码')}"
onmousedown="$('#password').attr('type','text')" onmouseup="$('#password').attr('type','password')"
onmouseenter="$(this).removeClass('icon-lock').addClass('icon-eye')"
onmouseout="$(this).removeClass('icon-eye').addClass('icon-lock')"></span>
<#form:input type="password" name="password" class="form-control required"
@@ -44,6 +40,15 @@
<div class="form-group has-feedback" id="isValidCodeLogin" style="display:${isValidCodeLogin?'blank':'none'}">
<#form:validcode name="validCode" isRequired="true" isRemote="true" isLazy="${!isValidCodeLogin}"/>
</div>
<div class="form-group has-feedback tab-pane tab-2">
<div class="input-group">
<input type="text" id="loginValidCode" name="loginValidCode" class="form-control required"
data-msg-required="${text('请填写手机验证码.')}" placeholder="${text('手机验证码')}" />
<span class="input-group-btn">
<input type="button" id="sendLoginValidCode" value="${text('获取手机验证码')}" class="btn btn-flat"/>
</span>
</div>
</div>
<div class="form-group">
<div class="mt5 icheck">
<label title="${text('公共场所慎用,下次不需要再填写帐号')}"><input type="checkbox"

View File

@@ -0,0 +1,21 @@
======= 说明:
当前目录:/src/main/resources/views/themes/default/modules/
是【default】主题的模块视图目录该目录下的文件会自动覆盖
/src/main/resources/views/modules/ 下的默认视图文件。
======= 举例:
拷贝文件:/src/main/resources/views/modules/sys/sysLogin.html
复制到:/src/main/resources/views/themes/default/modules/sys/sysLogin.html
这样写,默认的视图文件就会被替换为你自定义的视图文件,从而实现简单的自定义视图。
======= 更多资料:
http://jeesite.com/docs/custom-views/