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

整理登录注册代码

This commit is contained in:
xiaochong0302 2020-05-24 20:49:55 +08:00
parent 75f969c874
commit c0e405a51f
17 changed files with 546 additions and 119 deletions

View File

@ -22,7 +22,7 @@
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
@ -55,7 +55,7 @@
var $ = layui.jquery;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('app-id'),
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);

View File

@ -4,7 +4,6 @@ namespace App\Http\Web\Controllers;
use App\Http\Web\Services\Account as AccountService;
use App\Services\Frontend\Account\EmailUpdate as EmailUpdateService;
use App\Services\Frontend\Account\PasswordReset as PasswordResetService;
use App\Services\Frontend\Account\PasswordUpdate as PasswordUpdateService;
use App\Services\Frontend\Account\PhoneUpdate as PhoneUpdateService;
@ -18,6 +17,21 @@ class AccountController extends Controller
* @Get("/register", name="web.account.register")
*/
public function registerAction()
{
$service = new AccountService();
$captcha = $service->getSectionSettings('captcha');
$returnUrl = $this->request->getHTTPReferer();
$this->view->setVar('return_url', $returnUrl);
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/register", name="web.account.do_register")
*/
public function doRegisterAction()
{
}
@ -27,7 +41,38 @@ class AccountController extends Controller
*/
public function loginAction()
{
$service = new AccountService();
$captcha = $service->getSectionSettings('captcha');
$returnUrl = $this->request->getHTTPReferer();
$this->view->setVar('return_url', $returnUrl);
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/password/login", name="web.account.pwd_login")
*/
public function loginByPasswordAction()
{
$service = new AccountService();
$service->loginByPassword();
return $this->jsonSuccess();
}
/**
* @Post("/verify/login", name="web.account.verify_login")
*/
public function loginByVerifyAction()
{
$service = new AccountService();
$service->loginByVerify();
return $this->jsonSuccess();
}
/**
@ -46,89 +91,21 @@ class AccountController extends Controller
* @Get("/password/reset", name="web.account.reset_pwd")
*/
public function resetPasswordAction()
{
}
/**
* @Post("/phone/register", name="web.account.register_by_phone")
*/
public function registerByPhoneAction()
{
$service = new AccountService();
$service->registerByPhone();
$captcha = $service->getSectionSettings('captcha');
$content = [
'location' => $this->request->getHTTPReferer(),
'msg' => '注册账户成功',
];
return $this->jsonSuccess($content);
$this->view->pick('account/reset_password');
$this->view->setVar('captcha', $captcha);
}
/**
* @Post("/email/register", name="web.account.register_by_email")
* @Post("/password/reset", name="web.account.do_reset_pwd")
*/
public function registerByEmailAction()
public function doResetPasswordAction()
{
$service = new AccountService();
$service->registerByPhone();
$content = [
'msg' => '注册账户成功',
];
return $this->jsonSuccess($content);
}
/**
* @Post("/password/login", name="web.account.login_by_pwd")
*/
public function loginByPasswordAction()
{
$service = new AccountService();
$service->loginByPassword();
return $this->jsonSuccess();
}
/**
* @Post("/verify/login", name="web.account.login_by_verify")
*/
public function loginByVerifyAction()
{
$service = new AccountService();
$service->loginByVerify();
return $this->jsonSuccess();
}
/**
* @Post("/password/email/reset", name="web.account.reset_pwd_by_email")
*/
public function resetPasswordByEmailAction()
{
$service = new PasswordResetService();
$service->handle();
return $this->jsonSuccess(['msg' => '重置密码成功']);
}
/**
* @Post("/password/phone/reset", name="web.account.reset_pwd_by_phone")
*/
public function resetPasswordByPhoneAction()
{
$service = new PasswordResetService();
$service->handle();
return $this->jsonSuccess(['msg' => '重置密码成功']);
}
/**
@ -156,7 +133,7 @@ class AccountController extends Controller
}
/**
* @Post("/password/update", name="web.account.update_password")
* @Post("/password/update", name="web.account.update_pwd")
*/
public function updatePasswordAction()
{

View File

@ -4,6 +4,7 @@ namespace App\Http\Web\Controllers;
use App\Services\Frontend\Verify\EmailCode as EmailCodeService;
use App\Services\Frontend\Verify\SmsCode as SmsCodeService;
use App\Services\Frontend\Verify\VerifyCode as VerifyCodeService;
use App\Traits\Response as ResponseTrait;
/**
@ -14,6 +15,18 @@ class VerifyController extends \Phalcon\Mvc\Controller
use ResponseTrait;
/**
* @Post("/code", name="verify.code")
*/
public function verifyCodeAction()
{
$service = new VerifyCodeService();
$service->handle();
return $this->jsonSuccess();
}
/**
* @Post("/sms/code", name="verify.sms_code")
*/

View File

@ -2,7 +2,9 @@
namespace App\Http\Web\Services;
use App\Repos\User as UserRepo;
use App\Services\Auth as AuthService;
use App\Services\Frontend\Account\Register as RegisterService;
use App\Services\Frontend\Account\RegisterByEmail as RegisterByEmailService;
use App\Services\Frontend\Account\RegisterByPhone as RegisterByPhoneService;
use App\Validators\Account as AccountValidator;
@ -21,6 +23,19 @@ class Account extends Service
$this->auth = $this->getDI()->get('auth');
}
public function register()
{
$service = new RegisterService();
$account = $service->handle();
$userRepo = new UserRepo();
$user = $userRepo->findById($account->id);
$this->auth->saveAuthInfo($user);
}
public function registerByEmail()
{
$service = new RegisterByEmailService();

View File

@ -0,0 +1,20 @@
{% extends 'templates/base.volt' %}
{% block content %}
<div class="layui-tab layui-tab-brief login-tab">
<ul class="layui-tab-title kg-tab-title">
<li class="layui-this">密码登录</li>
<li>验证码登录</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
{{ partial('account/login_by_password') }}
</div>
<div class="layui-tab-item">
{{ partial('account/login_by_verify') }}
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,35 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'web.account.pwd_login'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="password" name="password" autocomplete="off" placeholder="密码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即登录</button>
<input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div>
</div>
</form>

View File

@ -0,0 +1,29 @@
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'web.account.verify_login'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<span id="phone-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="phone-verify-tips" class="kg-btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即登录</button>
<input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div>
</div>
</form>

View File

@ -0,0 +1,81 @@
{% extends 'templates/base.volt' %}
{% block content %}
<div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_register'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="password" name="password" autocomplete="off" placeholder="密码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即注册</button>
<input type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div>
</div>
</form>
</div>
{% endblock %}
{% block inline_js %}
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
<script>
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr);
$.ajax({
type: 'POST',
url: '/verify/code',
data: {
account: $('input[name=account]').val(),
ticket: $('input[name=ticket]').val(),
rand: $('input[name=rand]').val()
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
},
});
$('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-tips').removeClass('layui-hide');
}
}
);
</script>
{% endblock %}

