Browse Source

手机验证码

pull/2359/head
chenshihai 3 years ago
parent
commit
3fab05c1f4
7 changed files with 77 additions and 41 deletions
  1. +17
    -0
      options/locale/locale_en-US.ini
  2. +17
    -3
      options/locale/locale_zh-CN.ini
  3. +5
    -5
      templates/user/auth/bind_phone.tmpl
  4. +4
    -8
      templates/user/auth/forgot_passwd_phone.tmpl
  5. +29
    -17
      templates/user/auth/phone_verify.tmpl
  6. +3
    -6
      templates/user/auth/signin_navbar.tmpl
  7. +2
    -2
      templates/user/settings/profile.tmpl

+ 17
- 0
options/locale/locale_en-US.ini View File

@@ -389,6 +389,23 @@ manual_first=Please slide to finish the jigsaw first.
verify_code_fail=Please input right verify code. verify_code_fail=Please input right verify code.
bind_phone=Please Bind Your Phone. bind_phone=Please Bind Your Phone.
bind_phone_fail=Fail to bind phone number, please try again later. bind_phone_fail=Fail to bind phone number, please try again later.
phone_number=Phone number
drag_the_slider_to_fill_the_puzzle=Drag the slider to the right to fill the puzzle
mobile_phone_verification_code=Phone verification code
please_enter_SMS_verification_code=Please enter SMS verification code
get_verification_code=Get verification code
new_login_password=New login password
please_enter_new_password=Please enter new password
second_resend=S resend
please_bind_your_mobile_number=Please Bind Your Phone Number
submit=Submit
please_enter_the_correct_mobile_number=Please enter the correct phone number
please_enter_the_correct_mobile_phone_verification_code=Please enter the correct phone verification code
email_retrieve_password=Email retrieve password
mobile_number_retrieve_password=Phone number retrieve password
mobile_login=Mobile login
account_password_login=Account password login
cloud_brain_user_login=Cloud brain user login




[mail] [mail]


+ 17
- 3
options/locale/locale_zh-CN.ini View File

@@ -393,9 +393,23 @@ manual_first=请先拖动滑块填充拼图。
verify_code_fail=请输入正确的短信验证码。 verify_code_fail=请输入正确的短信验证码。
bind_phone=请绑定手机号。 bind_phone=请绑定手机号。
bind_phone_fail=绑定手机号失败,请稍后再试。 bind_phone_fail=绑定手机号失败,请稍后再试。



phone_number=手机号码
drag_the_slider_to_fill_the_puzzle=向右拖动滑块填充拼图
mobile_phone_verification_code=手机验证码
please_enter_SMS_verification_code=请输入短信验证码
get_verification_code=获取验证码
new_login_password=新的登录密码
please_enter_new_password=请输入新的密码
second_resend=S后重发
please_bind_your_mobile_number=请绑定手机号
submit=提交
please_enter_the_correct_mobile_number=请输入正确的手机号
please_enter_the_correct_mobile_phone_verification_code=请输入正确格式的手机验证码
email_retrieve_password=邮箱找回密码
mobile_number_retrieve_password=手机号找回密码
mobile_login=手机登录
account_password_login=账号密码登录
cloud_brain_user_login=云脑1用户登录




[mail] [mail]


+ 5
- 5
templates/user/auth/bind_phone.tmpl View File

