1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-26 20:52:44 +08:00

优化用户登录,用户注册,忘记密码

This commit is contained in:
koogua 2022-08-27 19:33:33 +08:00
parent 13873dcb0b
commit cb1b2c2043
17 changed files with 313 additions and 125 deletions

View File

@ -51,25 +51,6 @@ class AccountController extends Controller
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/register", name="home.account.do_register")
*/
public function doRegisterAction()
{
$service = new AccountService();
$service->register();
$returnUrl = $this->request->getPost('return_url', 'string');
$content = [
'location' => $returnUrl ?: '/',
'msg' => '注册成功',
];
return $this->jsonSuccess($content);
}
/**
* @Get("/login", name="home.account.login")
*/
@ -103,38 +84,6 @@ class AccountController extends Controller
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/password/login", name="home.account.pwd_login")
*/
public function loginByPasswordAction()
{
$service = new AccountService();
$service->loginByPassword();
$returnUrl = $this->request->getPost('return_url', 'string');
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
return $this->jsonSuccess(['location' => $location]);
}
/**
* @Post("/verify/login", name="home.account.verify_login")
*/
public function loginByVerifyAction()
{
$service = new AccountService();
$service->loginByVerify();
$returnUrl = $this->request->getPost('return_url', 'string');
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
return $this->jsonSuccess(['location' => $location]);
}
/**
* @Get("/logout", name="home.account.logout")
*/
@ -172,6 +121,57 @@ class AccountController extends Controller
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/register", name="home.account.do_register")
*/
public function doRegisterAction()
{
$service = new AccountService();
$service->register();
$returnUrl = $this->request->getPost('return_url', 'string');
$content = [
'location' => $returnUrl ?: '/',
'msg' => '注册成功',
];
return $this->jsonSuccess($content);
}
/**
* @Post("/password/login", name="home.account.pwd_login")
*/
public function loginByPasswordAction()
{
$service = new AccountService();
$service->loginByPassword();
$returnUrl = $this->request->getPost('return_url', 'string');
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
return $this->jsonSuccess(['location' => $location]);
}
/**
* @Post("/verify/login", name="home.account.verify_login")
*/
public function loginByVerifyAction()
{
$service = new AccountService();
$service->loginByVerify();
$returnUrl = $this->request->getPost('return_url', 'string');
$location = $returnUrl ?: $this->url->get(['for' => 'home.index']);
return $this->jsonSuccess(['location' => $location]);
}
/**
* @Post("/password/reset", name="home.account.reset_pwd")
*/

View File