View File

@ -0,0 +1,80 @@
{% extends 'templates/base.volt' %}
{% block content %}
<div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_reset_pwd'}) }}">
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="password" name="new_password" autocomplete="off" placeholder="新密码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<span id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-tips" class="btn-verify layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" lay-submit="true" lay-filter="go">立即重置</button>
<input type="hidden" name="ticket">
<input type="hidden" name="rand">
</div>
</div>
</form>
</div>
{% endblock %}
{% block inline_js %}
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
<script>
var $ = layui.jquery;
var layer = layui.layer;
var captcha = new TencentCaptcha(
$('#captcha-btn')[0],
$('#captcha-btn').attr('data-app-id'),
function (res) {
if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr);
$.ajax({
type: 'POST',
url: '/verify/code',
data: {
account: $('input[name=account]').val(),
ticket: $('input[name=ticket]').val(),
rand: $('input[name=rand]').val()
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
},
});
$('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-tips').removeClass('layui-hide');
}
}
);
</script>
{% endblock %}

View File

@ -2,10 +2,11 @@
{% block content %}
{{ partial('partials/macro_course') }}
{{ partial('course/list_filter') }}
<div class="course-list clearfix">
{{ partial('partials/macro_course') }}
{% for item in pager.items %}
{{ course_card(item) }}
{% endfor %}

View File