@@ -5,8 +5,7 @@
<form class="ui form ignore-dirty" action="" method=""> <form class="ui form ignore-dirty" action="" method="">
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
<h2 class="ui top attached header"> <h2 class="ui top attached header">
{{/*.i18n.Tr "auth.forgot_password_title"*/}}
请绑定手机号
{{.i18n.Tr "phone.please_bind_your_mobile_number"}}
</h2> </h2>
<div class="ui attached segment"> <div class="ui attached segment">
{{template "base/alert" .}} {{template "base/alert" .}}
@@ -42,11 +41,11 @@
if (phoneNumber && verifyCode) { if (phoneNumber && verifyCode) {
e.preventDefault(); e.preventDefault();
if (!/^1[3578]\d{9}$/.test(phoneNumber)) { if (!/^1[3578]\d{9}$/.test(phoneNumber)) {
bindPhoneEl.find('.ui.negative.message').show().find('p').text('请输入正确的手机号');
bindPhoneEl.find('.ui.negative.message').show().find('p').text({{.i18n.Tr "phone.please_enter_the_correct_mobile_number"}});
return; return;
} }
if (!/^\d{6}$/.test(verifyCode)) { if (!/^\d{6}$/.test(verifyCode)) {
bindPhoneEl.find('.ui.negative.message').show().find('p').text('请输入正确格式的手机验证码');
bindPhoneEl.find('.ui.negative.message').show().find('p').text({{.i18n.Tr "phone.please_enter_the_correct_mobile_phone_verification_code"}});
return; return;
} }
$.ajax({ $.ajax({
@@ -54,8 +53,9 @@
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
_csrf: bindPhoneEl.find('input[name="_csrf"]').val(),
phone_number: phoneNumber, phone_number: phoneNumber,
verify_code: phoneNumber
verify_code: verifyCode
}, },
success: function(res) { success: function(res) {
if (res && res.Code === 0) { if (res && res.Code === 0) {


+ 4
- 8
templates/user/auth/forgot_passwd_phone.tmpl View File

@@ -1,12 +1,10 @@
{{template "base/head" .}} {{template "base/head" .}}
<div class="ui secondary pointing tabular top attached borderless menu new-menu navbar"> <div class="ui secondary pointing tabular top attached borderless menu new-menu navbar">
<a class="item" rel="nofollow" href="{{AppSubUrl}}/user/forgot_password"> <a class="item" rel="nofollow" href="{{AppSubUrl}}/user/forgot_password">
{{/* 手机验证码登陆 .i18n.Tr "auth.login_userpass" */}}
邮箱找回密码
{{.i18n.Tr "phone.email_retrieve_password"}}
</a> </a>
<a class="active item" rel="nofollow" href="{{AppSubUrl}}/user/forgot_password?type=phone"> <a class="active item" rel="nofollow" href="{{AppSubUrl}}/user/forgot_password?type=phone">
{{/* .i18n.Tr "auth.login_userpass" */}}
手机号找回密码
{{.i18n.Tr "phone.mobile_number_retrieve_password"}}
</a> </a>
</div> </div>
<div class="user forgot password"> <div class="user forgot password">
@@ -19,13 +17,12 @@
</h2> </h2>
<div class="ui attached segment"> <div class="ui attached segment">
{{template "base/alert" .}} {{template "base/alert" .}}

{{if .EnablePhone }} {{if .EnablePhone }}
<div style="display:flex;justify-content:center;"> <div style="display:flex;justify-content:center;">
<div class="use-type" usetype="3" style="width:491px;" showlabel="true" shownewpwd="true" autofocus="true"> <div class="use-type" usetype="3" style="width:491px;" showlabel="true" shownewpwd="true" autofocus="true">
{{template "user/auth/phone_verify" .}} {{template "user/auth/phone_verify" .}}
</div> </div>
</div>
</div>
<style> <style>
.use-type ._label-c, .use-type .new-pass-word-wrap { .use-type ._label-c, .use-type .new-pass-word-wrap {
display: flex; display: flex;
@@ -36,9 +33,8 @@
<div class="ui divider"></div> <div class="ui divider"></div>
<div class="inline field"> <div class="inline field">
<label></label> <label></label>
<button class="ui blue button">{{/*.i18n.Tr "auth.send_reset_mail"*/}}提交</button>
<button class="ui blue button">{{.i18n.Tr "phone.submit"}}</button>
</div> </div>
</div> </div>
</form> </form>
</div> </div>


+ 29
- 17
templates/user/auth/phone_verify.tmpl View File

@@ -157,7 +157,7 @@
left: 0; left: 0;
width: 51px; width: 51px;
height: 51px; height: 51px;
background-color: blue;
box-shadow: 0 0 4px rgb(35 173 255);
} }


.slide-bar-c .verify-code-c { .slide-bar-c .verify-code-c {
@@ -247,10 +247,11 @@
outline: none; outline: none;
} }
</style> </style>

<div class="phone-verify-code"> <div class="phone-verify-code">
<div class="phone-c"> <div class="phone-c">
<div class="phone-label _label-c required"> <div class="phone-label _label-c required">
<span class="_label">手机号码</span>
<span class="_label">{{.i18n.Tr "phone.phone_number"}}</span>
</div> </div>
<div class="phone-area-c"> <div class="phone-area-c">
<select value="+86"> <select value="+86">
@@ -258,14 +259,14 @@
</select> </select>
</div> </div>
<div class="field phone-num-c"> <div class="field phone-num-c">
<input class="phoneNumber" style="width:100% !important" name="phone_number" value="{{.phone_number}}" placeholder="手机号码" required autocomplete="off" />
<input class="phoneNumber" style="width:100% !important" name="phone_number" value="{{.phone_number}}" placeholder="{{.i18n.Tr "phone.phone_number"}}" required autocomplete="off" />
</div> </div>
</div> </div>
<div class="slide-bar-wrap" style="display:flex;"> <div class="slide-bar-wrap" style="display:flex;">
<div class="slide-bar-label _label-c required" style=""></div> <div class="slide-bar-label _label-c required" style=""></div>
<div class="slide-bar-c" style="flex:1;"> <div class="slide-bar-c" style="flex:1;">
<div class="slide-bar-bg"> <div class="slide-bar-bg">
<div class="slide-txt">向右拖动滑块填充拼图</div>
<div class="slide-txt">{{.i18n.Tr "phone.drag_the_slider_to_fill_the_puzzle"}}</div>
<div class="slide-bar"></div> <div class="slide-bar"></div>
<div class="slide-trigger"></div> <div class="slide-trigger"></div>
</div> </div>
@@ -274,24 +275,23 @@
</div> </div>
</div> </div>
</div> </div>
<div class="verify-code-c"> <div class="verify-code-c">
<div class="verify-code-label _label-c required"> <div class="verify-code-label _label-c required">
<span class="_label">手机验证码</span>
<span class="_label">{{.i18n.Tr "phone.mobile_phone_verification_code"}}</span>
</div> </div>
<div class="verify-code-num-c"> <div class="verify-code-num-c">
<input class="verifyCode" style="width:100% !important" name="verify_code" value="{{.verify_code}}" placeholder="请输入短信验证码" required autocomplete="off" />
<input class="verifyCode" style="width:100% !important" name="verify_code" value="{{.verify_code}}" placeholder="{{.i18n.Tr "phone.please_enter_SMS_verification_code"}}" required autocomplete="off" />
</div> </div>
<div class="verify-code-send"> <div class="verify-code-send">
<div class="verify-code-send-btn __disabled">获取验证码</div>
<div class="verify-code-send-btn __disabled">{{.i18n.Tr "phone.get_verification_code"}}</div>
</div> </div>
</div> </div>
<div class="new-pass-word-wrap"> <div class="new-pass-word-wrap">
<div class="new-pass-word-label _label-c required"> <div class="new-pass-word-label _label-c required">
<span class="_label">新的登录密码</span>
<span class="_label">{{.i18n.Tr "phone.new_login_password"}}</span>
</div> </div>
<div class="new-pass-word-c"> <div class="new-pass-word-c">
<input class="newPassword" style="width:100% !important" name="password" type="password" placeholder="请输入新的密码" required autocomplete="off" />
<input class="newPassword" style="width:100% !important" name="password" type="password" placeholder="{{.i18n.Tr "phone.please_enter_new_password"}}" required autocomplete="off" />
</div> </div>
</div> </div>
<div class="new-pass-word-wrap"> <div class="new-pass-word-wrap">
@@ -310,7 +310,7 @@
window.addEventListener('load', function () { window.addEventListener('load', function () {
function PhoneVerifyCode(dom) { function PhoneVerifyCode(dom) {
if (!dom) return; if (!dom) return;
this.countDownNumber = 20;
this.countDownNumber = 120;
this.init(dom); this.init(dom);
} }
@@ -345,6 +345,10 @@
if (autofocus) { if (autofocus) {
this.dom.find('input.phoneNumber').focus(); this.dom.find('input.phoneNumber').focus();
} }
var verifyCodeNoRequired = wrap.attr('verifycodenorequired');
if (verifyCodeNoRequired) {
this.dom.find('input.verifyCode').removeAttr('required');
}
}; };


PhoneVerifyCode.prototype.eventInit = function () { PhoneVerifyCode.prototype.eventInit = function () {
@@ -452,7 +456,6 @@
} else { } else {
self.dom.find('.phone-num-c').removeClass('error'); self.dom.find('.phone-num-c').removeClass('error');
var useType = self.dom.closest('div.use-type').attr('usetype') || 0; var useType = self.dom.closest('div.use-type').attr('usetype') || 0;
self.countDown();
$.ajax({ $.ajax({
url: '/sendVerifyCode', url: '/sendVerifyCode',
type: 'post', type: 'post',
@@ -463,8 +466,17 @@
slide_id: self.imgID, slide_id: self.imgID,
}, },
success: function(res) { success: function(res) {
if (res && res.code === 0) {
console.log(res);
if (res && res.Code === 0) {
self.countDown();
} else {
$('body').toast({
message: res.Message,
showProgress: 'bottom',
showIcon:'warning circle',
class: 'warning',
position: 'top right',
});
self.refreshImages();
} }
}, },
error: function(err) { error: function(err) {
@@ -507,14 +519,14 @@
var self = this; var self = this;
var sendBtnEl = this.dom.find('.verify-code-send-btn'); var sendBtnEl = this.dom.find('.verify-code-send-btn');
var count = this.countDownNumber; var count = this.countDownNumber;
sendBtnEl.addClass('__disabled').text(`${count}S后重发`);
sendBtnEl.addClass('__disabled').text(`${count}{{.i18n.Tr "phone.second_resend"}}`);
this.canSendCode = false; this.canSendCode = false;
this.countDownEnd = false; this.countDownEnd = false;
var timer = setInterval(function () { var timer = setInterval(function () {
count--; count--;
sendBtnEl.addClass('__disabled').text(`${count}S后重发`);
sendBtnEl.addClass('__disabled').text(`${count}{{.i18n.Tr "phone.second_resend"}}`);
if (count <= 0) { if (count <= 0) {
sendBtnEl.removeClass('__disabled').text(`获取验证码`);
sendBtnEl.removeClass('__disabled').text({{.i18n.Tr "phone.get_verification_code"}});
clearInterval(timer); clearInterval(timer);
self.canSendCode = true; self.canSendCode = true;
self.countDownEnd = true; self.countDownEnd = true;


+ 3
- 6
templates/user/auth/signin_navbar.tmpl View File

@@ -1,16 +1,13 @@
{{if or .EnableOpenIDSignIn .EnableSSPI .EnableCloudBrain}} {{if or .EnableOpenIDSignIn .EnableSSPI .EnableCloudBrain}}
<div class="ui secondary pointing tabular top attached borderless menu new-menu navbar"> <div class="ui secondary pointing tabular top attached borderless menu new-menu navbar">
<a class="{{if .PageIsPhoneLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/phone"> <a class="{{if .PageIsPhoneLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/phone">
{{/* 手机验证码登陆 .i18n.Tr "auth.login_userpass" */}}
手机登录
{{.i18n.Tr "phone.mobile_login"}}
</a> </a>
<a class="{{if .PageIsLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login"> <a class="{{if .PageIsLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login">
{{/* .i18n.Tr "auth.login_userpass" */}}
账号密码登录
{{.i18n.Tr "phone.account_password_login"}}
</a> </a>
<a class="{{if .PageIsCloudBrainLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/cloud_brain"> <a class="{{if .PageIsCloudBrainLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/cloud_brain">
{{/* .i18n.Tr "auth.login_cloudbrain" */}}
云脑1用户登录
{{.i18n.Tr "phone.cloud_brain_user_login"}}
</a> </a>
{{if .EnableOpenIDSignIn}} {{if .EnableOpenIDSignIn}}
<a class="{{if .PageIsLoginOpenID}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/openid"> <a class="{{if .PageIsLoginOpenID}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/openid">


+ 2
- 2
templates/user/settings/profile.tmpl View File

@@ -35,8 +35,8 @@
</div> </div>
{{if .EnablePhone }} {{if .EnablePhone }}
<div class="field required" style="width:391px;"> <div class="field required" style="width:391px;">
<label for="phone">{{/* .i18n.Tr "phone" */}} 手机号码</label>
<div class="use-type" usetype="2" ophonenumber="{{.SignedUser.PhoneNumber}}">
<label for="phone">{{.i18n.Tr "phone.phone_number"}}</label>
<div class="use-type" usetype="2" ophonenumber="{{.SignedUser.PhoneNumber}}" verifycodenorequired="true">
{{template "user/auth/phone_verify" .}} {{template "user/auth/phone_verify" .}}
</div> </div>
</div> </div>


Loading…
Cancel
Save