@ -47,6 +47,15 @@ class Account extends Service
{
$post = $this->request->getPost();
/**
* 使用[account|phone|email]做账户名字段兼容
*/
if (isset($post['phone'])) {
$post['account'] = $post['phone'];
} elseif (isset($post['email'])) {
$post['account'] = $post['email'];
}
$validator = new AccountValidator();
$user = $validator->checkUserLogin($post['account'], $post['password']);
@ -74,6 +83,15 @@ class Account extends Service
{
$post = $this->request->getPost();
/**
* 使用[account|phone|email]做账户名字段兼容
*/
if (isset($post['phone'])) {
$post['account'] = $post['phone'];
} elseif (isset($post['email'])) {
$post['account'] = $post['email'];
}
$validator = new AccountValidator();
$user = $validator->checkVerifyLogin($post['account'], $post['verify_code']);

View File

@ -6,7 +6,6 @@
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>帐号</cite></a>
<a><cite>重置密码</cite></a>
</div>
@ -26,9 +25,9 @@
</div>
</div>
<div class="link">
<a class="login-link" href="{{ url({'for':'home.account.login'}) }}">登录账户</a>
<a class="login-link" href="{{ url({'for':'home.account.login'}) }}">用户登录</a>
<span class="separator">·</span>
<a class="forget-link" href="{{ url({'for':'home.account.register'}) }}">注册账户</a>
<a class="forget-link" href="{{ url({'for':'home.account.register'}) }}">用户注册</a>
</div>
</div>
@ -37,6 +36,7 @@
{% block include_js %}
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
{{ js_include('home/js/captcha.verify.js') }}
{{ js_include('home/js/captcha.verify.phone.js') }}
{{ js_include('home/js/captcha.verify.email.js') }}
{% endblock %}

View File

@ -1,7 +1,7 @@
<form class="layui-form account-form" method="POST" action="{{ action_url }}">
<div class="layui-form-item">
<label class="layui-icon layui-icon-email"></label>
<input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="邮箱" lay-verify="email">
<input id="cv-email" class="layui-input" type="text" name="email" autocomplete="off" placeholder="邮箱" lay-verify="email">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password"></label>
@ -13,16 +13,16 @@
<input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-email-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button>
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<button id="cv-email-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button>
<input id="cv-email-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-email-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-email-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-email-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -1,7 +1,7 @@
<form class="layui-form account-form" method="POST" action="{{ action_url }}">
<div class="layui-form-item">
<label class="layui-icon layui-icon-cellphone"></label>
<input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机" lay-verify="phone">
<input id="cv-phone" class="layui-input" type="text" name="phone" autocomplete="off" placeholder="手机" lay-verify="phone">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password"></label>
@ -13,16 +13,16 @@
<input class="layui-input" type="text" name="verify_code" autocomplete="off" placeholder="验证码" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-phone-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button>
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<button id="cv-phone-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">重置密码</button>
<input id="cv-phone-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-phone-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-phone-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-phone-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -4,8 +4,7 @@
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>帐号</cite></a>
<a><cite>登录</cite></a>
<a><cite>用户登录</cite></a>
</div>
<div class="login-wrap wrap">
@ -24,7 +23,7 @@
</div>
</div>
<div class="link">
<a class="login-link" href="{{ url({'for':'home.account.register'}) }}">免费注册</a>
<a class="login-link" href="{{ url({'for':'home.account.register'}) }}">用户注册</a>
<span class="separator">·</span>
<a class="forget-link" href="{{ url({'for':'home.account.forget'}) }}">忘记密码</a>
</div>

View File

@ -8,8 +8,7 @@
<div class="layui-breadcrumb breadcrumb">
<a href="/">首页</a>
<a><cite>帐号</cite></a>
<a><cite>注册</cite></a>
<a><cite>用户注册</cite></a>
</div>
<div class="login-wrap wrap">
@ -28,7 +27,7 @@
</div>
</div>
<div class="link">
<a class="login-link" href="{{ url({'for':'home.account.login'}) }}">登录账户</a>
<a class="login-link" href="{{ url({'for':'home.account.login'}) }}">用户登录</a>
<span class="separator">·</span>
<a class="forget-link" href="{{ url({'for':'home.account.forget'}) }}">忘记密码</a>
</div>
@ -39,6 +38,7 @@
{% block include_js %}
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
{{ js_include('home/js/captcha.verify.js') }}
{{ js_include('home/js/captcha.verify.phone.js') }}
{{ js_include('home/js/captcha.verify.email.js') }}
{% endblock %}

View File

@ -2,7 +2,7 @@
<form class="layui-form account-form" method="POST" action="{{ action_url }}">
<div class="layui-form-item">
<label class="layui-icon layui-icon-email"></label>
<input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="邮箱" lay-verify="email">
<input id="cv-email" class="layui-input" type="text" name="email" autocomplete="off" placeholder="邮箱" lay-verify="email">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password"></label>
@ -14,17 +14,17 @@
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-email-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">注册帐号</button>
<button id="cv-email-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">注册帐号</button>
<input type="hidden" name="return_url" value="{{ return_url }}">
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<input id="cv-email-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-email-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-email-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-email-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -2,7 +2,7 @@
<form class="layui-form account-form" method="POST" action="{{ action_url }}">
<div class="layui-form-item">
<label class="layui-icon layui-icon-cellphone"></label>
<input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机" lay-verify="phone">
<input id="cv-phone" class="layui-input" type="text" name="phone" autocomplete="off" placeholder="手机" lay-verify="phone">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password"></label>
@ -14,17 +14,17 @@
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-phone-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">注册帐号</button>
<button id="cv-phone-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">注册帐号</button>
<input type="hidden" name="return_url" value="{{ return_url }}">
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<input id="cv-phone-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-phone-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-phone-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-phone-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -19,7 +19,7 @@
<div class="layui-form-item">
<label class="layui-form-label">邮箱地址</label>
<div class="layui-input-block">
<input id="cv-account" class="layui-input" type="text" name="email" data-type="email" lay-verify="required">
<input id="cv-email" class="layui-input" type="text" name="email" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
@ -28,16 +28,16 @@
<input class="layui-input" type="text" name="verify_code" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-email-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<button id="cv-email-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-email-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-email-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-email-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-email-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -19,7 +19,7 @@
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-block">
<input id="cv-account" class="layui-input" type="text" name="phone" data-type="phone" lay-verify="required">
<input id="cv-phone" class="layui-input" type="text" name="phone" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
@ -28,16 +28,16 @@
<input class="layui-input" type="text" name="verify_code" lay-verify="required">
</div>
<div class="layui-input-inline verify-btn-inline">
<button id="cv-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<button id="cv-phone-emit-btn" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-captcha-rand" type="hidden" name="captcha[rand]">
<button id="cv-phone-submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" disabled="disabled" lay-submit="true" lay-filter="go">提交修改</button>
<input id="cv-phone-captcha-enabled" type="hidden" value="{{ captcha.enabled }}">
<input id="cv-phone-captcha-appId" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-phone-captcha-ticket" type="hidden" name="captcha[ticket]">
<input id="cv-phone-captcha-rand" type="hidden" name="captcha[rand]">
</div>
</div>
</form>

View File

@ -19,6 +19,15 @@ class PasswordReset extends LogicService
{
$post = $this->request->getPost();
/**
* 使用[account|phone|email]做账户名字段兼容
*/
if (isset($post['phone'])) {
$post['account'] = $post['phone'];
} elseif (isset($post['email'])) {
$post['account'] = $post['email'];
}
$accountValidator = new AccountValidator();
$account = $accountValidator->checkAccount($post['account']);

View File

@ -21,6 +21,15 @@ class Register extends LogicService
{
$post = $this->request->getPost();
/**
* 使用[account|phone|email]做账户名字段兼容
*/
if (isset($post['phone'])) {
$post['account'] = $post['phone'];
} elseif (isset($post['email'])) {
$post['account'] = $post['email'];
}
$verifyValidator = new VerifyValidator();
$verifyValidator->checkCode($post['account'], $post['verify_code']);

View File

@ -0,0 +1,80 @@
layui.use(['jquery', 'layer', 'util', 'helper'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var util = layui.util;
var helper = layui.helper;
var timeCounting = false;
var $account = $('#cv-email');
var $emit = $('#cv-email-emit-btn');
var $submit = $('#cv-email-submit-btn');
if ($('#cv-email-captcha-enabled').val() === '1') {
var captcha = new TencentCaptcha(
$emit[0],
$('#cv-email-captcha-appId').val(),
function (res) {
if (res.ret === 0) {
$('#cv-email-captcha-ticket').val(res.ticket);
$('#cv-email-captcha-rand').val(res.randstr);
sendVerifyCode();
}
}
);
} else {
$emit.on('click', function () {
sendVerifyCode();
});
}
$account.on('keyup', function () {
var account = $(this).val();
var accountOk = helper.isEmail(account);
if (accountOk && !timeCounting) {
$emit.removeClass('layui-btn-disabled').removeAttr('disabled');
} else {
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
}
});
function sendVerifyCode() {
if (helper.isEmail($account.val())) {
var postUrl = '/verify/mail/code';
var postData = {
email: $account.val(),
captcha: {
ticket: $('#cv-email-captcha-ticket').val(),
rand: $('#cv-email-captcha-rand').val(),
}
};
$.ajax({
type: 'POST',
url: postUrl,
data: postData,
success: function () {
layer.msg('发送验证码成功', {icon: 1});
}
});
$submit.removeClass('layui-btn-disabled').removeAttr('disabled');
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
showCountDown($emit);
}
}
function showCountDown() {
var serverTime = new Date().getTime();
var endTime = serverTime + 60 * 1000;
util.countdown(endTime, serverTime, function (date, serverTime, timer) {
var left = date[0] * 86400 + date[1] * 3600 + date[2] * 60 + date[3];
$emit.text(left + '秒');
if (left === 0) {
$emit.removeClass('layui-btn-disabled').removeAttr('disabled').text('重新发送');
clearInterval(timer);
timeCounting = false;
}
});
timeCounting = true;
}
});

View File

@ -1,8 +1,9 @@
layui.use(['jquery', 'layer', 'util'], function () {
layui.use(['jquery', 'layer', 'util', 'helper'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var util = layui.util;
var helper = layui.helper;
var timeCounting = false;
var $account = $('#cv-account');
@ -28,16 +29,8 @@ layui.use(['jquery', 'layer', 'util'], function () {
}
$account.on('keyup', function () {
var accountOk;
var type = $(this).data('type');
var account = $(this).val();
if (type === 'phone') {
accountOk = isPhone(account);
} else if (type === 'email') {
accountOk = isEmail(account);
} else {
accountOk = isPhone(account) || isEmail(account);
}
var accountOk = helper.isPhone(account) || helper.isEmail(account);
if (accountOk && !timeCounting) {
$emit.removeClass('layui-btn-disabled').removeAttr('disabled');
} else {
@ -46,7 +39,7 @@ layui.use(['jquery', 'layer', 'util'], function () {
});
function sendVerifyCode() {
if (isEmail($account.val()) || isPhone($account.val())) {
if (helper.isEmail($account.val()) || helper.isPhone($account.val())) {
var postUrl;
var postData = {
captcha: {
@ -54,10 +47,10 @@ layui.use(['jquery', 'layer', 'util'], function () {
rand: $('#cv-captcha-rand').val(),
}
};
if (isPhone($account.val())) {
if (helper.isPhone($account.val())) {
postData.phone = $account.val();
postUrl = '/verify/sms/code';
} else if (isEmail($account.val())) {
} else if (helper.isEmail($account.val())) {
postData.email = $account.val();
postUrl = '/verify/mail/code';
}
@ -90,12 +83,4 @@ layui.use(['jquery', 'layer', 'util'], function () {
timeCounting = true;
}
function isEmail(email) {
return /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(email);
}
function isPhone(phone) {
return /^1(3|4|5|6|7|8|9)\d{9}$/.test(phone);
}
});

View File

@ -0,0 +1,80 @@
layui.use(['jquery', 'layer', 'util', 'helper'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var util = layui.util;
var helper = layui.helper;
var timeCounting = false;
var $account = $('#cv-phone');
var $emit = $('#cv-phone-emit-btn');
var $submit = $('#cv-phone-submit-btn');
if ($('#cv-phone-captcha-enabled').val() === '1') {
var captcha = new TencentCaptcha(
$emit[0],
$('#cv-phone-captcha-appId').val(),
function (res) {
if (res.ret === 0) {
$('#cv-phone-captcha-ticket').val(res.ticket);
$('#cv-phone-captcha-rand').val(res.randstr);
sendVerifyCode();
}
}
);
} else {
$emit.on('click', function () {
sendVerifyCode();
});
}
$account.on('keyup', function () {
var account = $(this).val();
var accountOk = helper.isPhone(account);
if (accountOk && !timeCounting) {
$emit.removeClass('layui-btn-disabled').removeAttr('disabled');
} else {
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
}
});
function sendVerifyCode() {
if (helper.isPhone($account.val())) {
var postUrl = '/verify/sms/code';
var postData = {
phone: $account.val(),
captcha: {
ticket: $('#cv-phone-captcha-ticket').val(),
rand: $('#cv-phone-captcha-rand').val(),
}
};
$.ajax({
type: 'POST',
url: postUrl,
data: postData,
success: function () {
layer.msg('发送验证码成功', {icon: 1});
}
});
$submit.removeClass('layui-btn-disabled').removeAttr('disabled');
$emit.addClass('layui-btn-disabled').attr('disabled', 'disabled');
showCountDown($emit);
}
}
function showCountDown() {
var serverTime = new Date().getTime();
var endTime = serverTime + 60 * 1000;
util.countdown(endTime, serverTime, function (date, serverTime, timer) {
var left = date[0] * 86400 + date[1] * 3600 + date[2] * 60 + date[3];
$emit.text(left + '秒');
if (left === 0) {
$emit.removeClass('layui-btn-disabled').removeAttr('disabled').text('重新发送');
clearInterval(timer);
timeCounting = false;
}
});
timeCounting = true;
}
});

View File

@ -6,6 +6,14 @@ layui.define(['jquery', 'layer'], function (exports) {
var helper = {};
helper.isEmail = function (email) {
return /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(email);
};
helper.isPhone = function (phone) {
return /^1(3|4|5|6|7|8|9)\d{9}$/.test(phone);
};
helper.getRequestId = function () {
var id = Date.now().toString(36);
id += Math.random().toString(36).substr(3);