@ -26,23 +26,8 @@
{{ partial('partials/footer') }}
</div>
{{ js_include('lib/layui/layui.js') }}
<script>
layui.use(['element', 'util'], function () {
var element = layui.element;
var util = layui.util;
util.fixbar({
bar1: true,
click: function (type) {
console.log(type);
if (type === 'bar1') {
alert('点击了bar1');
}
}
});
})
</script>
{{ js_include('lib/layui/layui.all.js') }}
{{ js_include('web/js/common.js') }}
{% block include_js %}{% endblock %}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Services\Frontend\Account;
use App\Library\Validators\Common as CommonValidator;
use App\Models\Account as AccountModel;
use App\Services\Frontend\Service as FrontendService;
use App\Validators\Account as AccountValidator;
use App\Validators\Verify as VerifyValidator;
class Register extends FrontendService
{
public function handle()
{
$post = $this->request->getPost();
$verifyValidator = new VerifyValidator();
$verifyValidator->checkCode($post['account'], $post['verify_code']);
$accountValidator = new AccountValidator();
$data = [];
if (CommonValidator::phone($post['account'])) {
$data['phone'] = $accountValidator->checkPhone($post['account']);
$accountValidator->checkIfPhoneTaken($post['account']);
} elseif (CommonValidator::email($post['account'])) {
$data['email'] = $accountValidator->checkEmail($post['account']);
$accountValidator->checkIfEmailTaken($post['account']);
}
$data['password'] = $accountValidator->checkPassword($post['password']);
$account = new AccountModel();
$account->create($data);
return $account;
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Services\Frontend\Verify;
use App\Library\Validators\Common as CommonValidator;
use App\Services\Frontend\Service as FrontendService;
use App\Services\Mailer\Verify as VerifyMailerService;
use App\Services\Smser\Verify as VerifySmserService;
use App\Validators\Captcha as CaptchaValidator;
class VerifyCode extends FrontendService
{
public function handle()
{
$post = $this->request->getPost();
$captchaValidator = new CaptchaValidator();
$captchaValidator->checkCode($post['ticket'], $post['rand']);
if (CommonValidator::phone($post['account'])) {
$service = new VerifySmserService();
$service->handle($post['account']);
} elseif (CommonValidator::email($post['account'])) {
$service = new VerifyMailerService();
$service->handle($post['account']);
}
}
}

View File

@ -13,11 +13,19 @@ use App\Repos\User as UserRepo;
class Account extends Validator
{
public function checkAccount($id)
public function checkAccount($name)
{
$accountRepo = new AccountRepo();
$account = $accountRepo->findById($id);
$account = null;
if (CommonValidator::email($name)) {
$account = $accountRepo->findByEmail($name);
} elseif (CommonValidator::phone($name)) {
$account = $accountRepo->findByPhone($name);
} else {
$account = $accountRepo->findById($name);
}
if (!$account) {
throw new BadRequestException('account.not_found');
@ -52,6 +60,16 @@ class Account extends Validator
return $account;
}
public function checkLoginName($name)
{
$isPhone = CommonValidator::phone($name);
$isEmail = CommonValidator::email($name);
if (!$isPhone && !$isEmail) {
throw new BadRequestException('account.invalid_login_name');
}
}
public function checkPhone($phone)
{
if (!CommonValidator::phone($phone)) {
@ -110,32 +128,13 @@ class Account extends Validator
}
}
public function checkLoginName($name)
{
$accountRepo = new AccountRepo();
$account = null;
if (CommonValidator::email($name)) {
$account = $accountRepo->findByEmail($name);
} elseif (CommonValidator::phone($name)) {
$account = $accountRepo->findByPhone($name);
}
if (!$account) {
throw new BadRequestException('account.login_name_incorrect');
}
return $account;
}
public function checkVerifyLogin($name, $code)
{
$verify = new Verify();
$verify->checkCode($name, $code);
$account = $this->checkLoginName($name);
$account = $this->checkAccount($name);
$userRepo = new UserRepo();
@ -144,7 +143,7 @@ class Account extends Validator
public function checkUserLogin($name, $password)
{
$account = $this->checkLoginName($name);
$account = $this->checkAccount($name);
$hash = PasswordUtil::hash($password, $account->salt);

View File

@ -40,8 +40,8 @@ $error['captcha.invalid_code'] = '无效的验证码';
*/
$error['account.not_found'] = '账号不存在';
$error['account.login_block'] = '账号被锁定,无法登录';
$error['account.login_name_incorrect'] = '登录账号不正确';
$error['account.login_password_incorrect'] = '登录密码不正确';
$error['account.invalid_login_name'] = '无效的登录账户名';
$error['account.invalid_email'] = '无效的电子邮箱';
$error['account.invalid_phone'] = '无效的手机号';
$error['account.invalid_password'] = '无效的密码字母或数字6-16位';

View File

@ -51,8 +51,11 @@ body {
}
.search .layui-input {
border: none;
height: 30px;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
background-color: rgba(255, 255, 255, 0.05);
}
#main {
@ -310,4 +313,30 @@ body {
.course-body .sidebar {
float: left;
width: 320px;
}
.btn-verify {
color: green;
}
.register-container {
padding: 50px 30px;
background-color: #fff;
}
.register-container .layui-form {
width: 50%;
}
.login-tab {
padding: 30px;
background-color: #fff;
}
.login-tab .layui-tab-content {
padding-top: 30px;
}
.login-tab .layui-form {
width: 50%;
}

View File

@ -0,0 +1,79 @@
var $ = layui.jquery;
var element = layui.element;
var form = layui.form;
var layer = layui.layer;
var util = layui.util;
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Csrf-Token', $('meta[name="csrf-token"]').attr('content'));
}
});
util.fixbar({
bar1: true,
click: function (type) {
console.log(type);
if (type === 'bar1') {
alert('点击了bar1');
}
}
});
form.on('submit(go)', function (data) {
var submit = $(this);
submit.attr('disabled', true).addClass('layui-btn-disabled');
$.ajax({
type: 'POST',
url: data.form.action,
data: data.field,
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
if (res.location) {
setTimeout(function () {
window.location.href = res.location;
}, 1500);
} else {
submit.attr('disabled', false).removeClass('layui-btn-disabled');
}
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
submit.attr('disabled', false).removeClass('layui-btn-disabled');
}
});
return false;
});
$('.kg-delete').on('click', function () {
var url = $(this).attr('data-url');
var tips = '确定要删除吗?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: url,
success: function (res) {
layer.msg(res.msg, {icon: 1});
if (res.location) {
setTimeout(function () {
window.location.href = res.location;
}, 1500);
} else {
window.location.reload();
}
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
});
});
$('.kg-back').on('click', function () {
window.history.back();
});